ruby-lsp 0.23.11 → 0.26.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/VERSION +1 -1
  4. data/exe/ruby-lsp +10 -4
  5. data/exe/ruby-lsp-check +0 -4
  6. data/exe/ruby-lsp-launcher +45 -22
  7. data/exe/ruby-lsp-test-exec +6 -0
  8. data/lib/rubocop/cop/ruby_lsp/use_language_server_aliases.rb +1 -2
  9. data/lib/rubocop/cop/ruby_lsp/use_register_with_handler_method.rb +3 -6
  10. data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +82 -116
  11. data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +140 -183
  12. data/lib/ruby_indexer/lib/ruby_indexer/enhancement.rb +10 -14
  13. data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +107 -236
  14. data/lib/ruby_indexer/lib/ruby_indexer/index.rb +188 -285
  15. data/lib/ruby_indexer/lib/ruby_indexer/location.rb +4 -27
  16. data/lib/ruby_indexer/lib/ruby_indexer/prefix_tree.rb +23 -27
  17. data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +25 -57
  18. data/lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb +58 -68
  19. data/lib/ruby_indexer/lib/ruby_indexer/uri.rb +17 -19
  20. data/lib/ruby_indexer/lib/ruby_indexer/visibility_scope.rb +7 -11
  21. data/lib/ruby_indexer/test/class_variables_test.rb +14 -14
  22. data/lib/ruby_indexer/test/classes_and_modules_test.rb +65 -40
  23. data/lib/ruby_indexer/test/configuration_test.rb +49 -9
  24. data/lib/ruby_indexer/test/constant_test.rb +34 -34
  25. data/lib/ruby_indexer/test/enhancements_test.rb +1 -1
  26. data/lib/ruby_indexer/test/index_test.rb +225 -135
  27. data/lib/ruby_indexer/test/instance_variables_test.rb +61 -37
  28. data/lib/ruby_indexer/test/method_test.rb +166 -123
  29. data/lib/ruby_indexer/test/prefix_tree_test.rb +21 -21
  30. data/lib/ruby_indexer/test/rbs_indexer_test.rb +70 -75
  31. data/lib/ruby_indexer/test/reference_finder_test.rb +79 -14
  32. data/lib/ruby_indexer/test/test_case.rb +9 -3
  33. data/lib/ruby_indexer/test/uri_test.rb +15 -2
  34. data/lib/ruby_lsp/addon.rb +88 -86
  35. data/lib/ruby_lsp/base_server.rb +79 -65
  36. data/lib/ruby_lsp/client_capabilities.rb +16 -13
  37. data/lib/ruby_lsp/document.rb +205 -104
  38. data/lib/ruby_lsp/erb_document.rb +45 -47
  39. data/lib/ruby_lsp/global_state.rb +73 -57
  40. data/lib/ruby_lsp/internal.rb +8 -3
  41. data/lib/ruby_lsp/listeners/code_lens.rb +82 -89
  42. data/lib/ruby_lsp/listeners/completion.rb +81 -76
  43. data/lib/ruby_lsp/listeners/definition.rb +44 -58
  44. data/lib/ruby_lsp/listeners/document_highlight.rb +149 -151
  45. data/lib/ruby_lsp/listeners/document_link.rb +94 -82
  46. data/lib/ruby_lsp/listeners/document_symbol.rb +38 -52
  47. data/lib/ruby_lsp/listeners/folding_ranges.rb +40 -43
  48. data/lib/ruby_lsp/listeners/hover.rb +107 -115
  49. data/lib/ruby_lsp/listeners/inlay_hints.rb +8 -13
  50. data/lib/ruby_lsp/listeners/semantic_highlighting.rb +54 -56
  51. data/lib/ruby_lsp/listeners/signature_help.rb +12 -27
  52. data/lib/ruby_lsp/listeners/spec_style.rb +231 -0
  53. data/lib/ruby_lsp/listeners/test_discovery.rb +107 -0
  54. data/lib/ruby_lsp/listeners/test_style.rb +207 -95
  55. data/lib/ruby_lsp/node_context.rb +12 -39
  56. data/lib/ruby_lsp/rbs_document.rb +10 -11
  57. data/lib/ruby_lsp/requests/code_action_resolve.rb +65 -61
  58. data/lib/ruby_lsp/requests/code_actions.rb +14 -26
  59. data/lib/ruby_lsp/requests/code_lens.rb +31 -21
  60. data/lib/ruby_lsp/requests/completion.rb +8 -21
  61. data/lib/ruby_lsp/requests/completion_resolve.rb +6 -6
  62. data/lib/ruby_lsp/requests/definition.rb +8 -20
  63. data/lib/ruby_lsp/requests/diagnostics.rb +8 -11
  64. data/lib/ruby_lsp/requests/discover_tests.rb +20 -7
  65. data/lib/ruby_lsp/requests/document_highlight.rb +6 -16
  66. data/lib/ruby_lsp/requests/document_link.rb +6 -17
  67. data/lib/ruby_lsp/requests/document_symbol.rb +5 -8
  68. data/lib/ruby_lsp/requests/folding_ranges.rb +7 -15
  69. data/lib/ruby_lsp/requests/formatting.rb +6 -9
  70. data/lib/ruby_lsp/requests/go_to_relevant_file.rb +139 -0
  71. data/lib/ruby_lsp/requests/hover.rb +12 -25
  72. data/lib/ruby_lsp/requests/inlay_hints.rb +8 -19
  73. data/lib/ruby_lsp/requests/on_type_formatting.rb +32 -40
  74. data/lib/ruby_lsp/requests/prepare_rename.rb +5 -10
  75. data/lib/ruby_lsp/requests/prepare_type_hierarchy.rb +5 -15
  76. data/lib/ruby_lsp/requests/range_formatting.rb +5 -6
  77. data/lib/ruby_lsp/requests/references.rb +17 -57
  78. data/lib/ruby_lsp/requests/rename.rb +27 -51
  79. data/lib/ruby_lsp/requests/request.rb +13 -25
  80. data/lib/ruby_lsp/requests/selection_ranges.rb +7 -7
  81. data/lib/ruby_lsp/requests/semantic_highlighting.rb +16 -35
  82. data/lib/ruby_lsp/requests/show_syntax_tree.rb +7 -8
  83. data/lib/ruby_lsp/requests/signature_help.rb +9 -27
  84. data/lib/ruby_lsp/requests/support/annotation.rb +4 -10
  85. data/lib/ruby_lsp/requests/support/common.rb +23 -61
  86. data/lib/ruby_lsp/requests/support/formatter.rb +16 -15
  87. data/lib/ruby_lsp/requests/support/package_url.rb +414 -0
  88. data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +27 -35
  89. data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +13 -16
  90. data/lib/ruby_lsp/requests/support/rubocop_runner.rb +34 -36
  91. data/lib/ruby_lsp/requests/support/selection_range.rb +1 -3
  92. data/lib/ruby_lsp/requests/support/sorbet.rb +29 -38
  93. data/lib/ruby_lsp/requests/support/source_uri.rb +20 -32
  94. data/lib/ruby_lsp/requests/support/syntax_tree_formatter.rb +12 -19
  95. data/lib/ruby_lsp/requests/support/test_item.rb +16 -14
  96. data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +5 -6
  97. data/lib/ruby_lsp/requests/workspace_symbol.rb +24 -16
  98. data/lib/ruby_lsp/response_builders/collection_response_builder.rb +6 -9
  99. data/lib/ruby_lsp/response_builders/document_symbol.rb +15 -21
  100. data/lib/ruby_lsp/response_builders/hover.rb +12 -18
  101. data/lib/ruby_lsp/response_builders/response_builder.rb +6 -7
  102. data/lib/ruby_lsp/response_builders/semantic_highlighting.rb +62 -91
  103. data/lib/ruby_lsp/response_builders/signature_help.rb +6 -8
  104. data/lib/ruby_lsp/response_builders/test_collection.rb +35 -13
  105. data/lib/ruby_lsp/ruby_document.rb +32 -98
  106. data/lib/ruby_lsp/scope.rb +7 -11
  107. data/lib/ruby_lsp/scripts/compose_bundle.rb +6 -4
  108. data/lib/ruby_lsp/server.rb +305 -198
  109. data/lib/ruby_lsp/setup_bundler.rb +131 -82
  110. data/lib/ruby_lsp/static_docs.rb +12 -7
  111. data/lib/ruby_lsp/store.rb +21 -49
  112. data/lib/ruby_lsp/test_helper.rb +3 -16
  113. data/lib/ruby_lsp/test_reporters/lsp_reporter.rb +241 -0
  114. data/lib/ruby_lsp/test_reporters/minitest_reporter.rb +145 -0
  115. data/lib/ruby_lsp/test_reporters/test_unit_reporter.rb +92 -0
  116. data/lib/ruby_lsp/type_inferrer.rb +13 -14
  117. data/lib/ruby_lsp/utils.rb +138 -93
  118. data/static_docs/break.md +103 -0
  119. metadata +15 -20
  120. data/lib/ruby_lsp/load_sorbet.rb +0 -62
