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