[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
|