free_mutant/lib/mutant/ast.rb

59 lines
1.2 KiB
Ruby
Raw Normal View History

module Mutant
# AST helpers
module AST
2014-07-14 09:38:48 -04:00
# Walk all ast nodes
#
# @param [Parser::AST::Node] root
# @param [Array<Parser::AST::Node>] stack
2014-07-14 09:38:48 -04:00
#
# @yield [Parser::AST::Node]
# all nodes recursively including root
#
# @return [self]
#
# @api private
#
def self.walk(node, stack, &block)
2014-07-14 09:38:48 -04:00
raise ArgumentError, 'block expected' unless block_given?
block.call(node, stack)
2014-07-14 09:38:48 -04:00
node.children.grep(Parser::AST::Node).each do |child|
stack.push(child)
walk(child, stack, &block)
stack.pop
2014-07-14 09:38:48 -04:00
end
self
end
private_class_method :walk
2014-07-14 09:38:48 -04:00
2014-08-12 19:28:32 -04:00
# Find last node satisfying predicate (as block)
2014-07-14 09:38:48 -04:00
#
# @return [Parser::AST::Node]
2014-08-12 19:28:32 -04:00
# if satisfying node is found
2014-07-14 09:38:48 -04:00
#
# @yield [Parser::AST::Node]
#
# @yieldreturn [Boolean]
# true in case node satisfies predicate
#
# @return [nil]
# otherwise
#
# @api private
#
def self.find_last_path(node, &predicate)
2014-11-17 12:00:05 -05:00
fail ArgumentError, 'block expected' unless block_given?
path = []
walk(node, [node]) do |candidate, stack|
if predicate.call(candidate, &predicate)
path = stack.dup
end
2014-07-14 09:38:48 -04:00
end
path
2014-07-14 09:38:48 -04:00
end
end # AST
end # Mutant