Compare this which is like old squeak selectionAsStream

SmalltalkEditor>>selectionForDoitAsStream
        ^ ReadWriteStream
                on: self string
                from: self startIndex
                to: self stopIndex - 1

and this which has been changed conforming to Cuis

TextEditor>>selectionAsStream
        "Answer a ReadStream on the text in the paragraph that is currently
        selected."

        ^ReadStream
                on: (self string copyFrom: self startIndex to: self stopIndex - 
1)

(or self selection asString readStream)
The two differ.
The former stream position starts at editor startIndex - 1, while the
later stream position starts at 0.
The stream position is used by the Compiler/Parser for notifying the
SmalltalkEditor (or TextMorph) requestor.

Now look at SmalltalkEditor>>notify: aString at: anInteger in: aStream
        "The compilation of text failed. The syntax error is noted as the 
argument,
        aString. Insert it in the text at starting character position 
anInteger."

        | pos |
        pos := self selectionInterval notEmpty
                ifTrue: [self startIndex + anInteger - 1 ]
                ifFalse: [anInteger].
        self insertAndSelect: aString at: (pos max: 1)

You see that it adds (startIndex - 1) to the error message insertion
position which is a Cuis change.
(The old ParagraphEditor did not).

When #notify:at:in: is used for evaluating #selectionAsStream, all is
OK, the (startIndex - 1) is added only once.
But when it is used with #selectionForDoitAsStream, the offset is
counted twice (because already in the stream location passed in
anInteger parameter).

I guess the hack #selectionForDoitAsStream that undo the Cuis clean-up
has been added because some other part of Parser/Encoder/Compiler is
messing with the requestor selection (like highlighting some part of
the source for user interaction in case of ambiguity).
Tthis is not a valid workaround.

In Squeak, I did revert the Cuis clean-up just to keep some simple
compatibility with ParagraphEditor, but Pharo does not care about
that, so it should apply full simplification.
I suggest removing #selectionForDoitAsStream, and replace senders with
#selectionAsStream.
Then if there are some other feature broken we'll fix'em.
OK?

Nicolas

Reply via email to