Thierry, I have a last question. My last requirement will basically be to find ANY node that would match the regex *oldSelector* and rename it to *newSelector* being that.. a literal string, a literal symbol, a message send, a tempVar name, a comment, etc... I guess there is a simpler way that defining rewrite for each type of node right? I can always do a "(methodSource substrings detect: [:each | each matches: '*oldSelector'] ifNone: [#()] ) each2: [:each2 | copReplace. .... ] but RB is probably better. Any clues in this last requirement? On Mon, Nov 9, 2015 at 11:01 AM, Thierry Goubier <thierry.goubier@gmail.com> wrote:
2015-11-09 14:45 GMT+01:00 Mariano Martinez Peck <marianopeck@gmail.com>:
Pharo 4.0 as well. I made a mistake in my example :(, so I'm adding more test cases to check ;).
| tree | RBParseTreeRewriter new replace: '``@object `oldSelector `{:node | node selector asString matchesRegex: ''.*oldSelector.*''}' with: '`{RBMessageNode receiver: ``@object selector: (`oldSelector copyReplaceAll: ''oldSelector'' with: ''newSelector'') asSymbol arguments: #()}'; executeTree: (tree := RBParser parseMethod: 'DoIt ^ [:proxy | proxy at: #oldSelector. proxy preoldSelector. self preoldSelector oldSelectorPost. proxy preoldSelector: proxy. proxy oldSelectorAnotherMethod. proxy do: ''oldSelectorAndSomething''. "a comment with #oldSelector " ]'). tree newSource.
Thanks, that worked much better!
Here you have a much larger example/test:
| rewriter tree oldSeletor newSelector | "closure method sourceCode" tree := RBParser parseMethod: 'DoIt ^ [:proxy | | oldSelector oldSelectorsuffix prefixoldSelector prefixoldSelectorSuffix | oldSelector := 1. oldSelectorsuffix := 1. prefixoldSelector := 1. prefixoldSelectorSuffix := 1. proxy at: #oldSelector. proxy at: #oldSelectorSuffix. proxy at: #prefixoldSelector. proxy at: #prefixoldSelectorSuffix. proxy oldSelector. proxy oldSelectorSuffix. proxy prefixoldSelector. proxy prefixoldSelectorSuffix. proxy do: ''oldSelector''. proxy do: ''oldSelectorSuffix''. proxy do: ''prefixoldSelector''. proxy do: ''prefixoldSelectorSuffix''. "a comment with #oldSelector " "a comment with #oldSelectorSuffix " "a comment with #prefixoldSelector " "a comment with #prefixoldSelectorSuffix " ]'. oldSeletor := #oldSelector. newSelector := #newSelector.
rewriter := RBParseTreeRewriter new replace: '``@object `oldSelector `{:node | node selector asString matchesRegex: ''.*oldSelector.*''}' with: '`{RBMessageNode receiver: ``@object selector: (`oldSelector copyReplaceAll: ''oldSelector'' with: ''newSelector'') asSymbol arguments: #()}'.
rewriter executeTree: tree. tree newSource
I think I only miss the literal ones (for example proxy at: #oldSelector and the rest) which previously were catched by " RBParseTreeRewriter replaceLiteral: oldSeletor with: newSelector. "
Yes, I didn't focus on this one. Didn't understood why it was there :)
Something like, for the match: '`#aLiteral {:node | node value isSymbol and: [node value matchesRegex: '.*oldSelector.*'] }'
I think it could be simplified; the #copyReplaceAll: probably works just all well on all message sends.
RBParseTreeRewriter new replace: '``@object `oldSelector' with: '`{RBMessageNode receiver: ``@object selector: (`oldSelector copyReplaceAll: ''oldSelector'' with: ''newSelector'') asSymbol arguments: #()}';
I guess I can apply a similar logic for with the regex. I will see if I can came up with that. If you happen to know how ;););)
Yes, I will go to Smalltalks and I will give a talk. So I will ask him if there are remaining questions! BTW, later on today I will send you an screenshot to show you where you helped me :)
Cool! Lucky you. Have fun :)
Thierry
Thanks!!!
-- Mariano http://marianopeck.wordpress.com
-- Mariano http://marianopeck.wordpress.com