ruby-lsp 0.23.11 → 0.26.1

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 (119) 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 +166 -281
  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 +185 -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 +59 -54
  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 +123 -150
  45. data/lib/ruby_lsp/listeners/document_link.rb +50 -70
  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 +214 -0
  53. data/lib/ruby_lsp/listeners/test_discovery.rb +92 -0
  54. data/lib/ruby_lsp/listeners/test_style.rb +205 -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 +85 -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 +16 -58
  86. data/lib/ruby_lsp/requests/support/formatter.rb +16 -15
  87. data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +27 -35
  88. data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +13 -16
  89. data/lib/ruby_lsp/requests/support/rubocop_runner.rb +34 -36
  90. data/lib/ruby_lsp/requests/support/selection_range.rb +1 -3
  91. data/lib/ruby_lsp/requests/support/sorbet.rb +29 -38
  92. data/lib/ruby_lsp/requests/support/source_uri.rb +20 -32
  93. data/lib/ruby_lsp/requests/support/syntax_tree_formatter.rb +12 -19
  94. data/lib/ruby_lsp/requests/support/test_item.rb +16 -14
  95. data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +5 -6
  96. data/lib/ruby_lsp/requests/workspace_symbol.rb +4 -4
  97. data/lib/ruby_lsp/response_builders/collection_response_builder.rb +6 -9
  98. data/lib/ruby_lsp/response_builders/document_symbol.rb +15 -21
  99. data/lib/ruby_lsp/response_builders/hover.rb +12 -18
  100. data/lib/ruby_lsp/response_builders/response_builder.rb +6 -7
  101. data/lib/ruby_lsp/response_builders/semantic_highlighting.rb +62 -91
  102. data/lib/ruby_lsp/response_builders/signature_help.rb +6 -8
  103. data/lib/ruby_lsp/response_builders/test_collection.rb +35 -13
  104. data/lib/ruby_lsp/ruby_document.rb +32 -98
  105. data/lib/ruby_lsp/scope.rb +7 -11
  106. data/lib/ruby_lsp/scripts/compose_bundle.rb +6 -4
  107. data/lib/ruby_lsp/server.rb +303 -196
  108. data/lib/ruby_lsp/setup_bundler.rb +121 -82
  109. data/lib/ruby_lsp/static_docs.rb +12 -7
  110. data/lib/ruby_lsp/store.rb +21 -49
  111. data/lib/ruby_lsp/test_helper.rb +3 -16
  112. data/lib/ruby_lsp/test_reporters/lsp_reporter.rb +233 -0
  113. data/lib/ruby_lsp/test_reporters/minitest_reporter.rb +145 -0
  114. data/lib/ruby_lsp/test_reporters/test_unit_reporter.rb +92 -0
  115. data/lib/ruby_lsp/type_inferrer.rb +13 -14
  116. data/lib/ruby_lsp/utils.rb +138 -93
  117. data/static_docs/break.md +103 -0
  118. metadata +14 -20
  119. 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,7 +1148,7 @@ 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
 
@@ -1135,7 +1166,7 @@ module RubyIndexer
1135
1166
  end
1136
1167
  RUBY
1137
1168
 
1138
- foo_entry = T.must(@index.resolve("Entry::CONST", ["Namespace", "Index"])&.first)
1169
+ foo_entry = @index.resolve("Entry::CONST", ["Namespace", "Index"])&.first #: as !nil
1139
1170
  assert_equal(3, foo_entry.location.start_line)
1140
1171
  end
1141
1172
 
@@ -1154,7 +1185,7 @@ module RubyIndexer
1154
1185
  end
1155
1186
  RUBY
1156
1187
 
1157
- foo_entry = T.must(@index.resolve("CONST", ["Namespace", "Index"])&.first)
1188
+ foo_entry = @index.resolve("CONST", ["Namespace", "Index"])&.first #: as !nil
1158
1189
  assert_equal(6, foo_entry.location.start_line)
1159
1190
  end
1160
1191
 
@@ -1171,7 +1202,7 @@ module RubyIndexer
1171
1202
  end
1172
1203
  RUBY
1173
1204
 
1174
- foo_entry = T.must(@index.resolve("CONST", ["Namespace", "Index"])&.first)
1205
+ foo_entry = @index.resolve("CONST", ["Namespace", "Index"])&.first #: as !nil
1175
1206
  assert_equal(1, foo_entry.location.start_line)
