ruby-lsp 0.22.1 → 0.23.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/exe/ruby-lsp +10 -9
- data/exe/ruby-lsp-check +5 -5
- data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +26 -20
- data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +88 -22
- data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +60 -30
- data/lib/ruby_indexer/lib/ruby_indexer/index.rb +73 -55
- data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +16 -14
- data/lib/{core_ext → ruby_indexer/lib/ruby_indexer}/uri.rb +29 -3
- data/lib/ruby_indexer/ruby_indexer.rb +1 -1
- data/lib/ruby_indexer/test/class_variables_test.rb +140 -0
- data/lib/ruby_indexer/test/classes_and_modules_test.rb +11 -6
- data/lib/ruby_indexer/test/configuration_test.rb +116 -51
- data/lib/ruby_indexer/test/enhancements_test.rb +2 -2
- data/lib/ruby_indexer/test/index_test.rb +72 -43
- data/lib/ruby_indexer/test/rbs_indexer_test.rb +1 -1
- data/lib/ruby_indexer/test/reference_finder_test.rb +1 -1
- data/lib/ruby_indexer/test/test_case.rb +2 -2
- data/lib/ruby_indexer/test/uri_test.rb +72 -0
- data/lib/ruby_lsp/addon.rb +9 -0
- data/lib/ruby_lsp/base_server.rb +15 -6
- data/lib/ruby_lsp/document.rb +10 -1
- data/lib/ruby_lsp/internal.rb +1 -1
- data/lib/ruby_lsp/listeners/code_lens.rb +8 -4
- data/lib/ruby_lsp/listeners/completion.rb +73 -4
- data/lib/ruby_lsp/listeners/definition.rb +73 -17
- data/lib/ruby_lsp/listeners/document_symbol.rb +12 -1
- data/lib/ruby_lsp/listeners/folding_ranges.rb +1 -1
- data/lib/ruby_lsp/listeners/hover.rb +57 -0
- data/lib/ruby_lsp/requests/completion.rb +6 -0
- data/lib/ruby_lsp/requests/completion_resolve.rb +2 -1
- data/lib/ruby_lsp/requests/definition.rb +6 -0
- data/lib/ruby_lsp/requests/prepare_rename.rb +51 -0
- data/lib/ruby_lsp/requests/prepare_type_hierarchy.rb +1 -1
- data/lib/ruby_lsp/requests/rename.rb +14 -4
- data/lib/ruby_lsp/requests/support/common.rb +1 -5
- data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +1 -1
- data/lib/ruby_lsp/requests/workspace_symbol.rb +3 -2
- data/lib/ruby_lsp/scripts/compose_bundle.rb +1 -1
- data/lib/ruby_lsp/server.rb +42 -7
- data/lib/ruby_lsp/setup_bundler.rb +31 -41
- data/lib/ruby_lsp/test_helper.rb +45 -11
- data/lib/ruby_lsp/type_inferrer.rb +22 -0
- data/lib/ruby_lsp/utils.rb +3 -0
- metadata +7 -8
- data/lib/ruby_indexer/lib/ruby_indexer/indexable_path.rb +0 -29
@@ -13,63 +13,62 @@ module RubyIndexer
|
|
13
13
|
|
14
14
|
def test_load_configuration_executes_configure_block
|
15
15
|
@config.apply_config({ "excluded_patterns" => ["**/fixtures/**/*.rb"] })
|
16
|
-
|
16
|
+
uris = @config.indexable_uris
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
assert(
|
21
|
-
assert(
|
22
|
-
assert(
|
18
|
+
bundle_path = Bundler.bundle_path.join("gems")
|
19
|
+
|
20
|
+
assert(uris.none? { |uri| uri.full_path.include?("test/fixtures") })
|
21
|
+
assert(uris.none? { |uri| uri.full_path.include?(bundle_path.join("minitest-reporters").to_s) })
|
22
|
+
assert(uris.none? { |uri| uri.full_path.include?(bundle_path.join("ansi").to_s) })
|
23
|
+
assert(uris.any? { |uri| uri.full_path.include?(bundle_path.join("sorbet-runtime").to_s) })
|
24
|
+
assert(uris.none? { |uri| uri.full_path == __FILE__ })
|
23
25
|
end
|
24
26
|
|
25
|
-
def
|
27
|
+
def test_indexable_uris_have_expanded_full_paths
|
26
28
|
@config.apply_config({ "included_patterns" => ["**/*.rb"] })
|
27
|
-
|
29
|
+
uris = @config.indexable_uris
|
28
30
|
|
29
31
|
# All paths should be expanded
|
30
|
-
assert(
|
32
|
+
assert(uris.all? { |uri| File.absolute_path?(uri.full_path) })
|
31
33
|
end
|
32
34
|
|
33
|
-
def
|
34
|
-
|
35
|
+
def test_indexable_uris_only_includes_gem_require_paths
|
36
|
+
uris = @config.indexable_uris
|
35
37
|
|
36
38
|
Bundler.locked_gems.specs.each do |lazy_spec|
|
37
39
|
next if lazy_spec.name == "ruby-lsp"
|
38
40
|
|
39
41
|
spec = Gem::Specification.find_by_name(lazy_spec.name)
|
40
|
-
assert(
|
42
|
+
assert(uris.none? { |uri| uri.full_path.start_with?("#{spec.full_gem_path}/test/") })
|
41
43
|
rescue Gem::MissingSpecError
|
42
44
|
# Transitive dependencies might be missing when running tests on Windows
|
43
45
|
end
|
44
46
|
end
|
45
47
|
|
46
|
-
def
|
47
|
-
|
48
|
-
|
49
|
-
assert(
|
50
|
-
indexables.none? { |indexable| indexable.full_path.start_with?("#{RbConfig::CONFIG["rubylibdir"]}/psych") },
|
51
|
-
)
|
48
|
+
def test_indexable_uris_does_not_include_default_gem_path_when_in_bundle
|
49
|
+
uris = @config.indexable_uris
|
50
|
+
assert(uris.none? { |uri| uri.full_path.start_with?("#{RbConfig::CONFIG["rubylibdir"]}/psych") })
|
52
51
|
end
|
53
52
|
|
54
|
-
def
|
55
|
-
|
53
|
+
def test_indexable_uris_includes_default_gems
|
54
|
+
paths = @config.indexable_uris.map(&:full_path)
|
56
55
|
|
57
|
-
assert_includes(
|
58
|
-
assert_includes(
|
59
|
-
assert_includes(
|
56
|
+
assert_includes(paths, "#{RbConfig::CONFIG["rubylibdir"]}/pathname.rb")
|
57
|
+
assert_includes(paths, "#{RbConfig::CONFIG["rubylibdir"]}/ipaddr.rb")
|
58
|
+
assert_includes(paths, "#{RbConfig::CONFIG["rubylibdir"]}/erb.rb")
|
60
59
|
end
|
61
60
|
|
62
|
-
def
|
63
|
-
|
61
|
+
def test_indexable_uris_includes_project_files
|
62
|
+
paths = @config.indexable_uris.map(&:full_path)
|
64
63
|
|
65
64
|
Dir.glob("#{Dir.pwd}/lib/**/*.rb").each do |path|
|
66
65
|
next if path.end_with?("_test.rb")
|
67
66
|
|
68
|
-
assert_includes(
|
67
|
+
assert_includes(paths, path)
|
69
68
|
end
|
70
69
|
end
|
71
70
|
|
72
|
-
def
|
71
|
+
def test_indexable_uris_avoids_duplicates_if_bundle_path_is_inside_project
|
73
72
|
Bundler.settings.temporary(path: "vendor/bundle") do
|
74
73
|
config = Configuration.new
|
75
74
|
|
@@ -77,33 +76,32 @@ module RubyIndexer
|
|
77
76
|
end
|
78
77
|
end
|
79
78
|
|
80
|
-
def
|
81
|
-
|
82
|
-
|
83
|
-
|
79
|
+
def test_indexable_uris_does_not_include_gems_own_installed_files
|
80
|
+
uris = @config.indexable_uris
|
81
|
+
uris_inside_bundled_lsp = uris.select do |uri|
|
82
|
+
uri.full_path.start_with?(Bundler.bundle_path.join("gems", "ruby-lsp").to_s)
|
84
83
|
end
|
85
84
|
|
86
85
|
assert_empty(
|
87
|
-
|
88
|
-
"
|
89
|
-
"Included: #{
|
86
|
+
uris_inside_bundled_lsp,
|
87
|
+
"Indexable URIs should not include files from the gem currently being worked on. " \
|
88
|
+
"Included: #{uris_inside_bundled_lsp.map(&:full_path)}",
|
90
89
|
)
|
91
90
|
end
|
92
91
|
|
93
|
-
def
|
92
|
+
def test_indexable_uris_does_not_include_non_ruby_files_inside_rubylibdir
|
94
93
|
path = Pathname.new(RbConfig::CONFIG["rubylibdir"]).join("extra_file.txt").to_s
|
95
94
|
FileUtils.touch(path)
|
96
|
-
indexables = @config.indexables
|
97
95
|
|
98
|
-
|
96
|
+
uris = @config.indexable_uris
|
97
|
+
assert(uris.none? { |uri| uri.full_path == path })
|
99
98
|
ensure
|
100
99
|
FileUtils.rm(T.must(path))
|
101
100
|
end
|
102
101
|
|
103
102
|
def test_paths_are_unique
|
104
|
-
|
105
|
-
|
106
|
-
assert_equal(indexables.uniq.length, indexables.length)
|
103
|
+
uris = @config.indexable_uris
|
104
|
+
assert_equal(uris.uniq.length, uris.length)
|
107
105
|
end
|
108
106
|
|
109
107
|
def test_configuration_raises_for_unknown_keys
|
@@ -132,7 +130,7 @@ module RubyIndexer
|
|
132
130
|
end
|
133
131
|
end
|
134
132
|
|
135
|
-
def
|
133
|
+
def test_indexable_uris_respect_given_workspace_path
|
136
134
|
Dir.mktmpdir do |dir|
|
137
135
|
FileUtils.mkdir(File.join(dir, "ignore"))
|
138
136
|
FileUtils.touch(File.join(dir, "ignore", "file0.rb"))
|
@@ -141,21 +139,21 @@ module RubyIndexer
|
|
141
139
|
|
142
140
|
@config.apply_config({ "excluded_patterns" => ["ignore/**/*.rb"] })
|
143
141
|
@config.workspace_path = dir
|
144
|
-
indexables = @config.indexables
|
145
142
|
|
146
|
-
|
143
|
+
uris = @config.indexable_uris
|
144
|
+
assert(uris.none? { |uri| uri.full_path.start_with?(File.join(dir, "ignore")) })
|
147
145
|
|
148
|
-
# After switching the workspace path, all
|
146
|
+
# After switching the workspace path, all indexable URIs will be found in one of these places:
|
149
147
|
# - The new workspace path
|
150
148
|
# - The Ruby LSP's own code (because Bundler is requiring the dependency from source)
|
151
149
|
# - Bundled gems
|
152
150
|
# - Default gems
|
153
151
|
assert(
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
152
|
+
uris.all? do |u|
|
153
|
+
u.full_path.start_with?(dir) ||
|
154
|
+
u.full_path.start_with?(File.join(Dir.pwd, "lib")) ||
|
155
|
+
u.full_path.start_with?(Bundler.bundle_path.to_s) ||
|
156
|
+
u.full_path.start_with?(RbConfig::CONFIG["rubylibdir"])
|
159
157
|
end,
|
160
158
|
)
|
161
159
|
end
|
@@ -166,8 +164,75 @@ module RubyIndexer
|
|
166
164
|
FileUtils.touch(File.join(dir, "find_me.rb"))
|
167
165
|
@config.workspace_path = dir
|
168
166
|
|
169
|
-
|
170
|
-
assert(
|
167
|
+
uris = @config.indexable_uris
|
168
|
+
assert(uris.find { |u| File.basename(u.full_path) == "find_me.rb" })
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_transitive_dependencies_for_non_dev_gems_are_not_excluded
|
173
|
+
Dir.mktmpdir do |dir|
|
174
|
+
Dir.chdir(dir) do
|
175
|
+
# Both IRB and debug depend on reline. Since IRB is in the default group, reline should not be excluded
|
176
|
+
File.write(File.join(dir, "Gemfile"), <<~RUBY)
|
177
|
+
source "https://rubygems.org"
|
178
|
+
gem "irb"
|
179
|
+
gem "ruby-lsp", path: "#{Bundler.root}"
|
180
|
+
|
181
|
+
group :development do
|
182
|
+
gem "debug"
|
183
|
+
end
|
184
|
+
RUBY
|
185
|
+
|
186
|
+
Bundler.with_unbundled_env do
|
187
|
+
capture_subprocess_io do
|
188
|
+
system("bundle install")
|
189
|
+
end
|
190
|
+
|
191
|
+
stdout, _stderr = capture_subprocess_io do
|
192
|
+
script = [
|
193
|
+
"require \"ruby_lsp/internal\"",
|
194
|
+
"print RubyIndexer::Configuration.new.instance_variable_get(:@excluded_gems).join(\",\")",
|
195
|
+
].join(";")
|
196
|
+
system("bundle exec ruby -e '#{script}'")
|
197
|
+
end
|
198
|
+
|
199
|
+
excluded_gems = stdout.split(",")
|
200
|
+
assert_includes(excluded_gems, "debug")
|
201
|
+
refute_includes(excluded_gems, "reline")
|
202
|
+
refute_includes(excluded_gems, "irb")
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_does_not_fail_if_there_are_missing_specs_due_to_platform_constraints
|
209
|
+
Dir.mktmpdir do |dir|
|
210
|
+
Dir.chdir(dir) do
|
211
|
+
File.write(File.join(dir, "Gemfile"), <<~RUBY)
|
212
|
+
source "https://rubygems.org"
|
213
|
+
gem "ruby-lsp", path: "#{Bundler.root}"
|
214
|
+
|
215
|
+
platforms :windows do
|
216
|
+
gem "tzinfo"
|
217
|
+
gem "tzinfo-data"
|
218
|
+
end
|
219
|
+
RUBY
|
220
|
+
|
221
|
+
Bundler.with_unbundled_env do
|
222
|
+
capture_subprocess_io { system("bundle install") }
|
223
|
+
|
224
|
+
_stdout, stderr = capture_subprocess_io do
|
225
|
+
script = [
|
226
|
+
"require \"ruby_lsp/internal\"",
|
227
|
+
"RubyIndexer::Configuration.new.indexable_uris",
|
228
|
+
].join(";")
|
229
|
+
|
230
|
+
system("bundle exec ruby -e '#{script}'")
|
231
|
+
end
|
232
|
+
|
233
|
+
assert_empty(stderr)
|
234
|
+
end
|
235
|
+
end
|
171
236
|
end
|
172
237
|
end
|
173
238
|
end
|
@@ -172,7 +172,7 @@ module RubyIndexer
|
|
172
172
|
end
|
173
173
|
|
174
174
|
assert_match(
|
175
|
-
%r{Indexing error in
|
175
|
+
%r{Indexing error in file:///fake/path/foo\.rb with 'TestEnhancement' on call node enter enhancement},
|
176
176
|
stderr,
|
177
177
|
)
|
178
178
|
# The module should still be indexed
|
@@ -205,7 +205,7 @@ module RubyIndexer
|
|
205
205
|
end
|
206
206
|
|
207
207
|
assert_match(
|
208
|
-
%r{Indexing error in
|
208
|
+
%r{Indexing error in file:///fake/path/foo\.rb with 'TestEnhancement' on call node leave enhancement},
|
209
209
|
stderr,
|
210
210
|
)
|
211
211
|
# The module should still be indexed
|
@@ -6,11 +6,11 @@ require_relative "test_case"
|
|
6
6
|
module RubyIndexer
|
7
7
|
class IndexTest < TestCase
|
8
8
|
def test_deleting_one_entry_for_a_class
|
9
|
-
@index.index_single(
|
9
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb"), <<~RUBY)
|
10
10
|
class Foo
|
11
11
|
end
|
12
12
|
RUBY
|
13
|
-
@index.index_single(
|
13
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/other_foo.rb"), <<~RUBY)
|
14
14
|
class Foo
|
15
15
|
end
|
16
16
|
RUBY
|
@@ -18,13 +18,13 @@ module RubyIndexer
|
|
18
18
|
entries = @index["Foo"]
|
19
19
|
assert_equal(2, entries.length)
|
20
20
|
|
21
|
-
@index.delete(
|
21
|
+
@index.delete(URI::Generic.from_path(path: "/fake/path/other_foo.rb"))
|
22
22
|
entries = @index["Foo"]
|
23
23
|
assert_equal(1, entries.length)
|
24
24
|
end
|
25
25
|
|
26
26
|
def test_deleting_all_entries_for_a_class
|
27
|
-
@index.index_single(
|
27
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb"), <<~RUBY)
|
28
28
|
class Foo
|
29
29
|
end
|
30
30
|
RUBY
|
@@ -32,13 +32,13 @@ module RubyIndexer
|
|
32
32
|
entries = @index["Foo"]
|
33
33
|
assert_equal(1, entries.length)
|
34
34
|
|
35
|
-
@index.delete(
|
35
|
+
@index.delete(URI::Generic.from_path(path: "/fake/path/foo.rb"))
|
36
36
|
entries = @index["Foo"]
|
37
37
|
assert_nil(entries)
|
38
38
|
end
|
39
39
|
|
40
40
|
def test_index_resolve
|
41
|
-
@index.index_single(
|
41
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb"), <<~RUBY)
|
42
42
|
class Bar; end
|
43
43
|
|
44
44
|
module Foo
|
@@ -72,7 +72,7 @@ module RubyIndexer
|
|
72
72
|
end
|
73
73
|
|
74
74
|
def test_accessing_with_colon_colon_prefix
|
75
|
-
@index.index_single(
|
75
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb"), <<~RUBY)
|
76
76
|
class Bar; end
|
77
77
|
|
78
78
|
module Foo
|
@@ -92,7 +92,7 @@ module RubyIndexer
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def test_fuzzy_search
|
95
|
-
@index.index_single(
|
95
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb"), <<~RUBY)
|
96
96
|
class Zws; end
|
97
97
|
|
98
98
|
module Qtl
|
@@ -120,18 +120,22 @@ module RubyIndexer
|
|
120
120
|
end
|
121
121
|
|
122
122
|
def test_index_single_ignores_directories
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
123
|
+
path = "#{Dir.pwd}/lib/this_is_a_dir.rb"
|
124
|
+
FileUtils.mkdir(path)
|
125
|
+
|
126
|
+
begin
|
127
|
+
@index.index_file(URI::Generic.from_path(path: path))
|
128
|
+
ensure
|
129
|
+
FileUtils.rm_r(path)
|
130
|
+
end
|
127
131
|
end
|
128
132
|
|
129
133
|
def test_searching_for_require_paths
|
130
|
-
@index.index_single(
|
134
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb", load_path_entry: "/fake"), <<~RUBY)
|
131
135
|
class Foo
|
132
136
|
end
|
133
137
|
RUBY
|
134
|
-
@index.index_single(
|
138
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/other_foo.rb", load_path_entry: "/fake"), <<~RUBY)
|
135
139
|
class Foo
|
136
140
|
end
|
137
141
|
RUBY
|
@@ -140,11 +144,11 @@ module RubyIndexer
|
|
140
144
|
end
|
141
145
|
|
142
146
|
def test_searching_for_entries_based_on_prefix
|
143
|
-
@index.index_single(
|
147
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb", load_path_entry: "/fake"), <<~RUBY)
|
144
148
|
class Foo::Bizw
|
145
149
|
end
|
146
150
|
RUBY
|
147
|
-
@index.index_single(
|
151
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/other_foo.rb", load_path_entry: "/fake"), <<~RUBY)
|
148
152
|
class Foo::Bizw
|
149
153
|
end
|
150
154
|
|
@@ -160,7 +164,7 @@ module RubyIndexer
|
|
160
164
|
end
|
161
165
|
|
162
166
|
def test_resolve_normalizes_top_level_names
|
163
|
-
@index.index_single(
|
167
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb", load_path_entry: "/fake"), <<~RUBY)
|
164
168
|
class Bar; end
|
165
169
|
|
166
170
|
module Foo
|
@@ -180,7 +184,7 @@ module RubyIndexer
|
|
180
184
|
end
|
181
185
|
|
182
186
|
def test_resolving_aliases_to_non_existing_constants_with_conflicting_names
|
183
|
-
@index.index_single(
|
187
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb", load_path_entry: "/fake"), <<~RUBY)
|
184
188
|
class Bar
|
185
189
|
end
|
186
190
|
|
@@ -343,18 +347,18 @@ module RubyIndexer
|
|
343
347
|
raise "Prism fixtures not found. Run `git submodule update --init` to fetch them."
|
344
348
|
end
|
345
349
|
|
346
|
-
fixtures = Dir.glob("test/fixtures/prism/test/prism/fixtures/**/*.txt")
|
350
|
+
fixtures = Dir.glob("#{Dir.pwd}/test/fixtures/prism/test/prism/fixtures/**/*.txt")
|
347
351
|
|
348
352
|
fixtures.each do |fixture|
|
349
|
-
|
350
|
-
@index.
|
353
|
+
uri = URI::Generic.from_path(path: fixture)
|
354
|
+
@index.index_file(uri)
|
351
355
|
end
|
352
356
|
|
353
357
|
refute_empty(@index)
|
354
358
|
end
|
355
359
|
|
356
360
|
def test_index_single_does_not_fail_for_non_existing_file
|
357
|
-
@index.
|
361
|
+
@index.index_file(URI::Generic.from_path(path: "/fake/path/foo.rb"))
|
358
362
|
entries_after_indexing = @index.names
|
359
363
|
assert_equal(@default_indexed_entries.keys, entries_after_indexing)
|
360
364
|
end
|
@@ -782,8 +786,8 @@ module RubyIndexer
|
|
782
786
|
end
|
783
787
|
RUBY
|
784
788
|
|
785
|
-
|
786
|
-
@index.
|
789
|
+
uri = URI::Generic.from_path(path: File.join(dir, "foo.rb"))
|
790
|
+
@index.index_file(uri)
|
787
791
|
|
788
792
|
assert_equal(["Bar", "Foo", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Bar"))
|
789
793
|
|
@@ -796,7 +800,7 @@ module RubyIndexer
|
|
796
800
|
end
|
797
801
|
RUBY
|
798
802
|
|
799
|
-
@index.handle_change(
|
803
|
+
@index.handle_change(uri, File.read(T.must(uri.full_path)))
|
800
804
|
assert_empty(@index.instance_variable_get(:@ancestors))
|
801
805
|
assert_equal(["Bar", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Bar"))
|
802
806
|
end
|
@@ -816,8 +820,8 @@ module RubyIndexer
|
|
816
820
|
end
|
817
821
|
RUBY
|
818
822
|
|
819
|
-
|
820
|
-
@index.
|
823
|
+
uri = URI::Generic.from_path(path: File.join(dir, "foo.rb"))
|
824
|
+
@index.index_file(uri)
|
821
825
|
|
822
826
|
assert_equal(["Bar", "Foo", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Bar"))
|
823
827
|
|
@@ -833,7 +837,7 @@ module RubyIndexer
|
|
833
837
|
end
|
834
838
|
RUBY
|
835
839
|
|
836
|
-
@index.handle_change(
|
840
|
+
@index.handle_change(uri, File.read(T.must(uri.full_path)))
|
837
841
|
refute_empty(@index.instance_variable_get(:@ancestors))
|
838
842
|
assert_equal(["Bar", "Foo", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Bar"))
|
839
843
|
end
|
@@ -852,8 +856,8 @@ module RubyIndexer
|
|
852
856
|
end
|
853
857
|
RUBY
|
854
858
|
|
855
|
-
|
856
|
-
@index.
|
859
|
+
uri = URI::Generic.from_path(path: File.join(dir, "foo.rb"))
|
860
|
+
@index.index_file(uri)
|
857
861
|
|
858
862
|
assert_equal(["Bar", "Foo", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Bar"))
|
859
863
|
|
@@ -866,7 +870,7 @@ module RubyIndexer
|
|
866
870
|
end
|
867
871
|
RUBY
|
868
872
|
|
869
|
-
@index.handle_change(
|
873
|
+
@index.handle_change(uri, File.read(T.must(uri.full_path)))
|
870
874
|
assert_empty(@index.instance_variable_get(:@ancestors))
|
871
875
|
assert_equal(["Bar", "Object", "Kernel", "BasicObject"], @index.linearized_ancestors_of("Bar"))
|
872
876
|
end
|
@@ -1300,7 +1304,7 @@ module RubyIndexer
|
|
1300
1304
|
end
|
1301
1305
|
|
1302
1306
|
def test_resolving_method_inside_singleton_context
|
1303
|
-
@index.index_single(
|
1307
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb"), <<~RUBY)
|
1304
1308
|
module Foo
|
1305
1309
|
class Bar
|
1306
1310
|
class << self
|
@@ -1321,7 +1325,7 @@ module RubyIndexer
|
|
1321
1325
|
end
|
1322
1326
|
|
1323
1327
|
def test_resolving_constants_in_singleton_contexts
|
1324
|
-
@index.index_single(
|
1328
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb"), <<~RUBY)
|
1325
1329
|
module Foo
|
1326
1330
|
class Bar
|
1327
1331
|
CONST = 3
|
@@ -1346,7 +1350,7 @@ module RubyIndexer
|
|
1346
1350
|
end
|
1347
1351
|
|
1348
1352
|
def test_resolving_instance_variables_in_singleton_contexts
|
1349
|
-
@index.index_single(
|
1353
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb"), <<~RUBY)
|
1350
1354
|
module Foo
|
1351
1355
|
class Bar
|
1352
1356
|
@a = 123
|
@@ -1376,7 +1380,7 @@ module RubyIndexer
|
|
1376
1380
|
end
|
1377
1381
|
|
1378
1382
|
def test_instance_variable_completion_in_singleton_contexts
|
1379
|
-
@index.index_single(
|
1383
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb"), <<~RUBY)
|
1380
1384
|
module Foo
|
1381
1385
|
class Bar
|
1382
1386
|
@a = 123
|
@@ -1622,7 +1626,7 @@ module RubyIndexer
|
|
1622
1626
|
end
|
1623
1627
|
|
1624
1628
|
def test_linearizing_singleton_ancestors_of_singleton_when_class_has_parent
|
1625
|
-
@index.index_single(
|
1629
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb"), <<~RUBY)
|
1626
1630
|
class Foo; end
|
1627
1631
|
|
1628
1632
|
class Bar < Foo
|
@@ -1673,7 +1677,7 @@ module RubyIndexer
|
|
1673
1677
|
end
|
1674
1678
|
|
1675
1679
|
def test_extend_self
|
1676
|
-
@index.index_single(
|
1680
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb"), <<~RUBY)
|
1677
1681
|
module Foo
|
1678
1682
|
def bar
|
1679
1683
|
end
|
@@ -1705,7 +1709,7 @@ module RubyIndexer
|
|
1705
1709
|
end
|
1706
1710
|
|
1707
1711
|
def test_linearizing_singleton_ancestors
|
1708
|
-
@index.index_single(
|
1712
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb"), <<~RUBY)
|
1709
1713
|
module First
|
1710
1714
|
end
|
1711
1715
|
|
@@ -1746,7 +1750,7 @@ module RubyIndexer
|
|
1746
1750
|
end
|
1747
1751
|
|
1748
1752
|
def test_linearizing_singleton_ancestors_when_class_has_parent
|
1749
|
-
@index.index_single(
|
1753
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb"), <<~RUBY)
|
1750
1754
|
class Foo; end
|
1751
1755
|
|
1752
1756
|
class Bar < Foo
|
@@ -1776,7 +1780,7 @@ module RubyIndexer
|
|
1776
1780
|
end
|
1777
1781
|
|
1778
1782
|
def test_linearizing_a_module_singleton_class
|
1779
|
-
@index.index_single(
|
1783
|
+
@index.index_single(URI::Generic.from_path(path: "/fake/path/foo.rb"), <<~RUBY)
|
1780
1784
|
module A; end
|
1781
1785
|
RUBY
|
1782
1786
|
|
@@ -1885,13 +1889,13 @@ module RubyIndexer
|
|
1885
1889
|
end
|
1886
1890
|
RUBY
|
1887
1891
|
|
1888
|
-
entries = @index.entries_for("
|
1892
|
+
entries = @index.entries_for("file:///fake/path/foo.rb", Entry)
|
1889
1893
|
assert_equal(["Foo", "Bar", "my_def", "Bar::<Class:Bar>", "my_singleton_def"], entries.map(&:name))
|
1890
1894
|
|
1891
|
-
entries = @index.entries_for("
|
1895
|
+
entries = @index.entries_for("file:///fake/path/foo.rb", RubyIndexer::Entry::Namespace)
|
1892
1896
|
assert_equal(["Foo", "Bar", "Bar::<Class:Bar>"], entries.map(&:name))
|
1893
1897
|
|
1894
|
-
entries = @index.entries_for("
|
1898
|
+
entries = @index.entries_for("file:///fake/path/foo.rb")
|
1895
1899
|
assert_equal(["Foo", "Bar", "my_def", "Bar::<Class:Bar>", "my_singleton_def"], entries.map(&:name))
|
1896
1900
|
end
|
1897
1901
|
|
@@ -2062,5 +2066,30 @@ module RubyIndexer
|
|
2062
2066
|
@index.index_all
|
2063
2067
|
end
|
2064
2068
|
end
|
2069
|
+
|
2070
|
+
def test_index_can_handle_entries_from_untitled_scheme
|
2071
|
+
uri = URI("untitled:Untitled-1")
|
2072
|
+
|
2073
|
+
index(<<~RUBY, uri: uri)
|
2074
|
+
class Foo
|
2075
|
+
end
|
2076
|
+
RUBY
|
2077
|
+
|
2078
|
+
entry = @index["Foo"]&.first
|
2079
|
+
refute_nil(entry, "Expected indexer to be able to handle unsaved URIs")
|
2080
|
+
assert_equal("untitled:Untitled-1", entry.uri.to_s)
|
2081
|
+
assert_equal("Untitled-1", entry.file_name)
|
2082
|
+
assert_nil(entry.file_path)
|
2083
|
+
|
2084
|
+
@index.handle_change(uri, <<~RUBY)
|
2085
|
+
# I added this comment!
|
2086
|
+
class Foo
|
2087
|
+
end
|
2088
|
+
RUBY
|
2089
|
+
|
2090
|
+
entry = @index["Foo"]&.first
|
2091
|
+
refute_nil(entry, "Expected indexer to be able to handle unsaved URIs")
|
2092
|
+
assert_equal("I added this comment!", entry.comments)
|
2093
|
+
end
|
2065
2094
|
end
|
2066
2095
|
end
|
@@ -377,7 +377,7 @@ module RubyIndexer
|
|
377
377
|
_, _, declarations = RBS::Parser.parse_signature(buffer)
|
378
378
|
index = RubyIndexer::Index.new
|
379
379
|
indexer = RubyIndexer::RBSIndexer.new(index)
|
380
|
-
pathname = Pathname.new("file.rbs")
|
380
|
+
pathname = Pathname.new("/file.rbs")
|
381
381
|
indexer.process_signature(pathname, declarations)
|
382
382
|
entry = T.must(index[method_name]).first
|
383
383
|
T.cast(entry, Entry::Method).signatures
|
@@ -231,7 +231,7 @@ module RubyIndexer
|
|
231
231
|
def find_references(target, source)
|
232
232
|
file_path = "/fake.rb"
|
233
233
|
index = Index.new
|
234
|
-
index.index_single(
|
234
|
+
index.index_single(URI::Generic.from_path(path: file_path), source)
|
235
235
|
parse_result = Prism.parse(source)
|
236
236
|
dispatcher = Prism::Dispatcher.new
|
237
237
|
finder = ReferenceFinder.new(target, index, dispatcher)
|
@@ -13,8 +13,8 @@ module RubyIndexer
|
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
|
-
def index(source)
|
17
|
-
@index.index_single(
|
16
|
+
def index(source, uri: URI::Generic.from_path(path: "/fake/path/foo.rb"))
|
17
|
+
@index.index_single(uri, source)
|
18
18
|
end
|
19
19
|
|
20
20
|
def assert_entry(expected_name, type, expected_location, visibility: nil)
|