class Metamorpher::Drivers::Ruby
Public Instance Methods
parse(src)
click to toggle source
# File lib/metamorpher/drivers/ruby.rb, line 9 def parse(src) import(@root = parser.parse(src)) rescue Parser::SyntaxError raise ParseError end
source_location_for(literal)
click to toggle source
# File lib/metamorpher/drivers/ruby.rb, line 19 def source_location_for(literal) ast = ast_for(literal) (ast.loc.expression.begin_pos..(ast.loc.expression.end_pos - 1)) end
unparse(literal)
click to toggle source
# File lib/metamorpher/drivers/ruby.rb, line 15 def unparse(literal) unparser.unparse(export(literal)) end
Private Instance Methods
ast_for(literal)
click to toggle source
# File lib/metamorpher/drivers/ruby.rb, line 65 def ast_for(literal) literal.path.reduce(@root) { |a, e| a.children[e] } end
create_literal_for(ast)
click to toggle source
# File lib/metamorpher/drivers/ruby.rb, line 30 def create_literal_for(ast) if ast.respond_to? :type Terms::Literal.new(name: ast.type, children: ast.children.map { |c| import(c) }) else Terms::Literal.new(name: ast) end end
export(literal)
click to toggle source
# File lib/metamorpher/drivers/ruby.rb, line 38 def export(literal) if literal.branch? Parser::AST::Node.new(literal.name, literal.children.map { |c| export(c) }) elsif keyword?(literal) # Unparser requires leaf nodes containing keywords to be represented as nodes. Parser::AST::Node.new(literal.name) else # Unparser requires all other leaf nodes to be represented as primitives. literal.name end end
import(ast)
click to toggle source
# File lib/metamorpher/drivers/ruby.rb, line 26 def import(ast) create_literal_for(ast) end
keyword?(literal)
click to toggle source
# File lib/metamorpher/drivers/ruby.rb, line 52 def keyword?(literal) literal.leaf? && !literal.child_of?(:sym) && keywords.include?(literal.name) end
keywords()
click to toggle source
# File lib/metamorpher/drivers/ruby.rb, line 56 def keywords # The symbols used by Parser for Ruby keywords. The current implementation # is not a definitive list. If unparsing fails, it might be due to this list # omitting a necessary keyword. Note that these are the symbols produced # by Parser which are not necessarily the same as Ruby keywords (e.g., # Parser sometimes produces a :zsuper node for a program of the form "super") @keywords ||= %i(nil false true self array hash) end
parser()
click to toggle source
# File lib/metamorpher/drivers/ruby.rb, line 69 def parser @parser ||= Parser::CurrentRuby end
unparser()
click to toggle source
# File lib/metamorpher/drivers/ruby.rb, line 73 def unparser @unparser ||= Unparser end