ruby-lsp 0.3.2 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/lib/ruby_lsp/document.rb +12 -4
- data/lib/ruby_lsp/handler.rb +4 -4
- data/lib/ruby_lsp/queue.rb +11 -5
- data/lib/ruby_lsp/requests/base_request.rb +49 -0
- data/lib/ruby_lsp/requests/code_actions.rb +1 -1
- data/lib/ruby_lsp/requests/diagnostics.rb +1 -1
- data/lib/ruby_lsp/requests/document_highlight.rb +15 -20
- data/lib/ruby_lsp/requests/document_link.rb +4 -4
- data/lib/ruby_lsp/requests/document_symbol.rb +21 -21
- data/lib/ruby_lsp/requests/folding_ranges.rb +8 -5
- data/lib/ruby_lsp/requests/formatting.rb +2 -2
- data/lib/ruby_lsp/requests/hover.rb +74 -0
- data/lib/ruby_lsp/requests/inlay_hints.rb +56 -0
- data/lib/ruby_lsp/requests/on_type_formatting.rb +6 -6
- data/lib/ruby_lsp/requests/selection_ranges.rb +4 -4
- data/lib/ruby_lsp/requests/semantic_highlighting.rb +20 -30
- data/lib/ruby_lsp/requests/support/rails_document_client.rb +114 -0
- data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +10 -10
- data/lib/ruby_lsp/requests/support/rubocop_runner.rb +6 -0
- data/lib/ruby_lsp/requests/support/semantic_token_encoder.rb +1 -1
- data/lib/ruby_lsp/requests/support/source_uri.rb +1 -1
- data/lib/ruby_lsp/requests/support/syntax_error_diagnostic.rb +1 -1
- data/lib/ruby_lsp/requests.rb +5 -0
- data/lib/ruby_lsp/server.rb +34 -10
- data/lib/ruby_lsp/store.rb +3 -6
- metadata +7 -5
- data/CHANGELOG.md +0 -75
@@ -101,15 +101,15 @@ module RubyLsp
|
|
101
101
|
def add_edit_with_text(text)
|
102
102
|
position = Interface::Position.new(
|
103
103
|
line: @position[:line],
|
104
|
-
character: @position[:character]
|
104
|
+
character: @position[:character],
|
105
105
|
)
|
106
106
|
|
107
107
|
@edits << Interface::TextEdit.new(
|
108
108
|
range: Interface::Range.new(
|
109
109
|
start: position,
|
110
|
-
end: position
|
110
|
+
end: position,
|
111
111
|
),
|
112
|
-
new_text: text
|
112
|
+
new_text: text,
|
113
113
|
)
|
114
114
|
end
|
115
115
|
|
@@ -117,7 +117,7 @@ module RubyLsp
|
|
117
117
|
def move_cursor_to(line, character)
|
118
118
|
position = Interface::Position.new(
|
119
119
|
line: line,
|
120
|
-
character: character
|
120
|
+
character: character,
|
121
121
|
)
|
122
122
|
|
123
123
|
# The $0 is a special snippet anchor that moves the cursor to that given position. See the snippets
|
@@ -126,9 +126,9 @@ module RubyLsp
|
|
126
126
|
@edits << Interface::TextEdit.new(
|
127
127
|
range: Interface::Range.new(
|
128
128
|
start: position,
|
129
|
-
end: position
|
129
|
+
end: position,
|
130
130
|
),
|
131
|
-
new_text: "$0"
|
131
|
+
new_text: "$0",
|
132
132
|
)
|
133
133
|
end
|
134
134
|
|
@@ -70,13 +70,13 @@ module RubyLsp
|
|
70
70
|
|
71
71
|
sig { override.returns(T.all(T::Array[Support::SelectionRange], Object)) }
|
72
72
|
def run
|
73
|
-
visit(@document.tree)
|
73
|
+
visit(@document.tree) if @document.parsed?
|
74
74
|
@ranges.reverse!
|
75
75
|
end
|
76
76
|
|
77
77
|
private
|
78
78
|
|
79
|
-
sig { params(node: T.nilable(SyntaxTree::Node)).void }
|
79
|
+
sig { override.params(node: T.nilable(SyntaxTree::Node)).void }
|
80
80
|
def visit(node)
|
81
81
|
return if node.nil?
|
82
82
|
|
@@ -93,7 +93,7 @@ module RubyLsp
|
|
93
93
|
sig do
|
94
94
|
params(
|
95
95
|
location: SyntaxTree::Location,
|
96
|
-
parent: T.nilable(Support::SelectionRange)
|
96
|
+
parent: T.nilable(Support::SelectionRange),
|
97
97
|
).returns(Support::SelectionRange)
|
98
98
|
end
|
99
99
|
def create_selection_range(location, parent = nil)
|
@@ -108,7 +108,7 @@ module RubyLsp
|
|
108
108
|
character: location.end_column,
|
109
109
|
),
|
110
110
|
),
|
111
|
-
parent: parent
|
111
|
+
parent: parent,
|
112
112
|
)
|
113
113
|
end
|
114
114
|
end
|
@@ -90,22 +90,19 @@ module RubyLsp
|
|
90
90
|
T.any(
|
91
91
|
LanguageServer::Protocol::Interface::SemanticTokens,
|
92
92
|
T.all(T::Array[SemanticToken], Object),
|
93
|
-
)
|
93
|
+
),
|
94
94
|
)
|
95
95
|
end
|
96
96
|
def run
|
97
|
+
return @tokens unless @document.parsed?
|
98
|
+
|
97
99
|
visit(@tree)
|
98
100
|
return @tokens unless @encoder
|
99
101
|
|
100
102
|
@encoder.encode(@tokens)
|
101
103
|
end
|
102
104
|
|
103
|
-
sig { params(node: SyntaxTree::
|
104
|
-
def visit_a_ref_field(node)
|
105
|
-
add_token(node.collection.value.location, :variable)
|
106
|
-
end
|
107
|
-
|
108
|
-
sig { params(node: SyntaxTree::Call).void }
|
105
|
+
sig { override.params(node: SyntaxTree::Call).void }
|
109
106
|
def visit_call(node)
|
110
107
|
visit(node.receiver)
|
111
108
|
|
@@ -115,32 +112,32 @@ module RubyLsp
|
|
115
112
|
visit(node.arguments)
|
116
113
|
end
|
117
114
|
|
118
|
-
sig { params(node: SyntaxTree::Command).void }
|
115
|
+
sig { override.params(node: SyntaxTree::Command).void }
|
119
116
|
def visit_command(node)
|
120
117
|
add_token(node.message.location, :method) unless special_method?(node.message.value)
|
121
118
|
visit(node.arguments)
|
122
119
|
end
|
123
120
|
|
124
|
-
sig { params(node: SyntaxTree::CommandCall).void }
|
121
|
+
sig { override.params(node: SyntaxTree::CommandCall).void }
|
125
122
|
def visit_command_call(node)
|
126
123
|
visit(node.receiver)
|
127
124
|
add_token(node.message.location, :method)
|
128
125
|
visit(node.arguments)
|
129
126
|
end
|
130
127
|
|
131
|
-
sig { params(node: SyntaxTree::Const).void }
|
128
|
+
sig { override.params(node: SyntaxTree::Const).void }
|
132
129
|
def visit_const(node)
|
133
130
|
add_token(node.location, :namespace)
|
134
131
|
end
|
135
132
|
|
136
|
-
sig { params(node: SyntaxTree::Def).void }
|
133
|
+
sig { override.params(node: SyntaxTree::Def).void }
|
137
134
|
def visit_def(node)
|
138
135
|
add_token(node.name.location, :method, [:declaration])
|
139
136
|
visit(node.params)
|
140
137
|
visit(node.bodystmt)
|
141
138
|
end
|
142
139
|
|
143
|
-
sig { params(node: SyntaxTree::DefEndless).void }
|
140
|
+
sig { override.params(node: SyntaxTree::DefEndless).void }
|
144
141
|
def visit_def_endless(node)
|
145
142
|
add_token(node.name.location, :method, [:declaration])
|
146
143
|
visit(node.paren)
|
@@ -148,7 +145,7 @@ module RubyLsp
|
|
148
145
|
visit(node.statement)
|
149
146
|
end
|
150
147
|
|
151
|
-
sig { params(node: SyntaxTree::Defs).void }
|
148
|
+
sig { override.params(node: SyntaxTree::Defs).void }
|
152
149
|
def visit_defs(node)
|
153
150
|
visit(node.target)
|
154
151
|
visit(node.operator)
|
@@ -157,13 +154,13 @@ module RubyLsp
|
|
157
154
|
visit(node.bodystmt)
|
158
155
|
end
|
159
156
|
|
160
|
-
sig { params(node: SyntaxTree::FCall).void }
|
157
|
+
sig { override.params(node: SyntaxTree::FCall).void }
|
161
158
|
def visit_fcall(node)
|
162
159
|
add_token(node.value.location, :method) unless special_method?(node.value.value)
|
163
160
|
visit(node.arguments)
|
164
161
|
end
|
165
162
|
|
166
|
-
sig { params(node: SyntaxTree::Kw).void }
|
163
|
+
sig { override.params(node: SyntaxTree::Kw).void }
|
167
164
|
def visit_kw(node)
|
168
165
|
case node.value
|
169
166
|
when "self"
|
@@ -171,14 +168,7 @@ module RubyLsp
|
|
171
168
|
end
|
172
169
|
end
|
173
170
|
|
174
|
-
sig { params(node: SyntaxTree::
|
175
|
-
def visit_m_assign(node)
|
176
|
-
node.target.parts.each do |var_ref|
|
177
|
-
add_token(var_ref.value.location, :variable)
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
sig { params(node: SyntaxTree::Params).void }
|
171
|
+
sig { override.params(node: SyntaxTree::Params).void }
|
182
172
|
def visit_params(node)
|
183
173
|
node.keywords.each do |keyword,|
|
184
174
|
location = keyword.location
|
@@ -196,7 +186,7 @@ module RubyLsp
|
|
196
186
|
add_token(name.location, :variable) if name
|
197
187
|
end
|
198
188
|
|
199
|
-
sig { params(node: SyntaxTree::VarField).void }
|
189
|
+
sig { override.params(node: SyntaxTree::VarField).void }
|
200
190
|
def visit_var_field(node)
|
201
191
|
case node.value
|
202
192
|
when SyntaxTree::Ident
|
@@ -206,7 +196,7 @@ module RubyLsp
|
|
206
196
|
end
|
207
197
|
end
|
208
198
|
|
209
|
-
sig { params(node: SyntaxTree::VarRef).void }
|
199
|
+
sig { override.params(node: SyntaxTree::VarRef).void }
|
210
200
|
def visit_var_ref(node)
|
211
201
|
case node.value
|
212
202
|
when SyntaxTree::Ident
|
@@ -216,19 +206,19 @@ module RubyLsp
|
|
216
206
|
end
|
217
207
|
end
|
218
208
|
|
219
|
-
sig { params(node: SyntaxTree::VCall).void }
|
209
|
+
sig { override.params(node: SyntaxTree::VCall).void }
|
220
210
|
def visit_vcall(node)
|
221
211
|
add_token(node.value.location, :method) unless special_method?(node.value.value)
|
222
212
|
end
|
223
213
|
|
224
|
-
sig { params(node: SyntaxTree::ClassDeclaration).void }
|
214
|
+
sig { override.params(node: SyntaxTree::ClassDeclaration).void }
|
225
215
|
def visit_class(node)
|
226
216
|
add_token(node.constant.location, :class, [:declaration])
|
227
217
|
add_token(node.superclass.location, :class) if node.superclass
|
228
218
|
visit(node.bodystmt)
|
229
219
|
end
|
230
220
|
|
231
|
-
sig { params(node: SyntaxTree::ModuleDeclaration).void }
|
221
|
+
sig { override.params(node: SyntaxTree::ModuleDeclaration).void }
|
232
222
|
def visit_module(node)
|
233
223
|
add_token(node.constant.location, :class, [:declaration])
|
234
224
|
visit(node.bodystmt)
|
@@ -243,8 +233,8 @@ module RubyLsp
|
|
243
233
|
location: location,
|
244
234
|
length: length,
|
245
235
|
type: T.must(TOKEN_TYPES[type]),
|
246
|
-
modifier: modifiers_indices
|
247
|
-
)
|
236
|
+
modifier: modifiers_indices,
|
237
|
+
),
|
248
238
|
)
|
249
239
|
end
|
250
240
|
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "net/http"
|
5
|
+
|
6
|
+
module RubyLsp
|
7
|
+
module Requests
|
8
|
+
module Support
|
9
|
+
class RailsDocumentClient
|
10
|
+
RAILS_DOC_HOST = "https://api.rubyonrails.org"
|
11
|
+
SUPPORTED_RAILS_DOC_NAMESPACES = T.let(
|
12
|
+
Regexp.union(
|
13
|
+
/ActionDispatch/, /ActionController/, /AbstractController/, /ActiveRecord/, /ActiveModel/, /ActiveStorage/,
|
14
|
+
/ActionText/, /ActiveJob/
|
15
|
+
).freeze,
|
16
|
+
Regexp,
|
17
|
+
)
|
18
|
+
|
19
|
+
RAILTIES_VERSION = T.let(
|
20
|
+
[*::Gem::Specification.default_stubs, *::Gem::Specification.stubs].find do |s|
|
21
|
+
s.name == "railties"
|
22
|
+
end&.version&.to_s, T.nilable(String)
|
23
|
+
)
|
24
|
+
|
25
|
+
class << self
|
26
|
+
extend T::Sig
|
27
|
+
sig do
|
28
|
+
params(name: String).returns(T::Array[String])
|
29
|
+
end
|
30
|
+
def generate_rails_document_urls(name)
|
31
|
+
docs = T.must(search_index)[name]
|
32
|
+
|
33
|
+
return [] unless docs
|
34
|
+
|
35
|
+
docs.map do |doc|
|
36
|
+
owner = doc[:owner]
|
37
|
+
|
38
|
+
link_name =
|
39
|
+
# class/module name
|
40
|
+
if owner == name
|
41
|
+
name
|
42
|
+
else
|
43
|
+
"#{owner}##{name}"
|
44
|
+
end
|
45
|
+
|
46
|
+
"[Rails Document: `#{link_name}`](#{doc[:url]})"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
sig { returns(T.nilable(T::Hash[String, T::Array[T::Hash[Symbol, String]]])) }
|
51
|
+
private def search_index
|
52
|
+
@rails_documents ||= T.let(
|
53
|
+
build_search_index,
|
54
|
+
T.nilable(T::Hash[String, T::Array[T::Hash[Symbol, String]]]),
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
58
|
+
sig { returns(T.nilable(T::Hash[String, T::Array[T::Hash[Symbol, String]]])) }
|
59
|
+
private def build_search_index
|
60
|
+
return unless RAILTIES_VERSION
|
61
|
+
|
62
|
+
$stderr.puts "Fetching Rails Documents..."
|
63
|
+
# If the version's doc is not found, e.g. Rails main, it'll be redirected
|
64
|
+
# In this case, we just fetch the latest doc
|
65
|
+
response = if Gem::Version.new(RAILTIES_VERSION).prerelease?
|
66
|
+
Net::HTTP.get_response(URI("#{RAILS_DOC_HOST}/js/search_index.js"))
|
67
|
+
else
|
68
|
+
Net::HTTP.get_response(URI("#{RAILS_DOC_HOST}/v#{RAILTIES_VERSION}/js/search_index.js"))
|
69
|
+
end
|
70
|
+
|
71
|
+
if response.code == "200"
|
72
|
+
process_search_index(response.body)
|
73
|
+
else
|
74
|
+
$stderr.puts("Response failed: #{response.inspect}")
|
75
|
+
nil
|
76
|
+
end
|
77
|
+
rescue StandardError => e
|
78
|
+
$stderr.puts("Exception occurred when fetching Rails document index: #{e.inspect}")
|
79
|
+
end
|
80
|
+
|
81
|
+
sig { params(js: String).returns(T::Hash[String, T::Array[T::Hash[Symbol, String]]]) }
|
82
|
+
private def process_search_index(js)
|
83
|
+
raw_data = js.sub("var search_data = ", "")
|
84
|
+
info = JSON.parse(raw_data).dig("index", "info")
|
85
|
+
|
86
|
+
# An entry looks like this:
|
87
|
+
#
|
88
|
+
# ["belongs_to", # method or module/class
|
89
|
+
# "ActiveRecord::Associations::ClassMethods", # method owner
|
90
|
+
# "classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to", # path to the document
|
91
|
+
# "(name, scope = nil, **options)", # method's parameters
|
92
|
+
# "<p>Specifies a one-to-one association with another class..."] # document preview
|
93
|
+
#
|
94
|
+
info.each_with_object({}) do |(method_or_class, method_owner, doc_path, _, doc_preview), table|
|
95
|
+
# If a method doesn't have documentation, there's no need to generate the link to it.
|
96
|
+
next if doc_preview.nil? || doc_preview.empty?
|
97
|
+
|
98
|
+
# If the method or class/module is not from the supported namespace, reject it
|
99
|
+
next unless [method_or_class, method_owner].any? do |elem|
|
100
|
+
elem.match?(SUPPORTED_RAILS_DOC_NAMESPACES)
|
101
|
+
end
|
102
|
+
|
103
|
+
owner = method_owner.empty? ? method_or_class : method_owner
|
104
|
+
table[method_or_class] ||= []
|
105
|
+
# It's possible to have multiple modules defining the same method name. For example,
|
106
|
+
# both `ActiveRecord::FinderMethods` and `ActiveRecord::Associations::CollectionProxy` defines `#find`
|
107
|
+
table[method_or_class] << { owner: owner, url: "#{RAILS_DOC_HOST}/v#{RAILTIES_VERSION}/#{doc_path}" }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -25,7 +25,7 @@ module RubyLsp
|
|
25
25
|
@uri = uri
|
26
26
|
@replacements = T.let(
|
27
27
|
offense.correctable? ? offense_replacements : [],
|
28
|
-
T::Array[LanguageServer::Protocol::Interface::TextEdit]
|
28
|
+
T::Array[LanguageServer::Protocol::Interface::TextEdit],
|
29
29
|
)
|
30
30
|
end
|
31
31
|
|
@@ -49,11 +49,11 @@ module RubyLsp
|
|
49
49
|
LanguageServer::Protocol::Interface::TextDocumentEdit.new(
|
50
50
|
text_document: LanguageServer::Protocol::Interface::OptionalVersionedTextDocumentIdentifier.new(
|
51
51
|
uri: @uri,
|
52
|
-
version: nil
|
52
|
+
version: nil,
|
53
53
|
),
|
54
|
-
edits: @replacements
|
54
|
+
edits: @replacements,
|
55
55
|
),
|
56
|
-
]
|
56
|
+
],
|
57
57
|
),
|
58
58
|
is_preferred: true,
|
59
59
|
)
|
@@ -76,13 +76,13 @@ module RubyLsp
|
|
76
76
|
range: LanguageServer::Protocol::Interface::Range.new(
|
77
77
|
start: LanguageServer::Protocol::Interface::Position.new(
|
78
78
|
line: @offense.line - 1,
|
79
|
-
character: @offense.column
|
79
|
+
character: @offense.column,
|
80
80
|
),
|
81
81
|
end: LanguageServer::Protocol::Interface::Position.new(
|
82
82
|
line: @offense.last_line - 1,
|
83
|
-
character: @offense.last_column
|
84
|
-
)
|
85
|
-
)
|
83
|
+
character: @offense.last_column,
|
84
|
+
),
|
85
|
+
),
|
86
86
|
)
|
87
87
|
end
|
88
88
|
|
@@ -95,9 +95,9 @@ module RubyLsp
|
|
95
95
|
range: LanguageServer::Protocol::Interface::Range.new(
|
96
96
|
start: LanguageServer::Protocol::Interface::Position.new(line: range.line - 1, character: range.column),
|
97
97
|
end: LanguageServer::Protocol::Interface::Position.new(line: range.last_line - 1,
|
98
|
-
character: range.last_column)
|
98
|
+
character: range.last_column),
|
99
99
|
),
|
100
|
-
new_text: replacement
|
100
|
+
new_text: replacement,
|
101
101
|
)
|
102
102
|
end
|
103
103
|
end
|
data/lib/ruby_lsp/requests.rb
CHANGED
@@ -6,6 +6,7 @@ module RubyLsp
|
|
6
6
|
#
|
7
7
|
# - {RubyLsp::Requests::DocumentSymbol}
|
8
8
|
# - {RubyLsp::Requests::DocumentLink}
|
9
|
+
# - {RubyLsp::Requests::Hover}
|
9
10
|
# - {RubyLsp::Requests::FoldingRanges}
|
10
11
|
# - {RubyLsp::Requests::SelectionRanges}
|
11
12
|
# - {RubyLsp::Requests::SemanticHighlighting}
|
@@ -14,10 +15,13 @@ module RubyLsp
|
|
14
15
|
# - {RubyLsp::Requests::Diagnostics}
|
15
16
|
# - {RubyLsp::Requests::CodeActions}
|
16
17
|
# - {RubyLsp::Requests::DocumentHighlight}
|
18
|
+
# - {RubyLsp::Requests::InlayHints}
|
19
|
+
|
17
20
|
module Requests
|
18
21
|
autoload :BaseRequest, "ruby_lsp/requests/base_request"
|
19
22
|
autoload :DocumentSymbol, "ruby_lsp/requests/document_symbol"
|
20
23
|
autoload :DocumentLink, "ruby_lsp/requests/document_link"
|
24
|
+
autoload :Hover, "ruby_lsp/requests/hover"
|
21
25
|
autoload :FoldingRanges, "ruby_lsp/requests/folding_ranges"
|
22
26
|
autoload :SelectionRanges, "ruby_lsp/requests/selection_ranges"
|
23
27
|
autoload :SemanticHighlighting, "ruby_lsp/requests/semantic_highlighting"
|
@@ -26,6 +30,7 @@ module RubyLsp
|
|
26
30
|
autoload :Diagnostics, "ruby_lsp/requests/diagnostics"
|
27
31
|
autoload :CodeActions, "ruby_lsp/requests/code_actions"
|
28
32
|
autoload :DocumentHighlight, "ruby_lsp/requests/document_highlight"
|
33
|
+
autoload :InlayHints, "ruby_lsp/requests/inlay_hints"
|
29
34
|
|
30
35
|
# :nodoc:
|
31
36
|
module Support
|
data/lib/ruby_lsp/server.rb
CHANGED
@@ -15,7 +15,7 @@ module RubyLsp
|
|
15
15
|
hierarchical_document_symbol_support: true,
|
16
16
|
symbol_kind: {
|
17
17
|
value_set: Requests::DocumentSymbol::SYMBOL_KIND.values,
|
18
|
-
}
|
18
|
+
},
|
19
19
|
)
|
20
20
|
end
|
21
21
|
|
@@ -23,6 +23,10 @@ module RubyLsp
|
|
23
23
|
Interface::DocumentLinkOptions.new(resolve_provider: false)
|
24
24
|
end
|
25
25
|
|
26
|
+
hover_provider = if enabled_features.include?("hover")
|
27
|
+
Interface::HoverClientCapabilities.new(dynamic_registration: false)
|
28
|
+
end
|
29
|
+
|
26
30
|
folding_ranges_provider = if enabled_features.include?("foldingRanges")
|
27
31
|
Interface::FoldingRangeClientCapabilities.new(line_folding_only: true)
|
28
32
|
end
|
@@ -32,12 +36,12 @@ module RubyLsp
|
|
32
36
|
document_selector: { scheme: "file", language: "ruby" },
|
33
37
|
legend: Interface::SemanticTokensLegend.new(
|
34
38
|
token_types: Requests::SemanticHighlighting::TOKEN_TYPES.keys,
|
35
|
-
token_modifiers: Requests::SemanticHighlighting::TOKEN_MODIFIERS.keys
|
39
|
+
token_modifiers: Requests::SemanticHighlighting::TOKEN_MODIFIERS.keys,
|
36
40
|
),
|
37
41
|
range: false,
|
38
42
|
full: {
|
39
43
|
delta: true,
|
40
|
-
}
|
44
|
+
},
|
41
45
|
)
|
42
46
|
end
|
43
47
|
|
@@ -51,10 +55,14 @@ module RubyLsp
|
|
51
55
|
on_type_formatting_provider = if enabled_features.include?("onTypeFormatting")
|
52
56
|
Interface::DocumentOnTypeFormattingOptions.new(
|
53
57
|
first_trigger_character: "{",
|
54
|
-
more_trigger_character: ["\n", "|"]
|
58
|
+
more_trigger_character: ["\n", "|"],
|
55
59
|
)
|
56
60
|
end
|
57
61
|
|
62
|
+
inlay_hint_provider = if enabled_features.include?("inlayHint")
|
63
|
+
Interface::InlayHintOptions.new(resolve_provider: false)
|
64
|
+
end
|
65
|
+
|
58
66
|
Interface::InitializeResult.new(
|
59
67
|
capabilities: Interface::ServerCapabilities.new(
|
60
68
|
text_document_sync: Interface::TextDocumentSyncOptions.new(
|
@@ -62,6 +70,7 @@ module RubyLsp
|
|
62
70
|
open_close: true,
|
63
71
|
),
|
64
72
|
selection_range_provider: enabled_features.include?("selectionRanges"),
|
73
|
+
hover_provider: hover_provider,
|
65
74
|
document_symbol_provider: document_symbol_provider,
|
66
75
|
document_link_provider: document_link_provider,
|
67
76
|
folding_range_provider: folding_ranges_provider,
|
@@ -71,7 +80,8 @@ module RubyLsp
|
|
71
80
|
code_action_provider: enabled_features.include?("codeActions"),
|
72
81
|
document_on_type_formatting_provider: on_type_formatting_provider,
|
73
82
|
diagnostic_provider: diagnostics_provider,
|
74
|
-
|
83
|
+
inlay_hint_provider: inlay_hint_provider,
|
84
|
+
),
|
75
85
|
)
|
76
86
|
end
|
77
87
|
|
@@ -111,6 +121,13 @@ module RubyLsp
|
|
111
121
|
end
|
112
122
|
end
|
113
123
|
|
124
|
+
on("textDocument/hover") do |request|
|
125
|
+
position = request.dig(:params, :position)
|
126
|
+
document = store.get(request.dig(:params, :textDocument, :uri))
|
127
|
+
|
128
|
+
RubyLsp::Requests::Hover.new(document, position).run
|
129
|
+
end
|
130
|
+
|
114
131
|
on("textDocument/foldingRange", parallel: true) do |request|
|
115
132
|
store.cache_fetch(request.dig(:params, :textDocument, :uri), :folding_ranges) do |document|
|
116
133
|
Requests::FoldingRanges.new(document).run
|
@@ -144,9 +161,9 @@ module RubyLsp
|
|
144
161
|
T.cast(
|
145
162
|
Requests::SemanticHighlighting.new(
|
146
163
|
document,
|
147
|
-
encoder: Requests::Support::SemanticTokenEncoder.new
|
164
|
+
encoder: Requests::Support::SemanticTokenEncoder.new,
|
148
165
|
).run,
|
149
|
-
LanguageServer::Protocol::Interface::SemanticTokens
|
166
|
+
LanguageServer::Protocol::Interface::SemanticTokens,
|
150
167
|
)
|
151
168
|
end
|
152
169
|
end
|
@@ -170,9 +187,7 @@ module RubyLsp
|
|
170
187
|
on("textDocument/documentHighlight", parallel: true) do |request|
|
171
188
|
document = store.get(request.dig(:params, :textDocument, :uri))
|
172
189
|
|
173
|
-
|
174
|
-
Requests::DocumentHighlight.new(document, request.dig(:params, :position)).run
|
175
|
-
end
|
190
|
+
Requests::DocumentHighlight.new(document, request.dig(:params, :position)).run
|
176
191
|
end
|
177
192
|
|
178
193
|
on("textDocument/codeAction", parallel: true) do |request|
|
@@ -186,6 +201,15 @@ module RubyLsp
|
|
186
201
|
end
|
187
202
|
end
|
188
203
|
|
204
|
+
on("textDocument/inlayHint", parallel: true) do |request|
|
205
|
+
document = store.get(request.dig(:params, :textDocument, :uri))
|
206
|
+
range = request.dig(:params, :range)
|
207
|
+
start_line = range.dig(:start, :line)
|
208
|
+
end_line = range.dig(:end, :line)
|
209
|
+
|
210
|
+
Requests::InlayHints.new(document, start_line..end_line).run
|
211
|
+
end
|
212
|
+
|
189
213
|
on("$/cancelRequest") do |request|
|
190
214
|
cancel_request(request[:params][:id])
|
191
215
|
Handler::VOID
|
data/lib/ruby_lsp/store.rb
CHANGED
@@ -54,14 +54,11 @@ module RubyLsp
|
|
54
54
|
.params(
|
55
55
|
uri: String,
|
56
56
|
request_name: Symbol,
|
57
|
-
block: T.proc.params(document: Document).returns(T.type_parameter(:T))
|
58
|
-
).returns(T.
|
57
|
+
block: T.proc.params(document: Document).returns(T.type_parameter(:T)),
|
58
|
+
).returns(T.type_parameter(:T))
|
59
59
|
end
|
60
60
|
def cache_fetch(uri, request_name, &block)
|
61
|
-
|
62
|
-
return unless document.parsed?
|
63
|
-
|
64
|
-
document.cache_fetch(request_name, &block)
|
61
|
+
get(uri).cache_fetch(request_name, &block)
|
65
62
|
end
|
66
63
|
end
|
67
64
|
end
|
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.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-10-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: language_server-protocol
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 3.6.3
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 3.6.3
|
55
55
|
description: An opinionated language server for Ruby
|
56
56
|
email:
|
57
57
|
- ruby@shopify.com
|
@@ -60,7 +60,6 @@ executables:
|
|
60
60
|
extensions: []
|
61
61
|
extra_rdoc_files: []
|
62
62
|
files:
|
63
|
-
- CHANGELOG.md
|
64
63
|
- LICENSE.txt
|
65
64
|
- README.md
|
66
65
|
- VERSION
|
@@ -79,10 +78,13 @@ files:
|
|
79
78
|
- lib/ruby_lsp/requests/document_symbol.rb
|
80
79
|
- lib/ruby_lsp/requests/folding_ranges.rb
|
81
80
|
- lib/ruby_lsp/requests/formatting.rb
|
81
|
+
- lib/ruby_lsp/requests/hover.rb
|
82
|
+
- lib/ruby_lsp/requests/inlay_hints.rb
|
82
83
|
- lib/ruby_lsp/requests/on_type_formatting.rb
|
83
84
|
- lib/ruby_lsp/requests/selection_ranges.rb
|
84
85
|
- lib/ruby_lsp/requests/semantic_highlighting.rb
|
85
86
|
- lib/ruby_lsp/requests/support/highlight_target.rb
|
87
|
+
- lib/ruby_lsp/requests/support/rails_document_client.rb
|
86
88
|
- lib/ruby_lsp/requests/support/rubocop_diagnostic.rb
|
87
89
|
- lib/ruby_lsp/requests/support/rubocop_diagnostics_runner.rb
|
88
90
|
- lib/ruby_lsp/requests/support/rubocop_formatting_runner.rb
|