1176
1207
  end
1177
1208
 
@@ -1190,9 +1221,9 @@ module RubyIndexer
1190
1221
  end
1191
1222
  RUBY
1192
1223
 
1193
- entry = T.must(@index.instance_variable_completion_candidates("@", "Bar")&.first)
1224
+ entry = @index.instance_variable_completion_candidates("@", "Bar").first #: as !nil
1194
1225
  assert_equal("@bar", entry.name)
1195
- assert_equal("Bar", T.must(entry.owner).name)
1226
+ assert_equal("Bar", entry.owner&.name)
1196
1227
  end
1197
1228
 
1198
1229
  def test_resolving_a_qualified_reference
@@ -1213,7 +1244,7 @@ module RubyIndexer
1213
1244
  end
1214
1245
  RUBY
1215
1246
 
1216
- foo_entry = T.must(@index.resolve("Third::CONST", ["Foo"])&.first)
1247
+ foo_entry = @index.resolve("Third::CONST", ["Foo"])&.first #: as !nil
1217
1248
  assert_equal(9, foo_entry.location.start_line)
1218
1249
  end
1219
1250
 
@@ -1226,9 +1257,9 @@ module RubyIndexer
1226
1257
  class Object; end
1227
1258
  RUBY
1228
1259
 
1229
- entries = @index["Object"]
1260
+ entries = @index["Object"] #: as !nil
1230
1261
  assert_equal(2, entries.length)
1231
- reopened_entry = entries.last
1262
+ reopened_entry = entries.last #: as Entry::Class
1232
1263
  assert_equal("::BasicObject", reopened_entry.parent_class)
1233
1264
  assert_equal(["Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Object"))
1234
1265
  end
@@ -1238,9 +1269,9 @@ module RubyIndexer
1238
1269
  class BasicObject; end
1239
1270
  RUBY
1240
1271
 
1241
- entries = @index["BasicObject"]
1272
+ entries = @index["BasicObject"] #: as !nil
1242
1273
  assert_equal(2, entries.length)
1243
- reopened_entry = entries.last
1274
+ reopened_entry = entries.last #: as Entry::Class
1244
1275
  assert_nil(reopened_entry.parent_class)
1245
1276
  assert_equal(["BasicObject"], @index.linearized_ancestors_of("BasicObject"))
1246
1277
  end
@@ -1318,10 +1349,9 @@ module RubyIndexer
1318
1349
  end
1319
1350
  RUBY
1320
1351
 
1321
- entry = @index.resolve_method("found_me!", "Foo::Bar::<Class:Bar>::Baz::<Class:Baz>")&.first
1352
+ entry = @index.resolve_method("found_me!", "Foo::Bar::<Class:Bar>::Baz::<Class:Baz>")&.first #: as !nil
1322
1353
  refute_nil(entry)
1323
-
1324
- assert_equal("found_me!", T.must(entry).name)
1354
+ assert_equal("found_me!", entry.name)
1325
1355
  end
1326
1356
 
1327
1357
  def test_resolving_constants_in_singleton_contexts
@@ -1344,9 +1374,9 @@ module RubyIndexer
1344
1374
  end
1345
1375
  RUBY
1346
1376
 
1347
- entry = @index.resolve("CONST", ["Foo", "Bar", "<Class:Bar>", "Baz", "<Class:Baz>"])&.first
1377
+ entry = @index.resolve("CONST", ["Foo", "Bar", "<Class:Bar>", "Baz", "<Class:Baz>"])&.first #: as !nil
1348
1378
  refute_nil(entry)
1349
- assert_equal(9, T.must(entry).location.start_line)
1379
+ assert_equal(9, entry.location.start_line)
1350
1380
  end
1351
1381
 
1352
1382
  def test_resolving_instance_variables_in_singleton_contexts
@@ -1366,17 +1396,17 @@ module RubyIndexer
1366
1396
  end
1367
1397
  RUBY
1368
1398
 
1369
- entry = @index.resolve_instance_variable("@a", "Foo::Bar::<Class:Bar>")&.first
1399
+ entry = @index.resolve_instance_variable("@a", "Foo::Bar::<Class:Bar>")&.first #: as !nil
1370
1400
  refute_nil(entry)
