Hi All, I'm attempting to port some code that works in Pharo 5 to Pharo 6 and have hit a problem when attempting to inspect text.
Inspecting the following: | text | text := Text fromString: 'Hello World'. text addAttribute: (TextAction new actOnClickBlock: [ self halt ]) from: 1 to: 5. text. And then moving the mouse over the text causes the traceback included below in Pharo 6, but is fine in Pharo 5. I think the problem was introduced as part of SLICE-Issue-18901-Highlight-message-send-selector-on-mouse-over-NicolaiHess.4 in RubAbstractTextArea>>mouseMove: where the line: self paragraph move: evt for: model controller: self editor. was added to the start of the method. I'm not familiar with this code, so it would be great if someone (Nicolai? :-)) who has a better understanding of the original intention can offer a suggested fix. Removing the addition appears to resolve the problem, although I expect it introduces other unwanted side effects, and the remainder of the method was also refactored. Thanks! Alistair RubCurrentLineBarDecorator(Object)>>doesNotUnderstand: #move:for:controller: [ super doesNotUnderstand: aMessage ] in RubCurrentLineBarDecorator(RubParagraphDecorator)>>doesNotUnderstand: #move:for:controller: BlockClosure>>cull: Context>>evaluateSignal: Context>>handleSignal: MessageNotUnderstood(Exception)>>signal RubExtraSelectionDecorator(Object)>>doesNotUnderstand: #move:for:controller: [ super doesNotUnderstand: aMessage ] in RubExtraSelectionDecorator(RubParagraphDecorator)>>doesNotUnderstand: #move:for:controller: BlockClosure>>cull: Context>>evaluateSignal: Context>>handleSignal: MessageNotUnderstood(Exception)>>signal RubOpeningClosingDelimiterDecorator(Object)>>doesNotUnderstand: #move:for:controller: [ super doesNotUnderstand: aMessage ] in RubOpeningClosingDelimiterDecorator(RubParagraphDecorator)>>doesNotUnderstand: #move:for:controller: BlockClosure>>cull: Context>>evaluateSignal: Context>>handleSignal: MessageNotUnderstood(Exception)>>signal TextAction(Object)>>doesNotUnderstand: #actOnMove:for:in:editor: [ :attribute | | target | "evaluate the attribute action" target := model ifNil: [ textArea ]. (attribute actOnMove: anEvent for: target in: self editor: editor) == true ifTrue: [ ^ true ] ] in RubParagraph>>move:for:controller: BlockClosure>>cull: BlockClosure>>cull:cull: [ :attribute | | range boxes | "find the boxes for the current attribute range" range := self text rangeOf: attribute startingAt: startBlock stringIndex. boxes := self selectionRectsFrom: (self characterBlockForIndex: range first) to: (self characterBlockForIndex: range last + 1). (boxes detect: [ :each | each containsPoint: aClickPoint ] ifNone: [ nil ]) ifNotNil: [ aBlock cull: attribute cull: boxes ] ] in RubParagraph>>actionAttributesUnder:event:do: Array(SequenceableCollection)>>select:thenDo: RubParagraph>>actionAttributesUnder:event:do: RubParagraph>>move:for:controller: Message>>sendTo: [ aMessage sendTo: next ] in RubOpeningClosingDelimiterDecorator(RubParagraphDecorator)>>doesNotUnderstand: #move:for:controller: BlockClosure>>on:do: RubOpeningClosingDelimiterDecorator(RubParagraphDecorator)>>doesNotUnderstand: #move:for:controller: Message>>sendTo: [ aMessage sendTo: next ] in RubExtraSelectionDecorator(RubParagraphDecorator)>>doesNotUnderstand: #move:for:controller: BlockClosure>>on:do: RubExtraSelectionDecorator(RubParagraphDecorator)>>doesNotUnderstand: #move:for:controller: Message>>sendTo: [ aMessage sendTo: next ] in RubCurrentLineBarDecorator(RubParagraphDecorator)>>doesNotUnderstand: #move:for:controller: BlockClosure>>on:do: RubCurrentLineBarDecorator(RubParagraphDecorator)>>doesNotUnderstand: #move:for:controller: RubEditingArea(RubAbstractTextArea)>>mouseMove: RubEditingArea>>mouseMove: RubEditingArea(RubAbstractTextArea)>>handleMouseMove: MouseMoveEvent>>sentTo: RubEditingArea(Morph)>>handleEvent: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: RubEditingArea(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: TransformWithLayoutMorph(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: RubTextScrollPane(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: RubScrolledTextMorph(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: PanelMorph(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: LazyTabGroupMorph(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: PanelMorph(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: PanelMorph(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: LazyTabGroupMorph(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: PanelMorph(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: GLMMorphBrick(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: GLMScrollPaneBandBrick(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: GLMPagerScrollBrick(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: GLMPagerBrick(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: GLMFoundationBrick(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: GLMSystemWindow(Morph)>>processEvent:using: MorphicEventDispatcher>>dispatchDefault:with: MorphicEventDispatcher>>handleMouseMove: MouseMoveEvent>>sentTo: [ ^ anEvent sentTo: self ] in MorphicEventDispatcher>>dispatchEvent:with: BlockClosure>>ensure: MorphicEventDispatcher>>dispatchEvent:with: WorldMorph(Morph)>>processEvent:using: WorldMorph(Morph)>>processEvent: HandMorph>>sendEvent:focus:clear: HandMorph>>sendMouseEvent: HandMorph>>handleEvent: HandMorph>>processEventsFromQueue: HandMorph>>processEvents [ :h | self activeHand: h. h processEvents. self activeHand: nil ] in WorldState>>doOneCycleNowFor: Array(SequenceableCollection)>>do: WorldState>>handsDo: WorldState>>doOneCycleNowFor: WorldState>>doOneCycleFor: WorldMorph>>doOneCycle WorldMorph class>>doOneCycle [ [ WorldMorph doOneCycle. Processor yield. false ] whileFalse: [ ] ] in MorphicUIManager>>spawnNewProcess [ self value. Processor terminateActive ] in BlockClosure>>newProcess