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 }'. > > 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. 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 Now, I haven't tested with arguments on the message. Look how you can use pattern variables inside the blocks :) This is very cool and extremely powerfull. 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 >> > >