1371
- assert_equal("@a", T.must(entry).name)
1401
+ assert_equal("@a", entry.name)
1372
1402
 
1373
- entry = @index.resolve_instance_variable("@b", "Foo::Bar::<Class:Bar>")&.first
1403
+ entry = @index.resolve_instance_variable("@b", "Foo::Bar::<Class:Bar>")&.first #: as !nil
1374
1404
  refute_nil(entry)
1375
- assert_equal("@b", T.must(entry).name)
1405
+ assert_equal("@b", entry.name)
1376
1406
 
1377
- entry = @index.resolve_instance_variable("@c", "Foo::Bar::<Class:Bar>::<Class:<Class:Bar>>")&.first
1407
+ entry = @index.resolve_instance_variable("@c", "Foo::Bar::<Class:Bar>::<Class:<Class:Bar>>")&.first #: as !nil
1378
1408
  refute_nil(entry)
1379
- assert_equal("@c", T.must(entry).name)
1409
+ assert_equal("@c", entry.name)
1380
1410
  end
1381
1411
 
1382
1412
  def test_instance_variable_completion_in_singleton_contexts
@@ -1422,7 +1452,7 @@ module RubyIndexer
1422
1452
 
1423
1453
  results = @index.fuzzy_search("Zwq")
1424
1454
  assert_equal(1, results.length)
1425
- assert_equal("Zwq", results.first.name)
1455
+ assert_equal("Zwq", results.first&.name)
1426
1456
  end
1427
1457
 
1428
1458
  def test_resolving_method_aliases
@@ -1444,39 +1474,39 @@ module RubyIndexer
1444
1474
  RUBY
1445
1475
 
1446
1476
  # baz
1447
- methods = @index.resolve_method("baz", "Bar")
1477
+ methods = @index.resolve_method("baz", "Bar") #: as !nil
1448
1478
  refute_nil(methods)
1449
1479
 
1450
- entry = T.must(methods.first)
1480
+ entry = methods.first #: as Entry::MethodAlias
1451
1481
  assert_kind_of(Entry::MethodAlias, entry)
1452
1482
  assert_equal("bar", entry.target.name)
1453
- assert_equal("Foo", T.must(entry.target.owner).name)
1483
+ assert_equal("Foo", entry.target.owner&.name)
1454
1484
 
1455
1485
  # qux
1456
- methods = @index.resolve_method("qux", "Bar")
1486
+ methods = @index.resolve_method("qux", "Bar") #: as !nil
1457
1487
  refute_nil(methods)
1458
1488
 
1459
- entry = T.must(methods.first)
1489
+ entry = methods.first #: as Entry::MethodAlias
1460
1490
  assert_kind_of(Entry::MethodAlias, entry)
1461
1491
  assert_equal("hello", entry.target.name)
1462
- assert_equal("Bar", T.must(entry.target.owner).name)
1492
+ assert_equal("Bar", entry.target.owner&.name)
1463
1493
 
1464
1494
  # double
1465
- methods = @index.resolve_method("double", "Bar")
1495
+ methods = @index.resolve_method("double", "Bar") #: as !nil
1466
1496
  refute_nil(methods)
1467
1497
 
1468
- entry = T.must(methods.first)
1498
+ entry = methods.first #: as Entry::MethodAlias
1469
1499
  assert_kind_of(Entry::MethodAlias, entry)
1470
1500
 
1471
- target = entry.target
1501
+ target = entry.target #: as Entry::MethodAlias
1472
1502
  assert_equal("double_alias", target.name)
1473
1503
  assert_kind_of(Entry::MethodAlias, target)
1474
- assert_equal("Foo", T.must(target.owner).name)
1504
+ assert_equal("Foo", target.owner&.name)
1475
1505
 
1476
1506
  final_target = target.target
1477
1507
  assert_equal("bar", final_target.name)
1478
1508
  assert_kind_of(Entry::Method, final_target)
1479
- assert_equal("Foo", T.must(final_target.owner).name)
1509
+ assert_equal("Foo", final_target.owner&.name)
1480
1510
  end
1481
1511
 
1482
1512
  def test_resolving_circular_method_aliases
@@ -1490,7 +1520,7 @@ module RubyIndexer
1490
1520
  methods = @index.resolve_method("bar", "Foo")
1491
1521
  assert_nil(methods)
1492
1522
 
1493
- entry = T.must(@index["bar"].first)
1523
+ entry = @index["bar"]&.first
1494
1524
  assert_kind_of(Entry::UnresolvedMethodAlias, entry)
1495
1525
  end
1496
1526
 
@@ -1505,7 +1535,7 @@ module RubyIndexer
1505
1535
  methods = @index.resolve_method("bar", "Foo")
1506
1536
  assert_nil(methods)
1507
1537
 
1508
- entry = T.must(@index["bar"].first)
1538
+ entry = @index["bar"]&.first
1509
1539
  assert_kind_of(Entry::UnresolvedMethodAlias, entry)
1510
1540
  end
1511
1541
 
@@ -1521,18 +1551,18 @@ module RubyIndexer
1521
1551
  end
1522
1552
  RUBY
1523
1553
 
1524
- methods = @index.resolve_method("decorated_name", "Foo")
1554
+ methods = @index.resolve_method("decorated_name", "Foo") #: as !nil
1525
1555
  refute_nil(methods)
1526
1556
 
1527
- entry = T.must(methods.first)
1557
+ entry = methods.first #: as Entry::MethodAlias
1528
1558
  assert_kind_of(Entry::MethodAlias, entry)
1529
1559
 
1530
1560
  target = entry.target
1531
1561
  assert_equal("name", target.name)
1532
1562
  assert_kind_of(Entry::Accessor, target)
1533
- assert_equal("Foo", T.must(target.owner).name)
1563
+ assert_equal("Foo", target.owner&.name)
1534
1564
 
1535
- other_decorated_name = T.must(@index["decorated_name"].find { |e| e.is_a?(Entry::UnresolvedMethodAlias) })
1565
+ other_decorated_name = @index["decorated_name"]&.find { |e| e.is_a?(Entry::UnresolvedMethodAlias) }
1536
1566
  assert_kind_of(Entry::UnresolvedMethodAlias, other_decorated_name)
1537
1567
  end
1538
1568
 
@@ -1557,7 +1587,7 @@ module RubyIndexer
1557
1587
  end
1558
1588
  RUBY
1559
1589
 
1560
- entry = T.must(@index.first_unqualified_const("Bar")&.first)
1590
+ entry = @index.first_unqualified_const("Bar")&.first #: as !nil
1561
1591
  assert_equal("Foo::Bar", entry.name)
1562
1592
  end
1563
1593
 
@@ -1574,7 +1604,7 @@ module RubyIndexer
1574
1604
  end
1575
1605
  RUBY
1576
1606
 
1577
- entry = T.must(@index.first_unqualified_const("Type")&.first)
1607
+ entry = @index.first_unqualified_const("Type")&.first #: as !nil
1578
1608
  assert_equal("Namespace::Type", entry.name)
1579
1609
  end
1580
1610
 
@@ -1591,7 +1621,7 @@ module RubyIndexer
1591
1621
 
1592
1622
  entries = @index.method_completion_candidates("bar", "Baz")
1593
1623
  assert_equal(["bar"], entries.map(&:name))
1594
- assert_equal("Baz", T.must(entries.first.owner).name)
1624
+ assert_equal("Baz", entries.first&.owner&.name)
1595
1625
  end
1596
1626
 
1597
1627
  def test_completion_does_not_duplicate_methods_overridden_by_aliases
@@ -1607,7 +1637,7 @@ module RubyIndexer
1607
1637
 
1608
1638
  entries = @index.method_completion_candidates("bar", "Baz")
1609
1639
  assert_equal(["bar"], entries.map(&:name))
1610
- assert_equal("Baz", T.must(entries.first.owner).name)
1640
+ assert_equal("Baz", entries.first&.owner&.name)
1611
1641
  end
1612
1642
 
1613
1643
  def test_decorated_parameters
@@ -1618,11 +1648,10 @@ module RubyIndexer
1618
1648
  end
1619
1649
  RUBY
1620
1650
 
1621
- methods = @index.resolve_method("bar", "Foo")
1651
+ methods = @index.resolve_method("bar", "Foo") #: as !nil
1622
1652
  refute_nil(methods)
1623
1653
 
1624
- entry = T.must(methods.first)
1625
-
1654
+ entry = methods.first #: as Entry::Method
1626
1655
  assert_equal("(a, b = <default>, c: <default>)", entry.decorated_parameters)
1627
1656
  end
1628
1657
 
@@ -1634,11 +1663,10 @@ module RubyIndexer
1634
1663
  end
1635
1664
  RUBY
1636
1665
 
1637
- methods = @index.resolve_method("bar", "Foo")
1666
+ methods = @index.resolve_method("bar", "Foo") #: as !nil
1638
1667
  refute_nil(methods)
1639
1668
 
1640
- entry = T.must(methods.first)
1641
-
1669
+ entry = methods.first #: as Entry::Method
1642
1670
  assert_equal("()", entry.decorated_parameters)
1643
1671
  end
1644
1672
 
@@ -1707,9 +1735,9 @@ module RubyIndexer
1707
1735
  RUBY
1708
1736
 
1709
1737
  ["bar", "baz"].product(["Foo", "Foo::<Class:Foo>"]).each do |method, receiver|
1710
- entry = @index.resolve_method(method, receiver)&.first
1738
+ entry = @index.resolve_method(method, receiver)&.first #: as !nil
1711
1739
  refute_nil(entry)
1712
- assert_equal(method, T.must(entry).name)
1740
+ assert_equal(method, entry.name)
1713
1741
  end
1714
1742
 
