2015-11-09 14:45 GMT+01:00 Mariano Martinez Peck <[email protected]>:
>
>>
>> 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
>