I think that we hacked too much :). I like how ParsetreeRewriter is working, 
but I think that it would be nice to have some API to say: ok, I have this 
node, now I want to replace it (maybe it should generate a new changed tree), 
so the pattern syntax would be more of a nice interface instead of a single 
entry point.

Anyway, I also think that this substitution without reformatting is really 
cool. I need to double check it, because I think that many uses do not use auto 
fix from lint rules because it reformats their code.

Cheers.
Uko

> On 23 Jan 2017, at 16:28, John Brant <[email protected]> wrote:
> 
> 
> 
> On 01/23/2017 07:48 AM, Yuriy Tymchuk wrote:
>> Hi everyone,
>> 
>> does anyone have a better knowledge about replacing nodes in AST? Because 
>> what I saw is that there are methods like replaceSourceWith: that can be 
>> sent to an AST node with another AST node as a parameter. But this is not 
>> enough to get a new source code. Because when you ask the AST for newSource 
>> it generates a new source by taking replacements into account, parses the 
>> new source, compares it with itself and in case the new parse tree is equal 
>> it returns the new source. So it’s not enough to just use replaceSourceWith: 
>> but you also have to replace the current node with a new one it AST.
>> 
>> Now the question is: am I doing something wrong, or we have strange API 
>> because we need to replace both source and node, replacing only one of them 
>> does not work…
> 
> 
> This code was created so that some refactoring could be performed without 
> having to format the entire parse tree. For example, converting direct 
> variable access to use accessors should be able to rewrite the code without 
> having to reformat.
> 
> When you perform the replaceWith: on a node or the rewriter performs a node 
> replacement, it calls the replaceMethodSource: method. That method calls the 
> replaceSourceWith: method (replaceSourceWith: is a "private" method). The 
> replaceSourceWith: methods test the source/replacement nodes for certain 
> patterns. If the replacement fits the condition of the pattern, then it adds 
> the appropriate text edit operations that should transform the old source 
> into the new source. If the replaceSourceWith: doesn't recognize what is 
> being done, then it dispatches the replaceSourceFrom: message to the 
> replacement node. Currently, this handles cases were any section of code is 
> being replaced with a variable or literal.
> 
> Anyway, after all replacements are performed, it gets the new source like you 
> explain. It performs a sanity check on the edited source. If it isn't parse 
> tree equivalent to the rewritten tree, then it assumes that something went 
> wrong in a replaceSourceWith: or replaceSourceFrom: method and uses the 
> formatted code of the rewritten tree instead.
> 
> 
> John Brant
> 


Reply via email to