Class: RubyLsp::NodeContext

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_lsp/node_context.rb

Overview

This class allows listeners to access contextual information about a node in the AST, such as its parent, its namespace nesting, and the surrounding CallNode (e.g. a method call).

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(node, parent, nesting_nodes, call_node) ⇒ NodeContext

: (Prism::Node? node, Prism::Node? parent, Array[(Prism::ClassNode | Prism::ModuleNode | Prism::SingletonClassNode | Prism::DefNode | Prism::BlockNode | Prism::LambdaNode | Prism::ProgramNode)] nesting_nodes, Prism::CallNode? call_node) -> void



21
22
23
24
25
26
27
28
29
30
# File 'lib/ruby_lsp/node_context.rb', line 21

def initialize(node, parent, nesting_nodes, call_node)
  @node = node
  @parent = parent
  @nesting_nodes = nesting_nodes
  @call_node = call_node

  nesting, surrounding_method = handle_nesting_nodes(nesting_nodes)
  @nesting = nesting #: Array[String]
  @surrounding_method = surrounding_method #: String?
end

Instance Attribute Details

#call_nodeObject (readonly)

: Prism::CallNode?



15
16
17
# File 'lib/ruby_lsp/node_context.rb', line 15

def call_node
  @call_node
end

#nestingObject (readonly)

: Array



12
13
14
# File 'lib/ruby_lsp/node_context.rb', line 12

def nesting
  @nesting
end

#nodeObject (readonly)

: Prism::Node?



9
10
11
# File 'lib/ruby_lsp/node_context.rb', line 9

def node
  @node
end

#parentObject (readonly)

: Prism::Node?



9
10
11
# File 'lib/ruby_lsp/node_context.rb', line 9

def parent
  @parent
end

#surrounding_methodObject (readonly)

: String?



18
19
20
# File 'lib/ruby_lsp/node_context.rb', line 18

def surrounding_method
  @surrounding_method
end

Instance Method Details

#fully_qualified_nameObject

: -> String



33
34
35
# File 'lib/ruby_lsp/node_context.rb', line 33

def fully_qualified_name
  @fully_qualified_name ||= @nesting.join("::") #: String?
end

#locals_for_scopeObject

: -> Array



38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/ruby_lsp/node_context.rb', line 38

def locals_for_scope
  locals = []

  @nesting_nodes.each do |node|
    if node.is_a?(Prism::ClassNode) || node.is_a?(Prism::ModuleNode) || node.is_a?(Prism::SingletonClassNode) ||
        node.is_a?(Prism::DefNode)
      locals.clear
    end

    locals.concat(node.locals)
  end

  locals
end