123456789_123456789_123456789_123456789_123456789_

Class: PowerAssert::Parser::PrismParser

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Parser
Instance Chain:
self, Parser
Inherits: Parser
  • Object
Defined in: lib/power_assert/parser.rb

Instance Method Summary

Instance Method Details

#extract_idents(node) (private)

[ GitHub ]

  
# File 'lib/power_assert/parser.rb', line 208

def extract_idents(node)
  case node&.type
  when nil
    []
  when :program_node
    if (statement = node.statements.body.first).is_a?(Prism::CallNode) && (statement.name == @assertion_method_name&.to_sym) && (block = statement.block).is_a?(Prism::BlockNode) && (body = block.body).is_a?(Prism::StatementsNode)
      extract_idents(body)
    else
      extract_idents(statement)
    end
  when :call_node
    message_ident =
      if (node.name == :[] && !node.call_operator_loc)
        Ident[:method, "[]", node.opening_loc.start_column]
      elsif (message_loc = node.message_loc)
        Ident[:method, node.name.name, message_loc.start_column]
      else
        Ident[:method, "call", node.opening_loc.start_column]
      end

    if node.safe_navigation?
      extract_idents(node.receiver) + [Branch[extract_idents(node.arguments) + [message_ident], []]]
    else
      extract_idents(node.receiver) + extract_idents(node.arguments) + [message_ident]
    end
  when :call_operator_write_node, :class_variable_operator_write_node, :constant_operator_write_node, :constant_path_operator_write_node, :global_variable_operator_write_node, :index_operator_write_node, :instance_variable_operator_write_node, :local_variable_operator_write_node
    binary_operator_loc = node.binary_operator_loc.chop
    extract_idents(node.value) + [Ident[:method, binary_operator_loc.slice, binary_operator_loc.start_column]]
  when :if_node
    extract_idents(node.predicate) + [Branch[extract_idents(node.statements), extract_idents(node.subsequent)]]
  when :unless_node
    extract_idents(node.predicate) + [Branch[extract_idents(node.statements), extract_idents(node.else_clause)]]
  when :and_node, :or_node
    extract_idents(node.left) + [Branch[extract_idents(node.right), []]]
  when :class_variable_read_node, :constant_read_node, :global_variable_read_node, :instance_variable_read_node, :local_variable_read_node, :self_node
    [Ident[:ref, node.slice, node.start_column]]
  else
    node.compact_child_nodes.flat_map { |child| extract_idents(child) }
  end
end

#idents

[ GitHub ]

  
# File 'lib/power_assert/parser.rb', line 197

def idents
  @idents ||=
    begin
      require 'prism'
      result = Prism.parse(@line_for_parsing, scopes: [@proc_local_variables.map(&:to_sym)])
      result.success? ? extract_idents(result.value) : []
    end
end