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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/VERSION +1 -1
- data/exe/ruby-lsp +10 -4
- data/exe/ruby-lsp-check +0 -4
- data/exe/ruby-lsp-launcher +45 -22
- data/exe/ruby-lsp-test-exec +6 -0
- data/lib/rubocop/cop/ruby_lsp/use_language_server_aliases.rb +1 -2
- data/lib/rubocop/cop/ruby_lsp/use_register_with_handler_method.rb +3 -6
- data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +82 -116
- data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +140 -183
- data/lib/ruby_indexer/lib/ruby_indexer/enhancement.rb +10 -14
- data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +107 -236
- data/lib/ruby_indexer/lib/ruby_indexer/index.rb +188 -285
- data/lib/ruby_indexer/lib/ruby_indexer/location.rb +4 -27
- data/lib/ruby_indexer/lib/ruby_indexer/prefix_tree.rb +23 -27
- data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +25 -57
- data/lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb +58 -68
- data/lib/ruby_indexer/lib/ruby_indexer/uri.rb +17 -19
- data/lib/ruby_indexer/lib/ruby_indexer/visibility_scope.rb +7 -11
- data/lib/ruby_indexer/test/class_variables_test.rb +14 -14
- data/lib/ruby_indexer/test/classes_and_modules_test.rb +65 -40
- data/lib/ruby_indexer/test/configuration_test.rb +49 -9
- data/lib/ruby_indexer/test/constant_test.rb +34 -34
- data/lib/ruby_indexer/test/enhancements_test.rb +1 -1
- data/lib/ruby_indexer/test/index_test.rb +225 -135
- data/lib/ruby_indexer/test/instance_variables_test.rb +61 -37
- data/lib/ruby_indexer/test/method_test.rb +166 -123
- data/lib/ruby_indexer/test/prefix_tree_test.rb +21 -21
- data/lib/ruby_indexer/test/rbs_indexer_test.rb +70 -75
- data/lib/ruby_indexer/test/reference_finder_test.rb +79 -14
- data/lib/ruby_indexer/test/test_case.rb +9 -3
- data/lib/ruby_indexer/test/uri_test.rb +15 -2
- data/lib/ruby_lsp/addon.rb +88 -86
- data/lib/ruby_lsp/base_server.rb +79 -65
- data/lib/ruby_lsp/client_capabilities.rb +16 -13
- data/lib/ruby_lsp/document.rb +205 -104
- data/lib/ruby_lsp/erb_document.rb +45 -47
- data/lib/ruby_lsp/global_state.rb +73 -57
- data/lib/ruby_lsp/internal.rb +8 -3
- data/lib/ruby_lsp/listeners/code_lens.rb +82 -89
- data/lib/ruby_lsp/listeners/completion.rb +81 -76
- data/lib/ruby_lsp/listeners/definition.rb +44 -58
- data/lib/ruby_lsp/listeners/document_highlight.rb +149 -151
- data/lib/ruby_lsp/listeners/document_link.rb +94 -82
- data/lib/ruby_lsp/listeners/document_symbol.rb +38 -52
- data/lib/ruby_lsp/listeners/folding_ranges.rb +40 -43
- data/lib/ruby_lsp/listeners/hover.rb +107 -115
- data/lib/ruby_lsp/listeners/inlay_hints.rb +8 -13
- data/lib/ruby_lsp/listeners/semantic_highlighting.rb +54 -56
- data/lib/ruby_lsp/listeners/signature_help.rb +12 -27
- data/lib/ruby_lsp/listeners/spec_style.rb +231 -0
- data/lib/ruby_lsp/listeners/test_discovery.rb +107 -0
- data/lib/ruby_lsp/listeners/test_style.rb +207 -95
- data/lib/ruby_lsp/node_context.rb +12 -39
- data/lib/ruby_lsp/rbs_document.rb +10 -11
- data/lib/ruby_lsp/requests/code_action_resolve.rb +65 -61
- data/lib/ruby_lsp/requests/code_actions.rb +14 -26
- data/lib/ruby_lsp/requests/code_lens.rb +31 -21
- data/lib/ruby_lsp/requests/completion.rb +8 -21
- data/lib/ruby_lsp/requests/completion_resolve.rb +6 -6
- data/lib/ruby_lsp/requests/definition.rb +8 -20
- data/lib/ruby_lsp/requests/diagnostics.rb +8 -11
- data/lib/ruby_lsp/requests/discover_tests.rb +20 -7
- data/lib/ruby_lsp/requests/document_highlight.rb +6 -16
- data/lib/ruby_lsp/requests/document_link.rb +6 -17
- data/lib/ruby_lsp/requests/document_symbol.rb +5 -8
- data/lib/ruby_lsp/requests/folding_ranges.rb +7 -15
- data/lib/ruby_lsp/requests/formatting.rb +6 -9
- data/lib/ruby_lsp/requests/go_to_relevant_file.rb +139 -0
- data/lib/ruby_lsp/requests/hover.rb +12 -25
- data/lib/ruby_lsp/requests/inlay_hints.rb +8 -19
- data/lib/ruby_lsp/requests/on_type_formatting.rb +32 -40
- data/lib/ruby_lsp/requests/prepare_rename.rb +5 -10
- data/lib/ruby_lsp/requests/prepare_type_hierarchy.rb +5 -15
- data/lib/ruby_lsp/requests/range_formatting.rb +5 -6
- data/lib/ruby_lsp/requests/references.rb +17 -57
- data/lib/ruby_lsp/requests/rename.rb +27 -51
- data/lib/ruby_lsp/requests/request.rb +13 -25
- data/lib/ruby_lsp/requests/selection_ranges.rb +7 -7
- data/lib/ruby_lsp/requests/semantic_highlighting.rb +16 -35
- data/lib/ruby_lsp/requests/show_syntax_tree.rb +7 -8
- data/lib/ruby_lsp/requests/signature_help.rb +9 -27
- data/lib/ruby_lsp/requests/support/annotation.rb +4 -10
- data/lib/ruby_lsp/requests/support/common.rb +23 -61
- data/lib/ruby_lsp/requests/support/formatter.rb +16 -15
- data/lib/ruby_lsp/requests/support/package_url.rb +414 -0
- data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +27 -35
- data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +13 -16
- data/lib/ruby_lsp/requests/support/rubocop_runner.rb +34 -36
- data/lib/ruby_lsp/requests/support/selection_range.rb +1 -3
- data/lib/ruby_lsp/requests/support/sorbet.rb +29 -38
- data/lib/ruby_lsp/requests/support/source_uri.rb +20 -32
- data/lib/ruby_lsp/requests/support/syntax_tree_formatter.rb +12 -19
- data/lib/ruby_lsp/requests/support/test_item.rb +16 -14
- data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +5 -6
- data/lib/ruby_lsp/requests/workspace_symbol.rb +24 -16
- data/lib/ruby_lsp/response_builders/collection_response_builder.rb +6 -9
- data/lib/ruby_lsp/response_builders/document_symbol.rb +15 -21
- data/lib/ruby_lsp/response_builders/hover.rb +12 -18
- data/lib/ruby_lsp/response_builders/response_builder.rb +6 -7
- data/lib/ruby_lsp/response_builders/semantic_highlighting.rb +62 -91
- data/lib/ruby_lsp/response_builders/signature_help.rb +6 -8
- data/lib/ruby_lsp/response_builders/test_collection.rb +35 -13
- data/lib/ruby_lsp/ruby_document.rb +32 -98
- data/lib/ruby_lsp/scope.rb +7 -11
- data/lib/ruby_lsp/scripts/compose_bundle.rb +6 -4
- data/lib/ruby_lsp/server.rb +305 -198
- data/lib/ruby_lsp/setup_bundler.rb +131 -82
- data/lib/ruby_lsp/static_docs.rb +12 -7
- data/lib/ruby_lsp/store.rb +21 -49
- data/lib/ruby_lsp/test_helper.rb +3 -16
- data/lib/ruby_lsp/test_reporters/lsp_reporter.rb +241 -0
- data/lib/ruby_lsp/test_reporters/minitest_reporter.rb +145 -0
- data/lib/ruby_lsp/test_reporters/test_unit_reporter.rb +92 -0
- data/lib/ruby_lsp/type_inferrer.rb +13 -14
- data/lib/ruby_lsp/utils.rb +138 -93
- data/static_docs/break.md +103 -0
- metadata +15 -20
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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/
|
|
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::
|
|
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::
|
|
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
|
|
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
|
|
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"])
|
|
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 =
|
|
237
|
-
assert_equal("baz", entries.first
|
|
238
|
-
|
|
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 =
|
|
252
|
-
assert_equal("Array", entries.first
|
|
253
|
-
|
|
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 =
|
|
264
|
-
assert_equal("bar", entries.first
|
|
265
|
-
|
|
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 =
|
|
284
|
+
first_entry, second_entry = @index.resolve_method("bar", "Foo") #: as !nil
|
|
282
285
|
|
|
283
|
-
assert_equal("bar", first_entry
|
|
284
|
-
|
|
285
|
-
|
|
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
|
|
288
|
-
|
|
289
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
770
|
+
entry = @index.resolve_method("baz", "Wow")&.first #: as !nil
|
|
743
771
|
assert_equal("baz", entry.name)
|
|
744
|
-
assert_equal("Foo",
|
|
772
|
+
assert_equal("Foo", entry.owner&.name)
|
|
745
773
|
|
|
746
|
-
entry =
|
|
774
|
+
entry = @index.resolve_method("qux", "Wow")&.first #: as !nil
|
|
747
775
|
assert_equal("qux", entry.name)
|
|
748
|
-
assert_equal("Bar",
|
|
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 =
|
|
796
|
+
entries = @index.resolve_method("qux", "Wow") #: as !nil
|
|
769
797
|
assert_equal(1, entries.length)
|
|
770
798
|
|
|
771
|
-
entry =
|
|
799
|
+
entry = entries.first #: as !nil
|
|
772
800
|
assert_equal("qux", entry.name)
|
|
773
|
-
assert_equal("Foo",
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
959
|
+
entry = @index.resolve("Foo::CONST::TARGET", [])&.first #: as !nil
|
|
929
960
|
assert_equal(2, entry.location.start_line)
|
|
930
961
|
|
|
931
|
-
entry =
|
|
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 =
|
|
980
|
+
entry = @index.resolve("CONST", ["Namespace", "Child"])&.first #: as !nil
|
|
950
981
|
assert_equal(2, entry.location.start_line)
|
|
951
982
|
|
|
952
|
-
entry =
|
|
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 =
|
|
1009
|
+
entry = @index.resolve("CONST", ["Foo"])&.first #: as !nil
|
|
979
1010
|
assert_equal(6, entry.location.start_line)
|
|
980
1011
|
|
|
981
|
-
entry =
|
|
1012
|
+
entry = @index.resolve("Foo::CONST", [])&.first #: as !nil
|
|
982
1013
|
assert_equal(6, entry.location.start_line)
|
|
983
1014
|
|
|
984
|
-
entry =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
1264
|
+
entry = @index.instance_variable_completion_candidates("@", "Bar").first #: as !nil
|
|
1194
1265
|
assert_equal("@bar", entry.name)
|
|
1195
|
-
assert_equal("Bar",
|
|
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 =
|
|
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,
|
|
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",
|
|
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",
|
|
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",
|
|
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
|
|
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 =
|
|
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",
|
|
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 =
|
|
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",
|
|
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 =
|
|
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",
|
|
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",
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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",
|
|
1603
|
+
assert_equal("Foo", target.owner&.name)
|
|
1534
1604
|
|
|
1535
|
-
other_decorated_name =
|
|
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 =
|
|
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 =
|
|
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",
|
|
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",
|
|
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 =
|
|
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 =
|
|
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,
|
|
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")
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
2133
|
-
assert_equal("@@adf", adf
|
|
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
|