ruby-lsp 0.17.16 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -110
  3. data/VERSION +1 -1
  4. data/exe/ruby-lsp +10 -8
  5. data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +14 -6
  6. data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +157 -27
  7. data/lib/ruby_indexer/lib/ruby_indexer/index.rb +31 -12
  8. data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +2 -2
  9. data/lib/ruby_indexer/test/classes_and_modules_test.rb +10 -10
  10. data/lib/ruby_indexer/test/constant_test.rb +4 -4
  11. data/lib/ruby_indexer/test/enhancements_test.rb +2 -2
  12. data/lib/ruby_indexer/test/index_test.rb +41 -0
  13. data/lib/ruby_indexer/test/method_test.rb +257 -2
  14. data/lib/ruby_indexer/test/rbs_indexer_test.rb +1 -1
  15. data/lib/ruby_lsp/addon.rb +3 -2
  16. data/lib/ruby_lsp/base_server.rb +21 -1
  17. data/lib/ruby_lsp/document.rb +5 -3
  18. data/lib/ruby_lsp/erb_document.rb +29 -10
  19. data/lib/ruby_lsp/global_state.rb +15 -1
  20. data/lib/ruby_lsp/listeners/code_lens.rb +34 -5
  21. data/lib/ruby_lsp/listeners/folding_ranges.rb +1 -1
  22. data/lib/ruby_lsp/listeners/semantic_highlighting.rb +28 -0
  23. data/lib/ruby_lsp/listeners/signature_help.rb +55 -24
  24. data/lib/ruby_lsp/rbs_document.rb +5 -4
  25. data/lib/ruby_lsp/requests/code_action_resolve.rb +0 -15
  26. data/lib/ruby_lsp/requests/code_actions.rb +0 -10
  27. data/lib/ruby_lsp/requests/code_lens.rb +1 -11
  28. data/lib/ruby_lsp/requests/completion.rb +3 -20
  29. data/lib/ruby_lsp/requests/completion_resolve.rb +0 -8
  30. data/lib/ruby_lsp/requests/definition.rb +6 -20
  31. data/lib/ruby_lsp/requests/diagnostics.rb +0 -10
  32. data/lib/ruby_lsp/requests/document_highlight.rb +7 -14
  33. data/lib/ruby_lsp/requests/document_link.rb +0 -10
  34. data/lib/ruby_lsp/requests/document_symbol.rb +0 -17
  35. data/lib/ruby_lsp/requests/folding_ranges.rb +0 -10
  36. data/lib/ruby_lsp/requests/formatting.rb +3 -17
  37. data/lib/ruby_lsp/requests/hover.rb +9 -9
  38. data/lib/ruby_lsp/requests/inlay_hints.rb +0 -30
  39. data/lib/ruby_lsp/requests/on_type_formatting.rb +0 -10
  40. data/lib/ruby_lsp/requests/prepare_type_hierarchy.rb +0 -11
  41. data/lib/ruby_lsp/requests/request.rb +17 -1
  42. data/lib/ruby_lsp/requests/selection_ranges.rb +0 -10
  43. data/lib/ruby_lsp/requests/semantic_highlighting.rb +1 -23
  44. data/lib/ruby_lsp/requests/show_syntax_tree.rb +0 -11
  45. data/lib/ruby_lsp/requests/signature_help.rb +5 -20
  46. data/lib/ruby_lsp/requests/support/common.rb +1 -1
  47. data/lib/ruby_lsp/requests/support/rubocop_runner.rb +2 -0
  48. data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +0 -11
  49. data/lib/ruby_lsp/requests/workspace_symbol.rb +0 -12
  50. data/lib/ruby_lsp/ruby_document.rb +4 -3
  51. data/lib/ruby_lsp/server.rb +23 -8
  52. data/lib/ruby_lsp/setup_bundler.rb +31 -13
  53. data/lib/ruby_lsp/type_inferrer.rb +6 -2
  54. data/lib/ruby_lsp/utils.rb +11 -1
  55. metadata +7 -14
  56. data/lib/ruby_lsp/check_docs.rb +0 -130
@@ -5,16 +5,8 @@ require "ruby_lsp/listeners/hover"
5
5
 
