Skip to content

Instantly share code, notes, and snippets.

@a2ikm
Last active December 15, 2020 06:02
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save a2ikm/746441beab71a4e1dce4720966429cc6 to your computer and use it in GitHub Desktop.
Save a2ikm/746441beab71a4e1dce4720966429cc6 to your computer and use it in GitHub Desktop.
Replace included module with parser gem
$ cat mongo_mapper.rb
$ cat mongo_mapper.rb | ruby rewrite.rb
class Foo
  include Mongoid::Document

  key :name, String
end
class Foo
include MongoMapper::Document
key :name, String
end
require "bundler/inline"
gemfile do
source "https://rubygems.org"
gem "parser", require: "parser/current"
end
class Rewriter < Parser::TreeRewriter
def on_send(node)
# Given `foo.bar(...)`,
# receiver -> :foo
# method_name -> :bar
# *args -> [...]
receiver, method_name, *args = node.children
# include Mongoid::Document
# ~~~~~~~~~~~~~~~~~~~~~~~~~ node.loc.expression
# ~~~~~~~~~~~~~~~~~ args[0].loc.expression
if receiver == nil && method_name == :include && args.size == 1 && args[0].loc.expression.source == "MongoMapper::Document"
replace(node.loc.expression, "include Mongoid::Document")
end
super
end
end
source = $stdin.read
buffer = Parser::Source::Buffer.new("(stdin)")
buffer.source = source
ast = Parser::CurrentRuby.parse(source)
puts Rewriter.new.rewrite(buffer, ast)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment