Class: RubyLsp::Listeners::Hover

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

Constant Summary collapse

ALLOWED_TARGETS =
[
  Prism::BreakNode,
  Prism::CallNode,
  Prism::ConstantReadNode,
  Prism::ConstantWriteNode,
  Prism::ConstantPathNode,
  Prism::GlobalVariableAndWriteNode,
  Prism::GlobalVariableOperatorWriteNode,
  Prism::GlobalVariableOrWriteNode,
  Prism::GlobalVariableReadNode,
  Prism::GlobalVariableTargetNode,
  Prism::GlobalVariableWriteNode,
  Prism::InstanceVariableReadNode,
  Prism::InstanceVariableAndWriteNode,
  Prism::InstanceVariableOperatorWriteNode,
  Prism::InstanceVariableOrWriteNode,
  Prism::InstanceVariableTargetNode,
  Prism::InstanceVariableWriteNode,
  Prism::SymbolNode,
  Prism::StringNode,
  Prism::InterpolatedStringNode,
  Prism::SuperNode,
  Prism::ForwardingSuperNode,
  Prism::YieldNode,
  Prism::ClassVariableAndWriteNode,
  Prism::ClassVariableOperatorWriteNode,
  Prism::ClassVariableOrWriteNode,
  Prism::ClassVariableReadNode,
  Prism::ClassVariableTargetNode,
  Prism::ClassVariableWriteNode,
]
ALLOWED_REMOTE_PROVIDERS =

: Array

[
  "https://github.com",
  "https://gitlab.com",
].freeze

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, uri, node_context, dispatcher, sorbet_level) ⇒ Hover

: (ResponseBuilders::Hover response_builder, GlobalState global_state, URI::Generic uri, NodeContext node_context, Prism::Dispatcher dispatcher, SorbetLevel sorbet_level) -> void



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/ruby_lsp/listeners/hover.rb', line 47

