@@ -48,6 +48,7 @@ def initialize(response_builder, global_state, uri, node_context, dispatcher, so
4848 @response_builder = response_builder
4949 @global_state = global_state
5050 @index = global_state . index #: RubyIndexer::Index
51+ @graph = global_state . graph #: Rubydex::Graph
5152 @type_inferrer = global_state . type_inferrer #: TypeInferrer
5253 @path = uri . to_standardized_path #: String?
5354 @node_context = node_context
@@ -178,32 +179,32 @@ def on_global_variable_write_node_enter(node)
178179
179180 #: (Prism::InstanceVariableReadNode node) -> void
180181 def on_instance_variable_read_node_enter ( node )
181- handle_instance_variable_hover ( node . name . to_s )
182+ handle_variable_hover ( node . name . to_s )
182183 end
183184
184185 #: (Prism::InstanceVariableWriteNode node) -> void
185186 def on_instance_variable_write_node_enter ( node )
186- handle_instance_variable_hover ( node . name . to_s )
187+ handle_variable_hover ( node . name . to_s )
187188 end
188189
189190 #: (Prism::InstanceVariableAndWriteNode node) -> void
190191 def on_instance_variable_and_write_node_enter ( node )
191- handle_instance_variable_hover ( node . name . to_s )
192+ handle_variable_hover ( node . name . to_s )
192193 end
193194
194195 #: (Prism::InstanceVariableOperatorWriteNode node) -> void
195196 def on_instance_variable_operator_write_node_enter ( node )
196- handle_instance_variable_hover ( node . name . to_s )
197+ handle_variable_hover ( node . name . to_s )
197198 end
198199
199200 #: (Prism::InstanceVariableOrWriteNode node) -> void
200201 def on_instance_variable_or_write_node_enter ( node )
201- handle_instance_variable_hover ( node . name . to_s )
202+ handle_variable_hover ( node . name . to_s )
202203 end
203204
204205 #: (Prism::InstanceVariableTargetNode node) -> void
205206 def on_instance_variable_target_node_enter ( node )
206- handle_instance_variable_hover ( node . name . to_s )
207+ handle_variable_hover ( node . name . to_s )
207208 end
208209
209210 #: (Prism::SuperNode node) -> void
@@ -223,32 +224,32 @@ def on_yield_node_enter(node)
223224
224225 #: (Prism::ClassVariableAndWriteNode node) -> void
225226 def on_class_variable_and_write_node_enter ( node )
226- handle_class_variable_hover ( node . name . to_s )
227+ handle_variable_hover ( node . name . to_s )
227228 end
228229
229230 #: (Prism::ClassVariableOperatorWriteNode node) -> void
230231 def on_class_variable_operator_write_node_enter ( node )
231- handle_class_variable_hover ( node . name . to_s )
232+ handle_variable_hover ( node . name . to_s )
232233 end
233234
234235 #: (Prism::ClassVariableOrWriteNode node) -> void
235236 def on_class_variable_or_write_node_enter ( node )
236- handle_class_variable_hover ( node . name . to_s )
237+ handle_variable_hover ( node . name . to_s )
237238 end
238239
239240 #: (Prism::ClassVariableTargetNode node) -> void
240241 def on_class_variable_target_node_enter ( node )
241- handle_class_variable_hover ( node . name . to_s )
242+ handle_variable_hover ( node . name . to_s )
242243 end
243244
244245 #: (Prism::ClassVariableReadNode node) -> void
245246 def on_class_variable_read_node_enter ( node )
246- handle_class_variable_hover ( node . name . to_s )
247+ handle_variable_hover ( node . name . to_s )
247248 end
248249
249250 #: (Prism::ClassVariableWriteNode node) -> void
250251 def on_class_variable_write_node_enter ( node )
251- handle_class_variable_hover ( node . name . to_s )
252+ handle_variable_hover ( node . name . to_s )
252253 end
253254
254255 private
@@ -324,62 +325,46 @@ def handle_method_hover(message, inherited_only: false)
324325 end
325326 end
326327
327- #: (String name) -> void
328- def handle_instance_variable_hover ( name )
329- # Sorbet enforces that all instance variables be declared on typed strict or higher, which means it will be able
330- # to provide all features for them
331- return if @sorbet_level . strict?
332-
333- type = @type_inferrer . infer_receiver_type ( @node_context )
334- return unless type
335-
336- entries = @index . resolve_instance_variable ( name , type . name )
337- return unless entries
338-
339- categorized_markdown_from_index_entries ( name , entries ) . each do |category , content |
340- @response_builder . push ( content , category : category )
341- end
342- rescue RubyIndexer ::Index ::NonExistingNamespaceError
343- # If by any chance we haven't indexed the owner, then there's no way to find the right declaration
344- end
345-
346328 #: (String name) -> void
347329 def handle_global_variable_hover ( name )
348- entries = @index [ name ]
349- return unless entries
330+ declaration = @graph [ name ]
331+ return unless declaration
350332
351- categorized_markdown_from_index_entries ( name , entries ) . each do |category , content |
333+ categorized_markdown_from_definitions ( name , declaration . definitions ) . each do |category , content |
352334 @response_builder . push ( content , category : category )
353335 end
354336 end
355337
338+ # Handle class or instance variables. We collect all definitions across the ancestors of the type
339+ #
356340 #: (String name) -> void
357- def handle_class_variable_hover ( name )
341+ def handle_variable_hover ( name )
342+ # Sorbet enforces that all variables be declared on typed strict or higher, which means it will be able to
343+ # provide all features for them
344+ return if @sorbet_level . strict?
345+
358346 type = @type_inferrer . infer_receiver_type ( @node_context )
359347 return unless type
360348
361- entries = @index . resolve_class_variable ( name , type . name )
362- return unless entries
349+ owner = @graph [ type . name ]
350+ return unless owner . is_a? ( Rubydex :: Namespace )
363351
364- categorized_markdown_from_index_entries ( name , entries ) . each do |category , content |
365- @response_builder . push ( content , category : category )
352+ owner . ancestors . each do |ancestor |
353+ member = ancestor . member ( name )
354+ next unless member
355+
356+ categorized_markdown_from_definitions ( member . name , member . definitions ) . each do |category , content |
357+ @response_builder . push ( content , category : category )
358+ end
366359 end
367- rescue RubyIndexer ::Index ::NonExistingNamespaceError
368- # If by any chance we haven't indexed the owner, then there's no way to find the right declaration
369360 end
370361
371362 #: (String name, Prism::Location location) -> void
372363 def generate_hover ( name , location )
373- entries = @index . resolve ( name , @node_context . nesting )
374- return unless entries
375-
376- # We should only show hover for private constants if the constant is defined in the same namespace as the
377- # reference
378- first_entry = entries . first #: as !nil
379- full_name = first_entry . name
380- return if first_entry . private? && full_name != "#{ @node_context . fully_qualified_name } ::#{ name } "
364+ declaration = @graph . resolve_constant ( name , @node_context . nesting )
365+ return unless declaration
381366
382- categorized_markdown_from_index_entries ( full_name , entries ) . each do |category , content |
367+ categorized_markdown_from_definitions ( declaration . name , declaration . definitions ) . each do |category , content |
383368 @response_builder . push ( content , category : category )
384369 end
385370 end
0 commit comments