@@ -15,11 +15,11 @@ module RubyIndexer
15
15
  end
16
16
  RUBY
17
17
 
18
- entries = @index["Foo"]
18
+ entries = @index["Foo"] #: as !nil
19
19
  assert_equal(2, entries.length)
20
20
 
21
21
  @index.delete(URI::Generic.from_path(path: "/fake/path/other_foo.rb"))
22
- entries = @index["Foo"]
22
+ entries = @index["Foo"] #: as !nil
23
23
  assert_equal(1, entries.length)
24
24
  end
25
25
 
@@ -29,7 +29,7 @@ module RubyIndexer
29
29
  end
30
30
  RUBY
31
31
 
32
- entries = @index["Foo"]
32
+ entries = @index["Foo"] #: as !nil
33
33
  assert_equal(1, entries.length)
34
34
 
35
35
  @index.delete(URI::Generic.from_path(path: "/fake/path/foo.rb"))
@@ -52,21 +52,21 @@ module RubyIndexer
52
52
  end
53
53
  RUBY
54
54
 
55
- entries = @index.resolve("Something", ["Foo", "Baz"])
55
+ entries = @index.resolve("Something", ["Foo", "Baz"]) #: as !nil
56
56
  refute_empty(entries)
57
- assert_equal("Foo::Baz::Something", entries.first.name)
57
+ assert_equal("Foo::Baz::Something", entries.first&.name)
58
58
 
59
- entries = @index.resolve("Bar", ["Foo"])
59
+ entries = @index.resolve("Bar", ["Foo"]) #: as !nil
60
60
  refute_empty(entries)
61
- assert_equal("Foo::Bar", entries.first.name)
61
+ assert_equal("Foo::Bar", entries.first&.name)
62
62
 
63
- entries = @index.resolve("Bar", ["Foo", "Baz"])
63
+ entries = @index.resolve("Bar", ["Foo", "Baz"]) #: as !nil
64
64
  refute_empty(entries)
65
- assert_equal("Foo::Bar", entries.first.name)
65
+ assert_equal("Foo::Bar", entries.first&.name)
66
66
 
67
- entries = @index.resolve("Foo::Bar", ["Foo", "Baz"])
67
+ entries = @index.resolve("Foo::Bar", ["Foo", "Baz"]) #: as !nil
68
68
  refute_empty(entries)
69
- assert_equal("Foo::Bar", entries.first.name)
69
+ assert_equal("Foo::Bar", entries.first&.name)
70
70
 
71
71
  assert_nil(@index.resolve("DoesNotExist", ["Foo"]))
72
72
  end
@@ -86,9 +86,9 @@ module RubyIndexer
86
86
  end
87
87
  RUBY
88
88
 
89
- entries = @index["::Foo::Baz::Something"]
89
+ entries = @index["::Foo::Baz::Something"] #: as !nil
90
90
  refute_empty(entries)
91
- assert_equal("Foo::Baz::Something", entries.first.name)
91
+ assert_equal("Foo::Baz::Something", entries.first&.name)
92
92
  end
93
93
 
94
94
  def test_fuzzy_search
@@ -140,7 +140,7 @@ module RubyIndexer
140
140
  end
141
141
  RUBY
142
142
 
143
- assert_equal(["path/foo", "path/other_foo"], @index.search_require_paths("path").map(&:require_path))
143
+ assert_equal(["path/other_foo", "path/foo"], @index.search_require_paths("path").map(&:require_path))
144
144
  end
145
145
 
146
146
  def test_searching_for_entries_based_on_prefix
@@ -157,10 +157,10 @@ module RubyIndexer
157
157
  RUBY
158
158
 
159
159
  results = @index.prefix_search("Foo", []).map { |entries| entries.map(&:name) }
160
- assert_equal([["Foo::Bizw", "Foo::Bizw"], ["Foo::Bizt"]], results)
160
+ assert_equal([["Foo::Bizt"], ["Foo::Bizw", "Foo::Bizw"]], results)
161
161
 
162
162
  results = @index.prefix_search("Biz", ["Foo"]).map { |entries| entries.map(&:name) }
163
- assert_equal([["Foo::Bizw", "Foo::Bizw"], ["Foo::Bizt"]], results)
163
+ assert_equal([["Foo::Bizt"], ["Foo::Bizw", "Foo::Bizw"]], results)
164
164
  end
165
165
 
166
166
  def test_resolve_normalizes_top_level_names
@@ -172,15 +172,15 @@ module RubyIndexer
172
172
  end
