2015-11-09 13:58 GMT+01:00 Mariano Martinez Peck <marianop...@gmail.com>:

>
>
> On Mon, Nov 9, 2015 at 6:07 AM, Thierry Goubier <thierry.goub...@gmail.com
> > wrote:
>
>>
>>
>> 2015-11-09 6:38 GMT+01:00 Thierry Goubier <thierry.goub...@gmail.com>:
>>
>>> Hi Mariano,
>>>
>>> Le 09/11/2015 01:13, Mariano Martinez Peck a écrit :
>>>
>>>>
>>>>
>>>> On Fri, Nov 6, 2015 at 1:59 PM, Mariano Martinez Peck
>>>> <marianop...@gmail.com <mailto:marianop...@gmail.com>> wrote:
>>>>
>>>> ...
>>>
>>>>
>>>> Hi Thierry,
>>>>
>>>> I am trying to achieve a similar case like the one I commented in this
>>>> post but I am unable to find the way.
>>>> Previously I wanted to replace say the literal #oldSelector to
>>>> #newSelector. Now,  I need to use regular expressions. I mean, I would
>>>> need to find matches of '*oldSelector*' and do the replace with
>>>> 'newSelector'. For example,  the search may find
>>>> '*pre*oldSelector*post*' and I want it to be replaced by
>>>> '*pre*newSelector*post'. *And of course, I don't know in advance what
>>>> pre and post strings there could be.
>>>>
>>>
>>> What you need to do there is to use a match block after the @selector
>>>
>>> `{:node | node selector matches: '.*oldSelector.*'}
>>>
>>> Which would mean that your patterns become:
>>>
>>> rewriter
>>>         replace: '``@object `oldSelector {:node | node selector matches:
>>> '.*oldSelector.*'}'
>>>         with: '``@object `newSelector {:node | node selector }'.
>>>
>>
>
> OK, thanks for the explanation.
>
>
>
>>
>>> Wait, not entirely sure. I think you need to add a dictionary in the
>>> block to give the with: argument the pre and post string. And I'm not sure
>>> about the regular expression above as well.
>>>
>>> I need to have access to the SmaCC code source, so I'll answer to you a
>>> bit later.
>>
>>
>> Ok, here is a first try that make a change pre and post included:
>>
>> | tree |
>> RBParseTreeRewriter new
>> replace: '`@object `oldSelector `{:node | node selector asString
>> matchesRegex: ''.*oldSelector.*''}'
>> with: '`@object newSelector';
>> executeTree:
>> (tree := RBParser
>> parseMethod:
>> 'DoIt ^ [:proxy |
>> proxy at: #oldSelector.
>> proxy preoldSelector.
>> proxy oldSelectorAnotherMethod.
>> proxy do: ''oldSelectorAndSomething''.
>> "a comment with #oldSelector  "
>> ]').
>> tree newSource
>>
>> But it does not replace yet the right selector.
>>
>
>
> Yes, this one replaced both #oldSelector and #preoldSelector to
> #newSelector right?
>
>
>
>> For that, I will recreate a message send:
>>
>> | tree |
>> RBParseTreeRewriter new
>> replace: '`object `oldSelector `{:node | node selector asString
>> matchesRegex: ''.*oldSelector.*''} `@args'
>> with: '`{RBMessageNode receiver: `object selector: (`oldSelector selector
>> copyReplaceAll: ''oldSelector'' with: ''newSelector'') asSymbol arguments:
>> `@args}';
>> executeTree:
>> (tree := RBParser
>> parseMethod:
>> 'DoIt ^ [:proxy |
>> proxy at: #oldSelector.
>> proxy preoldSelector.
>> proxy oldSelectorAnotherMethod.
>> proxy do: ''oldSelectorAndSomething''.
>> "a comment with #oldSelector  "
>> ]').
>> tree newSource
>>
>>
>
> Thanks Thierry for your efforts. Very much appreciated.
> I tried the above but still did not work. I executed the very same example
> of yours (I pasted it) but the #newSource was:
>
> DoIt ^ [:proxy |
> proxy at: #oldSelector.
> proxy preoldSelector.
> proxy oldSelectorAnotherMethod.
> proxy do: 'oldSelectorAndSomething'.
> "a comment with #oldSelector  "
> ]
>
> I am trying in Pharo 4.0. And you?
>

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.


>
>> Now, I haven't tested with arguments on the message.
>>
>
> Yes..that's a different story. But for the time being, I can live without
> that :)
>

I'm trying it, but I end up in a subscriptOutOfBounds: error :(


>
>
>>
>> Look how you can use pattern variables inside the blocks :)
>>
>> This is very cool and extremely powerfull.
>>
>>
> Yes, I saw it. I wasn't aware of that. Super powerful but I think it has
> some learning curve to master it, right?
>

Me too... Time to ask for some help.

Thierry


>
>
>> Thierry
>>
>>
>>
>>
>>>
>>>
>>>
>>>> Also..do you know where can I find some more info about RB? For example,
>>>> if I read this:
>>>>
>>>> rewriter
>>>> replace: '``@object ' , oldSeletor
>>>> with: '``@object ' , newSelector.
>>>>
>>>> Where can I read that  ``@object   means XXX ..  ?
>>>>
>>>
>>> There is a first level of explanation in the Pharo for the Enterprise
>>> book; but, yes the pattern language is fairly complex.
>>>
>>> Are you going to Smalltalks? John Brant is there and will give a talk on
>>> RB and SmaCC (two talks, I believe).
>>>
>>> Thierry
>>>
>>>
>>> Thanks in advance!
>>>>
>>>>
>>>>
>>>>         Or a cascade: a RBParseTreeSearcher which matches blocks; on
>>>>         each block node you activate a rewriter.
>>>>
>>>>         However, there is an issue in rewriting blocks contents, because
>>>>         it supposes that the method defining the block is recompiled;
>>>>         it's significantly harder to make changes to the code of live
>>>>         blocks (change the bytescode itself? What if the block has
>>>>         multiples instances?).
>>>>
>>>>         Thierry
>>>>
>>>>
>>>>             If not, I think my easiest path is to automatically compile
>>>>             dummy/temporal  classes/methods from the rules, perform the
>>>>             refactor, then move source from methods to block closures,
>>>>             and finally remove created classes.
>>>>
>>>>             Any pointer is appreciated.
>>>>
>>>>             best,
>>>>
>>>>             --
>>>>             Mariano
>>>>             http://marianopeck.wordpress.com
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>     --
>>>>     Mariano
>>>>     http://marianopeck.wordpress.com
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Mariano
>>>> http://marianopeck.wordpress.com
>>>>
>>>
>>>
>>
>
>
> --
> Mariano
> http://marianopeck.wordpress.com
>

Reply via email to