Class: RubyLsp::Listeners::Definition

Inherits:
Object
  • Object
show all
Includes:
Requests::Support::Common
Defined in:
lib/ruby_lsp/listeners/definition.rb

Constant Summary collapse

MAX_NUMBER_OF_DEFINITION_CANDIDATES_WITHOUT_RECEIVER =
10

Instance Method Summary collapse

Methods included from Requests::Support::Common

#categorized_markdown_from_index_entries, #constant_name, #create_code_lens, #each_constant_path_part, #kind_for_entry, #markdown_from_index_entries, #namespace_constant_name, #not_in_dependencies?, #range_from_location, #range_from_node, #self_receiver?

Constructor Details

#initialize(response_builder, global_state, language_id, uri, node_context, dispatcher, sorbet_level) ⇒ Definition

: (ResponseBuilders::CollectionResponseBuilder[(Interface::Location | Interface::LocationLink)] response_builder, GlobalState global_state, Symbol language_id, URI::Generic uri, NodeContext node_context, Prism::Dispatcher dispatcher, SorbetLevel sorbet_level) -> void



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
# File 'lib/ruby_lsp/listeners/definition.rb', line 12

def initialize(response_builder, global_state, language_id, uri, node_context, dispatcher, sorbet_level) # rubocop:disable Metrics/ParameterLists
  @response_builder = response_builder
  @global_state = global_state
  @index = global_state.index #: RubyIndexer::Index
  @type_inferrer = global_state.type_inferrer #: TypeInferrer
  @language_id = language_id
  @uri = uri
  @node_context = node_context
  @sorbet_level = sorbet_level

  dispatcher.register(
    self,
    :on_call_node_enter,
    :on_block_argument_node_enter,
    :on_constant_read_node_enter,
    :on_constant_path_node_enter,
    :on_global_variable_and_write_node_enter,
    :on_global_variable_operator_write_node_enter,
    :on_global_variable_or_write_node_enter,
    :on_global_variable_read_node_enter,
    :on_global_variable_target_node_enter,
    :on_global_variable_write_node_enter,
    :on_instance_variable_read_node_enter,
    :on_instance_variable_write_node_enter,
    :on_instance_variable_and_write_node_enter,
    :on_instance_variable_operator_write_node_enter,
    :on_instance_variable_or_write_node_enter,
    :on_instance_variable_target_node_enter,
    :on_string_node_enter,
    :on_symbol_node_enter,
    :on_super_node_enter,
    :on_forwarding_super_node_enter,
    :on_class_variable_and_write_node_enter,
    :on_class_variable_operator_write_node_enter,
    :on_class_variable_or_write_node_enter,
    :on_class_variable_read_node_enter,
    :on_class_variable_target_node_enter,
    :on_class_variable_write_node_enter,
  )
end

Instance Method Details

#on_block_argument_node_enter(node) ⇒ Object

: (Prism::BlockArgumentNode node) -> void



95
96
97
98
99
100
101
102
103
# File 'lib/ruby_lsp/listeners/definition.rb', line 95

def on_block_argument_node_enter(node)
  expression = node.expression
  return unless expression.is_a?(Prism::SymbolNode)

  value = expression.value
  return unless value

  handle_method_definition(value, nil)
end

#on_call_node_enter(node) ⇒ Object

: (Prism::CallNode node) -> void



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/ruby_lsp/listeners/definition.rb', line 54

def on_call_node_enter(node)
  # Sorbet can handle go to definition for methods invoked on self on typed true or higher
  return if @sorbet_level.true_or_higher? && self_receiver?(node)

  message = node.message
  return unless message

  inferrer_receiver_type = @type_inferrer.infer_receiver_type(@node_context)

  # Until we can properly infer the receiver type in erb files (maybe with ruby-lsp-rails),
  # treating method calls' type as `nil` will allow users to get some completion support first
  if @language_id == :erb && inferrer_receiver_type&.name == "Object"
    inferrer_receiver_type = nil
  end

  handle_method_definition(message, inferrer_receiver_type)
