module Mutest::AST

AST helpers

Public Class Methods

find_last_path(node, &predicate) click to toggle source

Find last node satisfying predicate (as block)

@return [Parser::AST::Node]

if satisfying node is found

@yield [Parser::AST::Node]

@yieldreturn [Boolean]

true in case node satisfies predicate

@return [nil]

otherwise
# File lib/mutest/ast.rb, line 16
def self.find_last_path(node, &predicate)
  raise ArgumentError, 'block expected' unless block_given?

  path = []
  walk(node, [node]) do |candidate, stack|
    path = stack.dup if predicate.call(candidate)
  end
  path
end

Private Class Methods

walk(node, stack, &block) click to toggle source

Walk all ast nodes keeping track of path

@param [Parser::AST::Node] root @param [Array<Parser::AST::Node>] stack

@yield [Parser::AST::Node]

all nodes visited recursively including root

@return [undefined]

# File lib/mutest/ast.rb, line 35
def self.walk(node, stack, &block)
  block.call(node, stack)
  node.children.grep(::Parser::AST::Node) do |child|
    stack.push(child)
    walk(child, stack, &block)
    stack.pop
  end
end