module Solargraph::Parser::Legacy::NodeMethods::DeepInference

Constants

CONDITIONAL
REDUCEABLE
SKIPPABLE

Public Class Methods

get_return_nodes(node) click to toggle source

@param node [Parser::AST::Node] @return [Array<Parser::AST::Node>]

# File lib/solargraph/parser/legacy/node_methods.rb, line 228
def get_return_nodes node
  return [] unless node.is_a?(::Parser::AST::Node)
  result = []
  if REDUCEABLE.include?(node.type)
    result.concat get_return_nodes_from_children(node)
  elsif CONDITIONAL.include?(node.type)
    result.concat reduce_to_value_nodes(node.children[1..-1])
    # result.push NIL_NODE unless node.children[2]
  elsif node.type == :or
    result.concat reduce_to_value_nodes(node.children)
  elsif node.type == :return
    result.concat reduce_to_value_nodes([node.children[0]])
  elsif node.type == :block
    result.push node
    result.concat get_return_nodes_only(node.children[2])
  elsif node.type == :case
    node.children[1..-1].each do |cc|
      if cc.nil?
        result.push NIL_NODE
      else
        result.concat reduce_to_value_nodes(cc.children[1..-2]) unless cc.children.length < 1
        result.concat reduce_to_value_nodes([cc.children.last])
      end
    end
  else
    result.push node
  end
  result
end

Private Class Methods

get_return_nodes_from_children(parent) click to toggle source
# File lib/solargraph/parser/legacy/node_methods.rb, line 260
def get_return_nodes_from_children parent
  result = []
  nodes = parent.children.select{|n| n.is_a?(AST::Node)}
  nodes.each_with_index do |node, idx|
    if node.type == :block
      result.concat get_return_nodes_only(node.children[2])
    elsif SKIPPABLE.include?(node.type)
      next
    elsif node.type == :return
      result.concat reduce_to_value_nodes([node.children[0]])
      # Return the result here because the rest of the code is
      # unreachable
      return result
    else
      result.concat get_return_nodes_only(node)
    end
    result.concat reduce_to_value_nodes([nodes.last]) if idx == nodes.length - 1
  end
  result
end
get_return_nodes_only(parent) click to toggle source
# File lib/solargraph/parser/legacy/node_methods.rb, line 281
def get_return_nodes_only parent
  return [] unless parent.is_a?(::Parser::AST::Node)
  result = []
  nodes = parent.children.select{|n| n.is_a?(::Parser::AST::Node)}
  nodes.each do |node|
    next if SKIPPABLE.include?(node.type)
    if node.type == :return
      result.concat reduce_to_value_nodes([node.children[0]])
      # Return the result here because the rest of the code is
      # unreachable
      return result
    else
      result.concat get_return_nodes_only(node)
    end
  end
  result
end
reduce_to_value_nodes(nodes) click to toggle source
# File lib/solargraph/parser/legacy/node_methods.rb, line 299
def reduce_to_value_nodes nodes
  result = []
  nodes.each do |node|
    if !node.is_a?(::Parser::AST::Node)
      result.push nil
    elsif REDUCEABLE.include?(node.type)
      result.concat get_return_nodes_from_children(node)
    elsif CONDITIONAL.include?(node.type)
      result.concat reduce_to_value_nodes(node.children[1..-1])
    elsif node.type == :return
      result.concat reduce_to_value_nodes([node.children[0]])
    elsif node.type == :or
      result.concat reduce_to_value_nodes(node.children)
    elsif node.type == :block
      result.concat get_return_nodes_only(node.children[2])
    else
      result.push node
    end
  end
  result
end