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

Reply via email to