ruby-lsp 0.17.2 → 0.17.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- dependencies = gather_dependencies
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(dependencies) if @formatter == "auto"
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(dependencies)
67
- @test_library = detect_test_library(dependencies)
68
- @typechecker = detect_typechecker(dependencies)
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(dependencies: T::Array[String]).returns(String) }
107
- def detect_formatter(dependencies)
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 dependencies.any?(/^rubocop/)
110
- "rubocop"
111
- elsif dependencies.any?(/^syntax_tree$/)
112
- "syntax_tree"
113
- else
114
- "none"
115
- end
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 File.exist?(File.join(workspace_path, "bin/rails"))
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 gather_dependencies
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
@@ -18,6 +18,7 @@ require "set"
18
18
  require "prism"
19
19
  require "prism/visitor"
20
20
  require "language_server-protocol"
21
+ require "rbs"
21
22
 
22
23
  require "ruby-lsp"
23
24
  require "ruby_lsp/base_server"
@@ -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
@@ -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.2
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-06-05 00:00:00.000000000 Z
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.30'
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.30'
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