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