1715
1743
  assert_equal(
@@ -1888,7 +1916,7 @@ module RubyIndexer
1888
1916
  end
1889
1917
  RUBY
1890
1918
 
1891
- method = @index.resolve_method("==", "Foo").first
1919
+ method = @index.resolve_method("==", "Foo")&.first #: as Entry::Method
1892
1920
  assert_kind_of(Entry::Method, method)
1893
1921
  assert_equal("==", method.name)
1894
1922
 
@@ -1906,13 +1934,13 @@ module RubyIndexer
1906
1934
  end
1907
1935
  RUBY
1908
1936
 
1909
- entries = @index.entries_for("file:///fake/path/foo.rb", Entry)
1937
+ entries = @index.entries_for("file:///fake/path/foo.rb", Entry) #: as !nil
1910
1938
  assert_equal(["Foo", "Bar", "my_def", "Bar::<Class:Bar>", "my_singleton_def"], entries.map(&:name))
1911
1939
 
1912
- entries = @index.entries_for("file:///fake/path/foo.rb", RubyIndexer::Entry::Namespace)
1940
+ entries = @index.entries_for("file:///fake/path/foo.rb", RubyIndexer::Entry::Namespace) #: as !nil
1913
1941
  assert_equal(["Foo", "Bar", "Bar::<Class:Bar>"], entries.map(&:name))
1914
1942
 
1915
- entries = @index.entries_for("file:///fake/path/foo.rb")
1943
+ entries = @index.entries_for("file:///fake/path/foo.rb") #: as !nil
1916
1944
  assert_equal(["Foo", "Bar", "my_def", "Bar::<Class:Bar>", "my_singleton_def"], entries.map(&:name))
1917
1945
  end
1918
1946
 
@@ -1945,14 +1973,29 @@ module RubyIndexer
1945
1973
  result = @index.constant_completion_candidates("X", ["Namespace", "Baz"])
1946
1974
 
1947
1975
  result.each do |entries|
1948
- name = entries.first.name
1976
+ name = entries.first&.name
1949
1977
  assert(entries.all? { |e| e.name == name })
1950
1978
  end
1951
1979
 
1952
- assert_equal(["Namespace::XQRK", "Bar::XQRK", "XQRK"], result.map { |entries| entries.first.name })
1980
+ assert_equal(["Namespace::XQRK", "Bar::XQRK", "XQRK"], result.map { |entries| entries.first&.name })
1953
1981
 
1954
1982
  result = @index.constant_completion_candidates("::X", ["Namespace", "Baz"])
1955
- assert_equal(["XQRK"], result.map { |entries| entries.first.name })
1983
+ assert_equal(["XQRK"], result.map { |entries| entries.first&.name })
1984
+ end
1985
+
1986
+ def test_constant_completion_does_not_confuse_uppercase_methods
1987
+ index(<<~RUBY)
1988
+ class Foo
1989
+ def Qux
1990
+ end
1991
+ end
1992
+ RUBY
1993
+
1994
+ candidates = @index.constant_completion_candidates("Q", [])
1995
+ refute_includes(candidates.flat_map { |entries| entries.map(&:name) }, "Qux")
1996
+
1997
+ candidates = @index.constant_completion_candidates("Qux", [])
1998
+ assert_equal(0, candidates.length)
1956
1999
  end
1957
2000
 
1958
2001
  def test_constant_completion_candidates_for_empty_name
@@ -1967,7 +2010,7 @@ module RubyIndexer
1967
2010
  RUBY
1968
2011
 
1969
2012
  result = @index.constant_completion_candidates("Baz::", [])
1970
- assert_includes(result.map { |entries| entries.first.name }, "Foo::Bar")
2013
+ assert_includes(result.map { |entries| entries.first&.name }, "Foo::Bar")
1971
2014
  end
1972
2015
 
1973
2016
  def test_follow_alias_namespace
@@ -2025,7 +2068,7 @@ module RubyIndexer
2025
2068
  end
2026
2069
  RUBY
2027
2070
 
2028
- entry = @index.resolve("Namespace::Foo::CONST", ["First", "Namespace", "Foo", "InnerNamespace"])&.first
2071
+ entry = @index.resolve("Namespace::Foo::CONST", ["First", "Namespace", "Foo", "InnerNamespace"])&.first #: as !nil
2029
2072
  assert_equal("Parent::CONST", entry.name)
2030
2073
  assert_instance_of(Entry::Constant, entry)
2031
2074
  end
@@ -2093,7 +2136,7 @@ module RubyIndexer
2093
2136
  end
2094
2137
  RUBY
2095
2138
 
2096
- entry = @index["Foo"]&.first
2139
+ entry = @index["Foo"]&.first #: as !nil
2097
2140
  refute_nil(entry, "Expected indexer to be able to handle unsaved URIs")
2098
2141
  assert_equal("untitled:Untitled-1", entry.uri.to_s)
2099
2142
  assert_equal("Untitled-1", entry.file_name)
@@ -2105,7 +2148,7 @@ module RubyIndexer
2105
2148
  end
2106
2149
  RUBY
2107
2150
 
2108
- entry = @index["Foo"]&.first
2151
+ entry = @index["Foo"]&.first #: as !nil
2109
2152
  refute_nil(entry, "Expected indexer to be able to handle unsaved URIs")
2110
2153
  assert_equal("I added this comment!", entry.comments)
2111
2154
  end
@@ -2124,13 +2167,13 @@ module RubyIndexer
2124
2167
  end
2125
2168
  RUBY
2126
2169
 
2127
- abc, adf = @index.instance_variable_completion_candidates("@", "Child::<Class:Child>")
2170
+ adf, abc = @index.instance_variable_completion_candidates("@", "Child::<Class:Child>")
2128
2171
 
2129
2172
  refute_nil(abc)
2130
2173
  refute_nil(adf)
2131
2174
 
2132
- assert_equal("@@abc", abc.name)
2133
- assert_equal("@@adf", adf.name)
2175
+ assert_equal("@@abc", abc&.name)
2176
+ assert_equal("@@adf", adf&.name)
2134
2177
  end
2135
2178
 
2136
2179
  def test_class_variable_completion_from_singleton_context
@@ -2156,7 +2199,7 @@ module RubyIndexer
2156
2199
  end
2157
2200
  RUBY
2158
2201
 
2159
- candidates = @index.resolve_class_variable("@@hello", "Foo::<Class:Foo>")
2202
+ candidates = @index.resolve_class_variable("@@hello", "Foo::<Class:Foo>") #: as !nil
2160
2203
  refute_empty(candidates)
2161
2204
 
2162
2205
  assert_equal("@@hello", candidates.first&.name)
@@ -2181,6 +2224,13 @@ module RubyIndexer
2181
2224
 
2182
2225
  node = Prism.parse("class Foo; end").value.statements.body.first.constant_path
2183
2226
  assert_equal("Foo", Index.constant_name(node))
2227
+
2228
+ node = Prism.parse(<<~RUBY).value.statements.body.first.constant_path
2229
+ class class Foo
2230
+ end
2231
+ end
2232
+ RUBY
2233
+ assert_nil(Index.constant_name(node))
2184
2234
  end
2185
2235
  end
2186
2236
  end