Yes I will :) or if people want to jon and participate this is ok too. On Aug 27, 2009, at 9:11 AM, Adrian Lienhard wrote:
> Stef, I think it would make sense to create issues in the tracker for > these changes so that we can keep track of. With mails they get > quickly lost and forgotten. What do you think? > > Cheers, > Adrian > > On Aug 27, 2009, at 08:58 , Stéphane Ducasse wrote: > >> >> >> Begin forwarded message: >> >>> From: [email protected] >>> Date: August 26, 2009 6:27:44 AM CEDT >>> To: [email protected] >>> Subject: [squeak-dev] The Trunk: Compiler-cwp.73.mcz >>> Reply-To: [email protected] >>> >>> Andreas Raab uploaded a new version of Compiler to project The >>> Trunk: >>> http://source.squeak.org/trunk/Compiler-cwp.73.mcz >>> >>> ==================== Summary ==================== >>> >>> Name: Compiler-cwp.73 >>> Author: cwp >>> Time: 25 August 2009, 8:45:22 am >>> UUID: 0fc4552f-d0c6-481a-8fa0-2bea842240b2 >>> Ancestors: Compiler-rss.72 >>> >>> The compiler now uses notifications to signal that a correctable >>> error has been found in the method source, rather than interacting >>> directly with the user. >>> >>> =============== Diff against Compiler-rss.72 =============== >>> >>> Item was added: >>> + ----- Method: ParserNotification>>setName: (in category 'as yet >>> unclassified') ----- >>> + setName: aString >>> + name _ aString! >>> >>> Item was changed: >>> SystemOrganization addCategory: #'Compiler-Kernel'! >>> SystemOrganization addCategory: #'Compiler-ParseNodes'! >>> SystemOrganization addCategory: #'Compiler-Support'! >>> SystemOrganization addCategory: #'Compiler-Tests'! >>> SystemOrganization addCategory: #'Compiler-Syntax'! >>> + SystemOrganization addCategory: #'Compiler-Exceptions'! >>> >>> Item was added: >>> + TestCase subclass: #CompilerExceptionsTest >>> + instanceVariableNames: '' >>> + classVariableNames: '' >>> + poolDictionaries: '' >>> + category: 'Compiler-Tests'! >>> >>> Item was added: >>> + ----- Method: ParserNotification>>defaultAction (in category 'as >>> yet unclassified') ----- >>> + defaultAction >>> + >>> + self openMenuIn: >>> + [:labels :lines :caption | >>> + UIManager default chooseFrom: labels lines: lines title: >>> caption]! >>> >>> Item was added: >>> + ----- Method: UndeclaredVariable class>>signalFor:name:inRange: >>> (in category 'as yet unclassified') ----- >>> + signalFor: aParser name: aString inRange: anInterval >>> + ^ (self new setParser: aParser name: aString range: anInterval) >>> signal! >>> >>> Item was added: >>> + ----- Method: ParserNotification>>openMenuIn: (in category 'as yet >>> unclassified') ----- >>> + openMenuIn: aBlock >>> + self subclassResponsibility! >>> >>> Item was changed: >>> ----- Method: >>> Parser>>correctSelector:wordIntervals:exprInterval:ifAbort: (in >>> category 'error correction') ----- >>> correctSelector: proposedKeyword wordIntervals: spots exprInterval: >>> expInt ifAbort: abortAction >>> "Correct the proposedKeyword to some selector symbol, correcting >>> the original text if such action is indicated. abortAction is >>> invoked if the proposedKeyword couldn't be converted into a valid >>> selector. Spots is an ordered collection of intervals within the >>> test stream of the for each of the keyword parts." >>> >>> + | correctSelector userSelection | >>> - | alternatives aStream choice correctSelector userSelection lines >>> firstLine | >>> "If we can't ask the user, assume that the keyword will be defined >>> later" >>> self interactive ifFalse: [ ^ proposedKeyword asSymbol ]. >>> >>> + userSelection _ requestor selectionInterval. >>> - userSelection := requestor selectionInterval. >>> requestor selectFrom: spots first first to: spots last last. >>> requestor select. >>> - alternatives := Symbol possibleSelectorsFor: proposedKeyword. >>> - self flag: #toBeFixed. >>> - "alternatives addAll: (MultiSymbol possibleSelectorsFor: >>> proposedKeyword)." >>> >>> + correctSelector _ UnknownSelector name: proposedKeyword. >>> + correctSelector ifNil: [ ^ abortAction value ]. >>> - aStream := WriteStream on: (String new: 200). >>> - aStream nextPutAll: (proposedKeyword contractTo: 35); cr. >>> - firstLine := 1. >>> - alternatives do: >>> - [:sel | aStream nextPutAll: (sel contractTo: 35); nextPut: >>> Character cr]. >>> - aStream nextPutAll: 'cancel'. >>> - lines := Array with: firstLine with: (alternatives size + >>> firstLine). >>> - >>> - choice := (UIManager default >>> - chooseFrom: (aStream contents substrings) >>> - lines: lines >>> - title: 'Unknown selector, please\confirm, correct, or >>> cancel' >>> withCRs). >>> - >>> - (choice = 0) | (choice > (lines at: 2)) >>> - ifTrue: [ ^ abortAction value ]. >>> >>> requestor deselect. >>> requestor selectInvisiblyFrom: userSelection first to: >>> userSelection last. >>> >>> - choice = 1 ifTrue: [ ^ proposedKeyword asSymbol ]. >>> - correctSelector := alternatives at: choice - 1. >>> self substituteSelector: correctSelector keywords wordIntervals: >>> spots. >>> + ((proposedKeyword last ~~ $:) and: [correctSelector last == $:]) >>> ifTrue: [ >>> - ((proposedKeyword last ~= $:) and: [correctSelector last == $:]) >>> ifTrue: [ >>> ^ abortAction value]. >>> ^ correctSelector. >>> ! >>> >>> Item was added: >>> + ----- Method: UnknownSelector>>openMenuIn: (in category 'as yet >>> unclassified') ----- >>> + openMenuIn: aBlock >>> + | alternatives labels lines caption choice | >>> + alternatives _ Symbol possibleSelectorsFor: name. >>> + labels _ Array streamContents: >>> + [:s | s nextPut: name; nextPutAll: >>> alternatives; nextPut: >>> 'cancel']. >>> + lines _ {1. alternatives size + 1}. >>> + caption _ 'Unknown selector, please\confirm, correct, or cancel' >>> withCRs. >>> + >>> + choice _ aBlock value: labels value: lines value: caption. >>> + choice = 0 ifTrue: [self resume: nil]. >>> + choice = 1 ifTrue: [self resume: name asSymbol]. >>> + choice = labels size ifTrue: [self resume: nil]. >>> + self resume: (alternatives at: choice - 1).! >>> >>> Item was added: >>> + ParserNotification subclass: #UnknownSelector >>> + instanceVariableNames: '' >>> + classVariableNames: '' >>> + poolDictionaries: '' >>> + category: 'Compiler-Exceptions'! >>> >>> Item was changed: >>> ----- Method: Parser>>queryUndefined (in category 'error >>> correction') ----- >>> queryUndefined >>> | varStart varName | >>> + varName _ parseNode key. >>> + varStart _ self endOfLastToken + requestorOffset - varName size + >>> 1. >>> - varName := parseNode key. >>> - varStart := self endOfLastToken + requestorOffset - varName size >>> + 1. >>> requestor selectFrom: varStart to: varStart + varName size - 1; >>> select. >>> + (UndefinedVariable name: varName) ifFalse: [^ self fail]! >>> - (UIManager default chooseFrom: #('yes' 'no') title: >>> - ((varName , ' appears to be >>> - undefined at this point. >>> - Proceed anyway?') asText makeBoldFrom: 1 to: varName size)) >>> - = 1 ifFalse: [^ self fail]! >>> >>> Item was added: >>> + ----- Method: CompilerExceptionsTest>>selectFrom:to: (in category >>> 'emulating') ----- >>> + selectFrom: start to: end >>> + ! >>> >>> Item was added: >>> + ----- Method: ParserNotification class>>name: (in category 'as yet >>> unclassified') ----- >>> + name: aString >>> + ^ (self new setName: aString) signal! >>> >>> Item was added: >>> + ----- Method: CompilerExceptionsTest>>testUnknownSelector (in >>> category 'tests') ----- >>> + testUnknownSelector >>> + self >>> + should: >>> + [self class >>> + compile: 'griffle self >>> reallyHopeThisIsntImplementedAnywhere' >>> + notifying: self] >>> + raise: UnknownSelector! >>> >>> Item was changed: >>> ----- Method: Parser>>correctVariable:interval: (in category 'error >>> correction') ----- >>> + correctVariable: proposedVariable interval: spot >>> - correctVariable: proposedVariable interval: spot >>> "Correct the proposedVariable to a known variable, or declare it >>> as a new >>> variable if such action is requested. We support declaring >>> lowercase >>> variables as temps or inst-vars, and uppercase variables as >>> Globals or >>> ClassVars, depending on whether the context is nil >>> (class=UndefinedObject). >>> Spot is the interval within the test stream of the variable. >>> rr 3/4/2004 10:26 : adds the option to define a new class. " >>> >>> - | tempIvar labels actions lines alternatives binding >>> userSelection choice action | >>> - >>> "Check if this is an i-var, that has been corrected already (ugly)" >>> - (encoder classEncoding allInstVarNames includes: >>> proposedVariable) ifTrue: [ >>> - ^InstanceVariableNode new >>> - name: proposedVariable >>> - index: (encoder classEncoding allInstVarNames indexOf: >>> proposedVariable)]. >>> - >>> - "If we can't ask the user for correction, make it undeclared" >>> - self interactive >>> - ifFalse: [ ^encoder undeclared: proposedVariable ]. >>> - >>> - "First check to see if the requestor knows anything about the >>> variable" >>> - tempIvar := proposedVariable first canBeNonGlobalVarInitial. >>> - (tempIvar and: [ (binding := requestor bindingOf: >>> proposedVariable) notNil ]) >>> - ifTrue: [ ^encoder global: binding name: proposedVariable ]. >>> - userSelection := requestor selectionInterval. >>> - requestor selectFrom: spot first to: spot last. >>> - requestor select. >>> - >>> - "Build the menu with alternatives" >>> - labels := OrderedCollection new. actions := OrderedCollection >>> new. lines := OrderedCollection new. >>> - alternatives := encoder possibleVariablesFor: proposedVariable. >>> - tempIvar >>> - ifTrue: [ >>> - labels add: 'declare temp'. >>> - actions add: [ self declareTempAndPaste: >>> proposedVariable ]. >>> - labels add: 'declare instance'. >>> - actions add: [ self declareInstVar: proposedVariable ] ] >>> - ifFalse: [ >>> - labels add: 'define new class'. >>> - actions add: [self defineClass: proposedVariable]. >>> - labels add: 'declare global'. >>> - actions add: [ self declareGlobal: proposedVariable ]. >>> - encoder classEncoding == UndefinedObject ifFalse: [ >>> - labels add: 'declare class variable'. >>> - actions add: [ self declareClassVar: >>> proposedVariable ] ] ]. >>> - lines add: labels size. >>> - alternatives do: [ :each | >>> - labels add: each. >>> - actions add: [ >>> - self substituteWord: each wordInterval: spot offset: 0. >>> - encoder encodeVariable: each ] fixTemps ]. >>> - lines add: labels size. >>> - labels add: 'cancel'. >>> >>> "Display the pop-up menu" >>> + >>> + | tempIvar binding userSelection action | >>> + (encoder classEncoding instVarNames includes: proposedVariable) >>> + ifTrue: >>> + [^(LiteralVariableNode new) >>> + name: proposedVariable >>> + index: (encoder classEncoding >>> instVarNames indexOf: >>> proposedVariable) - 1 >>> + type: 1; >>> + yourself]. >>> + >>> + "If we can't ask the user for correction, make it undeclared" >>> + self interactive ifFalse: [^encoder undeclared: >>> proposedVariable]. >>> + >>> + "First check to see if the requestor knows anything about the >>> variable" >>> + tempIvar := proposedVariable first isLowercase. >>> + (tempIvar and: [(binding := requestor bindingOf: >>> proposedVariable) notNil]) >>> + ifTrue: [^encoder global: binding name: proposedVariable]. >>> + userSelection := requestor selectionInterval. >>> + requestor selectFrom: spot first to: spot last. >>> + requestor select. >>> + >>> + "Build the menu with alternatives" >>> + action := UndeclaredVariable >>> + signalFor: self >>> + name: proposedVariable >>> + inRange: spot. >>> + action ifNil: [^self fail]. >>> - choice := (UIManager default chooseFrom: labels asArray lines: >>> lines asArray >>> - title: 'Unknown variable: ', proposedVariable, ' please >>> correct, or cancel:'). >>> - action := actions at: choice ifAbsent: [ ^self fail ]. >>> >>> "Execute the selected action" >>> requestor deselect. >>> requestor selectInvisiblyFrom: userSelection first to: >>> userSelection last. >>> ^action value! >>> >>> Item was added: >>> + ParserNotification subclass: #UndeclaredVariable >>> + instanceVariableNames: 'parser interval' >>> + classVariableNames: '' >>> + poolDictionaries: '' >>> + category: 'Compiler-Exceptions'! >>> >>> Item was added: >>> + ParserNotification subclass: #UndefinedVariable >>> + instanceVariableNames: '' >>> + classVariableNames: '' >>> + poolDictionaries: '' >>> + category: 'Compiler-Exceptions'! >>> >>> Item was added: >>> + Notification subclass: #ParserNotification >>> + instanceVariableNames: 'name' >>> + classVariableNames: '' >>> + poolDictionaries: '' >>> + category: 'Compiler-Exceptions'! >>> >>> Item was added: >>> + ----- Method: UndeclaredVariable>>openMenuIn: (in category 'as yet >>> unclassified') ----- >>> + openMenuIn: aBlock >>> + | alternatives labels actions lines caption choice | >>> + alternatives := parser possibleVariablesFor: name. >>> + labels := OrderedCollection new. >>> + actions := OrderedCollection new. >>> + lines := OrderedCollection new. >>> + name first isLowercase >>> + ifTrue: >>> + [labels add: 'declare temp'. >>> + actions add: [parser declareTempAndPaste: name]. >>> + labels add: 'declare instance'. >>> + actions add: [parser declareInstVar: name]] >>> + ifFalse: >>> + [labels add: 'define new class'. >>> + actions add: [parser defineClass: name]. >>> + labels add: 'declare global'. >>> + actions add: [parser declareGlobal: name]. >>> + parser canDeclareClassVariable >>> + ifTrue: >>> + [labels add: 'declare class variable'. >>> + actions add: [parser declareClassVar: >>> name]]]. >>> + lines add: labels size. >>> + alternatives do: >>> + [:each | >>> + labels add: each. >>> + actions add: [parser subsituteVariable: each atInterval: >>> interval] fixTemps]. >>> + lines add: labels size. >>> + labels add: 'cancel'. >>> + caption := 'Unknown variable: ' , name , ' please correct, or >>> cancel:'. >>> + choice := aBlock value: labels value: lines value: caption. >>> + self resume: (actions at: choice ifAbsent: [nil])! >>> >>> Item was added: >>> + ----- Method: CompilerExceptionsTest>>select (in category >>> 'emulating') ----- >>> + select >>> + ! >>> >>> Item was added: >>> + ----- Method: Parser>>canDeclareClassVariable (in category 'error >>> correction') ----- >>> + canDeclareClassVariable >>> + ^encoder classEncoding ~~ UndefinedObject! >>> >>> Item was added: >>> + ----- Method: UndefinedVariable>>openMenuIn: (in category 'as yet >>> unclassified') ----- >>> + openMenuIn: aBlock >>> + | labels caption index | >>> + labels _ #('yes' 'no'). >>> + caption _ name, ' appears to be >>> + undefined at this point. >>> + Proceed anyway?'. >>> + >>> + index _ aBlock value: labels value: #() value: caption. >>> + ^ self resume: index = 1! >>> >>> Item was added: >>> + ----- Method: CompilerExceptionsTest>>selectionInterval (in >>> category 'emulating') ----- >>> + selectionInterval >>> + ^ 1 to: 0! >>> >>> Item was added: >>> + ----- Method: CompilerExceptionsTest>>griffle (in category 'as yet >>> unclassified') ----- >>> + griffle | goo |! >>> >>> Item was changed: >>> ----- Method: Parser>>removeUnusedTemps (in category 'error >>> correction') ----- >>> removeUnusedTemps >>> "Scan for unused temp names, and prompt the user about the >>> prospect of removing each one found" >>> >>> | str end start madeChanges | >>> + madeChanges _ false. >>> + str _ requestor text string. >>> - madeChanges := false. >>> - str := requestor text string. >>> ((tempsMark between: 1 and: str size) >>> and: [(str at: tempsMark) = $|]) ifFalse: [^ self]. >>> encoder unusedTempNames do: >>> [:temp | >>> + (UnusedVariable name: temp) ifTrue: >>> - (UIManager default chooseFrom: #('yes' 'no') title: >>> - ((temp , ' appears to be\unused in this method.\OK to >>> remove >>> it?' withCRs) asText makeBoldFrom: 1 to: temp size)) >>> - = 1 >>> - ifTrue: >>> [(encoder encodeVariable: temp) isUndefTemp >>> ifTrue: >>> + [end _ tempsMark. >>> - [end := tempsMark. >>> ["Beginning at right temp marker..." >>> + start _ end - temp size + 1. >>> - start := end - temp size + 1. >>> end < temp size or: [temp = (str copyFrom: start to: >>> end) >>> and: [(str at: start-1) isSeparator & >>> (str at: end+1) >>> isSeparator]]] >>> + whileFalse: >>> + ["Search left for the unused temp" >>> + end _ requestor nextTokenFrom: end direction: >>> -1]. >>> - whileFalse: >>> - ["Search left for the unused temp" >>> - end := requestor nextTokenFrom: end >>> direction: -1]. >>> end < temp size ifFalse: >>> + [(str at: start-1) = $ ifTrue: [start _ >>> start-1]. >>> - [(str at: start-1) = $ ifTrue: [start := >>> start-1]. >>> requestor correctFrom: start to: end with: ''. >>> + str _ str copyReplaceFrom: start to: end with: >>> ''. >>> + madeChanges _ true. >>> + tempsMark _ tempsMark - (end-start+1)]] >>> - str := str copyReplaceFrom: start to: end with: >>> ''. >>> - madeChanges := true. >>> - tempsMark := tempsMark - (end-start+1)]] >>> ifFalse: >>> [self inform: >>> + 'You''ll first have to remove the >>> + statement where it''s stored into']]]. >>> + madeChanges ifTrue: [ParserRemovedUnusedTemps signal]! >>> - 'You''ll first have to remove the\statement where it''s stored >>> into' withCRs]]]. >>> - madeChanges ifTrue: [ReparseAfterSourceEditing signal]! >>> >>> Item was added: >>> + ParserNotification subclass: #UnusedVariable >>> + instanceVariableNames: '' >>> + classVariableNames: '' >>> + poolDictionaries: '' >>> + category: 'Compiler-Exceptions'! >>> >>> Item was added: >>> + ----- Method: CompilerExceptionsTest>>testUndeclaredVariable (in >>> category 'tests') ----- >>> + testUndeclaredVariable >>> + self >>> + should: >>> + [self class >>> + compile: 'griffle ^ goo' >>> + notifying: self] >>> + raise: UndeclaredVariable! >>> >>> Item was added: >>> + ----- Method: UnusedVariable>>openMenuIn: (in category 'as yet >>> unclassified') ----- >>> + openMenuIn: aBlock >>> + | labels caption index | >>> + labels _ #('yes' 'no'). >>> + caption _ name , ' appears to be >>> + unused in this method. >>> + OK to remove it?'. >>> + >>> + index _ aBlock value: labels value: #() value: caption. >>> + self resume: index = 1! >>> >>> Item was added: >>> + ----- Method: CompilerExceptionsTest>>testUndefinedVariable (in >>> category 'tests') ----- >>> + testUndefinedVariable >>> + self >>> + should: >>> + [self class >>> + compile: 'griffle | goo | ^ goo' >>> + notifying: self] >>> + raise: UndefinedVariable! >>> >>> Item was added: >>> + ----- Method: Parser>>subsituteVariable:atInterval: (in category >>> 'error correction') ----- >>> + subsituteVariable: each atInterval: anInterval >>> + self >>> + substituteWord: each >>> + wordInterval: anInterval >>> + offset: 0. >>> + ^encoder encodeVariable: each! >>> >>> Item was added: >>> + ----- Method: CompilerExceptionsTest>>unusedVariableSource (in >>> category 'private') ----- >>> + unusedVariableSource >>> + ^ 'griffle >>> + | goo | >>> + ^ nil'! >>> >>> Item was added: >>> + ----- Method: UndeclaredVariable>>setParser:name:range: (in >>> category 'as yet unclassified') ----- >>> + setParser: aParser name: aString range: anInterval >>> + parser := aParser. >>> + name := aString. >>> + interval := anInterval! >>> >>> Item was added: >>> + ----- Method: CompilerExceptionsTest>>text (in category >>> 'emulating') ----- >>> + text >>> + ^ self unusedVariableSource! >>> >>> Item was added: >>> + ----- Method: Parser>>possibleVariablesFor: (in category 'error >>> correction') ----- >>> + possibleVariablesFor: proposedVariable >>> + ^encoder possibleVariablesFor: proposedVariable! >>> >>> Item was added: >>> + ----- Method: CompilerExceptionsTest>>testUnusedVariable (in >>> category 'tests') ----- >>> + testUnusedVariable >>> + self >>> + should: >>> + [self class >>> + compile: self unusedVariableSource >>> + notifying: self] >>> + raise: UnusedVariable! >>> >>> >> >> >> _______________________________________________ >> Pharo-project mailing list >> [email protected] >> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project > > > _______________________________________________ > Pharo-project mailing list > [email protected] > http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project _______________________________________________ Pharo-project mailing list [email protected] http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
