ruby-lsp 0.17.1 → 0.17.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/VERSION +1 -1
- data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +56 -0
- data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +28 -0
- data/lib/ruby_indexer/lib/ruby_indexer/index.rb +156 -40
- data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +99 -0
- data/lib/ruby_indexer/ruby_indexer.rb +1 -0
- data/lib/ruby_indexer/test/classes_and_modules_test.rb +3 -2
- data/lib/ruby_indexer/test/configuration_test.rb +1 -1
- data/lib/ruby_indexer/test/constant_test.rb +1 -1
- data/lib/ruby_indexer/test/index_test.rb +388 -56
- data/lib/ruby_indexer/test/method_test.rb +20 -0
- data/lib/ruby_indexer/test/rbs_indexer_test.rb +42 -0
- data/lib/ruby_indexer/test/test_case.rb +7 -0
- data/lib/ruby_lsp/document.rb +24 -1
- data/lib/ruby_lsp/global_state.rb +37 -16
- data/lib/ruby_lsp/internal.rb +1 -0
- data/lib/ruby_lsp/listeners/code_lens.rb +2 -2
- data/lib/ruby_lsp/listeners/definition.rb +20 -18
- data/lib/ruby_lsp/listeners/hover.rb +2 -0
- data/lib/ruby_lsp/node_context.rb +15 -4
- data/lib/ruby_lsp/requests/definition.rb +5 -0
- data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +23 -6
- data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +5 -1
- data/lib/ruby_lsp/requests/support/rubocop_runner.rb +4 -0
- data/lib/ruby_lsp/requests/workspace_symbol.rb +4 -3
- data/lib/ruby_lsp/server.rb +12 -1
- metadata +27 -5
data/lib/ruby_lsp/document.rb
CHANGED
@@ -128,6 +128,7 @@ module RubyLsp
|
|
128
128
|
closest = node
|
129
129
|
parent = T.let(nil, T.nilable(Prism::Node))
|
130
130
|
nesting = T.let([], T::Array[T.any(Prism::ClassNode, Prism::ModuleNode)])
|
131
|
+
call_node = T.let(nil, T.nilable(Prism::CallNode))
|
131
132
|
|
132
133
|
until queue.empty?
|
133
134
|
candidate = queue.shift
|
@@ -159,6 +160,15 @@ module RubyLsp
|
|
159
160
|
nesting << candidate
|
160
161
|
end
|
161
162
|
|
163
|
+
if candidate.is_a?(Prism::CallNode)
|
164
|
+
arg_loc = candidate.arguments&.location
|
165
|
+
blk_loc = candidate.block&.location
|
166
|
+
if (arg_loc && (arg_loc.start_offset...arg_loc.end_offset).cover?(char_position)) ||
|
167
|
+
(blk_loc && (blk_loc.start_offset...blk_loc.end_offset).cover?(char_position))
|
168
|
+
call_node = candidate
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
162
172
|
# If there are node types to filter by, and the current node is not one of those types, then skip it
|
163
173
|
next if node_types.any? && node_types.none? { |type| candidate.class == type }
|
164
174
|
|
@@ -170,7 +180,20 @@ module RubyLsp
|
|
170
180
|
end
|
171
181
|
end
|
172
182
|
|
173
|
-
|
183
|
+
# When targeting the constant part of a class/module definition, we do not want the nesting to be duplicated. That
|
184
|
+
# is, when targeting Bar in the following example:
|
185
|
+
#
|
186
|
+
# ```ruby
|
187
|
+
# class Foo::Bar; end
|
188
|
+
# ```
|
189
|
+
# The correct target is `Foo::Bar` with an empty nesting. `Foo::Bar` should not appear in the nesting stack, even
|
190
|
+
# though the class/module node does indeed enclose the target, because it would lead to incorrect behavior
|
191
|
+
if closest.is_a?(Prism::ConstantReadNode) || closest.is_a?(Prism::ConstantPathNode)
|
192
|
+
last_level = nesting.last
|
193
|
+
nesting.pop if last_level && last_level.constant_path == closest
|
194
|
+
end
|
195
|
+
|
196
|
+
NodeContext.new(closest, parent, nesting.map { |n| n.constant_path.location.slice }, call_node)
|
174
197
|
end
|
175
198
|
|
176
199
|
sig { returns(T::Boolean) }
|
@@ -54,18 +54,19 @@ module RubyLsp
|
|
54
54
|
|
55
55
|
sig { params(options: T::Hash[Symbol, T.untyped]).void }
|
56
56
|
def apply_options(options)
|
57
|
-
|
57
|
+
direct_dependencies = gather_direct_dependencies
|
58
|
+
all_dependencies = gather_direct_and_indirect_dependencies
|
58
59
|
workspace_uri = options.dig(:workspaceFolders, 0, :uri)
|
59
60
|
@workspace_uri = URI(workspace_uri) if workspace_uri
|
60
61
|
|
61
62
|
specified_formatter = options.dig(:initializationOptions, :formatter)
|
62
63
|
@formatter = specified_formatter if specified_formatter
|
63
|
-
@formatter = detect_formatter(
|
64
|
+
@formatter = detect_formatter(direct_dependencies, all_dependencies) if @formatter == "auto"
|
64
65
|
|
65
66
|
specified_linters = options.dig(:initializationOptions, :linters)
|
66
|
-
@linters = specified_linters || detect_linters(
|
67
|
-
@test_library = detect_test_library(
|
68
|
-
@typechecker = detect_typechecker(
|
67
|
+
@linters = specified_linters || detect_linters(direct_dependencies)
|
68
|
+
@test_library = detect_test_library(direct_dependencies)
|
69
|
+
@typechecker = detect_typechecker(direct_dependencies)
|
69
70
|
|
70
71
|
encodings = options.dig(:capabilities, :general, :positionEncodings)
|
71
72
|
@encoding = if !encodings || encodings.empty?
|
@@ -103,16 +104,18 @@ module RubyLsp
|
|
103
104
|
|
104
105
|
private
|
105
106
|
|
106
|
-
sig { params(
|
107
|
-
def detect_formatter(
|
107
|
+
sig { params(direct_dependencies: T::Array[String], all_dependencies: T::Array[String]).returns(String) }
|
108
|
+
def detect_formatter(direct_dependencies, all_dependencies)
|
108
109
|
# NOTE: Intentionally no $ at end, since we want to match rubocop-shopify, etc.
|
109
|
-
if
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
110
|
+
return "rubocop" if direct_dependencies.any?(/^rubocop/)
|
111
|
+
|
112
|
+
syntax_tree_is_direct_dependency = direct_dependencies.include?("syntax_tree")
|
113
|
+
return "syntax_tree" if syntax_tree_is_direct_dependency
|
114
|
+
|
115
|
+
rubocop_is_transitive_dependency = all_dependencies.include?("rubocop")
|
116
|
+
return "rubocop" if dot_rubocop_yml_present && rubocop_is_transitive_dependency
|
117
|
+
|
118
|
+
"none"
|
116
119
|
end
|
117
120
|
|
118
121
|
# Try to detect if there are linters in the project's dependencies. For auto-detection, we always only consider a
|
@@ -132,7 +135,7 @@ module RubyLsp
|
|
132
135
|
# by ruby-lsp-rails. A Rails app doesn't need to depend on the rails gem itself, individual components like
|
133
136
|
# activestorage may be added to the gemfile so that other components aren't downloaded. Check for the presence
|
134
137
|
# of bin/rails to support these cases.
|
135
|
-
elsif
|
138
|
+
elsif bin_rails_present
|
136
139
|
"rails"
|
137
140
|
# NOTE: Intentionally ends with $ to avoid mis-matching minitest-reporters, etc. in a Rails app.
|
138
141
|
elsif dependencies.any?(/^minitest$/)
|
@@ -162,8 +165,18 @@ module RubyLsp
|
|
162
165
|
false
|
163
166
|
end
|
164
167
|
|
168
|
+
sig { returns(T::Boolean) }
|
169
|
+
def bin_rails_present
|
170
|
+
File.exist?(File.join(workspace_path, "bin/rails"))
|
171
|
+
end
|
172
|
+
|
173
|
+
sig { returns(T::Boolean) }
|
174
|
+
def dot_rubocop_yml_present
|
175
|
+
File.exist?(File.join(workspace_path, ".rubocop.yml"))
|
176
|
+
end
|
177
|
+
|
165
178
|
sig { returns(T::Array[String]) }
|
166
|
-
def
|
179
|
+
def gather_direct_dependencies
|
167
180
|
Bundler.with_original_env { Bundler.default_gemfile }
|
168
181
|
Bundler.locked_gems.dependencies.keys + gemspec_dependencies
|
169
182
|
rescue Bundler::GemfileNotFound
|
@@ -176,5 +189,13 @@ module RubyLsp
|
|
176
189
|
.grep(Bundler::Source::Gemspec)
|
177
190
|
.flat_map { _1.gemspec&.dependencies&.map(&:name) }
|
178
191
|
end
|
192
|
+
|
193
|
+
sig { returns(T::Array[String]) }
|
194
|
+
def gather_direct_and_indirect_dependencies
|
195
|
+
Bundler.with_original_env { Bundler.default_gemfile }
|
196
|
+
Bundler.locked_gems.specs.map(&:name)
|
197
|
+
rescue Bundler::GemfileNotFound
|
198
|
+
[]
|
199
|
+
end
|
179
200
|
end
|
180
201
|
end
|
data/lib/ruby_lsp/internal.rb
CHANGED
@@ -236,7 +236,7 @@ module RubyLsp
|
|
236
236
|
# so there must be something to the left of the available path.
|
237
237
|
group_stack = T.must(group_stack[last_dynamic_reference_index + 1..])
|
238
238
|
if method_name
|
239
|
-
" --name " + "/::#{Shellwords.escape(group_stack.join("::") + "#" + method_name)}$/"
|
239
|
+
" --name " + "/::#{Shellwords.escape(group_stack.join("::")) + "#" + Shellwords.escape(method_name)}$/"
|
240
240
|
else
|
241
241
|
# When clicking on a CodeLens for `Test`, `(#|::)` will match all tests
|
242
242
|
# that are registered on the class itself (matches after `#`) and all tests
|
@@ -245,7 +245,7 @@ module RubyLsp
|
|
245
245
|
end
|
246
246
|
elsif method_name
|
247
247
|
# We know the entire path, do an exact match
|
248
|
-
" --name " + Shellwords.escape(group_stack.join("::") + "#" + method_name)
|
248
|
+
" --name " + Shellwords.escape(group_stack.join("::")) + "#" + Shellwords.escape(method_name)
|
249
249
|
elsif spec_name
|
250
250
|
" --name " + "/#{Shellwords.escape(spec_name)}/"
|
251
251
|
else
|
@@ -39,18 +39,27 @@ module RubyLsp
|
|
39
39
|
:on_instance_variable_operator_write_node_enter,
|
40
40
|
:on_instance_variable_or_write_node_enter,
|
41
41
|
:on_instance_variable_target_node_enter,
|
42
|
+
:on_string_node_enter,
|
42
43
|
)
|
43
44
|
end
|
44
45
|
|
45
46
|
sig { params(node: Prism::CallNode).void }
|
46
47
|
def on_call_node_enter(node)
|
47
|
-
message = node.
|
48
|
+
message = node.message
|
49
|
+
return unless message
|
48
50
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
handle_method_definition(message, self_receiver?(node))
|
52
|
+
end
|
53
|
+
|
54
|
+
sig { params(node: Prism::StringNode).void }
|
55
|
+
def on_string_node_enter(node)
|
56
|
+
enclosing_call = @node_context.call_node
|
57
|
+
return unless enclosing_call
|
58
|
+
|
59
|
+
name = enclosing_call.name
|
60
|
+
return unless name == :require || name == :require_relative
|
61
|
+
|
62
|
+
handle_require_definition(node, name)
|
54
63
|
end
|
55
64
|
|
56
65
|
sig { params(node: Prism::BlockArgumentNode).void }
|
@@ -159,19 +168,12 @@ module RubyLsp
|
|
159
168
|
end
|
160
169
|
end
|
161
170
|
|
162
|
-
sig { params(node: Prism::
|
163
|
-
def handle_require_definition(node)
|
164
|
-
message = node.name
|
165
|
-
arguments = node.arguments
|
166
|
-
return unless arguments
|
167
|
-
|
168
|
-
argument = arguments.arguments.first
|
169
|
-
return unless argument.is_a?(Prism::StringNode)
|
170
|
-
|
171
|
+
sig { params(node: Prism::StringNode, message: Symbol).void }
|
172
|
+
def handle_require_definition(node, message)
|
171
173
|
case message
|
172
174
|
when :require
|
173
|
-
entry = @index.search_require_paths(
|
174
|
-
indexable_path.require_path ==
|
175
|
+
entry = @index.search_require_paths(node.content).find do |indexable_path|
|
176
|
+
indexable_path.require_path == node.content
|
175
177
|
end
|
176
178
|
|
177
179
|
if entry
|
@@ -186,7 +188,7 @@ module RubyLsp
|
|
186
188
|
)
|
187
189
|
end
|
188
190
|
when :require_relative
|
189
|
-
required_file = "#{
|
191
|
+
required_file = "#{node.content}.rb"
|
190
192
|
path = @uri.to_standardized_path
|
191
193
|
current_folder = path ? Pathname.new(CGI.unescape(path)).dirname : Dir.pwd
|
192
194
|
candidate = File.expand_path(File.join(current_folder, required_file))
|
@@ -2,8 +2,8 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module RubyLsp
|
5
|
-
# This class allows listeners to access contextual information about a node in the AST, such as its parent
|
6
|
-
#
|
5
|
+
# This class allows listeners to access contextual information about a node in the AST, such as its parent,
|
6
|
+
# its namespace nesting, and the surrounding CallNode (e.g. a method call).
|
7
7
|
class NodeContext
|
8
8
|
extend T::Sig
|
9
9
|
|
@@ -13,11 +13,22 @@ module RubyLsp
|
|
13
13
|
sig { returns(T::Array[String]) }
|
14
14
|
attr_reader :nesting
|
15
15
|
|
16
|
-
sig {
|
17
|
-
|
16
|
+
sig { returns(T.nilable(Prism::CallNode)) }
|
17
|
+
attr_reader :call_node
|
18
|
+
|
19
|
+
sig do
|
20
|
+
params(
|
21
|
+
node: T.nilable(Prism::Node),
|
22
|
+
parent: T.nilable(Prism::Node),
|
23
|
+
nesting: T::Array[String],
|
24
|
+
call_node: T.nilable(Prism::CallNode),
|
25
|
+
).void
|
26
|
+
end
|
27
|
+
def initialize(node, parent, nesting, call_node)
|
18
28
|
@node = node
|
19
29
|
@parent = parent
|
20
30
|
@nesting = nesting
|
31
|
+
@call_node = call_node
|
21
32
|
end
|
22
33
|
|
23
34
|
sig { returns(String) }
|
@@ -60,6 +60,8 @@ module RubyLsp
|
|
60
60
|
Prism::InstanceVariableOrWriteNode,
|
61
61
|
Prism::InstanceVariableTargetNode,
|
62
62
|
Prism::InstanceVariableWriteNode,
|
63
|
+
Prism::SymbolNode,
|
64
|
+
Prism::StringNode,
|
63
65
|
],
|
64
66
|
)
|
65
67
|
|
@@ -79,6 +81,9 @@ module RubyLsp
|
|
79
81
|
# If the target is a method call, we need to ensure that the requested position is exactly on top of the
|
80
82
|
# method identifier. Otherwise, we risk showing definitions for unrelated things
|
81
83
|
target = nil
|
84
|
+
# For methods with block arguments using symbol-to-proc
|
85
|
+
elsif target.is_a?(Prism::SymbolNode) && parent.is_a?(Prism::BlockArgumentNode)
|
86
|
+
target = parent
|
82
87
|
end
|
83
88
|
|
84
89
|
if target
|
@@ -19,6 +19,16 @@ module RubyLsp
|
|
19
19
|
T::Hash[Symbol, Integer],
|
20
20
|
)
|
21
21
|
|
22
|
+
ENHANCED_DOC_URL = T.let(
|
23
|
+
begin
|
24
|
+
gem("rubocop", ">= 1.64.0")
|
25
|
+
true
|
26
|
+
rescue LoadError
|
27
|
+
false
|
28
|
+
end,
|
29
|
+
T::Boolean,
|
30
|
+
)
|
31
|
+
|
22
32
|
# TODO: avoid passing document once we have alternative ways to get at
|
23
33
|
# encoding and file source
|
24
34
|
sig { params(document: Document, offense: RuboCop::Cop::Offense, uri: URI::Generic).void }
|
@@ -38,8 +48,8 @@ module RubyLsp
|
|
38
48
|
code_actions
|
39
49
|
end
|
40
50
|
|
41
|
-
sig { returns(Interface::Diagnostic) }
|
42
|
-
def to_lsp_diagnostic
|
51
|
+
sig { params(config: RuboCop::Config).returns(Interface::Diagnostic) }
|
52
|
+
def to_lsp_diagnostic(config)
|
43
53
|
# highlighted_area contains the begin and end position of the first line
|
44
54
|
# This ensures that multiline offenses don't clutter the editor
|
45
55
|
highlighted = @offense.highlighted_area
|
@@ -47,7 +57,7 @@ module RubyLsp
|
|
47
57
|
message: message,
|
48
58
|
source: "RuboCop",
|
49
59
|
code: @offense.cop_name,
|
50
|
-
code_description: code_description,
|
60
|
+
code_description: code_description(config),
|
51
61
|
severity: severity,
|
52
62
|
range: Interface::Range.new(
|
53
63
|
start: Interface::Position.new(
|
@@ -80,9 +90,16 @@ module RubyLsp
|
|
80
90
|
RUBOCOP_TO_LSP_SEVERITY[@offense.severity.name]
|
81
91
|
end
|
82
92
|
|
83
|
-
sig { returns(T.nilable(Interface::CodeDescription)) }
|
84
|
-
def code_description
|
85
|
-
|
93
|
+
sig { params(config: RuboCop::Config).returns(T.nilable(Interface::CodeDescription)) }
|
94
|
+
def code_description(config)
|
95
|
+
cop = RuboCopRunner.find_cop_by_name(@offense.cop_name)
|
96
|
+
return unless cop
|
97
|
+
|
98
|
+
doc_url = if ENHANCED_DOC_URL
|
99
|
+
cop.documentation_url(config)
|
100
|
+
else
|
101
|
+
cop.documentation_url
|
102
|
+
end
|
86
103
|
Interface::CodeDescription.new(href: doc_url) if doc_url
|
87
104
|
end
|
88
105
|
|
@@ -38,7 +38,11 @@ module RubyLsp
|
|
38
38
|
@diagnostic_runner.run(filename, document.source)
|
39
39
|
|
40
40
|
@diagnostic_runner.offenses.map do |offense|
|
41
|
-
Support::RuboCopDiagnostic.new(
|
41
|
+
Support::RuboCopDiagnostic.new(
|
42
|
+
document,
|
43
|
+
offense,
|
44
|
+
uri,
|
45
|
+
).to_lsp_diagnostic(@diagnostic_runner.config_for_working_directory)
|
42
46
|
end
|
43
47
|
end
|
44
48
|
end
|
@@ -50,6 +50,9 @@ module RubyLsp
|
|
50
50
|
sig { returns(T::Array[RuboCop::Cop::Offense]) }
|
51
51
|
attr_reader :offenses
|
52
52
|
|
53
|
+
sig { returns(::RuboCop::Config) }
|
54
|
+
attr_reader :config_for_working_directory
|
55
|
+
|
53
56
|
DEFAULT_ARGS = T.let(
|
54
57
|
[
|
55
58
|
"--stderr", # Print any output to stderr so that our stdout does not get polluted
|
@@ -78,6 +81,7 @@ module RubyLsp
|
|
78
81
|
args += DEFAULT_ARGS
|
79
82
|
rubocop_options = ::RuboCop::Options.new.parse(args).first
|
80
83
|
config_store = ::RuboCop::ConfigStore.new
|
84
|
+
@config_for_working_directory = T.let(config_store.for_pwd, ::RuboCop::Config)
|
81
85
|
|
82
86
|
super(rubocop_options, config_store)
|
83
87
|
end
|
@@ -33,10 +33,11 @@ module RubyLsp
|
|
33
33
|
sig { override.returns(T::Array[Interface::WorkspaceSymbol]) }
|
34
34
|
def perform
|
35
35
|
@index.fuzzy_search(@query).filter_map do |entry|
|
36
|
-
# If the project is using Sorbet, we let Sorbet handle symbols defined inside the project itself and RBIs, but
|
37
|
-
# we still return entries defined in gems to allow developers to jump directly to the source
|
38
36
|
file_path = entry.file_path
|
39
|
-
|
37
|
+
|
38
|
+
# We only show symbols declared in the workspace
|
39
|
+
in_dependencies = !not_in_dependencies?(file_path)
|
40
|
+
next if in_dependencies
|
40
41
|
|
41
42
|
# We should never show private symbols when searching the entire workspace
|
42
43
|
next if entry.private?
|
data/lib/ruby_lsp/server.rb
CHANGED
@@ -175,7 +175,7 @@ module RubyLsp
|
|
175
175
|
completion_provider: completion_provider,
|
176
176
|
code_lens_provider: code_lens_provider,
|
177
177
|
definition_provider: enabled_features["definition"],
|
178
|
-
workspace_symbol_provider: enabled_features["workspaceSymbol"],
|
178
|
+
workspace_symbol_provider: enabled_features["workspaceSymbol"] && !@global_state.typechecker,
|
179
179
|
signature_help_provider: signature_help_provider,
|
180
180
|
),
|
181
181
|
serverInfo: {
|
@@ -690,6 +690,17 @@ module RubyLsp
|
|
690
690
|
|
691
691
|
sig { params(config_hash: T::Hash[String, T.untyped]).void }
|
692
692
|
def perform_initial_indexing(config_hash)
|
693
|
+
index_ruby_core
|
694
|
+
index_ruby_code(config_hash)
|
695
|
+
end
|
696
|
+
|
697
|
+
sig { void }
|
698
|
+
def index_ruby_core
|
699
|
+
RubyIndexer::RBSIndexer.new(@global_state.index).index_ruby_core
|
700
|
+
end
|
701
|
+
|
702
|
+
sig { params(config_hash: T::Hash[String, T.untyped]).void }
|
703
|
+
def index_ruby_code(config_hash)
|
693
704
|
# The begin progress invocation happens during `initialize`, so that the notification is sent before we are
|
694
705
|
# stuck indexing files
|
695
706
|
RubyIndexer.configuration.apply_config(config_hash)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-lsp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.17.
|
4
|
+
version: 0.17.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: language_server-protocol
|
@@ -33,7 +33,7 @@ dependencies:
|
|
33
33
|
version: 0.29.0
|
34
34
|
- - "<"
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version: '0.
|
36
|
+
version: '0.31'
|
37
37
|
type: :runtime
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -43,7 +43,27 @@ dependencies:
|
|
43
43
|
version: 0.29.0
|
44
44
|
- - "<"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: '0.
|
46
|
+
version: '0.31'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rbs
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '3'
|
54
|
+
- - "<"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '4'
|
57
|
+
type: :runtime
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '3'
|
64
|
+
- - "<"
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '4'
|
47
67
|
- !ruby/object:Gem::Dependency
|
48
68
|
name: sorbet-runtime
|
49
69
|
requirement: !ruby/object:Gem::Requirement
|
@@ -85,6 +105,7 @@ files:
|
|
85
105
|
- lib/ruby_indexer/lib/ruby_indexer/indexable_path.rb
|
86
106
|
- lib/ruby_indexer/lib/ruby_indexer/location.rb
|
87
107
|
- lib/ruby_indexer/lib/ruby_indexer/prefix_tree.rb
|
108
|
+
- lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb
|
88
109
|
- lib/ruby_indexer/ruby_indexer.rb
|
89
110
|
- lib/ruby_indexer/test/classes_and_modules_test.rb
|
90
111
|
- lib/ruby_indexer/test/configuration_test.rb
|
@@ -93,6 +114,7 @@ files:
|
|
93
114
|
- lib/ruby_indexer/test/instance_variables_test.rb
|
94
115
|
- lib/ruby_indexer/test/method_test.rb
|
95
116
|
- lib/ruby_indexer/test/prefix_tree_test.rb
|
117
|
+
- lib/ruby_indexer/test/rbs_indexer_test.rb
|
96
118
|
- lib/ruby_indexer/test/test_case.rb
|
97
119
|
- lib/ruby_lsp/addon.rb
|
98
120
|
- lib/ruby_lsp/base_server.rb
|
@@ -180,7 +202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
180
202
|
- !ruby/object:Gem::Version
|
181
203
|
version: '0'
|
182
204
|
requirements: []
|
183
|
-
rubygems_version: 3.5.
|
205
|
+
rubygems_version: 3.5.11
|
184
206
|
signing_key:
|
185
207
|
specification_version: 4
|
186
208
|
summary: An opinionated language server for Ruby
|