class MetaCommit::Factories::ContextualAstNodeFactory

Factory that builds ContextualAstNode from ast nodes

Constants

WHOLE_FILE

Public Instance Methods

create_contextual_node(source_ast, line_number) click to toggle source

@param [MetaCommit::Contracts::Ast] source_ast @param [Integer] line_number @return [MetaCommit::Models::ContextualAstNode]

# File lib/meta_commit/factories/contextual_ast_node_factory.rb, line 9
def create_contextual_node(source_ast, line_number)
  visited_nodes = []
  contextual_node = MetaCommit::Models::ContextualAstNode.new
  contextual_node.parser_class = source_ast.parser_class
  contextual_node.target_node = collect_path_to_ast_at_line(source_ast, line_number, visited_nodes)
  contextual_node.context_nodes = visited_nodes
  contextual_node.whole_file_change = (line_number == WHOLE_FILE)
  contextual_node
end

Protected Instance Methods

collect_path_to_ast_at_line(ast, lineno, accumulator) click to toggle source

@param [MetaCommit::Contracts::Ast] ast @param [Integer] lineno @param [Array<MetaCommit::Contracts::Ast>] accumulator @return [MetaCommit::Contracts::Ast]

# File lib/meta_commit/factories/contextual_ast_node_factory.rb, line 23
def collect_path_to_ast_at_line(ast, lineno, accumulator)
  return ast if lineno == WHOLE_FILE
  return nil if ast.nil? || (lines?(ast) && !covers_line?(ast, lineno))

  closest_ast = ast
  accumulator.push(closest_ast)
  ast.children.each do |child|
    found_ast = collect_path_to_ast_at_line(child, lineno, accumulator)
    closest_ast = found_ast unless found_ast.nil?
  end
  closest_ast
end
covers_line?(ast, line) click to toggle source

@param [MetaCommit::Contracts::Ast] ast @param [Integer] line @return [Boolean]

# File lib/meta_commit/factories/contextual_ast_node_factory.rb, line 51
def covers_line?(ast, line)
  (ast.first_line <= line) && (ast.last_line >= line)
end
lines?(ast) click to toggle source

@param [MetaCommit::Contracts::Ast] ast @return [Boolean]

# File lib/meta_commit/factories/contextual_ast_node_factory.rb, line 41
def lines?(ast)
  !(ast.first_line.nil? && ast.last_line.nil?)
end