6
6
  module RubyLsp
7
7
  module Requests
8
- # ![Hover demo](../../hover.gif)
9
- #
10
8
  # The [hover request](https://microsoft.github.io/language-server-protocol/specification#textDocument_hover)
11
9
  # displays the documentation for the symbol currently under the cursor.
12
- #
13
- # # Example
14
- #
15
- # ```ruby
16
- # String # -> Hovering over the class reference will show all declaration locations and the documentation
17
- # ```
18
10
  class Hover < Request
19
11
  extend T::Sig
20
12
  extend T::Generic
@@ -41,7 +33,15 @@ module RubyLsp
41
33
  end
42
34
  def initialize(document, global_state, position, dispatcher, sorbet_level)
43
35
  super()
44
- node_context = document.locate_node(position, node_types: Listeners::Hover::ALLOWED_TARGETS)
36
+
37
+ char_position = document.create_scanner.find_char_position(position)
38
+ delegate_request_if_needed!(global_state, document, char_position)
39
+
40
+ node_context = RubyDocument.locate(
41
+ document.parse_result.value,
42
+ char_position,
43
+ node_types: Listeners::Hover::ALLOWED_TARGETS,
44
+ )
45
45
  target = node_context.node
46
46
  parent = node_context.parent
47
47
 
@@ -5,39 +5,9 @@ require "ruby_lsp/listeners/inlay_hints"
5
5
 
6
6
  module RubyLsp
7
7
  module Requests
8
- # ![Inlay hint demo](../../inlay_hints.gif)
9
- #
10
8
  # [Inlay hints](https://microsoft.github.io/language-server-protocol/specification#textDocument_inlayHint)
11
9
  # are labels added directly in the code that explicitly show the user something that might
12
10
  # otherwise just be implied.
13
- #
14
- # # Configuration
15
- #
16
- # To enable rescue hints, set `rubyLsp.featuresConfiguration.inlayHint.implicitRescue` to `true`.
17
- #
18
- # To enable hash value hints, set `rubyLsp.featuresConfiguration.inlayHint.implicitHashValue` to `true`.
19
- #
20
- # To enable all hints, set `rubyLsp.featuresConfiguration.inlayHint.enableAll` to `true`.
21
- #
22
- # # Example
23
- #
24
- # ```ruby
25
- # begin
26
- # puts "do something that might raise"
27
- # rescue # Label "StandardError" goes here as a bare rescue implies rescuing StandardError
28
- # puts "handle some rescue"
29
- # end
30
- # ```
31
- #
32
- # # Example
33
- #
34
- # ```ruby
35
- # var = "foo"
36
- # {
37
- # var: var, # Label "var" goes here in cases where the value is omitted
38
- # a: "hello",
39
- # }
40
- # ```
41
11
  class InlayHints < Request
42
12
  extend T::Sig
43
13
 
@@ -3,18 +3,8 @@
3
3
 
4
4
  module RubyLsp
5
5
  module Requests
6
- # ![On type formatting demo](../../on_type_formatting.gif)
7
- #
8
6
  # The [on type formatting](https://microsoft.github.io/language-server-protocol/specification#textDocument_onTypeFormatting)
9
7
  # request formats code as the user is typing. For example, automatically adding `end` to class definitions.
10
- #
11
- # # Example
12
- #
13
- # ```ruby
14
- # class Foo # <-- upon adding a line break, on type formatting is triggered
15
- # # <-- cursor ends up here
16
- # end # <-- end is automatically added
17
- # ```
18
8
  class OnTypeFormatting < Request
19
9
  extend T::Sig
20
10
 
@@ -3,22 +3,11 @@
3
3
 
4
4
  module RubyLsp
5
5
  module Requests
6
- # ![Prepare type hierarchy demo](../../prepare_type_hierarchy.gif)
7
- #
8
6
  # The [prepare type hierarchy
9
7
  # request](https://microsoft.github.io/language-server-protocol/specification#textDocument_prepareTypeHierarchy)
10
8
  # displays the list of ancestors (supertypes) and descendants (subtypes) for the selected type.
11
9
  #
12
10
  # Currently only supports supertypes due to a limitation of the index.
