On Mon, Nov 9, 2015 at 6:07 AM, Thierry Goubier <[email protected]> wrote:
> > > 2015-11-09 6:38 GMT+01:00 Thierry Goubier <[email protected]>: > >> 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 >>> <[email protected] <mailto:[email protected]>> 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? > 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 :) > > 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? > 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
