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