sanemat / ruby-parser-book

2 stars 0 forks source link

AST to AST #9

Open sanemat opened 9 years ago

sanemat commented 9 years ago

AST to ASTをすると、parserのレールに乗れなくなるっぽい

code = <<-EOF
# comment 1
gem 'action_args'
source 'https://rubygems.org'

ruby '2.1.2' # comment 2
EOF

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

class SourceProcessor < Parser::AST::Processor
  def initialize
  end

  def on_begin(node)
    node.updated(:begin, node.children.sort_by{|child| child.children[1]})
  end
end

processor = SourceProcessor.new
rewrited_ast = processor.process(ast)
puts Unparser.unparse(rewrited_ast)

#=>
gem("action_args")
ruby("2.1.2")
source("https://rubygems.org")

unparser使うといちおうrubyのコードが出力できた。

sanemat commented 9 years ago

試してみたこと unparserなしに、空のrewriteもしくはParser::Rewriterそのまま使うでrewriteしてみれば、そのASTから新しいrubyコードが出せるのでは? ソースも要るので使えなかった。 => 一番初めのASTとsourceも準備すればいけるのでは。あとでやってみる。

sanemat commented 9 years ago

unparser使った時のコメントの場所の維持がAST to ASTしてしまうと使えない。commentのastのlocation(?)も書き換える必要がありそうだけど、どうやって…

sanemat commented 9 years ago

unparserの出力をもう一度rewriteってバカっぽいけど、手持ちの知識だとそれぐらいか。

sanemat commented 9 years ago

うまくいかない例

rewrited_ast = processor.process(ast)
new_buffer = Parser::Source::Buffer.new('(new)')
new_buffer.source = code
new_source = rewriter.rewrite(new_buffer, rewrited_ast)
puts new_source