173
173
  RUBY
174
174
 
175
- entries = @index.resolve("::Foo::Bar", [])
175
+ entries = @index.resolve("::Foo::Bar", []) #: as !nil
176
176
  refute_nil(entries)
177
177
 
178
- assert_equal("Foo::Bar", entries.first.name)
178
+ assert_equal("Foo::Bar", entries.first&.name)
179
179
 
180
- entries = @index.resolve("::Bar", ["Foo"])
180
+ entries = @index.resolve("::Bar", ["Foo"]) #: as !nil
181
181
  refute_nil(entries)
182
182
 
183
- assert_equal("Bar", entries.first.name)
183
+ assert_equal("Bar", entries.first&.name)
184
184
  end
185
185
 
186
186
  def test_resolving_aliases_to_non_existing_constants_with_conflicting_names
@@ -195,7 +195,7 @@ module RubyIndexer
195
195
  end
196
196
  RUBY
197
197
 
198
- entry = @index.resolve("BAZ", ["Foo", "Bar"]).first
198
+ entry = @index.resolve("BAZ", ["Foo", "Bar"])&.first
199
199
  refute_nil(entry)
200
200
 
201
201
  assert_instance_of(Entry::UnresolvedConstantAlias, entry)
@@ -233,9 +233,10 @@ module RubyIndexer
233
233
  end
234
234
  RUBY
235
235
 
236
- entries = T.must(@index.resolve_method("baz", "Foo::Bar"))
237
- assert_equal("baz", entries.first.name)
238
- assert_equal("Foo::Bar", T.must(entries.first.owner).name)
236
+ entries = @index.resolve_method("baz", "Foo::Bar") #: as !nil
237
+ assert_equal("baz", entries.first&.name)
238
+ owner = entries.first&.owner #: as !nil
239
+ assert_equal("Foo::Bar", owner.name)
239
240
  end
240
241
 
241
242
  def test_resolve_method_with_class_name_conflict
@@ -248,9 +249,10 @@ module RubyIndexer
248
249
  end
249
250
  RUBY
250
251
 
251
- entries = T.must(@index.resolve_method("Array", "Foo"))
252
- assert_equal("Array", entries.first.name)
253
- assert_equal("Foo", T.must(entries.first.owner).name)
252
+ entries = @index.resolve_method("Array", "Foo") #: as !nil
253
+ assert_equal("Array", entries.first&.name)
254
+ owner = entries.first&.owner #: as !nil
255
+ assert_equal("Foo", owner.name)
254
256
  end
255
257
 
256
258
  def test_resolve_method_attribute
@@ -260,9 +262,10 @@ module RubyIndexer
260
262
  end
261
263
  RUBY
262
264
 
263
- entries = T.must(@index.resolve_method("bar", "Foo"))
264
- assert_equal("bar", entries.first.name)
265
- assert_equal("Foo", T.must(entries.first.owner).name)
265
+ entries = @index.resolve_method("bar", "Foo") #: as !nil
266
+ assert_equal("bar", entries.first&.name)
267
+ owner = entries.first&.owner #: as !nil
268
+ assert_equal("Foo", owner.name)
266
269
  end
267
270
 
268
271
  def test_resolve_method_with_two_definitions
@@ -278,15 +281,17 @@ module RubyIndexer
278
281
  end
279
282
  RUBY
280
283
 
281
- first_entry, second_entry = T.must(@index.resolve_method("bar", "Foo"))
284
+ first_entry, second_entry = @index.resolve_method("bar", "Foo") #: as !nil
282
285
 
283
- assert_equal("bar", first_entry.name)
284
- assert_equal("Foo", T.must(first_entry.owner).name)
285
- assert_includes(first_entry.comments, "Hello from first `bar`")
286
+ assert_equal("bar", first_entry&.name)
287
+ owner = first_entry&.owner #: as !nil
288
+ assert_equal("Foo", owner.name)
289
+ assert_includes(first_entry&.comments, "Hello from first `bar`")
286
290
 
287
- assert_equal("bar", second_entry.name)
288
- assert_equal("Foo", T.must(second_entry.owner).name)
289
- assert_includes(second_entry.comments, "Hello from second `bar`")
291
+ assert_equal("bar", second_entry&.name)
292
+ owner = second_entry&.owner #: as !nil
293
+ assert_equal("Foo", owner.name)
294
+ assert_includes(second_entry&.comments, "Hello from second `bar`")
290
295
  end
291
296
 
292
297
  def test_resolve_method_inherited_only
@@ -300,9 +305,8 @@ module RubyIndexer
300
305
  end
301
306
  RUBY
302
307
 
303
- entry = T.must(@index.resolve_method("baz", "Foo", inherited_only: true).first)
304
-
305
- assert_equal("Bar", T.must(entry.owner).name)
308
+ entry = @index.resolve_method("baz", "Foo", inherited_only: true)&.first #: as !nil
309
+ assert_equal("Bar", entry.owner&.name)
306
310
  end
307
311
 
308
312
  def test_resolve_method_inherited_only_for_prepended_module
@@ -338,7 +342,7 @@ module RubyIndexer
338
342
  entries = @index.prefix_search("qz")
339
343
  refute_empty(entries)
340
344
 
341
- entry = T.must(T.must(entries.first).first)
345
+ entry = entries.first&.first #: as !nil
342
346
  assert_equal("qzx", entry.name)
343
347
  end
344
348
 
@@ -724,6 +728,30 @@ module RubyIndexer
724
728
  assert_equal(["A", "ALIAS"], @index.linearized_ancestors_of("A"))
725
729
  end
726
730
 
731
+ def test_linearizing_ancestors_for_classes_with_overridden_parents
732
+ index(<<~RUBY)
733
+ # Find the re-open of a class first, without specifying a parent
734
+ class Child
735
+ end
736
+
737
+ # Now, find the actual definition of the class, which includes a parent
738
+ class Parent; end
739
+ class Child < Parent
740
+ end
741
+ RUBY
742
+
743
+ assert_equal(
744
+ [
745
+ "Child",
746
+ "Parent",
747
+ "Object",
748
+ "Kernel",
749
+ "BasicObject",
750
+ ],
751
+ @index.linearized_ancestors_of("Child"),
752
+ )
753
+ end
754
+
727
755
  def test_resolving_an_inherited_method
728
756
  index(<<~RUBY)
729
757
  module Foo
@@ -739,13 +767,13 @@ module RubyIndexer
739
767
  end
740
768
  RUBY
741
769
 
742
- entry = T.must(@index.resolve_method("baz", "Wow")&.first)
770
+ entry = @index.resolve_method("baz", "Wow")&.first #: as !nil
743
771
  assert_equal("baz", entry.name)
744
- assert_equal("Foo", T.must(entry.owner).name)
772
+ assert_equal("Foo", entry.owner&.name)
745
773
 
