I've never really learned the rewrite tool but while waiting for changes to
propagate through P12, I thought maybe I could use it to safely patch changes
until there are official updates (and it was a good chance to get more familiar
with it).
I thought there was more documentation available for how it works (interested
in any old articles - but the online help in P12 is ok - although it doesn't
display in markdown - in fact give there is markdown support now - I am a bit
confused what should appear more readable these days - and how to
fix/contribute changes to help).
This aside - I wanted to patch the SystemWindow>>taskbarButtonMenu: (and add my
fix to move tabs to any position).
I started writing the following search expression - the find the last call to
#addToggle:... method call that has a literal referencing #canBeMovedRight - as
I want to add my new menu item after it.
e.g.
moveSubmenu `@addToggle: `{ :node | node isLiteralNode and: [ node value =
#canBeMovedToRight] }
but I'm not sure my {} filter block is ever called, as the above matches both
addToggle:... calls, and not the one I'm after? I don't understand this - any
have ideas on the proper syntax for generic matching?
Anyway - I decided that in my case there is only one - so I can match it
explicitly and so I search on the full call:
and I entered this:
moveSubmenu
addToggle: 'Move right' translated
target: self
selector: #taskbarMoveRight
getStateSelector: nil
enablementSelector: #canBeMovedToRight.
Which matches exactly - then I want to replace the single statement with 2
statements e.g.
moveSubmenu
addToggle: 'Move right' translated
target: self
selector: #taskbarMoveRight
getStateSelector: nil
enablementSelector: #canBeMovedToRight.
moveSubmenu
addToggle: 'Move to' translated
target: self
selector: #taskbarMoveTo
getStateSelector: nil.
However this gives an error in the rewrite tool (actually it results in a zero
change, that then gives an error for EpMonitor).
But my question is - why can't you rewrite a single statement to multiple ones?
I have noticed that in this case I can cascade the message send - and this then
rewrites properly - so it looks like it wants to replace a single node with a
single node.
If I couldn't cascade - It seems I would have to rewrite with something like: [
"put multiple expressions here" ] value.
This seems an odd choice - but am I missing something obvious?
Do you have to do what I'm proposing in 2 steps - rewrite to a block (or some
equivalent) and then a 2nd rewrite to simplify the expression (like a refactor
step) - so its more provably correct?
I'm just curious on this - as it seemed time to learn this properly?
Tim