ruby-lsp 0.4.2 → 0.4.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c5d9c6b487aab55ce25eb2741fff92afa8ca0ee544f21374debacce7f887cc50
4
- data.tar.gz: 8da9da85900753306f5e8558bc1a42f25b7173ffe1087ea70612c10ef5558e27
3
+ metadata.gz: f7bf79fd6cdc704c8f874f58985f0e72ac034c76bb70a68166654185f6f00cf1
4
+ data.tar.gz: '083edc726c05ffb6e5e3ae63d480b17fa0f7161ee62349665cc57e309acd5598'
5
5
  SHA512:
6
- metadata.gz: 3dca630b9cae262f1af8d0aef0300ab7399dafd348db5f578ed7fdffb22a7afd48fe9467aa65e467fb50e16663f8fad32f1d0cc46b30819b06a6b7472700dcc0
7
- data.tar.gz: f048c6c9fe14d20edefeca7ac504942af34c61699163f0d09ec54f4d80e7469e1bb1762757b96aa3d8d06a6e8168473dacfc932112b2d31ca4b380748eef8899
6
+ metadata.gz: f6192daf27dfd82dbb505f5184eebd66308690ce10ead4d4cedc4d9c6667be882a8b9de4c87e66eb88ff43e896307be24bbcc6506b0544b496e1bcb3c9804498
7
+ data.tar.gz: bb68928d9a72b3b2873509bf915f753a202a520187bf5f55da1870d552e0ba0917a7d21ea70d20853ac60aa614f7d85d117d7291ec9c0778cab80e4561a7aba0
data/README.md CHANGED
@@ -1,57 +1,50 @@
1
- ![Build Status](https://github.com/Shopify/ruby-lsp/workflows/CI/badge.svg)
1
+ [![Build Status](https://github.com/Shopify/ruby-lsp/workflows/CI/badge.svg)](https://github.com/Shopify/ruby-lsp/actions/workflows/ci.yml)
2
+ [![Ruby LSP extension](https://img.shields.io/badge/VS%20Code-Ruby%20LSP-success?logo=visual-studio-code)](https://marketplace.visualstudio.com/items?itemName=Shopify.ruby-lsp)
3
+ [![Ruby DX Slack](https://img.shields.io/badge/Slack-Ruby%20DX-success?logo=slack)](https://join.slack.com/t/ruby-dx/shared_invite/zt-1s6f4y15t-v9jedZ9YUPQLM91TEJ4Gew)
2
4
 
3
- # Ruby LSP
4
-
5
- This gem is an implementation of the [language server protocol specification](https://microsoft.github.io/language-server-protocol/) for Ruby, used to improve editor features.
6
-
7
- # Overview
8
-
9
- The intention of Ruby LSP is to provide a fast, robust and feature-rich coding environment for Ruby developers.
10
-
11
- It's part of a [wider Shopify goal](https://github.com/Shopify/vscode-shopify-ruby) to provide a state-of-the-art experience to Ruby developers using modern standards for cross-editor features, documentation and debugging.
12
5
 
13
- It provides many features, including:
14
-
15
- * Syntax highlighting
16
- * Linting and formatting
17
- * Code folding
18
- * Selection ranges
19
-
20
- It does not perform typechecking, so its features are implemented on a best-effort basis, aiming to be as accurate as possible.
21
-
22
- Planned future features include:
6
+ # Ruby LSP
23
7
 
24
- * Auto-completion and navigation ("Go To Definition") ([prototype](https://github.com/Shopify/ruby-lsp/pull/429))
25
- * Support for plug-ins to extend behavior
8
+ The Ruby LSP is an implementation of the [language server protocol](https://microsoft.github.io/language-server-protocol/)
9
+ for Ruby, used to improve rich features in editors. It is a part of a wider goal to provide a state-of-the-art
10
+ experience to Ruby developers using modern standards for cross-editor features, documentation and debugging.
26
11
 
27
- The Ruby LSP does not perform any type-checking or provide any type-related assistance, but it can be used alongside [Sorbet](https://github.com/sorbet/sorbet)'s LSP server.
12
+ Want to discuss Ruby developer experience? Consider joining the public
13
+ [Ruby DX Slack workspace](https://join.slack.com/t/ruby-dx/shared_invite/zt-1s6f4y15t-v9jedZ9YUPQLM91TEJ4Gew).
28
14
 
29
- At the time of writing, these are the major differences between Ruby LSP and [Solargraph](https://solargraph.org/):
15
+ ## Usage
30
16
 
31
- * Solargraph [uses](https://solargraph.org/guides/yard) YARD documentation to gather information about your project and its gem dependencies. This provides functionality such as context-aware auto-completion and navigation ("Go To Definition")
32
- * Solargraph can be used as a globally installed gem, but Ruby LSP must be added to the Gemfile or gemspec if using RuboCop. (There are pros and cons to each approach)
17
+ ### With VS Code
33
18
 
34
- ## Learn More
19
+ If using VS Code, all you have to do is install the [Ruby LSP extension](https://github.com/Shopify/vscode-ruby-lsp) to
20
+ get the extra features in the editor. Do not install this gem manually.
35
21
 
36
- * [RubyConf 2022: Improving the development experience with language servers](https://www.youtube.com/watch?v=kEfXPTm1aCI) ([Vinicius Stock](https://github.com/vinistock))
22
+ ### With other editors
37
23
 
38
- ## Usage
24
+ See [editors](https://github.com/Shopify/ruby-lsp/blob/main/EDITORS.md) for community instructions on setting up the
25
+ Ruby LSP.
39
26
 
40
- Install the gem. There's no need to require it, since the server is used as a standalone executable.
27
+ The gem can be installed by doing
28
+ ```shell
29
+ gem install ruby-lsp
30
+ ```
41
31
 
32
+ If you decide to add the gem to the bundle, it is not necessary to require it.
42
33
  ```ruby
43
34
  group :development do
44
35
  gem "ruby-lsp", require: false
45
36
  end
46
37
  ```
47
38
 
48
- If using VS Code, install the [Ruby LSP extension](https://github.com/Shopify/vscode-ruby-lsp) to get the extra features
49
- in the editor. See [editors](https://github.com/Shopify/ruby-lsp/blob/main/EDITORS.md) for community instructions on
50
- setting up the Ruby LSP in different editors.
39
+ ### Documentation
51
40
 
52
41
  See the [documentation](https://shopify.github.io/ruby-lsp) for more in-depth details about the
53
42
  [supported features](https://shopify.github.io/ruby-lsp/RubyLsp/Requests.html).
54
43
 
44
+ ## Learn More
45
+
46
+ * [RubyConf 2022: Improving the development experience with language servers](https://www.youtube.com/watch?v=kEfXPTm1aCI) ([Vinicius Stock](https://github.com/vinistock))
47
+
55
48
  ## Contributing
56
49
 
57
50
  Bug reports and pull requests are welcome on GitHub at https://github.com/Shopify/ruby-lsp.
@@ -113,7 +106,7 @@ To add a new expectations test runner for a new request handler:
113
106
  * Tests with expectations will be checked with `assert_expectations`
114
107
  * Tests without expectations will be ran against your new $HANDLER to check that nothing breaks
115
108
 
116
- ## Debugging
109
+ ### Debugging
117
110
 
118
111
  ### Debugging Tests
119
112
 
@@ -135,7 +128,7 @@ To add a new expectations test runner for a new request handler:
135
128
  7. [`ruby-lsp`] Use commands like `b <file>:<line>` or `b Class#method` to set breakpoints and type `c` to continue the process.
136
129
  8. In your `Extension Development Host` project (e.g. [`Tapioca`](https://github.com/Shopify/tapioca)), trigger the request that will hit the breakpoint.
137
130
 
138
- ## Spell Checking
131
+ ### Spell Checking
139
132
 
140
133
  VS Code users will be prompted to enable the [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker) extension.
141
134
  By default this will be enabled for all workspaces, but you can choose to selectively enable or disable it per workspace.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.2
1
+ 0.4.3
@@ -0,0 +1,62 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "rubocop"
5
+ require "sorbet-runtime"
6
+
7
+ module RuboCop
8
+ module Cop
9
+ module RubyLsp
10
+ # Prefer using `Interface`, `Transport` and `Constant` aliases
11
+ # within the `RubyLsp` module, without having to prefix with
12
+ # `LanguageServer::Protocol`
13
+ #
14
+ # @example
15
+ # # bad
16
+ # module RubyLsp
17
+ # class FoldingRanges
18
+ # sig { override.returns(T.all(T::Array[LanguageServer::Protocol::Interface::FoldingRange], Object)) }
19
+ # def run; end
20
+ # end
21
+ #
22
+ # # good
23
+ # module RubyLsp
24
+ # class FoldingRanges
25
+ # sig { override.returns(T.all(T::Array[Interface::FoldingRange], Object)) }
26
+ # def run; end
27
+ # end
28
+ # end
29
+ class UseLanguageServerAliases < RuboCop::Cop::Base
30
+ extend RuboCop::Cop::AutoCorrector
31
+
32
+ ALIASED_CONSTANTS = T.let([:Interface, :Transport, :Constant].freeze, T::Array[Symbol])
33
+
34
+ MSG = "Use constant alias `%{constant}`."
35
+
36
+ def_node_search :ruby_lsp_modules, <<~PATTERN
37
+ (module (const nil? :RubyLsp) ...)
38
+ PATTERN
39
+
40
+ def_node_search :lsp_constant_usages, <<~PATTERN
41
+ (const (const (const nil? :LanguageServer) :Protocol) {:Interface | :Transport | :Constant})
42
+ PATTERN
43
+
44
+ def on_new_investigation
45
+ return if processed_source.blank?
46
+
47
+ ruby_lsp_modules(processed_source.ast).each do |ruby_lsp_mod|
48
+ lsp_constant_usages(ruby_lsp_mod).each do |node|
49
+ lsp_const = node.children.last
50
+
51
+ next unless ALIASED_CONSTANTS.include?(lsp_const)
52
+
53
+ add_offense(node, message: format(MSG, constant: lsp_const)) do |corrector|
54
+ corrector.replace(node, lsp_const)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -15,11 +15,19 @@ module RubyLsp
15
15
  sig { returns(String) }
16
16
  attr_reader :source
17
17
 
18
- sig { params(source: String, encoding: String).void }
19
- def initialize(source, encoding = "utf-8")
18
+ sig { returns(Integer) }
19
+ attr_reader :version
20
+
21
+ sig { returns(String) }
22
+ attr_reader :uri
23
+
24
+ sig { params(source: String, version: Integer, uri: String, encoding: String).void }
25
+ def initialize(source:, version:, uri:, encoding: "utf-8")
20
26
  @cache = T.let({}, T::Hash[Symbol, T.untyped])
21
27
  @encoding = T.let(encoding, String)
22
28
  @source = T.let(source, String)
29
+ @version = T.let(version, Integer)
30
+ @uri = T.let(uri, String)
23
31
  @unparsed_edits = T.let([], T::Array[EditShape])
24
32
  @syntax_error = T.let(false, T::Boolean)
25
33
  @tree = T.let(SyntaxTree.parse(@source), T.nilable(SyntaxTree::Node))
@@ -48,8 +56,8 @@ module RubyLsp
48
56
  result
49
57
  end
50
58
 
51
- sig { params(edits: T::Array[EditShape]).void }
52
- def push_edits(edits)
59
+ sig { params(edits: T::Array[EditShape], version: Integer).void }
60
+ def push_edits(edits, version:)
53
61
  edits.each do |edit|
54
62
  range = edit[:range]
55
63
  scanner = create_scanner
@@ -60,6 +68,7 @@ module RubyLsp
60
68
  @source[start_position...end_position] = edit[:text]
61
69
  end
62
70
 
71
+ @version = version
63
72
  @unparsed_edits.concat(edits)
64
73
  @cache.clear
65
74
  end
@@ -41,7 +41,11 @@ module RubyLsp
41
41
  warn("Ruby LSP is ready")
42
42
  VOID
43
43
  when "textDocument/didOpen"
44
- text_document_did_open(uri, request.dig(:params, :textDocument, :text))
44
+ text_document_did_open(
45
+ uri,
46
+ request.dig(:params, :textDocument, :text),
47
+ request.dig(:params, :textDocument, :version),
48
+ )
45
49
  when "textDocument/didClose"
46
50
  @notifications << Notification.new(
47
51
  message: "textDocument/publishDiagnostics",
@@ -50,7 +54,11 @@ module RubyLsp
50
54
 
51
55
  text_document_did_close(uri)
52
56
  when "textDocument/didChange"
53
- text_document_did_change(uri, request.dig(:params, :contentChanges))
57
+ text_document_did_change(
58
+ uri,
59
+ request.dig(:params, :contentChanges),
60
+ request.dig(:params, :textDocument, :version),
61
+ )
54
62
  when "textDocument/foldingRange"
55
63
  folding_range(uri)
56
64
  when "textDocument/documentLink"
@@ -138,7 +146,7 @@ module RubyLsp
138
146
  sig { params(uri: String).returns(T::Array[Interface::DocumentLink]) }
139
147
  def document_link(uri)
140
148
  @store.cache_fetch(uri, :document_link) do |document|
141
- RubyLsp::Requests::DocumentLink.new(uri, document).run
149
+ RubyLsp::Requests::DocumentLink.new(document).run
142
150
  end
143
151
  end
144
152
 
@@ -149,15 +157,15 @@ module RubyLsp
149
157
  end
150
158
  end
151
159
 
152
- sig { params(uri: String, content_changes: T::Array[Document::EditShape]).returns(Object) }
153
- def text_document_did_change(uri, content_changes)
154
- @store.push_edits(uri, content_changes)
160
+ sig { params(uri: String, content_changes: T::Array[Document::EditShape], version: Integer).returns(Object) }
161
+ def text_document_did_change(uri, content_changes, version)
162
+ @store.push_edits(uri: uri, edits: content_changes, version: version)
155
163
  VOID
156
164
  end
157
165
 
158
- sig { params(uri: String, text: String).returns(Object) }
159
- def text_document_did_open(uri, text)
160
- @store.set(uri, text)
166
+ sig { params(uri: String, text: String, version: Integer).returns(Object) }
167
+ def text_document_did_open(uri, text, version)
168
+ @store.set(uri: uri, source: text, version: version)
161
169
  VOID
162
170
  end
163
171
 
@@ -207,7 +215,7 @@ module RubyLsp
207
215
 
208
216
  sig { params(uri: String).returns(T.nilable(T::Array[Interface::TextEdit])) }
209
217
  def formatting(uri)
210
- Requests::Formatting.new(uri, @store.get(uri), formatter: @store.formatter).run
218
+ Requests::Formatting.new(@store.get(uri), formatter: @store.formatter).run
211
219
  end
212
220
 
213
221
  sig do
@@ -250,7 +258,7 @@ module RubyLsp
250
258
  def code_action(uri, range, context)
251
259
  document = @store.get(uri)
252
260
 
253
- Requests::CodeActions.new(uri, document, range, context).run
261
+ Requests::CodeActions.new(document, range, context).run
254
262
  end
255
263
 
256
264
  sig { params(params: T::Hash[Symbol, T.untyped]).returns(Interface::CodeAction) }
@@ -286,7 +294,7 @@ module RubyLsp
286
294
  sig { params(uri: String).returns(T.nilable(Interface::FullDocumentDiagnosticReport)) }
287
295
  def diagnostic(uri)
288
296
  response = @store.cache_fetch(uri, :diagnostics) do |document|
289
- Requests::Diagnostics.new(uri, document).run
297
+ Requests::Diagnostics.new(document).run
290
298
  end
291
299
 
292
300
  Interface::FullDocumentDiagnosticReport.new(kind: "full", items: response.map(&:to_lsp_diagnostic)) if response
@@ -36,16 +36,16 @@ module RubyLsp
36
36
  nodes.each { |node| visit(node) }
37
37
  end
38
38
 
39
- sig { params(node: SyntaxTree::Node).returns(LanguageServer::Protocol::Interface::Range) }
39
+ sig { params(node: SyntaxTree::Node).returns(Interface::Range) }
40
40
  def range_from_syntax_tree_node(node)
41
41
  loc = node.location
42
42
 
43
- LanguageServer::Protocol::Interface::Range.new(
44
- start: LanguageServer::Protocol::Interface::Position.new(
43
+ Interface::Range.new(
44
+ start: Interface::Position.new(
45
45
  line: loc.start_line - 1,
46
46
  character: loc.start_column,
47
47
  ),
48
- end: LanguageServer::Protocol::Interface::Position.new(line: loc.end_line - 1, character: loc.end_column),
48
+ end: Interface::Position.new(line: loc.end_line - 1, character: loc.end_column),
49
49
  )
50
50
  end
51
51
 
@@ -21,16 +21,15 @@ module RubyLsp
21
21
 
22
22
  sig do
23
23
  params(
24
- uri: String,
25
24
  document: Document,
26
25
  range: Document::RangeShape,
27
26
  context: T::Hash[Symbol, T.untyped],
28
27
  ).void
29
28
  end
30
- def initialize(uri, document, range, context)
29
+ def initialize(document, range, context)
31
30
  super(document)
32
31
 
33
- @uri = uri
32
+ @uri = T.let(document.uri, String)
34
33
  @range = range
35
34
  @context = context
36
35
  end
@@ -49,7 +48,9 @@ module RubyLsp
49
48
  code_action if diagnostic.dig(:data, :correctable) && cover?(range)
50
49
  end
51
50
 
52
- code_actions << refactor_code_action(@range, @uri)
51
+ # Only add refactor actions if there's a non empty selection in the editor
52
+ code_actions << refactor_code_action(@range, @uri) unless @range.dig(:start) == @range.dig(:end)
53
+ code_actions
53
54
  end
54
55
 
55
56
  private
@@ -21,11 +21,11 @@ module RubyLsp
21
21
  class Diagnostics < BaseRequest
22
22
  extend T::Sig
23
23
 
24
- sig { params(uri: String, document: Document).void }
25
- def initialize(uri, document)
24
+ sig { params(document: Document).void }
25
+ def initialize(document)
26
26
  super(document)
27
27
 
28
- @uri = uri
28
+ @uri = T.let(document.uri, String)
29
29
  end
30
30
 
31
31
  sig { override.returns(T.nilable(T.all(T::Array[Support::RuboCopDiagnostic], Object))) }
@@ -29,14 +29,14 @@ module RubyLsp
29
29
  def initialize(document, position)
30
30
  super(document)
31
31
 
32
- @highlights = T.let([], T::Array[LanguageServer::Protocol::Interface::DocumentHighlight])
32
+ @highlights = T.let([], T::Array[Interface::DocumentHighlight])
33
33
  return unless document.parsed?
34
34
 
35
35
  position = document.create_scanner.find_char_position(position)
36
36
  @target = T.let(find(T.must(document.tree), position), T.nilable(Support::HighlightTarget))
37
37
  end
38
38
 
39
- sig { override.returns(T.all(T::Array[LanguageServer::Protocol::Interface::DocumentHighlight], Object)) }
39
+ sig { override.returns(T.all(T::Array[Interface::DocumentHighlight], Object)) }
40
40
  def run
41
41
  # no @target means the target is not highlightable
42
42
  visit(@document.tree) if @document.parsed? && @target
@@ -90,7 +90,7 @@ module RubyLsp
90
90
  sig { params(match: Support::HighlightTarget::HighlightMatch).void }
91
91
  def add_highlight(match)
92
92
  range = range_from_syntax_tree_node(match.node)
93
- @highlights << LanguageServer::Protocol::Interface::DocumentHighlight.new(range: range, kind: match.type)
93
+ @highlights << Interface::DocumentHighlight.new(range: range, kind: match.type)
94
94
  end
95
95
  end
96
96
  end
@@ -69,18 +69,18 @@ module RubyLsp
69
69
  end
70
70
  end
71
71
 
72
- sig { params(uri: String, document: Document).void }
73
- def initialize(uri, document)
72
+ sig { params(document: Document).void }
73
+ def initialize(document)
74
74
  super(document)
75
75
 
76
76
  # Match the version based on the version in the RBI file name. Notice that the `@` symbol is sanitized to `%40`
77
77
  # in the URI
78
- version_match = /(?<=%40)[\d.]+(?=\.rbi$)/.match(uri)
78
+ version_match = /(?<=%40)[\d.]+(?=\.rbi$)/.match(document.uri)
79
79
  @gem_version = T.let(version_match && version_match[0], T.nilable(String))
80
- @links = T.let([], T::Array[LanguageServer::Protocol::Interface::DocumentLink])
80
+ @links = T.let([], T::Array[Interface::DocumentLink])
81
81
  end
82
82
 
83
- sig { override.returns(T.all(T::Array[LanguageServer::Protocol::Interface::DocumentLink], Object)) }
83
+ sig { override.returns(T.all(T::Array[Interface::DocumentLink], Object)) }
84
84
  def run
85
85
  visit(@document.tree) if @document.parsed?
86
86
  @links
@@ -91,12 +91,12 @@ module RubyLsp
91
91
  match = node.value.match(%r{source://.*#\d+$})
92
92
  return unless match
93
93
 
94
- uri = T.cast(URI(match[0]), URI::Source)
94
+ uri = T.cast(URI(T.must(match[0])), URI::Source)
95
95
  gem_version = T.must(resolve_version(uri))
96
96
  file_path = self.class.gem_paths.dig(uri.gem_name, gem_version, uri.path)
97
97
  return if file_path.nil?
98
98
 
99
- @links << LanguageServer::Protocol::Interface::DocumentLink.new(
99
+ @links << Interface::DocumentLink.new(
100
100
  range: range_from_syntax_tree_node(node),
101
101
  target: "file://#{file_path}##{uri.line_number}",
102
102
  tooltip: "Jump to #{file_path}##{uri.line_number}",
@@ -66,12 +66,12 @@ module RubyLsp
66
66
  class SymbolHierarchyRoot
67
67
  extend T::Sig
68
68
 
69
- sig { returns(T::Array[LanguageServer::Protocol::Interface::DocumentSymbol]) }
69
+ sig { returns(T::Array[Interface::DocumentSymbol]) }
70
70
  attr_reader :children
71
71
 
72
72
  sig { void }
73
73
  def initialize
74
- @children = T.let([], T::Array[LanguageServer::Protocol::Interface::DocumentSymbol])
74
+ @children = T.let([], T::Array[Interface::DocumentSymbol])
75
75
  end
76
76
  end
77
77
 
@@ -82,11 +82,11 @@ module RubyLsp
82
82
  @root = T.let(SymbolHierarchyRoot.new, SymbolHierarchyRoot)
83
83
  @stack = T.let(
84
84
  [@root],
85
- T::Array[T.any(SymbolHierarchyRoot, LanguageServer::Protocol::Interface::DocumentSymbol)],
85
+ T::Array[T.any(SymbolHierarchyRoot, Interface::DocumentSymbol)],
86
86
  )
87
87
  end
88
88
 
89
- sig { override.returns(T.all(T::Array[LanguageServer::Protocol::Interface::DocumentSymbol], Object)) }
89
+ sig { override.returns(T.all(T::Array[Interface::DocumentSymbol], Object)) }
90
90
  def run
91
91
  visit(@document.tree) if @document.parsed?
92
92
  @root.children
@@ -134,7 +134,9 @@ module RubyLsp
134
134
 
135
135
  sig { override.params(node: SyntaxTree::DefNode).void }
136
136
  def visit_def(node)
137
- if node.target&.value&.value == "self"
137
+ target = node.target
138
+
139
+ if target.is_a?(SyntaxTree::VarRef) && target.value.is_a?(SyntaxTree::Kw) && target.value.value == "self"
138
140
  name = "self.#{node.name.value}"
139
141
  kind = :method
140
142
  else
@@ -180,7 +182,8 @@ module RubyLsp
180
182
 
181
183
  sig { override.params(node: SyntaxTree::VarField).void }
182
184
  def visit_var_field(node)
183
- kind = case node.value
185
+ value = node.value
186
+ kind = case value
184
187
  when SyntaxTree::Const
185
188
  :constant
186
189
  when SyntaxTree::CVar, SyntaxTree::IVar
@@ -190,10 +193,10 @@ module RubyLsp
190
193
  end
191
194
 
192
195
  create_document_symbol(
193
- name: node.value.value,
196
+ name: value.value,
194
197
  kind: kind,
195
198
  range_node: node,
196
- selection_range_node: node.value,
199
+ selection_range_node: value,
197
200
  )
198
201
  end
199
202
 
@@ -205,10 +208,10 @@ module RubyLsp
205
208
  kind: Symbol,
206
209
  range_node: SyntaxTree::Node,
207
210
  selection_range_node: SyntaxTree::Node,
208
- ).returns(LanguageServer::Protocol::Interface::DocumentSymbol)
211
+ ).returns(Interface::DocumentSymbol)
209
212
  end
210
213
  def create_document_symbol(name:, kind:, range_node:, selection_range_node:)
211
- symbol = LanguageServer::Protocol::Interface::DocumentSymbol.new(
214
+ symbol = Interface::DocumentSymbol.new(
212
215
  name: name,
213
216
  kind: SYMBOL_KIND[kind],
214
217
  range: range_from_syntax_tree_node(range_node),
@@ -63,11 +63,11 @@ module RubyLsp
63
63
  def initialize(document)
64
64
  super
65
65
 
66
- @ranges = T.let([], T::Array[LanguageServer::Protocol::Interface::FoldingRange])
66
+ @ranges = T.let([], T::Array[Interface::FoldingRange])
67
67
  @partial_range = T.let(nil, T.nilable(PartialRange))
68
68
  end
69
69
 
70
- sig { override.returns(T.all(T::Array[LanguageServer::Protocol::Interface::FoldingRange], Object)) }
70
+ sig { override.returns(T.all(T::Array[Interface::FoldingRange], Object)) }
71
71
  def run
72
72
  if @document.parsed?
73
73
  visit(@document.tree)
@@ -161,9 +161,9 @@ module RubyLsp
161
161
  node.is_a?(SyntaxTree::Comment) && @end_line + 1 != node.location.start_line - 1
162
162
  end
163
163
 
164
- sig { returns(LanguageServer::Protocol::Interface::FoldingRange) }
164
+ sig { returns(Interface::FoldingRange) }
165
165
  def to_range
166
- LanguageServer::Protocol::Interface::FoldingRange.new(
166
+ Interface::FoldingRange.new(
167
167
  start_line: @start_line,
168
168
  end_line: @end_line,
169
169
  kind: @kind,
@@ -220,7 +220,8 @@ module RubyLsp
220
220
 
221
221
  sig { params(node: T.any(SyntaxTree::CallNode, SyntaxTree::CommandCall)).void }
222
222
  def add_call_range(node)
223
- receiver = T.let(node.receiver, SyntaxTree::Node)
223
+ receiver = T.let(node.receiver, T.nilable(SyntaxTree::Node))
224
+
224
225
  loop do
225
226
  case receiver
226
227
  when SyntaxTree::CallNode
@@ -255,9 +256,10 @@ module RubyLsp
255
256
  def add_def_range(node)
256
257
  # For an endless method with no arguments, `node.params` returns `nil` for Ruby 3.0, but a `Syntax::Params`
257
258
  # for Ruby 3.1
258
- return unless node.params
259
+ params = node.params
260
+ return unless params
259
261
 
260
- params_location = node.params.location
262
+ params_location = params.location
261
263
 
262
264
  if params_location.start_line < params_location.end_line
263
265
  add_lines_range(params_location.end_line, node.location.end_line - 1)
@@ -276,7 +278,9 @@ module RubyLsp
276
278
 
277
279
  sig { params(node: SyntaxTree::Node, statements: SyntaxTree::Statements).void }
278
280
  def add_statements_range(node, statements)
279
- add_lines_range(node.location.start_line, statements.body.last.location.end_line) unless statements.empty?
281
+ return if statements.empty?
282
+
283
+ add_lines_range(node.location.start_line, T.must(statements.body.last).location.end_line)
280
284
  end
281
285
 
282
286
  sig { params(node: SyntaxTree::StringConcat).void }
@@ -291,7 +295,7 @@ module RubyLsp
291
295
  def add_lines_range(start_line, end_line)
292
296
  return if start_line >= end_line
293
297
 
294
- @ranges << LanguageServer::Protocol::Interface::FoldingRange.new(
298
+ @ranges << Interface::FoldingRange.new(
295
299
  start_line: start_line - 1,
296
300
  end_line: end_line - 1,
297
301
  kind: "region",
@@ -2,6 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "ruby_lsp/requests/support/rubocop_formatting_runner"
5
+ require "ruby_lsp/requests/support/syntax_tree_formatting_runner"
5
6
 
6
7
  module RubyLsp
7
8
  module Requests
@@ -26,11 +27,11 @@ module RubyLsp
26
27
 
27
28
  extend T::Sig
28
29
 
29
- sig { params(uri: String, document: Document, formatter: String).void }
30
- def initialize(uri, document, formatter: "auto")
30
+ sig { params(document: Document, formatter: String).void }
31
+ def initialize(document, formatter: "auto")
31
32
  super(document)
32
33
 
33
- @uri = uri
34
+ @uri = T.let(document.uri, String)
34
35
  @formatter = T.let(
35
36
  if formatter == "auto"
36
37
  defined?(Support::RuboCopFormattingRunner) ? "rubocop" : "syntax_tree"
@@ -73,7 +74,7 @@ module RubyLsp
73
74
  when "rubocop"
74
75
  Support::RuboCopFormattingRunner.instance.run(@uri, @document)
75
76
  when "syntax_tree"
76
- SyntaxTree.format(@document.source)
77
+ Support::SyntaxTreeFormattingRunner.instance.run(@uri, @document)
77
78
  else
78
79
  raise InvalidFormatter, "Unknown formatter: #{@formatter}"
79
80
  end
@@ -36,7 +36,7 @@ module RubyLsp
36
36
  @position = T.let(document.create_scanner.find_char_position(position), Integer)
37
37
  end
38
38
 
39
- sig { override.returns(T.nilable(LanguageServer::Protocol::Interface::Hover)) }
39
+ sig { override.returns(T.nilable(Interface::Hover)) }
40
40
  def run
41
41
  return unless @document.parsed?
42
42
 
@@ -48,9 +48,10 @@ module RubyLsp
48
48
  message = target.message
49
49
  generate_rails_document_link_hover(message.value, message)
50
50
  when SyntaxTree::CallNode
51
- return if target.message == :call
51
+ message = target.message
52
+ return if message.is_a?(Symbol)
52
53
 
53
- generate_rails_document_link_hover(target.message.value, target.message)
54
+ generate_rails_document_link_hover(message.value, message)
54
55
  when SyntaxTree::ConstPathRef
55
56
  constant_name = full_constant_name(target)
56
57
  generate_rails_document_link_hover(constant_name, target)
@@ -60,18 +61,18 @@ module RubyLsp
60
61
  private
61
62
 
62
63
  sig do
63
- params(name: String, node: SyntaxTree::Node).returns(T.nilable(LanguageServer::Protocol::Interface::Hover))
64
+ params(name: String, node: SyntaxTree::Node).returns(T.nilable(Interface::Hover))
64
65
  end
65
66
  def generate_rails_document_link_hover(name, node)
66
67
  urls = Support::RailsDocumentClient.generate_rails_document_urls(name)
67
68
 
68
69
  return if urls.empty?
69
70
 
70
- contents = LanguageServer::Protocol::Interface::MarkupContent.new(
71
+ contents = Interface::MarkupContent.new(
71
72
  kind: "markdown",
72
73
  value: urls.join("\n\n"),
73
74
  )
74
- LanguageServer::Protocol::Interface::Hover.new(
75
+ Interface::Hover.new(
75
76
  range: range_from_syntax_tree_node(node),
76
77
  contents: contents,
77
78
  )
@@ -25,11 +25,11 @@ module RubyLsp
25
25
  def initialize(document, range)
26
26
  super(document)
27
27
 
28
- @hints = T.let([], T::Array[LanguageServer::Protocol::Interface::InlayHint])
28
+ @hints = T.let([], T::Array[Interface::InlayHint])
29
29
  @range = range
30
30
  end
31
31
 
32
- sig { override.returns(T.all(T::Array[LanguageServer::Protocol::Interface::InlayHint], Object)) }
32
+ sig { override.returns(T.all(T::Array[Interface::InlayHint], Object)) }
33
33
  def run
34
34
  visit(@document.tree) if @document.parsed?
35
35
  @hints
@@ -37,12 +37,13 @@ module RubyLsp
37
37
 
38
38
  sig { override.params(node: SyntaxTree::Rescue).void }
39
39
  def visit_rescue(node)
40
- return unless node.exception.nil?
40
+ exception = node.exception
41
+ return unless exception.nil? || exception.exceptions.nil?
41
42
 
42
43
  loc = node.location
43
44
  return unless visible?(node, @range)
44
45
 
45
- @hints << LanguageServer::Protocol::Interface::InlayHint.new(
46
+ @hints << Interface::InlayHint.new(
46
47
  position: { line: loc.start_line - 1, character: loc.start_column + RESCUE_STRING_LENGTH },
47
48
  label: "StandardError",
48
49
  padding_left: true,
@@ -63,13 +63,19 @@ module RubyLsp
63
63
 
64
64
  case matched
65
65
  when SyntaxTree::Command, SyntaxTree::CallNode, SyntaxTree::CommandCall
66
- return unless matched.message.value == "require"
66
+ message = matched.message
67
+ return if message.is_a?(Symbol)
68
+ return unless message.value == "require"
67
69
 
68
70
  args = matched.arguments
69
71
  args = args.arguments if args.is_a?(SyntaxTree::ArgParen)
72
+ return if args.nil? || args.is_a?(SyntaxTree::ArgsForward)
70
73
 
71
- path_node = args.parts.first.parts.first
72
- return unless path_node
74
+ argument = args.parts.first
75
+ return unless argument.is_a?(SyntaxTree::StringLiteral)
76
+
77
+ path_node = argument.parts.first
78
+ return unless path_node.is_a?(SyntaxTree::TStringContent)
73
79
  return unless (path_node.location.start_char..path_node.location.end_char).cover?(position)
74
80
 
75
81
  path_node
@@ -100,12 +100,12 @@ module RubyLsp
100
100
  end
101
101
  def create_selection_range(location, parent = nil)
102
102
  RubyLsp::Requests::Support::SelectionRange.new(
103
- range: LanguageServer::Protocol::Interface::Range.new(
104
- start: LanguageServer::Protocol::Interface::Position.new(
103
+ range: Interface::Range.new(
104
+ start: Interface::Position.new(
105
105
  line: location.start_line - 1,
106
106
  character: location.start_column,
107
107
  ),
108
- end: LanguageServer::Protocol::Interface::Position.new(
108
+ end: Interface::Position.new(
109
109
  line: location.end_line - 1,
110
110
  character: location.end_column,
111
111
  ),
@@ -122,7 +122,7 @@ module RubyLsp
122
122
  sig do
123
123
  override.returns(
124
124
  T.any(
125
- LanguageServer::Protocol::Interface::SemanticTokens,
125
+ Interface::SemanticTokens,
126
126
  T.all(T::Array[SemanticToken], Object),
127
127
  ),
128
128
  )
@@ -143,7 +143,7 @@ module RubyLsp
143
143
  visit(node.receiver)
144
144
 
145
145
  message = node.message
146
- if message != :call && !special_method?(message.value)
146
+ if !message.is_a?(Symbol) && !special_method?(message.value)
147
147
  type = Support::Sorbet.annotation?(node) ? :type : :method
148
148
 
149
149
  add_token(message.location, type)
@@ -168,7 +168,8 @@ module RubyLsp
168
168
  return super unless visible?(node, @range)
169
169
 
170
170
  visit(node.receiver)
171
- add_token(node.message.location, :method)
171
+ message = node.message
172
+ add_token(message.location, :method) unless message.is_a?(Symbol)
172
173
  visit(node.arguments)
173
174
  visit(node.block)
174
175
  end
@@ -205,7 +206,7 @@ module RubyLsp
205
206
  def visit_params(node)
206
207
  return super unless visible?(node, @range)
207
208
 
208
- node.keywords.each do |keyword,|
209
+ node.keywords.each do |keyword, *|
209
210
  location = keyword.location
210
211
  add_token(location_without_colon(location), :parameter)
211
212
  end
@@ -215,7 +216,7 @@ module RubyLsp
215
216
  end
216
217
 
217
218
  rest = node.keyword_rest
218
- if rest && !rest.is_a?(SyntaxTree::ArgsForward)
219
+ if rest && !rest.is_a?(SyntaxTree::ArgsForward) && !rest.is_a?(Symbol)
219
220
  name = rest.name
220
221
  add_token(name.location, :parameter) if name
221
222
  end
@@ -238,9 +239,14 @@ module RubyLsp
238
239
 
239
240
  value = node.value
240
241
 
241
- if value.is_a?(SyntaxTree::Ident)
242
+ case value
243
+ when SyntaxTree::Ident
242
244
  type = type_for_local(value)
243
245
  add_token(value.location, type)
246
+ when Symbol
247
+ # do nothing
248
+ else
249
+ visit(value)
244
250
  end
245
251
 
246
252
  super
@@ -256,6 +262,8 @@ module RubyLsp
256
262
  when SyntaxTree::Ident
257
263
  type = type_for_local(value)
258
264
  add_token(value.location, type)
265
+ when Symbol
266
+ # do nothing
259
267
  else
260
268
  visit(value)
261
269
  end
@@ -305,18 +313,21 @@ module RubyLsp
305
313
  return unless node.operator == :=~
306
314
 
307
315
  left = node.left
316
+ # The regexp needs to be on the left hand side of the =~ for local variable capture
317
+ return unless left.is_a?(SyntaxTree::RegexpLiteral)
318
+
308
319
  parts = left.parts
320
+ return unless parts.one?
309
321
 
310
- if left.is_a?(SyntaxTree::RegexpLiteral) && parts.one? && parts.first.is_a?(SyntaxTree::TStringContent)
311
- content = parts.first
322
+ content = parts.first
323
+ return unless content.is_a?(SyntaxTree::TStringContent)
312
324
 
313
- # For each capture name we find in the regexp, look for a local in the current_scope
314
- Regexp.new(content.value, Regexp::FIXEDENCODING).names.each do |name|
315
- local = current_scope.find_local(name)
316
- next unless local
325
+ # For each capture name we find in the regexp, look for a local in the current_scope
326
+ Regexp.new(content.value, Regexp::FIXEDENCODING).names.each do |name|
327
+ local = current_scope.find_local(name)
328
+ next unless local
317
329
 
318
- local.definitions.each { |definition| add_token(definition, :variable) }
319
- end
330
+ local.definitions.each { |definition| add_token(definition, :variable) }
320
331
  end
321
332
  end
322
333
 
@@ -325,7 +336,10 @@ module RubyLsp
325
336
  return super unless visible?(node, @range)
326
337
 
327
338
  add_token(node.constant.location, :class, [:declaration])
328
- add_token(node.superclass.location, :class) if node.superclass
339
+
340
+ superclass = node.superclass
341
+ add_token(superclass.location, :class) if superclass
342
+
329
343
  visit(node.bodystmt)
330
344
  end
331
345
 
@@ -7,8 +7,8 @@ module RubyLsp
7
7
  class HighlightTarget
8
8
  extend T::Sig
9
9
 
10
- READ = LanguageServer::Protocol::Constant::DocumentHighlightKind::READ
11
- WRITE = LanguageServer::Protocol::Constant::DocumentHighlightKind::WRITE
10
+ READ = Constant::DocumentHighlightKind::READ
11
+ WRITE = Constant::DocumentHighlightKind::WRITE
12
12
 
13
13
  class HighlightMatch
14
14
  extend T::Sig
@@ -84,10 +84,11 @@ module RubyLsp
84
84
  SyntaxTree::KwRestParam, SyntaxTree::BlockArg
85
85
  node.name&.value
86
86
  when SyntaxTree::VarField, SyntaxTree::VarRef, SyntaxTree::VCall
87
- node.value&.value
87
+ value = node.value
88
+ value.value unless value.nil? || value.is_a?(Symbol)
88
89
  when SyntaxTree::CallNode, SyntaxTree::Command, SyntaxTree::CommandCall
89
90
  message = node.message
90
- message != :call ? message.value : nil
91
+ message.value unless message.is_a?(Symbol)
91
92
  when SyntaxTree::ClassDeclaration, SyntaxTree::ModuleDeclaration
92
93
  node.constant.constant.value
93
94
  end
@@ -67,12 +67,13 @@ module RubyLsp
67
67
  return unless RAILTIES_VERSION
68
68
 
69
69
  warn("Fetching Rails Documents...")
70
- # If the version's doc is not found, e.g. Rails main, it'll be redirected
71
- # In this case, we just fetch the latest doc
72
- response = if Gem::Version.new(RAILTIES_VERSION).prerelease?
73
- Net::HTTP.get_response(URI("#{RAILS_DOC_HOST}/js/search_index.js"))
74
- else
75
- Net::HTTP.get_response(URI("#{RAILS_DOC_HOST}/v#{RAILTIES_VERSION}/js/search_index.js"))
70
+
71
+ response = Net::HTTP.get_response(URI("#{RAILS_DOC_HOST}/v#{RAILTIES_VERSION}/js/search_index.js"))
72
+
73
+ if response.code == "302"
74
+ # If the version's doc is not found, e.g. Rails main, it'll be redirected
75
+ # In this case, we just fetch the latest doc
76
+ response = Net::HTTP.get_response(URI("#{RAILS_DOC_HOST}/js/search_index.js"))
76
77
  end
77
78
 
78
79
  if response.code == "200"
@@ -4,7 +4,7 @@
4
4
  module RubyLsp
5
5
  module Requests
6
6
  module Support
7
- class SelectionRange < LanguageServer::Protocol::Interface::SelectionRange
7
+ class SelectionRange < Interface::SelectionRange
8
8
  extend T::Sig
9
9
 
10
10
  sig { params(position: Document::PositionShape).returns(T::Boolean) }
@@ -16,7 +16,7 @@ module RubyLsp
16
16
  sig do
17
17
  params(
18
18
  tokens: T::Array[SemanticHighlighting::SemanticToken],
19
- ).returns(LanguageServer::Protocol::Interface::SemanticTokens)
19
+ ).returns(Interface::SemanticTokens)
20
20
  end
21
21
  def encode(tokens)
22
22
  delta = tokens
@@ -27,7 +27,7 @@ module RubyLsp
27
27
  compute_delta(token)
28
28
  end
29
29
 
30
- LanguageServer::Protocol::Interface::SemanticTokens.new(data: delta)
30
+ Interface::SemanticTokens.new(data: delta)
31
31
  end
32
32
 
33
33
  # The delta array is computed according to the LSP specification:
@@ -63,7 +63,8 @@ module RubyLsp
63
63
  when SyntaxTree::VCall
64
64
  ANNOTATIONS[node.value.value]
65
65
  when SyntaxTree::CallNode
66
- ANNOTATIONS[node.message.value]
66
+ message = node.message
67
+ ANNOTATIONS[message.value] unless message.is_a?(Symbol)
67
68
  else
68
69
  T.absurd(node)
69
70
  end
@@ -84,21 +85,10 @@ module RubyLsp
84
85
  end
85
86
 
86
87
  sig do
87
- params(node: T.nilable(T.any(
88
- SyntaxTree::VarRef,
89
- SyntaxTree::CallNode,
90
- SyntaxTree::VCall,
91
- SyntaxTree::Ident,
92
- SyntaxTree::Backtick,
93
- SyntaxTree::Const,
94
- SyntaxTree::Op,
95
- Symbol,
96
- ))).returns(T.nilable(String))
88
+ params(node: T.nilable(SyntaxTree::Node)).returns(T.nilable(String))
97
89
  end
98
90
  def node_name(node)
99
91
  case node
100
- when NilClass
101
- nil
102
92
  when SyntaxTree::VarRef
103
93
  node.value.value
104
94
  when SyntaxTree::CallNode
@@ -107,8 +97,8 @@ module RubyLsp
107
97
  node_name(node.value)
108
98
  when SyntaxTree::Ident, SyntaxTree::Backtick, SyntaxTree::Const, SyntaxTree::Op
109
99
  node.value
110
- when Symbol
111
- node.to_s
100
+ when NilClass, SyntaxTree::Node
101
+ nil
112
102
  else
113
103
  T.absurd(node)
114
104
  end
@@ -0,0 +1,39 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "syntax_tree/cli"
5
+ require "singleton"
6
+
7
+ module RubyLsp
8
+ module Requests
9
+ module Support
10
+ # :nodoc:
11
+ class SyntaxTreeFormattingRunner
12
+ extend T::Sig
13
+ include Singleton
14
+
15
+ sig { void }
16
+ def initialize
17
+ @options =
18
+ T.let(
19
+ begin
20
+ opts = SyntaxTree::CLI::Options.new
21
+ opts.parse(SyntaxTree::CLI::ConfigFile.new.arguments)
22
+ opts
23
+ end,
24
+ SyntaxTree::CLI::Options,
25
+ )
26
+ end
27
+
28
+ sig { params(_uri: String, document: Document).returns(T.nilable(String)) }
29
+ def run(_uri, document)
30
+ SyntaxTree.format(
31
+ document.source,
32
+ @options.print_width,
33
+ options: @options.formatter_options,
34
+ )
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -2,9 +2,11 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module RubyLsp
5
+ # rubocop:disable RubyLsp/UseLanguageServerAliases
5
6
  Interface = LanguageServer::Protocol::Interface
6
7
  Constant = LanguageServer::Protocol::Constant
7
8
  Transport = LanguageServer::Protocol::Transport
9
+ # rubocop:enable RubyLsp/UseLanguageServerAliases
8
10
 
9
11
  class Server
10
12
  extend T::Sig
@@ -33,7 +35,8 @@ module RubyLsp
33
35
  # fall under the else branch which just pushes requests to the queue
34
36
  @reader.read do |request|
35
37
  case request[:method]
36
- when "initialize", "initialized", "textDocument/didOpen", "textDocument/didClose", "textDocument/didChange"
38
+ when "initialize", "initialized", "textDocument/didOpen", "textDocument/didClose", "textDocument/didChange",
39
+ "textDocument/formatting", "textDocument/onTypeFormatting", "codeAction/resolve"
37
40
  result = Executor.new(@store).execute(request)
38
41
  finalize_request(result, request)
39
42
  when "$/cancelRequest"
@@ -27,19 +27,19 @@ module RubyLsp
27
27
  document = @state[uri]
28
28
  return document unless document.nil?
29
29
 
30
- set(uri, File.binread(CGI.unescape(URI.parse(uri).path)))
30
+ set(uri: uri, source: File.binread(CGI.unescape(URI.parse(uri).path)), version: 0)
31
31
  T.must(@state[uri])
32
32
  end
33
33
 
34
- sig { params(uri: String, content: String).void }
35
- def set(uri, content)
36
- document = Document.new(content, @encoding)
34
+ sig { params(uri: String, source: String, version: Integer).void }
35
+ def set(uri:, source:, version:)
36
+ document = Document.new(source: source, version: version, uri: uri, encoding: @encoding)
37
37
  @state[uri] = document
38
38
  end
39
39
 
40
- sig { params(uri: String, edits: T::Array[Document::EditShape]).void }
41
- def push_edits(uri, edits)
42
- T.must(@state[uri]).push_edits(edits)
40
+ sig { params(uri: String, edits: T::Array[Document::EditShape], version: Integer).void }
41
+ def push_edits(uri:, edits:, version:)
42
+ T.must(@state[uri]).push_edits(edits, version: version)
43
43
  end
44
44
 
45
45
  sig { void }
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.4.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-03-20 00:00:00.000000000 Z
11
+ date: 2023-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: language_server-protocol
@@ -44,7 +44,7 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 6.0.2
47
+ version: 6.1.1
48
48
  - - "<"
49
49
  - !ruby/object:Gem::Version
50
50
  version: '7'
@@ -54,7 +54,7 @@ dependencies:
54
54
  requirements:
55
55
  - - ">="
56
56
  - !ruby/object:Gem::Version
57
- version: 6.0.2
57
+ version: 6.1.1
58
58
  - - "<"
59
59
  - !ruby/object:Gem::Version
60
60
  version: '7'
@@ -70,6 +70,7 @@ files:
70
70
  - README.md
71
71
  - VERSION
72
72
  - exe/ruby-lsp
73
+ - lib/rubocop/cop/ruby_lsp/use_language_server_aliases.rb
73
74
  - lib/ruby-lsp.rb
74
75
  - lib/ruby_lsp/document.rb
75
76
  - lib/ruby_lsp/executor.rb
@@ -102,6 +103,7 @@ files:
102
103
  - lib/ruby_lsp/requests/support/semantic_token_encoder.rb
103
104
  - lib/ruby_lsp/requests/support/sorbet.rb
104
105
  - lib/ruby_lsp/requests/support/source_uri.rb
106
+ - lib/ruby_lsp/requests/support/syntax_tree_formatting_runner.rb
105
107
  - lib/ruby_lsp/server.rb
106
108
  - lib/ruby_lsp/store.rb
107
109
  - lib/ruby_lsp/utils.rb
@@ -125,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
127
  - !ruby/object:Gem::Version
126
128
  version: '0'
127
129
  requirements: []
128
- rubygems_version: 3.3.3
130
+ rubygems_version: 3.4.9
129
131
  signing_key:
130
132
  specification_version: 4
131
133
  summary: An opinionated language server for Ruby