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 214 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 246 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 267 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 285 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