def initialize(response_builder, global_state, 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
  @path = uri.to_standardized_path #: String?
  @node_context = node_context
  @sorbet_level = sorbet_level

  dispatcher.register(
    self,
    :on_break_node_enter,
    :on_constant_read_node_enter,
    :on_constant_write_node_enter,
    :on_constant_path_node_enter,
    :on_call_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_super_node_enter,
    :on_forwarding_super_node_enter,
    :on_string_node_enter,
    :on_interpolated_string_node_enter,
    :on_yield_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_break_node_enter(node) ⇒ Object

: (Prism::BreakNode node) -> void



90
91
92
# File 'lib/ruby_lsp/listeners/hover.rb', line 90

def on_break_node_enter(node)
  handle_keyword_documentation(node.keyword)
end

#on_call_node_enter(node) ⇒ Object

: (Prism::CallNode node) -> void



140
141
142
143
144
145
146
147
# File 'lib/ruby_lsp/listeners/hover.rb', line 140

def on_call_node_enter(node)
  return if @sorbet_level.true_or_higher? && self_receiver?(node)

  message = node.message
  return unless message

  handle_method_hover(message)
end

#on_class_variable_and_write_node_enter(node) ⇒ Object

: (Prism::ClassVariableAndWriteNode node) -> void



225
226
227
# File 'lib/ruby_lsp/listeners/hover.rb', line 225

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

#on_class_variable_operator_write_node_enter(node) ⇒ Object

: (Prism::ClassVariableOperatorWriteNode node) -> void



230
231
232
# File 'lib/ruby_lsp/listeners/hover.rb', line 230

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

#on_class_variable_or_write_node_enter(node) ⇒ Object

: (Prism::ClassVariableOrWriteNode node) -> void



235
236
237
# File 'lib/ruby_lsp/listeners/hover.rb', line 235

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

#on_class_variable_read_node_enter(node) ⇒ Object

: (Prism::ClassVariableReadNode node) -> void



245
246
247
# File 'lib/ruby_lsp/listeners/hover.rb', line 245

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

#on_class_variable_target_node_enter(node) ⇒ Object

: (Prism::ClassVariableTargetNode node) -> void



240
241
242
# File 'lib/ruby_lsp/listeners/hover.rb', line 240

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

#on_class_variable_write_node_enter(node) ⇒ Object

: (Prism::ClassVariableWriteNode node) -> void



250
251
252
# File 'lib/ruby_lsp/listeners/hover.rb', line 250

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

#on_constant_path_node_enter(node) ⇒ Object

: (Prism::ConstantPathNode node) -> void



130
131
132
133
134
135
136
137
# File 'lib/ruby_lsp/listeners/hover.rb', line 130

def on_constant_path_node_enter(node)
  return unless @sorbet_level.ignore?

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

  generate_hover(name, node.location)
end

#on_constant_read_node_enter(node) ⇒ Object

: (Prism::ConstantReadNode node) -> void



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

def on_constant_read_node_enter(node)
  return unless @sorbet_level.ignore?

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

  generate_hover(name, node.location)
end

#on_constant_write_node_enter(node) ⇒ Object

: (Prism::ConstantWriteNode node) -> void



123
124
125
126
127
# File 'lib/ruby_lsp/listeners/hover.rb', line 123

def on_constant_write_node_enter(node)
  return unless @sorbet_level.ignore?

  generate_hover(node.name.to_s, node.name_loc)
end

#on_forwarding_super_node_enter(node) ⇒ Object

: (Prism::ForwardingSuperNode node) -> void



215
216
217
# File 'lib/ruby_lsp/listeners/hover.rb', line 215

def on_forwarding_super_node_enter(node)
  handle_super_node_hover
end

#on_global_variable_and_write_node_enter(node) ⇒ Object

: (Prism::GlobalVariableAndWriteNode node) -> void



150
151
152
# File 'lib/ruby_lsp/listeners/hover.rb', line 150

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

#on_global_variable_operator_write_node_enter(node) ⇒ Object

: (Prism::GlobalVariableOperatorWriteNode node) -> void



155
156
157
# File 'lib/ruby_lsp/listeners/hover.rb', line 155

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

#on_global_variable_or_write_node_enter(node) ⇒ Object

: (Prism::GlobalVariableOrWriteNode node) -> void



160
161
162
# File 'lib/ruby_lsp/listeners/hover.rb', line 160

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

#on_global_variable_read_node_enter(node) ⇒ Object

: (Prism::GlobalVariableReadNode node) -> void



165
166
167
# File 'lib/ruby_lsp/listeners/hover.rb', line 165

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

#on_global_variable_target_node_enter(node) ⇒ Object

: (Prism::GlobalVariableTargetNode node) -> void



170
171
172
# File 'lib/ruby_lsp/listeners/hover.rb', line 170

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

#on_global_variable_write_node_enter(node) ⇒ Object

: (Prism::GlobalVariableWriteNode node) -> void



175
176
177
# File 'lib/ruby_lsp/listeners/hover.rb', line 175

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

#on_instance_variable_and_write_node_enter(node) ⇒ Object

: (Prism::InstanceVariableAndWriteNode node) -> void



190
191
192
# File 'lib/ruby_lsp/listeners/hover.rb', line 190

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

#on_instance_variable_operator_write_node_enter(node) ⇒ Object

: (Prism::InstanceVariableOperatorWriteNode node) -> void



195
196
197
# File 'lib/ruby_lsp/listeners/hover.rb', line 195

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

#on_instance_variable_or_write_node_enter(node) ⇒ Object

: (Prism::InstanceVariableOrWriteNode node) -> void



200
201
202
# File 'lib/ruby_lsp/listeners/hover.rb', line 200

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

#on_instance_variable_read_node_enter(node) ⇒ Object

: (Prism::InstanceVariableReadNode node) -> void



180
181
182
# File 'lib/ruby_lsp/listeners/hover.rb', line 180

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

#on_instance_variable_target_node_enter(node) ⇒ Object

: (Prism::InstanceVariableTargetNode node) -> void



205
206
207
# File 'lib/ruby_lsp/listeners/hover.rb', line 205

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

#on_instance_variable_write_node_enter(node) ⇒ Object

: (Prism::InstanceVariableWriteNode node) -> void



185
186
187
# File 'lib/ruby_lsp/listeners/hover.rb', line 185

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

#on_interpolated_string_node_enter(node) ⇒ Object

: (Prism::InterpolatedStringNode node) -> void



108
109
110
# File 'lib/ruby_lsp/listeners/hover.rb', line 108

def on_interpolated_string_node_enter(node)
  generate_heredoc_hover(node)
end

#on_string_node_enter(node) ⇒ Object

: (Prism::StringNode node) -> void



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

def on_string_node_enter(node)
  if @path && File.basename(@path) == GEMFILE_NAME
    call_node = @node_context.call_node
    if call_node && call_node.name == :gem && call_node.arguments&.arguments&.first == node
      generate_gem_hover(call_node)
      return
    end
  end

  generate_heredoc_hover(node)
end

#on_super_node_enter(node) ⇒ Object

: (Prism::SuperNode node) -> void



210
211
212
# File 'lib/ruby_lsp/listeners/hover.rb', line 210

def on_super_node_enter(node)
  handle_super_node_hover
end

#on_yield_node_enter(node) ⇒ Object

: (Prism::YieldNode node) -> void



220
221
222
# File 'lib/ruby_lsp/listeners/hover.rb', line 220

def on_yield_node_enter(node)
  handle_keyword_documentation(node.keyword)
end