13
- #
14
- # # Example
15
- #
16
- # ```ruby
17
- # class Foo; end
18
- # class Bar < Foo; end
19
- #
20
- # puts Bar # <-- right click on `Bar` and select "Show Type Hierarchy"
21
- # ```
22
11
  class PrepareTypeHierarchy < Request
23
12
  extend T::Sig
24
13
 
@@ -3,7 +3,6 @@
3
3
 
4
4
  module RubyLsp
5
5
  module Requests
6
- # :nodoc:
7
6
  class Request
8
7
  extend T::Sig
9
8
  extend T::Generic
@@ -17,6 +16,23 @@ module RubyLsp
17
16
 
18
17
  private
19
18
 
19
+ # Signals to the client that the request should be delegated to the language server server for the host language
20
+ # in ERB files
21
+ sig do
22
+ params(
23
+ global_state: GlobalState,
24
+ document: Document[T.untyped],
25
+ char_position: Integer,
26
+ ).void
27
+ end
28
+ def delegate_request_if_needed!(global_state, document, char_position)
29
+ if global_state.supports_request_delegation &&
30
+ document.is_a?(ERBDocument) &&
31
+ document.inside_host_language?(char_position)
32
+ raise DelegateRequestError
33
+ end
34
+ end
35
+
20
36
  # Checks if a location covers a position
21
37
  sig { params(location: Prism::Location, position: T.untyped).returns(T::Boolean) }
22
38
  def cover?(location, position)
@@ -3,8 +3,6 @@
3
3
 
4
4
  module RubyLsp
5
5
  module Requests
6
- # ![Selection ranges demo](../../selection_ranges.gif)
7
- #
8
6
  # The [selection ranges](https://microsoft.github.io/language-server-protocol/specification#textDocument_selectionRange)
9
7
  # request informs the editor of ranges that the user may want to select based on the location(s)
10
8
  # of their cursor(s).
@@ -12,14 +10,6 @@ module RubyLsp
12
10
  # Trigger this request with: Ctrl + Shift + -> or Ctrl + Shift + <-
13
11
  #
14
12
  # Note that if using VSCode Neovim, you will need to be in Insert mode for this to work correctly.
15
- #
16
- # # Example
17
- #
18
- # ```ruby
19
- # def foo # --> The next selection range encompasses the entire method definition.
20
- # puts "Hello, world!" # --> Cursor is on this line
21
- # end
22
- # ```
23
13
  class SelectionRanges < Request
24
14
  extend T::Sig
25
15
  include Support::Common
@@ -5,31 +5,9 @@ require "ruby_lsp/listeners/semantic_highlighting"
5
5
 
6
6
  module RubyLsp
7
7
  module Requests
8
- # ![Semantic highlighting demo](../../semantic_highlighting.gif)
9
- #
10
8
  # The [semantic
11
9
  # highlighting](https://microsoft.github.io/language-server-protocol/specification#textDocument_semanticTokens)
12
10
  # request informs the editor of the correct token types to provide consistent and accurate highlighting for themes.
13
- #
14
- # # Example
15
- #
16
- # ```ruby
17
- # def foo
18
- # var = 1 # --> semantic highlighting: local variable
19
- # some_invocation # --> semantic highlighting: method invocation
20
- # var # --> semantic highlighting: local variable
21
- # end
22
- #
23
- # # Strategy
24
- #
25
- # To maximize editor performance, the Ruby LSP will return the minimum number of semantic tokens, since applying
26
- # them is an expensive operation for the client. This means that the server only returns tokens for ambiguous pieces
27
- # of syntax, such as method invocations with no receivers or parenthesis (which can be confused with local
28
- # variables).
29
- #
30
- # Offloading as much handling as possible to Text Mate grammars or equivalent will guarantee responsiveness in the
31
- # editor and allow for a much smoother experience.
32
- # ```
33
11
  class SemanticHighlighting < Request
34
12
  extend T::Sig
35
13
 
@@ -39,7 +17,7 @@ module RubyLsp
39
17
  sig { returns(Interface::SemanticTokensRegistrationOptions) }
40
18
  def provider
