Class: Solargraph::Parser::Rubyvm::NodeProcessors::SendNode

Inherits:
NodeProcessor::Base show all
Includes:
Solargraph::Parser::Rubyvm::NodeMethods
Defined in:
lib/solargraph/parser/rubyvm/node_processors/send_node.rb

Instance Attribute Summary

Attributes inherited from NodeProcessor::Base

#locals, #node, #pins, #region

Instance Method Summary collapse

Methods included from Solargraph::Parser::Rubyvm::NodeMethods

call_nodes_from, const_nodes_from, convert_hash, find_recipient_node, infer_literal_node_type, node?, pack_name, returns_from, unpack_name

Methods inherited from NodeProcessor::Base

#initialize

Constructor Details

This class inherits a constructor from Solargraph::Parser::NodeProcessor::Base

Instance Method Details

#processObject



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/solargraph/parser/rubyvm/node_processors/send_node.rb', line 10

def process
  if [:private, :public, :protected].include?(node.children[0])
    if node.type == :FCALL && Parser.is_ast_node?(node.children.last)
      node.children.last.children[0..-2].each do |child|
        # next unless child.is_a?(AST::Node) && (child.type == :sym || child.type == :str)
        next unless child.type == :LIT || child.type == :STR
        name = child.children[0].to_s
        matches = pins.select{ |pin| pin.is_a?(Pin::BaseMethod) && pin.name == name && pin.namespace == region.closure.full_context.namespace && pin.context.scope == (region.scope || :instance)}
        matches.each do |pin|
          # @todo Smelly instance variable access
          pin.instance_variable_set(:@visibility, node.children[0])
        end
      end
    else
      # @todo Smelly instance variable access
      region.instance_variable_set(:@visibility, node.children[0])
    end
  elsif node.children[0] == :module_function
    process_module_function
  elsif node.children[0] == :require
    process_require
  elsif node.children[0] == :autoload
    process_autoload
  elsif node.children[0] == :alias_method
    process_alias_method
  elsif node.children[0] == :private_class_method
    # Processing a private class can potentially handle children on its own
    return if process_private_class_method
  elsif [:attr_reader, :attr_writer, :attr_accessor].include?(node.children[0])
    process_attribute
  elsif node.children[0] == :include
    process_include
  elsif node.children[0] == :extend
    process_extend
  elsif node.children[0] == :prepend
    process_prepend
  elsif node.children[0] == :private_constant
    process_private_constant
  elsif node.children[1] == :require && unpack_name(node.children[0]) == 'Bundler'
    pins.push Pin::Reference::Require.new(Solargraph::Location.new(region.filename, Solargraph::Range.from_to(0, 0, 0, 0)), 'bundler/require')
  end
  process_children
end