746
- entry = T.must(@index.resolve_method("qux", "Wow")&.first)
774
+ entry = @index.resolve_method("qux", "Wow")&.first #: as !nil
747
775
  assert_equal("qux", entry.name)
748
- assert_equal("Bar", T.must(entry.owner).name)
776
+ assert_equal("Bar", entry.owner&.name)
749
777
  end
750
778
 
751
779
  def test_resolving_an_inherited_method_lands_on_first_match
@@ -765,12 +793,12 @@ module RubyIndexer
765
793
  end
766
794
  RUBY
767
795
 
768
- entries = T.must(@index.resolve_method("qux", "Wow"))
796
+ entries = @index.resolve_method("qux", "Wow") #: as !nil
769
797
  assert_equal(1, entries.length)
770
798
 
771
- entry = T.must(entries.first)
799
+ entry = entries.first #: as !nil
772
800
  assert_equal("qux", entry.name)
773
- assert_equal("Foo", T.must(entry.owner).name)
801
+ assert_equal("Foo", entry.owner&.name)
774
802
  end
775
803
 
776
804
  def test_handle_change_clears_ancestor_cache_if_tree_changed
@@ -800,7 +828,8 @@ module RubyIndexer
800
828
  end
801
829
  RUBY
802
830
 
803
- @index.handle_change(uri, File.read(T.must(uri.full_path)))
831
+ path = uri.full_path #: as !nil
832
+ @index.handle_change(uri, File.read(path))
804
833
  assert_empty(@index.instance_variable_get(:@ancestors))