41
19
  Interface::SemanticTokensRegistrationOptions.new(
42
- document_selector: [{ language: "ruby" }],
20
+ document_selector: [{ language: "ruby" }, { language: "erb" }],
43
21
  legend: Interface::SemanticTokensLegend.new(
44
22
  token_types: ResponseBuilders::SemanticHighlighting::TOKEN_TYPES.keys,
45
23
  token_modifiers: ResponseBuilders::SemanticHighlighting::TOKEN_MODIFIERS.keys,
@@ -3,20 +3,9 @@
3
3
 
4
4
  module RubyLsp
5
5
  module Requests
6
- # ![Show syntax tree demo](../../show_syntax_tree.gif)
7
- #
8
6
  # Show syntax tree is a custom [LSP
9
7
  # request](https://microsoft.github.io/language-server-protocol/specification#requestMessage) that displays the AST
10
8
  # for the current document or for the current selection in a new tab.
11
- #
12
- # # Example
13
- #
14
- # ```ruby
15
- # # Executing the Ruby LSP: Show syntax tree command will display the AST for the document
16
- # 1 + 1
17
- # # (program (statements ((binary (int "1") + (int "1")))))
18
- # ```
19
- #
20
9
  class ShowSyntaxTree < Request
21
10
  extend T::Sig
22
11
 
@@ -5,25 +5,9 @@ require "ruby_lsp/listeners/signature_help"
5
5
 
6
6
  module RubyLsp
7
7
  module Requests
8
- # ![Signature help demo](../../signature_help.gif)
9
- #
10
8
  # The [signature help
11
9
  # request](https://microsoft.github.io/language-server-protocol/specification#textDocument_signatureHelp) displays
12
10
  # information about the parameters of a method as you type an invocation.
13
- #
14
- # Currently only supports methods invoked directly on `self` without taking inheritance into account.
15
- #
16
- # # Example
17
- #
18
- # ```ruby
19
- # class Foo
20
- # def bar(a, b, c)
21
- # end
22
- #
23
- # def baz
24
- # bar( # -> Signature help will show the parameters of `bar`
25
- # end
26
- # ```
27
11
  class SignatureHelp < Request
28
12
  extend T::Sig
29
13
 
@@ -51,10 +35,11 @@ module RubyLsp
51
35
  end
52
36
  def initialize(document, global_state, position, context, dispatcher, sorbet_level) # rubocop:disable Metrics/ParameterLists
53
37
  super()
54
- node_context = document.locate_node(
55
- { line: position[:line], character: position[:character] },
56
- node_types: [Prism::CallNode],
57
- )
38
+
39
+ char_position = document.create_scanner.find_char_position(position)
40
+ delegate_request_if_needed!(global_state, document, char_position)
41
+
42
+ node_context = RubyDocument.locate(document.parse_result.value, char_position, node_types: [Prism::CallNode])
58
43
 
59
44
  target = adjust_for_nested_target(node_context.node, node_context.parent, position)
60
45
 
@@ -99,7 +99,7 @@ module RubyLsp
99
99
  )
100
100
 
101
101
  definitions << "[#{entry.file_name}](#{uri})"
102
- content << "\n\n#{entry.comments.join("\n")}" unless entry.comments.empty?
102
+ content << "\n\n#{entry.comments}" unless entry.comments.empty?
103
103
  end
104
104
 
105
105
  additional_entries_text = if max_entries && entries.length > max_entries
@@ -80,7 +80,9 @@ module RubyLsp
80
80
 
81
81
  args += DEFAULT_ARGS
82
82
  rubocop_options = ::RuboCop::Options.new.parse(args).first
83
+
83
84
  config_store = ::RuboCop::ConfigStore.new
85
+ config_store.options_config = rubocop_options[:config] if rubocop_options[:config]
84
86
  @config_for_working_directory = T.let(config_store.for_pwd, ::RuboCop::Config)
85
87
 
86
88
  super(rubocop_options, config_store)
@@ -3,20 +3,9 @@
3
3
 
4
4
  module RubyLsp
5
5
  module Requests
6
- # ![Type hierarchy supertypes demo](../../type_hierarchy_supertypes.gif)
7
- #
8
6
  # The [type hierarchy supertypes
9
7
  # request](https://microsoft.github.io/language-server-protocol/specification#typeHierarchy_supertypes)
10
8
  # displays the list of ancestors (supertypes) for the selected type.
11
- #
12
- # # Example
13
- #
14
- # ```ruby
15
- # class Foo; end
16
- # class Bar < Foo; end
17
- #
18
- # puts Bar # <-- right click on `Bar` and select "Show Type Hierarchy"
19
- # ```
20
9
  class TypeHierarchySupertypes < Request
21
10
  extend T::Sig
22
11
 
@@ -3,21 +3,9 @@
3
3
 
4
4
  module RubyLsp
5
5
  module Requests
6
- # ![Workspace symbol demo](../../workspace_symbol.gif)
7
- #
8
6
  # The [workspace symbol](https://microsoft.github.io/language-server-protocol/specification#workspace_symbol)
9
7
  # request allows fuzzy searching declarations in the entire project. On VS Code, use CTRL/CMD + T to search for
10
8
  # symbols.
11
- #
12
- # # Example
13
- #
14
- # ```ruby
15
- # # Searching for `Floo` will fuzzy match and return all declarations according to the query, including this `Foo`
16
- # class
17
- # class Foo
18
- # end
19
- # ```
20
- #
21
9
  class WorkspaceSymbol < Request
22
10
  extend T::Sig
23
11
  include Support::Common
@@ -121,12 +121,13 @@ module RubyLsp
121
121
  end
122
122
  end
123
123
 
124
- sig { override.returns(ParseResultType) }
125
- def parse
126
- return @parse_result unless @needs_parsing
124
+ sig { override.returns(T::Boolean) }
125
+ def parse!
126
+ return false unless @needs_parsing
127
127
 
128
128
  @needs_parsing = false
129
129
  @parse_result = Prism.parse(@source)
130
+ true
130
131
  end
131
132
 
132
133
  sig { override.returns(T::Boolean) }
@@ -9,12 +9,6 @@ module RubyLsp
9
9
  sig { returns(GlobalState) }
10
10
  attr_reader :global_state
11
11
 
12
- sig { params(test_mode: T::Boolean).void }
13
- def initialize(test_mode: false)
14
- super
15
- @global_state = T.let(GlobalState.new, GlobalState)
16
- end
17
-
18
12
  sig { override.params(message: T::Hash[Symbol, T.untyped]).void }
19
13
  def process_message(message)
20
14
  case message[:method]
@@ -98,6 +92,8 @@ module RubyLsp
98
92
  when "$/cancelRequest"
99
93
  @mutex.synchronize { @cancelled_requests << message[:params][:id] }
100
94
  end
95
+ rescue DelegateRequestError
96
+ send_message(Error.new(id: message[:id], code: DelegateRequestError::CODE, message: "DELEGATE_REQUEST"))
101
97
  rescue StandardError, LoadError => e
102
98
  # If an error occurred in a request, we have to return an error response or else the editor will hang
103
99
  if message[:id]
@@ -284,7 +280,15 @@ module RubyLsp
284
280
  RubyVM::YJIT.enable if defined?(RubyVM::YJIT.enable)
285
281
 
286
282
  if defined?(Requests::Support::RuboCopFormatter)
287
- @global_state.register_formatter("rubocop", Requests::Support::RuboCopFormatter.new)
283
+ begin
284
+ @global_state.register_formatter("rubocop", Requests::Support::RuboCopFormatter.new)
285
+ rescue RuboCop::Error => e
286
+ # The user may have provided unknown config switches in .rubocop or
287
+ # is trying to load a non-existant config file.
288
+ send_message(Notification.window_show_error(
289
+ "RuboCop configuration error: #{e.message}. Formatting will not be available.",
290
+ ))
291
+ end
288
292
  end
289
293
  if defined?(Requests::Support::SyntaxTreeFormatter)
290
294
  @global_state.register_formatter("syntax_tree", Requests::Support::SyntaxTreeFormatter.new)
@@ -543,7 +547,7 @@ module RubyLsp
543
547
  return
544
548
  end
545
549
 
546
- request = Requests::DocumentHighlight.new(document, params[:position], dispatcher)
550
+ request = Requests::DocumentHighlight.new(@global_state, document, params[:position], dispatcher)
547
551
  dispatcher.dispatch(document.parse_result.value)
548
552
  send_message(Result.new(id: message[:id], response: request.perform))
549
553
  end
@@ -740,6 +744,17 @@ module RubyLsp
740
744
 
741
745
  sig { params(message: T::Hash[Symbol, T.untyped]).void }
742
746
  def text_document_completion_item_resolve(message)
747
+ # When responding to a delegated completion request, it means we're handling a completion item that isn't related
748
+ # to Ruby (probably related to an ERB host language like HTML). We need to return the original completion item
749
+ # back to the editor so that it's displayed correctly
750
+ if message.dig(:params, :data, :delegateCompletion)
751
+ send_message(Result.new(
752
+ id: message[:id],
753
+ response: message[:params],
754
+ ))
755
+ return
756
+ end
757
+
743
758
  send_message(Result.new(
744
759
  id: message[:id],
745
760
  response: Requests::CompletionResolve.new(@global_state, message[:params]).perform,
@@ -56,7 +56,7 @@ module RubyLsp
56
56
 
57
57
  # Sets up the custom bundle and returns the `BUNDLE_GEMFILE`, `BUNDLE_PATH` and `BUNDLE_APP_CONFIG` that should be
58
58
  # used for running the server
59
- sig { returns([String, T.nilable(String), T.nilable(String)]) }
59
+ sig { returns(T::Hash[String, String]) }
60
60
  def setup!
61
61
  raise BundleNotLocked if @gemfile&.exist? && !@lockfile&.exist?
62
62
 
@@ -176,22 +176,18 @@ module RubyLsp
176
176
  dependencies
177
177
  end
178
178
 
179
- sig { params(bundle_gemfile: T.nilable(Pathname)).returns([String, T.nilable(String), T.nilable(String)]) }
179
+ sig { params(bundle_gemfile: T.nilable(Pathname)).returns(T::Hash[String, String]) }
180
180
  def run_bundle_install(bundle_gemfile = @gemfile)
181
+ env = bundler_settings_as_env
182
+ env["BUNDLE_GEMFILE"] = bundle_gemfile.to_s
183
+
181
184
  # If the user has a custom bundle path configured, we need to ensure that we will use the absolute and not
182
185
  # relative version of it when running `bundle install`. This is necessary to avoid installing the gems under the
183
186
  # `.ruby-lsp` folder, which is not the user's intention. For example, if the path is configured as `vendor`, we
184
187
  # want to install it in the top level `vendor` and not `.ruby-lsp/vendor`
185
- path = Bundler.settings["path"]
186
- expanded_path = File.expand_path(path, @project_path) if path
187
-
188
- # Use the absolute `BUNDLE_PATH` to prevent accidentally creating unwanted folders under `.ruby-lsp`
189
- env = {}
190
- env["BUNDLE_GEMFILE"] = bundle_gemfile.to_s
191
- env["BUNDLE_PATH"] = expanded_path if expanded_path
192
-
193
- local_config_path = File.join(@project_path, ".bundle")
194
- env["BUNDLE_APP_CONFIG"] = local_config_path if Dir.exist?(local_config_path)
188
+ if env["BUNDLE_PATH"]
189
+ env["BUNDLE_PATH"] = File.expand_path(env["BUNDLE_PATH"], @project_path)
190
+ end
195
191
 
196
192
  # If `ruby-lsp` and `debug` (and potentially `ruby-lsp-rails`) are already in the Gemfile, then we shouldn't try
197
193
  # to upgrade them or else we'll produce undesired source control changes. If the custom bundle was just created
@@ -238,7 +234,29 @@ module RubyLsp
238
234
  return setup!
239
235
  end
240
236
 
241
- [bundle_gemfile.to_s, expanded_path, env["BUNDLE_APP_CONFIG"]]
237
+ env
238
+ end
239
+
240
+ # Gather all Bundler settings (global and local) and return them as a hash that can be used as the environment
241
+ sig { returns(T::Hash[String, String]) }
242
+ def bundler_settings_as_env
243
+ local_config_path = File.join(@project_path, ".bundle")
244
+
245
+ # If there's no Gemfile or if the local config path does not exist, we return an empty setting set (which has the
246
+ # global settings included). Otherwise, we also load the local settings
247
+ settings = begin
248
+ Dir.exist?(local_config_path) ? Bundler::Settings.new(local_config_path) : Bundler::Settings.new
249
+ rescue Bundler::GemfileNotFound
250
+ Bundler::Settings.new
251
+ end
252
+
253
+ # Map all settings to their environment variable names with `key_for` and their values. For example, the if the
254
+ # setting name `e` is `path` with a value of `vendor/bundle`, then it will return `"BUNDLE_PATH" =>
255
+ # "vendor/bundle"`
256
+ settings.all.to_h do |e|
257
+ key = Bundler::Settings.key_for(e)
258
+ [key, settings[e].to_s]
259
+ end
242
260
  end
243
261
 
244
262
  sig { returns(T::Boolean) }
@@ -121,8 +121,12 @@ module RubyLsp
121
121
  return Type.new(node_context.fully_qualified_name) if node_context.surrounding_method
122
122
 
123
123
  # If we're not inside a method, then we're inside the body of a class or module, which is a singleton
124
- # context
125
- Type.new("#{nesting.join("::")}::<Class:#{nesting.last}>")
124
+ # context.
125
+ #
126
+ # If the class/module definition is using compact style (e.g.: `class Foo::Bar`), then we need to split the name
127
+ # into its individual parts to build the correct singleton name
128
+ parts = nesting.flat_map { |part| part.split("::") }
129
+ Type.new("#{parts.join("::")}::<Class:#{parts.last}>")
126
130
  end
127
131
 
128
132
  sig do
@@ -25,7 +25,17 @@ module RubyLsp
25
25
  end,
26
26
  String,
27
27
  )
28
- GUESSED_TYPES_URL = "https://github.com/Shopify/ruby-lsp/blob/main/DESIGN_AND_ROADMAP.md#guessed-types"
28
+ GUESSED_TYPES_URL = "https://shopify.github.io/ruby-lsp/design-and-roadmap.html#guessed-types"
29
+
30
+ # Request delegation for embedded languages is not yet standardized into the language server specification. Here we
31
+ # use this custom error class as a way to return a signal to the client that the request should be delegated to the
32
+ # language server for the host language. The support for delegation is custom built on the client side, so each editor
33
+ # needs to implement their own until this becomes a part of the spec
34
+ class DelegateRequestError < StandardError
35
+ # A custom error code that clients can use to handle delegate requests. This is past the range of error codes listed
36
+ # by the specification to avoid conflicting with other error types
37
+ CODE = -32900
38
+ end
29
39
 
30
40
  # A notification to be sent to the client
31
41
  class Message
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.16
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-08-26 00:00:00.000000000 Z
11
+ date: 2024-09-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: language_server-protocol
@@ -28,22 +28,16 @@ dependencies:
28
28
  name: prism
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 0.29.0
34
- - - "<"
31
+ - - "~>"
35
32
  - !ruby/object:Gem::Version
36
- version: '0.31'
33
+ version: '1.0'
37
34
  type: :runtime
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- version: 0.29.0
44
- - - "<"
38
+ - - "~>"
45
39
  - !ruby/object:Gem::Version
46
- version: '0.31'
40
+ version: '1.0'
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: rbs
49
43
  requirement: !ruby/object:Gem::Requirement
@@ -118,7 +112,6 @@ files:
118
112
  - lib/ruby_indexer/test/test_case.rb
119
113
  - lib/ruby_lsp/addon.rb
120
114
  - lib/ruby_lsp/base_server.rb
121
- - lib/ruby_lsp/check_docs.rb
122
115
  - lib/ruby_lsp/document.rb
123
116
  - lib/ruby_lsp/erb_document.rb
124
117
  - lib/ruby_lsp/global_state.rb
@@ -207,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
207
200
  - !ruby/object:Gem::Version
208
201
  version: '0'
209
202
  requirements: []
210
- rubygems_version: 3.5.17
203
+ rubygems_version: 3.5.18
211
204
  signing_key:
212
205
  specification_version: 4
213
206
  summary: An opinionated language server for Ruby