class Parser::TreeRewriter

{Parser::TreeRewriter} offers a basic API that makes it easy to rewrite existing ASTs. It’s built on top of {Parser::AST::Processor} and {Parser::Source::TreeRewriter}

For example, assume you want to remove ‘do` tokens from a while statement. You can do this as following:

require 'parser/current'

class RemoveDo < Parser::TreeRewriter
  def on_while(node)
    # Check if the statement starts with "do"
    if node.location.begin.is?('do')
      remove(node.location.begin)
    end
  end
end

code = <<-EOF
while true do
  puts 'hello'
end
EOF

ast           = Parser::CurrentRuby.parse code
buffer        = Parser::Source::Buffer.new('(example)', source: code)
rewriter      = RemoveDo.new

# Rewrite the AST, returns a String with the new form.
puts rewriter.rewrite(buffer, ast)

This would result in the following Ruby code:

while true
  puts 'hello'
end

Keep in mind that {Parser::TreeRewriter} does not take care of indentation when inserting/replacing code so you’ll have to do this yourself.

See also [a blog entry](whitequark.org/blog/2013/04/26/lets-play-with-ruby-code/) describing rewriters in greater detail.

@api public