class PowerAssert::Parser::PrismParser
Public Instance Methods
Source
# 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
Private Instance Methods
Source
# 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