ruby-lsp 0.3.6 → 0.3.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +29 -2
- data/VERSION +1 -1
- data/lib/ruby_lsp/document.rb +51 -46
- data/lib/ruby_lsp/handler.rb +2 -2
- data/lib/ruby_lsp/requests/base_request.rb +44 -20
- data/lib/ruby_lsp/requests/code_actions.rb +2 -2
- data/lib/ruby_lsp/requests/diagnostics.rb +1 -8
- data/lib/ruby_lsp/requests/document_highlight.rb +14 -11
- data/lib/ruby_lsp/requests/document_link.rb +30 -26
- data/lib/ruby_lsp/requests/document_symbol.rb +43 -83
- data/lib/ruby_lsp/requests/folding_ranges.rb +58 -38
- data/lib/ruby_lsp/requests/formatting.rb +2 -0
- data/lib/ruby_lsp/requests/hover.rb +16 -7
- data/lib/ruby_lsp/requests/inlay_hints.rb +1 -1
- data/lib/ruby_lsp/requests/on_type_formatting.rb +19 -22
- data/lib/ruby_lsp/requests/selection_ranges.rb +40 -38
- data/lib/ruby_lsp/requests/semantic_highlighting.rb +96 -73
- data/lib/ruby_lsp/requests/support/highlight_target.rb +8 -9
- data/lib/ruby_lsp/requests/support/rails_document_client.rb +13 -6
- data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +15 -10
- data/lib/ruby_lsp/requests/support/rubocop_diagnostics_runner.rb +1 -1
- data/lib/ruby_lsp/requests/support/rubocop_formatting_runner.rb +1 -1
- data/lib/ruby_lsp/requests/support/rubocop_runner.rb +9 -6
- data/lib/ruby_lsp/requests/support/source_uri.rb +10 -7
- data/lib/ruby_lsp/server.rb +19 -7
- data/lib/ruby_lsp/store.rb +5 -1
- metadata +6 -6
@@ -34,12 +34,12 @@ module RubyLsp
|
|
34
34
|
def matched_highlight(other)
|
35
35
|
case @node
|
36
36
|
# Method definitions and invocations
|
37
|
-
when SyntaxTree::VCall, SyntaxTree::
|
38
|
-
SyntaxTree::CommandCall, SyntaxTree::
|
37
|
+
when SyntaxTree::VCall, SyntaxTree::CallNode, SyntaxTree::Command,
|
38
|
+
SyntaxTree::CommandCall, SyntaxTree::DefNode
|
39
39
|
case other
|
40
|
-
when SyntaxTree::VCall, SyntaxTree::
|
40
|
+
when SyntaxTree::VCall, SyntaxTree::CallNode, SyntaxTree::Command, SyntaxTree::CommandCall
|
41
41
|
HighlightMatch.new(type: READ, node: other)
|
42
|
-
when SyntaxTree::
|
42
|
+
when SyntaxTree::DefNode
|
43
43
|
HighlightMatch.new(type: WRITE, node: other.name)
|
44
44
|
end
|
45
45
|
# Variables, parameters and constants
|
@@ -67,15 +67,14 @@ module RubyLsp
|
|
67
67
|
case node
|
68
68
|
when SyntaxTree::ConstPathRef, SyntaxTree::ConstPathField, SyntaxTree::TopConstField
|
69
69
|
node.constant.value
|
70
|
-
when SyntaxTree::GVar, SyntaxTree::IVar, SyntaxTree::Const, SyntaxTree::CVar, SyntaxTree::Ident
|
71
|
-
SyntaxTree::ArgsForward
|
70
|
+
when SyntaxTree::GVar, SyntaxTree::IVar, SyntaxTree::Const, SyntaxTree::CVar, SyntaxTree::Ident
|
72
71
|
node.value
|
73
|
-
when SyntaxTree::Field, SyntaxTree::
|
72
|
+
when SyntaxTree::Field, SyntaxTree::DefNode, SyntaxTree::RestParam,
|
74
73
|
SyntaxTree::KwRestParam, SyntaxTree::BlockArg
|
75
74
|
node.name&.value
|
76
|
-
when SyntaxTree::VarField, SyntaxTree::VarRef, SyntaxTree::VCall
|
75
|
+
when SyntaxTree::VarField, SyntaxTree::VarRef, SyntaxTree::VCall
|
77
76
|
node.value&.value
|
78
|
-
when SyntaxTree::
|
77
|
+
when SyntaxTree::CallNode, SyntaxTree::Command, SyntaxTree::CommandCall
|
79
78
|
message = node.message
|
80
79
|
message != :call ? message.value : nil
|
81
80
|
when SyntaxTree::ClassDeclaration, SyntaxTree::ModuleDeclaration
|
@@ -10,8 +10,14 @@ module RubyLsp
|
|
10
10
|
RAILS_DOC_HOST = "https://api.rubyonrails.org"
|
11
11
|
SUPPORTED_RAILS_DOC_NAMESPACES = T.let(
|
12
12
|
Regexp.union(
|
13
|
-
/ActionDispatch/,
|
14
|
-
/
|
13
|
+
/ActionDispatch/,
|
14
|
+
/ActionController/,
|
15
|
+
/AbstractController/,
|
16
|
+
/ActiveRecord/,
|
17
|
+
/ActiveModel/,
|
18
|
+
/ActiveStorage/,
|
19
|
+
/ActionText/,
|
20
|
+
/ActiveJob/,
|
15
21
|
).freeze,
|
16
22
|
Regexp,
|
17
23
|
)
|
@@ -19,7 +25,8 @@ module RubyLsp
|
|
19
25
|
RAILTIES_VERSION = T.let(
|
20
26
|
[*::Gem::Specification.default_stubs, *::Gem::Specification.stubs].find do |s|
|
21
27
|
s.name == "railties"
|
22
|
-
end&.version&.to_s,
|
28
|
+
end&.version&.to_s,
|
29
|
+
T.nilable(String),
|
23
30
|
)
|
24
31
|
|
25
32
|
class << self
|
@@ -59,7 +66,7 @@ module RubyLsp
|
|
59
66
|
private def build_search_index
|
60
67
|
return unless RAILTIES_VERSION
|
61
68
|
|
62
|
-
|
69
|
+
warn("Fetching Rails Documents...")
|
63
70
|
# If the version's doc is not found, e.g. Rails main, it'll be redirected
|
64
71
|
# In this case, we just fetch the latest doc
|
65
72
|
response = if Gem::Version.new(RAILTIES_VERSION).prerelease?
|
@@ -71,11 +78,11 @@ module RubyLsp
|
|
71
78
|
if response.code == "200"
|
72
79
|
process_search_index(response.body)
|
73
80
|
else
|
74
|
-
|
81
|
+
warn("Response failed: #{response.inspect}")
|
75
82
|
nil
|
76
83
|
end
|
77
84
|
rescue StandardError => e
|
78
|
-
|
85
|
+
warn("Exception occurred when fetching Rails document index: #{e.inspect}")
|
79
86
|
end
|
80
87
|
|
81
88
|
sig { params(js: String).returns(T::Hash[String, T::Array[T::Hash[Symbol, String]]]) }
|
@@ -7,14 +7,17 @@ module RubyLsp
|
|
7
7
|
class RuboCopDiagnostic
|
8
8
|
extend T::Sig
|
9
9
|
|
10
|
-
RUBOCOP_TO_LSP_SEVERITY = T.let(
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
10
|
+
RUBOCOP_TO_LSP_SEVERITY = T.let(
|
11
|
+
{
|
12
|
+
convention: LanguageServer::Protocol::Constant::DiagnosticSeverity::INFORMATION,
|
13
|
+
info: LanguageServer::Protocol::Constant::DiagnosticSeverity::INFORMATION,
|
14
|
+
refactor: LanguageServer::Protocol::Constant::DiagnosticSeverity::INFORMATION,
|
15
|
+
warning: LanguageServer::Protocol::Constant::DiagnosticSeverity::WARNING,
|
16
|
+
error: LanguageServer::Protocol::Constant::DiagnosticSeverity::ERROR,
|
17
|
+
fatal: LanguageServer::Protocol::Constant::DiagnosticSeverity::ERROR,
|
18
|
+
}.freeze,
|
19
|
+
T::Hash[Symbol, Integer],
|
20
|
+
)
|
18
21
|
|
19
22
|
sig { returns(T::Array[LanguageServer::Protocol::Interface::TextEdit]) }
|
20
23
|
attr_reader :replacements
|
@@ -94,8 +97,10 @@ module RubyLsp
|
|
94
97
|
LanguageServer::Protocol::Interface::TextEdit.new(
|
95
98
|
range: LanguageServer::Protocol::Interface::Range.new(
|
96
99
|
start: LanguageServer::Protocol::Interface::Position.new(line: range.line - 1, character: range.column),
|
97
|
-
end: LanguageServer::Protocol::Interface::Position.new(
|
98
|
-
|
100
|
+
end: LanguageServer::Protocol::Interface::Position.new(
|
101
|
+
line: range.last_line - 1,
|
102
|
+
character: range.last_column,
|
103
|
+
),
|
99
104
|
),
|
100
105
|
new_text: replacement,
|
101
106
|
)
|
@@ -25,12 +25,15 @@ module RubyLsp
|
|
25
25
|
sig { returns(T::Array[RuboCop::Cop::Offense]) }
|
26
26
|
attr_reader :offenses
|
27
27
|
|
28
|
-
DEFAULT_ARGS = T.let(
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
28
|
+
DEFAULT_ARGS = T.let(
|
29
|
+
[
|
30
|
+
"--stderr", # Print any output to stderr so that our stdout does not get polluted
|
31
|
+
"--force-exclusion",
|
32
|
+
"--format",
|
33
|
+
"RuboCop::Formatter::BaseFormatter", # Suppress any output by using the base formatter
|
34
|
+
].freeze,
|
35
|
+
T::Array[String],
|
36
|
+
)
|
34
37
|
|
35
38
|
sig { params(args: String).void }
|
36
39
|
def initialize(*args)
|
@@ -8,13 +8,16 @@ module URI
|
|
8
8
|
class Source < URI::File
|
9
9
|
extend T::Sig
|
10
10
|
|
11
|
-
COMPONENT = T.let(
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
11
|
+
COMPONENT = T.let(
|
12
|
+
[
|
13
|
+
:scheme,
|
14
|
+
:gem_name,
|
15
|
+
:gem_version,
|
16
|
+
:path,
|
17
|
+
:line_number,
|
18
|
+
].freeze,
|
19
|
+
T::Array[Symbol],
|
20
|
+
)
|
18
21
|
|
19
22
|
T.unsafe(self).alias_method(:gem_name, :host)
|
20
23
|
T.unsafe(self).alias_method(:line_number, :fragment)
|
data/lib/ruby_lsp/server.rb
CHANGED
@@ -7,6 +7,8 @@ module RubyLsp
|
|
7
7
|
Handler.start do
|
8
8
|
on("initialize") do |request|
|
9
9
|
store.clear
|
10
|
+
store.encoding = request.dig(:params, :capabilities, :general, :positionEncodings)
|
11
|
+
|
10
12
|
initialization_options = request.dig(:params, :initializationOptions)
|
11
13
|
enabled_features = initialization_options.fetch(:enabledFeatures, [])
|
12
14
|
|
@@ -38,10 +40,8 @@ module RubyLsp
|
|
38
40
|
token_types: Requests::SemanticHighlighting::TOKEN_TYPES.keys,
|
39
41
|
token_modifiers: Requests::SemanticHighlighting::TOKEN_MODIFIERS.keys,
|
40
42
|
),
|
41
|
-
range:
|
42
|
-
full: {
|
43
|
-
delta: true,
|
44
|
-
},
|
43
|
+
range: true,
|
44
|
+
full: { delta: false },
|
45
45
|
)
|
46
46
|
end
|
47
47
|
|
@@ -168,6 +168,19 @@ module RubyLsp
|
|
168
168
|
end
|
169
169
|
end
|
170
170
|
|
171
|
+
on("textDocument/semanticTokens/range", parallel: true) do |request|
|
172
|
+
document = store.get(request.dig(:params, :textDocument, :uri))
|
173
|
+
range = request.dig(:params, :range)
|
174
|
+
start_line = range.dig(:start, :line)
|
175
|
+
end_line = range.dig(:end, :line)
|
176
|
+
|
177
|
+
Requests::SemanticHighlighting.new(
|
178
|
+
document,
|
179
|
+
range: start_line..end_line,
|
180
|
+
encoder: Requests::Support::SemanticTokenEncoder.new,
|
181
|
+
).run
|
182
|
+
end
|
183
|
+
|
171
184
|
on("textDocument/formatting", parallel: true) do |request|
|
172
185
|
uri = request.dig(:params, :textDocument, :uri)
|
173
186
|
|
@@ -192,13 +205,12 @@ module RubyLsp
|
|
192
205
|
|
193
206
|
on("textDocument/codeAction", parallel: true) do |request|
|
194
207
|
uri = request.dig(:params, :textDocument, :uri)
|
208
|
+
document = store.get(uri)
|
195
209
|
range = request.dig(:params, :range)
|
196
210
|
start_line = range.dig(:start, :line)
|
197
211
|
end_line = range.dig(:end, :line)
|
198
212
|
|
199
|
-
|
200
|
-
Requests::CodeActions.new(uri, document, start_line..end_line).run
|
201
|
-
end
|
213
|
+
Requests::CodeActions.new(uri, document, start_line..end_line).run
|
202
214
|
end
|
203
215
|
|
204
216
|
on("textDocument/inlayHint", parallel: true) do |request|
|
data/lib/ruby_lsp/store.rb
CHANGED
@@ -9,9 +9,13 @@ module RubyLsp
|
|
9
9
|
class Store
|
10
10
|
extend T::Sig
|
11
11
|
|
12
|
+
sig { params(encoding: String).void }
|
13
|
+
attr_writer :encoding
|
14
|
+
|
12
15
|
sig { void }
|
13
16
|
def initialize
|
14
17
|
@state = T.let({}, T::Hash[String, Document])
|
18
|
+
@encoding = T.let("utf-8", String)
|
15
19
|
end
|
16
20
|
|
17
21
|
sig { params(uri: String).returns(Document) }
|
@@ -25,7 +29,7 @@ module RubyLsp
|
|
25
29
|
|
26
30
|
sig { params(uri: String, content: String).void }
|
27
31
|
def set(uri, content)
|
28
|
-
document = Document.new(content)
|
32
|
+
document = Document.new(content, @encoding)
|
29
33
|
@state[uri] = document
|
30
34
|
end
|
31
35
|
|
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.3.
|
4
|
+
version: 0.3.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: language_server-protocol
|
@@ -44,20 +44,20 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 5.0.0
|
48
48
|
- - "<"
|
49
49
|
- !ruby/object:Gem::Version
|
50
|
-
version:
|
50
|
+
version: '6'
|
51
51
|
type: :runtime
|
52
52
|
prerelease: false
|
53
53
|
version_requirements: !ruby/object:Gem::Requirement
|
54
54
|
requirements:
|
55
55
|
- - ">="
|
56
56
|
- !ruby/object:Gem::Version
|
57
|
-
version:
|
57
|
+
version: 5.0.0
|
58
58
|
- - "<"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version:
|
60
|
+
version: '6'
|
61
61
|
description: An opinionated language server for Ruby
|
62
62
|
email:
|
63
63
|
- ruby@shopify.com
|