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