end

#on_class_variable_and_write_node_enter(node) ⇒ Object

: (Prism::ClassVariableAndWriteNode node) -> void



192
193
194
# File 'lib/ruby_lsp/listeners/definition.rb', line 192

def on_class_variable_and_write_node_enter(node)
  handle_class_variable_definition(node.name.to_s)
end

#on_class_variable_operator_write_node_enter(node) ⇒ Object

: (Prism::ClassVariableOperatorWriteNode node) -> void



197
198
199
# File 'lib/ruby_lsp/listeners/definition.rb', line 197

def on_class_variable_operator_write_node_enter(node)
  handle_class_variable_definition(node.name.to_s)
end

#on_class_variable_or_write_node_enter(node) ⇒ Object

: (Prism::ClassVariableOrWriteNode node) -> void



202
203
204
# File 'lib/ruby_lsp/listeners/definition.rb', line 202

def on_class_variable_or_write_node_enter(node)
  handle_class_variable_definition(node.name.to_s)
end

#on_class_variable_read_node_enter(node) ⇒ Object

: (Prism::ClassVariableReadNode node) -> void



212
213
214
# File 'lib/ruby_lsp/listeners/definition.rb', line 212

def on_class_variable_read_node_enter(node)
  handle_class_variable_definition(node.name.to_s)
end

#on_class_variable_target_node_enter(node) ⇒ Object

: (Prism::ClassVariableTargetNode node) -> void



207
208
209
# File 'lib/ruby_lsp/listeners/definition.rb', line 207

def on_class_variable_target_node_enter(node)
  handle_class_variable_definition(node.name.to_s)
end

#on_class_variable_write_node_enter(node) ⇒ Object

: (Prism::ClassVariableWriteNode node) -> void



217
218
219
# File 'lib/ruby_lsp/listeners/definition.rb', line 217

def on_class_variable_write_node_enter(node)
  handle_class_variable_definition(node.name.to_s)
end

#on_constant_path_node_enter(node) ⇒ Object

: (Prism::ConstantPathNode node) -> void



106
107
108
109
110
111
# File 'lib/ruby_lsp/listeners/definition.rb', line 106

def on_constant_path_node_enter(node)
  name = RubyIndexer::Index.constant_name(node)
  return if name.nil?

  find_in_index(name)
end

#on_constant_read_node_enter(node) ⇒ Object

: (Prism::ConstantReadNode node) -> void



114
115
116
117
118
119
# File 'lib/ruby_lsp/listeners/definition.rb', line 114

def on_constant_read_node_enter(node)
  name = RubyIndexer::Index.constant_name(node)
  return if name.nil?

  find_in_index(name)
end

#on_forwarding_super_node_enter(node) ⇒ Object

: (Prism::ForwardingSuperNode node) -> void



187
188
189
# File 'lib/ruby_lsp/listeners/definition.rb', line 187

def on_forwarding_super_node_enter(node)
  handle_super_node_definition
end

#on_global_variable_and_write_node_enter(node) ⇒ Object

: (Prism::GlobalVariableAndWriteNode node) -> void



122
123
124
# File 'lib/ruby_lsp/listeners/definition.rb', line 122

def on_global_variable_and_write_node_enter(node)
  handle_global_variable_definition(node.name.to_s)
end

#on_global_variable_operator_write_node_enter(node) ⇒ Object

: (Prism::GlobalVariableOperatorWriteNode node) -> void



127
128
129
# File 'lib/ruby_lsp/listeners/definition.rb', line 127

def on_global_variable_operator_write_node_enter(node)
  handle_global_variable_definition(node.name.to_s)
end

#on_global_variable_or_write_node_enter(node) ⇒ Object

: (Prism::GlobalVariableOrWriteNode node) -> void



132
133
134
# File 'lib/ruby_lsp/listeners/definition.rb', line 132

def on_global_variable_or_write_node_enter(node)
  handle_global_variable_definition(node.name.to_s)
end

#on_global_variable_read_node_enter(node) ⇒ Object

