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!!!
��
--