[squeak-dev] The Trunk: Compiler-nice.427.mcz

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Fri May 8 18:59:57 UTC 2020


Hi Christoph,
yes, I see that now, you were on the same track a bit sooner.
I did not want to correct anything, just simplify the accumulated cruft
that prevents me finding a bug, so we came on the same track by 2 different
paths.
It's funny, I first considered introducing exactly that
selectFrom:to:during: but on the editor side, which was not a so great idea
and made me renounce for a simpler change. I still like it at Parser side,
it could help factoring some more code (and explanation about why we need
to select invisibly).

Le ven. 8 mai 2020 à 19:12, Thiede, Christoph <
Christoph.Thiede at student.hpi.uni-potsdam.de> a écrit :

> Hi Nicolas,
>
>
> I did not yet study your full commit, but this introduces a conflict with Compiler-ct.423
> from the Inbox. See also Morphic-ct.1640 and Tests-ct.429, both still in
> the Inbox. Would be nice if someone could review them before the merge
> conflicts get even worse. :-)
>
>
> Best,
>
> Christoph
> ------------------------------
> *Von:* Squeak-dev <squeak-dev-bounces at lists.squeakfoundation.org> im
> Auftrag von commits at source.squeak.org <commits at source.squeak.org>
> *Gesendet:* Freitag, 8. Mai 2020 18:59:56
> *An:* squeak-dev at lists.squeakfoundation.org;
> packages at lists.squeakfoundation.org
> *Betreff:* [squeak-dev] The Trunk: Compiler-nice.427.mcz
>
> Nicolas Cellier uploaded a new version of Compiler to project The Trunk:
> http://source.squeak.org/trunk/Compiler-nice.427.mcz
>
> ==================== Summary ====================
>
> Name: Compiler-nice.427
> Author: nice
> Time: 8 May 2020, 6:59:54.689381 pm
> UUID: e2c7d4b2-b79d-4d02-a576-872003ec88ed
> Ancestors: Compiler-ct.426
>
> Avoid sending select/deselect to the editor in case of interactive
> correction.
>
> These are st80 specific, forcing Morphic to have stubs, and are considered
> too intrusive: we should better let such responsibility to the editor,
> that's its own business.
>
> The send of #select was un-necessary anyway, because selectFrom:to: will
> send #selectAndScroll, which will send #select.
>
> However, deselect was still required for st80, so replace the sequence
> deselect; selectInvisiblyFrom:to: with a single message
> #selectIntervalInvisibly: which is provided by ST80-nice.254 and
> Morphic-nice.1657.
>
> Why is this needed? As explained in the st80 commit, we want to restore
> the (eventually slightly modified) user selection once the corrections are
> performed.
>
> We must do that at each correction, so as to correctly track addition or
> delection of characters (the selection interval might need to grow or
> shrink accordingly).
>
> But we do not want to make the user selection visible instantly, otherwise
> the selection will go back to user selection and forth to next zone of
> interactive correction repeatedly creating an annoying flashing effect.
>
> Care to let future reader know about it with a comment, there's nothing
> that obvious which could make the comment superfluous!
>
> =============== Diff against Compiler-ct.426 ===============
>
> Item was changed:
>   ----- Method: Parser>>ambiguousSelector:inRange: (in category 'error
> correction') -----
>   ambiguousSelector: aString inRange: anInterval
> +        | correctedSelector userSelection intervalWithOffset |
> -        | correctedSelector userSelection offset intervalWithOffset |
>
>          self interactive ifFalse: [
>                  "In non interactive mode, compile with backward
> comapatibility: $- is part of literal argument"
>                  Transcript cr; store: encoder classEncoding;
> nextPutAll:#'>>';store: encoder selector; show: ' would send ' , token ,
> '-'.
>                  ^super ambiguousSelector: aString inRange: anInterval].
>
>          "handle the text selection"
>          userSelection := cue requestor selectionInterval.
>          intervalWithOffset := anInterval first + requestorOffset to:
> anInterval last + requestorOffset.
>          cue requestor selectFrom: intervalWithOffset first to:
> intervalWithOffset last.
> -        cue requestor select.
>
>          "Build the menu with alternatives"
>          correctedSelector := AmbiguousSelector
>                          signalName: aString
>                          inRange: intervalWithOffset.
>          correctedSelector ifNil: [^self fail].
>
> +        "Restore the user selection state, but do not display selection
> yet
> +         This will avoid flashing effect when chaining multiple
> corrections."
> +        cue requestor selectIntervalInvisibly: userSelection.
> +
>          "Execute the selected action"
> +        self substituteWord: correctedSelector wordInterval:
> intervalWithOffset offset: 0.
> -        offset := self substituteWord: correctedSelector wordInterval:
> intervalWithOffset offset: 0.
> -        cue requestor deselect.
> -        cue requestor selectInvisiblyFrom: userSelection first to:
> userSelection last + offset.
>          token := (correctedSelector readStream upTo: Character space)
> asSymbol!
>
> 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 |
>          "If we can't ask the user, assume that the keyword will be
> defined later"
>          self interactive ifFalse: [^proposedKeyword asSymbol].
>
>          userSelection := cue requestor selectionInterval.
>          cue requestor selectFrom: spots first first to: spots last last.
> -        cue requestor select.
>
>          correctSelector := UnknownSelector name: proposedKeyword.
>          correctSelector ifNil: [^abortAction value].
>
> +        "Restore the user selection state, but do not display selection
> yet
> +         This will avoid flashing effect when chaining multiple
> corrections."
> +        cue requestor selectIntervalInvisibly: userSelection.
> -        cue requestor deselect.
> -        cue requestor selectInvisiblyFrom: userSelection first to:
> userSelection last.
>
>          self substituteSelector: correctSelector keywords wordIntervals:
> spots.
>          ^(proposedKeyword last ~~ $:
>             and: [correctSelector last == $:])
>                  ifTrue: [abortAction value]
>                  ifFalse: [correctSelector]!
>
> Item was changed:
>   ----- Method: Parser>>correctVariable:interval: (in category 'error
> correction') -----
>   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. "
>
>          "Check if this is an i-var, that has been corrected already
> (ugly)"
>
>          "Display the pop-up menu"
>
>          | binding userSelection action |
>          (encoder classEncoding instVarNames includes: proposedVariable)
> ifTrue:
>                  [^InstanceVariableNode new
>                          name: proposedVariable
>                          index: (encoder classEncoding allInstVarNames
> indexOf: proposedVariable)].
>
>          "First check to see if the requestor knows anything about the
> variable"
>          (binding := cue requestor ifNotNil: [:object | object bindingOf:
> proposedVariable])
>                  ifNotNil: [^encoder global: binding name:
> proposedVariable].
>
>          "If we can't ask the user for correction, make it undeclared"
>          self interactive ifFalse: [^encoder undeclared: proposedVariable].
>
>          userSelection := cue requestor selectionInterval.
>          cue requestor selectFrom: spot first to: spot last.
> -        cue requestor select.
>
>          "Build the menu with alternatives"
>          action := UndeclaredVariable
>                                  signalFor: self
>                                  name: proposedVariable
>                                  inRange: spot.
>          action ifNil: [^self fail].
>
> +        "Restore the user selection state, but do not display selection
> yet
> +         This will avoid flashing effect when chaining multiple
> corrections."
> +        cue requestor selectIntervalInvisibly: userSelection.
> +
>          "Execute the selected action"
> -        cue requestor deselect.
> -        cue requestor selectInvisiblyFrom: userSelection first to:
> userSelection last.
>          ^action value!
>
> Item was changed:
>   ----- Method: Parser>>queryUndefined (in category 'error correction')
> -----
>   queryUndefined
>          | varStart varName |
>          varName := parseNode key.
>          varStart := self endOfLastToken + requestorOffset - varName size
> + 1.
> +        cue requestor selectFrom: varStart to: varStart + varName size -
> 1.
> -        cue requestor selectFrom: varStart to: varStart + varName size -
> 1; select.
>          (UndefinedVariable name: varName) ifFalse: [^ self fail]!
>
> Item was changed:
>   ----- Method: Parser>>substituteSelector:wordIntervals: (in category
> 'error correction') -----
>   substituteSelector: selectorParts wordIntervals: spots
> +        "Substitute the correctSelector into the (presumed interactive)
> receiver."
> -        "Substitute the correctSelector into the (presuamed interactive)
> receiver."
>          | offset |
>          offset := 0.
>          selectorParts with: spots do:
>                  [ :word :interval |
>                  offset := self substituteWord: word wordInterval:
> interval offset: offset ]
>   !
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20200508/ef49f905/attachment.html>


More information about the Squeak-dev mailing list