805
834
  assert_equal(["Bar", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Bar"))
806
835
  end
@@ -837,7 +866,8 @@ module RubyIndexer
837
866
  end
838
867
  RUBY
839
868
 
840
- @index.handle_change(uri, File.read(T.must(uri.full_path)))
869
+ path = uri.full_path #: as !nil
870
+ @index.handle_change(uri, File.read(path))
841
871
  refute_empty(@index.instance_variable_get(:@ancestors))
842
872
  assert_equal(["Bar", "Foo", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Bar"))
843
873
  end
@@ -870,7 +900,8 @@ module RubyIndexer
870
900
  end
871
901
  RUBY
872
902
 
873
- @index.handle_change(uri, File.read(T.must(uri.full_path)))
903
+ path = uri.full_path #: as !nil
904
+ @index.handle_change(uri, File.read(path))
874
905
  assert_empty(@index.instance_variable_get(:@ancestors))
875
906
  assert_equal(["Bar", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Bar"))
876
907
  end
@@ -904,7 +935,7 @@ module RubyIndexer
904
935
  CONST = 4
905
936
  RUBY
906
937
 
907
- entry = T.must(@index.resolve("CONST", ["Namespace", "Bar"])&.first)
938
+ entry = @index.resolve("CONST", ["Namespace", "Bar"])&.first #: as !nil
908
939
  assert_equal(14, entry.location.start_line)
909
940
  end
910
941
 
@@ -925,10 +956,10 @@ module RubyIndexer
925
956
  end
926
957
  RUBY
927
958
 
928
- entry = T.must(@index.resolve("Foo::CONST::TARGET", [])&.first)
959
+ entry = @index.resolve("Foo::CONST::TARGET", [])&.first #: as !nil
929
960
  assert_equal(2, entry.location.start_line)
930
961
 
931
- entry = T.must(@index.resolve("Namespace::Bar::CONST::TARGET", [])&.first)
962
+ entry = @index.resolve("Namespace::Bar::CONST::TARGET", [])&.first #: as !nil
932
963
  assert_equal(2, entry.location.start_line)
933
964
  end
934
965
 
@@ -946,10 +977,10 @@ module RubyIndexer
946
977
  end
947
978
  RUBY
948
979
 
949
- entry = T.must(@index.resolve("CONST", ["Namespace", "Child"])&.first)
980
+ entry = @index.resolve("CONST", ["Namespace", "Child"])&.first #: as !nil
950
981
  assert_equal(2, entry.location.start_line)
951
982
 
952
- entry = T.must(@index.resolve("Namespace::Child::CONST", [])&.first)
983
+ entry = @index.resolve("Namespace::Child::CONST", [])&.first #: as !nil
953
984
  assert_equal(5, entry.location.start_line)
954
985
  end
955
986
 
@@ -975,13 +1006,13 @@ module RubyIndexer
975
1006
  end
976
1007
  RUBY
977
1008
 
978
- entry = T.must(@index.resolve("CONST", ["Foo"])&.first)
1009
+ entry = @index.resolve("CONST", ["Foo"])&.first #: as !nil
979
1010
  assert_equal(6, entry.location.start_line)
980
1011
 
981
- entry = T.must(@index.resolve("Foo::CONST", [])&.first)
1012
+ entry = @index.resolve("Foo::CONST", [])&.first #: as !nil
982
1013
  assert_equal(6, entry.location.start_line)
983
1014
 
984
- entry = T.must(@index.resolve("Bar::CONST", [])&.first)
1015
+ entry = @index.resolve("Bar::CONST", [])&.first #: as !nil
985
1016
  assert_equal(15, entry.location.start_line)
986
1017
  end
987
1018
 
@@ -1005,7 +1036,7 @@ module RubyIndexer
1005
1036
  end
1006
1037
  RUBY
1007
1038
 
1008
- entry = T.must(@index.resolve("CONST", ["First", "Second"])&.first)
1039
+ entry = @index.resolve("CONST", ["First", "Second"])&.first #: as !nil
1009
1040
  assert_equal(6, entry.location.start_line)
1010
1041
  end
1011
1042
 
@@ -1017,11 +1048,11 @@ module RubyIndexer
1017
1048
  end
1018
1049
  RUBY
1019
1050
 
1020
- foo_entry = T.must(@index.resolve("FOO", ["Namespace"])&.first)
1051
+ foo_entry = @index.resolve("FOO", ["Namespace"])&.first #: as !nil
1021
1052
  assert_equal(2, foo_entry.location.start_line)
1022
1053
  assert_instance_of(Entry::ConstantAlias, foo_entry)
1023
1054
 
1024
- bar_entry = T.must(@index.resolve("BAR", ["Namespace"])&.first)
1055
+ bar_entry = @index.resolve("BAR", ["Namespace"])&.first #: as !nil
1025
1056
  assert_equal(3, bar_entry.location.start_line)
1026
1057
  assert_instance_of(Entry::ConstantAlias, bar_entry)
1027
1058
  end
@@ -1035,15 +1066,15 @@ module RubyIndexer
1035
1066
  end
1036
1067
  RUBY
1037
1068
 
1038
- foo_entry = T.must(@index.resolve("FOO", ["Namespace"])&.first)
1069
+ foo_entry = @index.resolve("FOO", ["Namespace"])&.first #: as !nil
1039
1070
  assert_equal(2, foo_entry.location.start_line)
1040
1071
  assert_instance_of(Entry::ConstantAlias, foo_entry)
1041
1072
 
1042
- bar_entry = T.must(@index.resolve("BAR", ["Namespace"])&.first)
1073
+ bar_entry = @index.resolve("BAR", ["Namespace"])&.first #: as !nil
1043
1074
  assert_equal(3, bar_entry.location.start_line)
1044
1075
  assert_instance_of(Entry::ConstantAlias, bar_entry)
1045
1076
 
1046
- baz_entry = T.must(@index.resolve("BAZ", ["Namespace"])&.first)
1077
+ baz_entry = @index.resolve("BAZ", ["Namespace"])&.first #: as !nil
1047
1078
  assert_equal(4, baz_entry.location.start_line)
1048
1079
  assert_instance_of(Entry::ConstantAlias, baz_entry)
1049
1080
  end
@@ -1065,7 +1096,7 @@ module RubyIndexer
1065
1096
  end
1066
1097
  RUBY
1067
1098
 
1068
- entry = T.must(@index.resolve("Other::ALIAS::CONST", ["Third"])&.first)
1099
+ entry = @index.resolve("Other::ALIAS::CONST", ["Third"])&.first #: as !nil
1069
1100
  assert_kind_of(Entry::Constant, entry)
1070
1101
  assert_equal("Original::Something::CONST", entry.name)
1071
1102
  end
@@ -1080,7 +1111,7 @@ module RubyIndexer
1080
1111
  FOO::CONST
1081
1112
  RUBY
1082
1113
 
1083
- entry = T.must(@index.resolve("FOO::CONST", [])&.first)
1114
+ entry = @index.resolve("FOO::CONST", [])&.first #: as !nil
1084
1115
  assert_kind_of(Entry::Constant, entry)
1085
1116
  assert_equal("Foo::CONST", entry.name)
1086
1117
  end
@@ -1091,7 +1122,7 @@ module RubyIndexer
1091
1122
  end
1092
1123
  RUBY
1093
1124
 
1094
- foo_entry = T.must(@index.resolve("Foo::Bar", [])&.first)
1125
+ foo_entry = @index.resolve("Foo::Bar", [])&.first #: as !nil
1095
1126
  assert_equal(1, foo_entry.location.start_line)
1096
1127
  assert_instance_of(Entry::Class, foo_entry)
1097
1128
  end
@@ -1117,10 +1148,50 @@ module RubyIndexer
1117
1148
  end
1118
1149
  RUBY
1119
1150
 
1120
- foo_entry = T.must(@index.resolve("A::B::Foo::CONST", ["A", "B"])&.first)
1151
+ foo_entry = @index.resolve("A::B::Foo::CONST", ["A", "B"])&.first #: as !nil
1121
1152
  assert_equal(2, foo_entry.location.start_line)
1122
1153
  end
1123
1154
 
1155
+ def test_resolving_self_referential_constant_alias
1156
+ index(<<~RUBY)
1157
+ module A
1158
+ module B
1159
+ class C
1160
+ end
1161
+ end
1162
+ end
1163
+
1164
+ module A
1165
+ module D
1166
+ B = B::C
1167
+ end
1168
+ end
1169
+ RUBY
1170
+
1171
+ entry = @index.resolve("A::D::B", [])&.first #: as Entry::ConstantAlias
1172
+
1173
+ assert_kind_of(RubyIndexer::Entry::ConstantAlias, entry)
1174
+ assert_equal(10, entry.location.start_line)
1175
+ assert_equal("A::B::C", entry.target)
1176
+ end
1177
+
1178
+ def test_resolving_non_existing_self_referential_constant_alias
1179
+ index(<<~RUBY)
1180
+ module Foo
1181
+ SomeClass = ::SomeClass
1182
+ UNRESOLVED = SomeClass::CONSTANT
1183
+ end
1184
+ RUBY
1185
+
1186
+ entry = @index.resolve("Foo::UNRESOLVED", [])&.first #: as Entry::UnresolvedConstantAlias
1187
+ assert_kind_of(Entry::UnresolvedConstantAlias, entry)
1188
+ assert_equal(3, entry.location.start_line)
1189
+ assert_equal("SomeClass::CONSTANT", entry.target)
1190
+
1191
+ entry = @index.resolve("SomeClass::CONSTANT", ["Foo"])
1192
+ refute(entry)
1193
+ end
1194
+
1124
1195
  def test_resolving_qualified_references
1125
1196
  index(<<~RUBY)
1126
1197
  module Namespace
@@ -1135,7 +1206,7 @@ module RubyIndexer
1135
1206
  end
1136
1207
  RUBY
1137
1208
 
1138
- foo_entry = T.must(@index.resolve("Entry::CONST", ["Namespace", "Index"])&.first)
1209
+ foo_entry = @index.resolve("Entry::CONST", ["Namespace", "Index"])&.first #: as !nil
1139
1210
  assert_equal(3, foo_entry.location.start_line)
1140
1211
  end
1141
1212
 
@@ -1154,7 +1225,7 @@ module RubyIndexer
1154
1225
  end
1155
1226
  RUBY
1156
1227
 
1157
- foo_entry = T.must(@index.resolve("CONST", ["Namespace", "Index"])&.first)
1228
+ foo_entry = @index.resolve("CONST", ["Namespace", "Index"])&.first #: as !nil
1158
1229
  assert_equal(6, foo_entry.location.start_line)
1159
1230
  end
1160
1231
 
@@ -1171,7 +1242,7 @@ module RubyIndexer
1171
1242
  end
1172
1243
  RUBY
1173
1244
 
1174
- foo_entry = T.must(@index.resolve("CONST", ["Namespace", "Index"])&.first)
1245
+ foo_entry = @index.resolve("CONST", ["Namespace", "Index"])&.first #: as !nil
1175
1246
  assert_equal(1, foo_entry.location.start_line)
1176
1247
  end
1177
1248
 
@@ -1190,9 +1261,9 @@ module RubyIndexer
1190
1261
  end
1191
1262
  RUBY
1192
1263
 
1193
- entry = T.must(@index.instance_variable_completion_candidates("@", "Bar")&.first)
1264
+ entry = @index.instance_variable_completion_candidates("@", "Bar").first #: as !nil
1194
1265
  assert_equal("@bar", entry.name)
1195
- assert_equal("Bar", T.must(entry.owner).name)
1266
+ assert_equal("Bar", entry.owner&.name)
1196
1267
  end
1197
1268
 
1198
1269
  def test_resolving_a_qualified_reference
@@ -1213,7 +1284,7 @@ module RubyIndexer
1213
1284
  end
1214
1285
  RUBY
1215
1286
 
1216
- foo_entry = T.must(@index.resolve("Third::CONST", ["Foo"])&.first)
1287
+ foo_entry = @index.resolve("Third::CONST", ["Foo"])&.first #: as !nil
1217
1288
  assert_equal(9, foo_entry.location.start_line)
1218
1289
  end
1219
1290
 
@@ -1226,9 +1297,9 @@ module RubyIndexer
1226
1297
  class Object; end
1227
1298
  RUBY
1228
1299
 
1229
- entries = @index["Object"]
1300
+ entries = @index["Object"] #: as !nil
1230
1301
  assert_equal(2, entries.length)
1231
- reopened_entry = entries.last
1302
+ reopened_entry = entries.last #: as Entry::Class
1232
1303
  assert_equal("::BasicObject", reopened_entry.parent_class)
1233
1304
  assert_equal(["Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Object"))
1234
1305
  end
@@ -1238,9 +1309,9 @@ module RubyIndexer
1238
1309
  class BasicObject; end
1239
1310
  RUBY
1240
1311
 
1241
- entries = @index["BasicObject"]
1312
+ entries = @index["BasicObject"] #: as !nil
1242
1313
  assert_equal(2, entries.length)
1243
- reopened_entry = entries.last
1314
+ reopened_entry = entries.last #: as Entry::Class
1244
1315
  assert_nil(reopened_entry.parent_class)
1245
1316
  assert_equal(["BasicObject"], @index.linearized_ancestors_of("BasicObject"))
1246
1317
  end
@@ -1318,10 +1389,9 @@ module RubyIndexer
1318
1389
  end
1319
1390
  RUBY
1320
1391
 
1321
- entry = @index.resolve_method("found_me!", "Foo::Bar::<Class:Bar>::Baz::<Class:Baz>")&.first
1392
+ entry = @index.resolve_method("found_me!", "Foo::Bar::<Class:Bar>::Baz::<Class:Baz>")&.first #: as !nil
1322
1393
  refute_nil(entry)
1323
-
1324
- assert_equal("found_me!", T.must(entry).name)
1394
+ assert_equal("found_me!", entry.name)
1325
1395
  end
1326
1396
 
1327
1397
  def test_resolving_constants_in_singleton_contexts
@@ -1344,9 +1414,9 @@ module RubyIndexer
1344
1414
  end
1345
1415
  RUBY
1346
1416
 
1347
- entry = @index.resolve("CONST", ["Foo", "Bar", "<Class:Bar>", "Baz", "<Class:Baz>"])&.first
1417
+ entry = @index.resolve("CONST", ["Foo", "Bar", "<Class:Bar>", "Baz", "<Class:Baz>"])&.first #: as !nil
1348
1418
  refute_nil(entry)
1349
- assert_equal(9, T.must(entry).location.start_line)
1419
+ assert_equal(9, entry.location.start_line)
1350
1420
  end
1351
1421
 
1352
1422
  def test_resolving_instance_variables_in_singleton_contexts
@@ -1366,17 +1436,17 @@ module RubyIndexer
1366
1436
  end
1367
1437
  RUBY
1368
1438
 
1369
- entry = @index.resolve_instance_variable("@a", "Foo::Bar::<Class:Bar>")&.first
1439
+ entry = @index.resolve_instance_variable("@a", "Foo::Bar::<Class:Bar>")&.first #: as !nil
1370
1440
  refute_nil(entry)
1371
- assert_equal("@a", T.must(entry).name)
1441
+ assert_equal("@a", entry.name)
1372
1442
 
1373
- entry = @index.resolve_instance_variable("@b", "Foo::Bar::<Class:Bar>")&.first
1443
+ entry = @index.resolve_instance_variable("@b", "Foo::Bar::<Class:Bar>")&.first #: as !nil
1374
1444
  refute_nil(entry)
1375
- assert_equal("@b", T.must(entry).name)
1445
+ assert_equal("@b", entry.name)
1376
1446
 
1377
- entry = @index.resolve_instance_variable("@c", "Foo::Bar::<Class:Bar>::<Class:<Class:Bar>>")&.first
1447
+ entry = @index.resolve_instance_variable("@c", "Foo::Bar::<Class:Bar>::<Class:<Class:Bar>>")&.first #: as !nil
1378
1448
  refute_nil(entry)
1379
- assert_equal("@c", T.must(entry).name)
1449
+ assert_equal("@c", entry.name)
1380
1450
  end
1381
1451
 
1382
1452
  def test_instance_variable_completion_in_singleton_contexts
@@ -1422,7 +1492,7 @@ module RubyIndexer
1422
1492
 
1423
1493
  results = @index.fuzzy_search("Zwq")
1424
1494
  assert_equal(1, results.length)
1425
- assert_equal("Zwq", results.first.name)
1495
+ assert_equal("Zwq", results.first&.name)
1426
1496
  end
1427
1497
 
1428
1498
  def test_resolving_method_aliases
@@ -1444,39 +1514,39 @@ module RubyIndexer
1444
1514
  RUBY
1445
1515
 
1446
1516
  # baz
1447
- methods = @index.resolve_method("baz", "Bar")
1517
+ methods = @index.resolve_method("baz", "Bar") #: as !nil
1448
1518
  refute_nil(methods)
1449
1519
 
1450
- entry = T.must(methods.first)
1520
+ entry = methods.first #: as Entry::MethodAlias
1451
1521
  assert_kind_of(Entry::MethodAlias, entry)
1452
1522
  assert_equal("bar", entry.target.name)
1453
- assert_equal("Foo", T.must(entry.target.owner).name)
1523
+ assert_equal("Foo", entry.target.owner&.name)
1454
1524
 
1455
1525
  # qux
1456
- methods = @index.resolve_method("qux", "Bar")
1526
+ methods = @index.resolve_method("qux", "Bar") #: as !nil
1457
1527
  refute_nil(methods)
1458
1528
 
1459
- entry = T.must(methods.first)
1529
+ entry = methods.first #: as Entry::MethodAlias
1460
1530
  assert_kind_of(Entry::MethodAlias, entry)
1461
1531
  assert_equal("hello", entry.target.name)
1462
- assert_equal("Bar", T.must(entry.target.owner).name)
1532
+ assert_equal("Bar", entry.target.owner&.name)
1463
1533
 
1464
1534
  # double
1465
- methods = @index.resolve_method("double", "Bar")
1535
+ methods = @index.resolve_method("double", "Bar") #: as !nil
1466
1536
  refute_nil(methods)
1467
1537
 
1468
- entry = T.must(methods.first)
1538
+ entry = methods.first #: as Entry::MethodAlias
1469
1539
  assert_kind_of(Entry::MethodAlias, entry)
1470
1540
 
1471
- target = entry.target
1541
+ target = entry.target #: as Entry::MethodAlias
1472
1542
  assert_equal("double_alias", target.name)
1473
1543
  assert_kind_of(Entry::MethodAlias, target)
1474
- assert_equal("Foo", T.must(target.owner).name)
1544
+ assert_equal("Foo", target.owner&.name)
1475
1545
 
1476
1546
  final_target = target.target
1477
1547
  assert_equal("bar", final_target.name)
1478
1548
  assert_kind_of(Entry::Method, final_target)
1479
- assert_equal("Foo", T.must(final_target.owner).name)
1549
+ assert_equal("Foo", final_target.owner&.name)
1480
1550
  end
1481
1551
 
1482
1552
  def test_resolving_circular_method_aliases
@@ -1490,7 +1560,7 @@ module RubyIndexer
1490
1560
  methods = @index.resolve_method("bar", "Foo")
1491
1561
  assert_nil(methods)
1492
1562
 
1493
- entry = T.must(@index["bar"].first)
1563
+ entry = @index["bar"]&.first
1494
1564
  assert_kind_of(Entry::UnresolvedMethodAlias, entry)
1495
1565
  end
1496
1566
 
@@ -1505,7 +1575,7 @@ module RubyIndexer
1505
1575
  methods = @index.resolve_method("bar", "Foo")
1506
1576
  assert_nil(methods)
1507
1577
 
1508
- entry = T.must(@index["bar"].first)
1578
+ entry = @index["bar"]&.first
1509
1579
  assert_kind_of(Entry::UnresolvedMethodAlias, entry)
1510
1580
  end
1511
1581
 
@@ -1521,18 +1591,18 @@ module RubyIndexer
1521
1591
  end
1522
1592
  RUBY
1523
1593
 
1524
- methods = @index.resolve_method("decorated_name", "Foo")
1594
+ methods = @index.resolve_method("decorated_name", "Foo") #: as !nil
1525
1595
  refute_nil(methods)
1526
1596
 
1527
- entry = T.must(methods.first)
1597
+ entry = methods.first #: as Entry::MethodAlias
1528
1598
  assert_kind_of(Entry::MethodAlias, entry)
1529
1599
 
1530
1600
  target = entry.target
1531
1601
  assert_equal("name", target.name)
1532
1602
  assert_kind_of(Entry::Accessor, target)
1533
- assert_equal("Foo", T.must(target.owner).name)
1603
+ assert_equal("Foo", target.owner&.name)
1534
1604
 
1535
- other_decorated_name = T.must(@index["decorated_name"].find { |e| e.is_a?(Entry::UnresolvedMethodAlias) })
1605
+ other_decorated_name = @index["decorated_name"]&.find { |e| e.is_a?(Entry::UnresolvedMethodAlias) }
1536
1606
  assert_kind_of(Entry::UnresolvedMethodAlias, other_decorated_name)
1537
1607
  end
1538
1608
 
@@ -1557,7 +1627,7 @@ module RubyIndexer
1557
1627
  end
1558
1628
  RUBY
1559
1629
 
1560
- entry = T.must(@index.first_unqualified_const("Bar")&.first)
1630
+ entry = @index.first_unqualified_const("Bar")&.first #: as !nil
1561
1631
  assert_equal("Foo::Bar", entry.name)
1562
1632
  end
1563
1633
 
@@ -1574,7 +1644,7 @@ module RubyIndexer
1574
1644
  end
1575
1645
  RUBY
1576
1646
 
1577
- entry = T.must(@index.first_unqualified_const("Type")&.first)
1647
+ entry = @index.first_unqualified_const("Type")&.first #: as !nil
1578
1648
  assert_equal("Namespace::Type", entry.name)
1579
1649
  end
1580
1650
 
@@ -1591,7 +1661,7 @@ module RubyIndexer
1591
1661
 
1592
1662
  entries = @index.method_completion_candidates("bar", "Baz")
1593
1663
  assert_equal(["bar"], entries.map(&:name))
1594
- assert_equal("Baz", T.must(entries.first.owner).name)
1664
+ assert_equal("Baz", entries.first&.owner&.name)
1595
1665
  end
1596
1666
 
1597
1667
  def test_completion_does_not_duplicate_methods_overridden_by_aliases
@@ -1607,7 +1677,7 @@ module RubyIndexer
1607
1677
 
1608
1678
  entries = @index.method_completion_candidates("bar", "Baz")
1609
1679
  assert_equal(["bar"], entries.map(&:name))
1610
- assert_equal("Baz", T.must(entries.first.owner).name)
1680
+ assert_equal("Baz", entries.first&.owner&.name)
1611
1681
  end
1612
1682
 
1613
1683
  def test_decorated_parameters
@@ -1618,11 +1688,10 @@ module RubyIndexer
1618
1688
  end
1619
1689
  RUBY
1620
1690
 
1621
- methods = @index.resolve_method("bar", "Foo")
1691
+ methods = @index.resolve_method("bar", "Foo") #: as !nil
1622
1692
  refute_nil(methods)
1623
1693
 
1624
- entry = T.must(methods.first)
1625
-
1694
+ entry = methods.first #: as Entry::Method
1626
1695
  assert_equal("(a, b = <default>, c: <default>)", entry.decorated_parameters)
1627
1696
  end
1628
1697
 
@@ -1634,11 +1703,10 @@ module RubyIndexer
1634
1703
  end
1635
1704
  RUBY
1636
1705
 
1637
- methods = @index.resolve_method("bar", "Foo")
1706
+ methods = @index.resolve_method("bar", "Foo") #: as !nil
1638
1707
  refute_nil(methods)
1639
1708
 
1640
- entry = T.must(methods.first)
1641
-
1709
+ entry = methods.first #: as Entry::Method
1642
1710
  assert_equal("()", entry.decorated_parameters)
1643
1711
  end
1644
1712
 
@@ -1707,9 +1775,9 @@ module RubyIndexer
1707
1775
  RUBY
1708
1776
 
1709
1777
  ["bar", "baz"].product(["Foo", "Foo::<Class:Foo>"]).each do |method, receiver|
1710
- entry = @index.resolve_method(method, receiver)&.first
1778
+ entry = @index.resolve_method(method, receiver)&.first #: as !nil
1711
1779
  refute_nil(entry)
1712
- assert_equal(method, T.must(entry).name)
1780
+ assert_equal(method, entry.name)
1713
1781
  end
1714
1782
 
1715
1783
  assert_equal(
@@ -1888,7 +1956,7 @@ module RubyIndexer
1888
1956
  end
1889
1957
  RUBY
1890
1958
 
1891
- method = @index.resolve_method("==", "Foo").first
1959
+ method = @index.resolve_method("==", "Foo")&.first #: as Entry::Method
1892
1960
  assert_kind_of(Entry::Method, method)
1893
1961
  assert_equal("==", method.name)
1894
1962
 
@@ -1906,13 +1974,13 @@ module RubyIndexer
1906
1974
  end
1907
1975
  RUBY
1908
1976
 
1909
- entries = @index.entries_for("file:///fake/path/foo.rb", Entry)
1977
+ entries = @index.entries_for("file:///fake/path/foo.rb", Entry) #: as !nil
1910
1978
  assert_equal(["Foo", "Bar", "my_def", "Bar::<Class:Bar>", "my_singleton_def"], entries.map(&:name))
1911
1979
 
1912
- entries = @index.entries_for("file:///fake/path/foo.rb", RubyIndexer::Entry::Namespace)
1980
+ entries = @index.entries_for("file:///fake/path/foo.rb", RubyIndexer::Entry::Namespace) #: as !nil
1913
1981
  assert_equal(["Foo", "Bar", "Bar::<Class:Bar>"], entries.map(&:name))
1914
1982
 
1915
- entries = @index.entries_for("file:///fake/path/foo.rb")
1983
+ entries = @index.entries_for("file:///fake/path/foo.rb") #: as !nil
1916
1984
  assert_equal(["Foo", "Bar", "my_def", "Bar::<Class:Bar>", "my_singleton_def"], entries.map(&:name))
1917
1985
  end
1918
1986
 
@@ -1945,14 +2013,29 @@ module RubyIndexer
1945
2013
  result = @index.constant_completion_candidates("X", ["Namespace", "Baz"])
1946
2014
 
1947
2015
  result.each do |entries|
1948
- name = entries.first.name
2016
+ name = entries.first&.name
1949
2017
  assert(entries.all? { |e| e.name == name })
1950
2018
  end
1951
2019
 
1952
- assert_equal(["Namespace::XQRK", "Bar::XQRK", "XQRK"], result.map { |entries| entries.first.name })
2020
+ assert_equal(["Namespace::XQRK", "Bar::XQRK", "XQRK"], result.map { |entries| entries.first&.name })
1953
2021
 
1954
2022
  result = @index.constant_completion_candidates("::X", ["Namespace", "Baz"])
1955
- assert_equal(["XQRK"], result.map { |entries| entries.first.name })
2023
+ assert_equal(["XQRK"], result.map { |entries| entries.first&.name })
2024
+ end
2025
+
2026
+ def test_constant_completion_does_not_confuse_uppercase_methods
2027
+ index(<<~RUBY)
2028
+ class Foo
2029
+ def Qux
2030
+ end
2031
+ end
2032
+ RUBY
2033
+
2034
+ candidates = @index.constant_completion_candidates("Q", [])
2035
+ refute_includes(candidates.flat_map { |entries| entries.map(&:name) }, "Qux")
2036
+
2037
+ candidates = @index.constant_completion_candidates("Qux", [])
2038
+ assert_equal(0, candidates.length)
1956
2039
  end
1957
2040
 
1958
2041
  def test_constant_completion_candidates_for_empty_name
@@ -1967,7 +2050,7 @@ module RubyIndexer
1967
2050
  RUBY
1968
2051
 
1969
2052
  result = @index.constant_completion_candidates("Baz::", [])
1970
- assert_includes(result.map { |entries| entries.first.name }, "Foo::Bar")
2053
+ assert_includes(result.map { |entries| entries.first&.name }, "Foo::Bar")
1971
2054
  end
1972
2055
 
1973
2056
  def test_follow_alias_namespace
@@ -2025,7 +2108,7 @@ module RubyIndexer
2025
2108
  end
2026
2109
  RUBY
2027
2110
 
2028
- entry = @index.resolve("Namespace::Foo::CONST", ["First", "Namespace", "Foo", "InnerNamespace"])&.first
2111
+ entry = @index.resolve("Namespace::Foo::CONST", ["First", "Namespace", "Foo", "InnerNamespace"])&.first #: as !nil
2029
2112
  assert_equal("Parent::CONST", entry.name)
2030
2113
  assert_instance_of(Entry::Constant, entry)
2031
2114
  end
@@ -2093,7 +2176,7 @@ module RubyIndexer
2093
2176
  end
2094
2177
  RUBY
2095
2178
 
2096
- entry = @index["Foo"]&.first
2179
+ entry = @index["Foo"]&.first #: as !nil
2097
2180
  refute_nil(entry, "Expected indexer to be able to handle unsaved URIs")
2098
2181
  assert_equal("untitled:Untitled-1", entry.uri.to_s)
2099
2182
  assert_equal("Untitled-1", entry.file_name)
@@ -2105,7 +2188,7 @@ module RubyIndexer
2105
2188
  end
2106
2189
  RUBY
2107
2190
 
2108
- entry = @index["Foo"]&.first
2191
+ entry = @index["Foo"]&.first #: as !nil
2109
2192
  refute_nil(entry, "Expected indexer to be able to handle unsaved URIs")
2110
2193
  assert_equal("I added this comment!", entry.comments)
2111
2194
  end
@@ -2124,13 +2207,13 @@ module RubyIndexer
2124
2207
  end
2125
2208
  RUBY
2126
2209
 
2127
- abc, adf = @index.instance_variable_completion_candidates("@", "Child::<Class:Child>")
2210
+ adf, abc = @index.instance_variable_completion_candidates("@", "Child::<Class:Child>")
2128
2211
 
2129
2212
  refute_nil(abc)
2130
2213
  refute_nil(adf)
2131
2214
 
2132
- assert_equal("@@abc", abc.name)
2133
- assert_equal("@@adf", adf.name)
2215
+ assert_equal("@@abc", abc&.name)
2216
+ assert_equal("@@adf", adf&.name)
2134
2217
  end
2135
2218
 
2136
2219
  def test_class_variable_completion_from_singleton_context
@@ -2156,7 +2239,7 @@ module RubyIndexer
2156
2239
  end
2157
2240
  RUBY
2158
2241
 
2159
- candidates = @index.resolve_class_variable("@@hello", "Foo::<Class:Foo>")
2242
+ candidates = @index.resolve_class_variable("@@hello", "Foo::<Class:Foo>") #: as !nil
2160
2243
  refute_empty(candidates)
2161
2244
 
2162
2245
  assert_equal("@@hello", candidates.first&.name)
@@ -2181,6 +2264,13 @@ module RubyIndexer
2181
2264
 
2182
2265
  node = Prism.parse("class Foo; end").value.statements.body.first.constant_path
2183
2266
  assert_equal("Foo", Index.constant_name(node))
2267
+
2268
+ node = Prism.parse(<<~RUBY).value.statements.body.first.constant_path
2269
+ class class Foo
2270
+ end
2271
+ end
2272
+ RUBY
2273
+ assert_nil(Index.constant_name(node))
2184
2274
  end
2185
2275
  end
2186
2276
  end