: (Prism::GlobalVariableReadNode node) -> void



137
138
139
# File 'lib/ruby_lsp/listeners/definition.rb', line 137

def on_global_variable_read_node_enter(node)
  handle_global_variable_definition(node.name.to_s)
end

#on_global_variable_target_node_enter(node) ⇒ Object

: (Prism::GlobalVariableTargetNode node) -> void



142
143
144
# File 'lib/ruby_lsp/listeners/definition.rb', line 142

def on_global_variable_target_node_enter(node)
  handle_global_variable_definition(node.name.to_s)
end

#on_global_variable_write_node_enter(node) ⇒ Object

: (Prism::GlobalVariableWriteNode node) -> void



147
148
149
# File 'lib/ruby_lsp/listeners/definition.rb', line 147

def on_global_variable_write_node_enter(node)
  handle_global_variable_definition(node.name.to_s)
end

#on_instance_variable_and_write_node_enter(node) ⇒ Object

: (Prism::InstanceVariableAndWriteNode node) -> void



162
163
164
# File 'lib/ruby_lsp/listeners/definition.rb', line 162

def on_instance_variable_and_write_node_enter(node)
  handle_instance_variable_definition(node.name.to_s)
end

#on_instance_variable_operator_write_node_enter(node) ⇒ Object

: (Prism::InstanceVariableOperatorWriteNode node) -> void



167
168
169
# File 'lib/ruby_lsp/listeners/definition.rb', line 167

def on_instance_variable_operator_write_node_enter(node)
  handle_instance_variable_definition(node.name.to_s)
end

#on_instance_variable_or_write_node_enter(node) ⇒ Object

: (Prism::InstanceVariableOrWriteNode node) -> void



172
173
174
# File 'lib/ruby_lsp/listeners/definition.rb', line 172

def on_instance_variable_or_write_node_enter(node)
  handle_instance_variable_definition(node.name.to_s)
end

#on_instance_variable_read_node_enter(node) ⇒ Object

: (Prism::InstanceVariableReadNode node) -> void



152
153
154
# File 'lib/ruby_lsp/listeners/definition.rb', line 152

def on_instance_variable_read_node_enter(node)
  handle_instance_variable_definition(node.name.to_s)
end

#on_instance_variable_target_node_enter(node) ⇒ Object

: (Prism::InstanceVariableTargetNode node) -> void



177
178
179
# File 'lib/ruby_lsp/listeners/definition.rb', line 177

def on_instance_variable_target_node_enter(node)
  handle_instance_variable_definition(node.name.to_s)
end

#on_instance_variable_write_node_enter(node) ⇒ Object

: (Prism::InstanceVariableWriteNode node) -> void



157
158
159
# File 'lib/ruby_lsp/listeners/definition.rb', line 157

def on_instance_variable_write_node_enter(node)
  handle_instance_variable_definition(node.name.to_s)
end

#on_string_node_enter(node) ⇒ Object

: (Prism::StringNode node) -> void



73
74
75
76
77
78
79
80
81
# File 'lib/ruby_lsp/listeners/definition.rb', line 73

def on_string_node_enter(node)
  enclosing_call = @node_context.call_node
  return unless enclosing_call

  name = enclosing_call.name
  return unless name == :require || name == :require_relative

  handle_require_definition(node, name)
end

#on_super_node_enter(node) ⇒ Object

: (Prism::SuperNode node) -> void



182
183
184
# File 'lib/ruby_lsp/listeners/definition.rb', line 182

def on_super_node_enter(node)
  handle_super_node_definition
end

#on_symbol_node_enter(node) ⇒ Object

: (Prism::SymbolNode node) -> void



84
85
86
87
88
89
90
91
92
# File 'lib/ruby_lsp/listeners/definition.rb', line 84

def on_symbol_node_enter(node)
  enclosing_call = @node_context.call_node
  return unless enclosing_call

  name = enclosing_call.name
  return unless name == :autoload

  handle_autoload_definition(enclosing_call)
end