ruby-lsp 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3e09a85000549c0b7b7dd2886b49d44ca2e32b830616a4af7181a2d7952f948f
4
- data.tar.gz: f19b017ebffce3a090d9fe9c39c94cb0dad75a7a74856c099443839524d513f3
3
+ metadata.gz: 62174da68ba92c0af61878221168a02398c9b3df2867b63c063850b1787c7104
4
+ data.tar.gz: dc3d2e17e3fe2dcbb6578902eb3b672babc72d0f10511c021db767cfde709b0b
5
5
  SHA512:
6
- metadata.gz: e0b75fa95c43a4a15a46e3cd663b5dd637c9288497116b356eb69dc3f831cfdbb3e167c1c578b68feee715e85c72d26c7d63236e3250552ddbf0f2db334e8f46
7
- data.tar.gz: c80518dba77375f07f9944f0401f6836ca69bba60ba6723677e33e366104dd69b70832e8ce76c05312b47c3a032a5308711505e88be2ce69f3f837bec2db3c21
6
+ metadata.gz: c8295ce6739f9452dd20cab22ebb19fb099040f4782afa4dfd63b423b08ad73eedeb1fccc33113dcd7b27d38745e7112a6d272ea28652e00102a870c18c51b96
7
+ data.tar.gz: 1e1a2a681dcdf97bbb1f667211111b89ca274c1d89745bcd3cf8511fbc3d41416d0bb5a45f2fcaf85feb8b0469a5441b5500148136f849657d263531ffe5ff8a
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.2
1
+ 0.3.3
@@ -38,7 +38,7 @@ module RubyLsp
38
38
  type_parameters(:T)
39
39
  .params(
40
40
  request_name: Symbol,
41
- block: T.proc.params(document: Document).returns(T.type_parameter(:T))
41
+ block: T.proc.params(document: Document).returns(T.type_parameter(:T)),
42
42
  ).returns(T.type_parameter(:T))
43
43
  end
44
44
  def cache_fetch(request_name, &block)
@@ -26,7 +26,7 @@ module RubyLsp
26
26
  # for displaying window messages on errors
27
27
  sig do
28
28
  params(
29
- block: T.proc.bind(Handler).params(error: Exception, request: T::Hash[Symbol, T.untyped]).void
29
+ block: T.proc.bind(Handler).params(error: Exception, request: T::Hash[Symbol, T.untyped]).void,
30
30
  ).void
31
31
  end
32
32
  def on_error(&block)
@@ -85,7 +85,7 @@ module RubyLsp
85
85
  params(
86
86
  msg: String,
87
87
  parallel: T::Boolean,
88
- blk: T.proc.bind(Handler).params(request: T::Hash[Symbol, T.untyped]).returns(T.untyped)
88
+ blk: T.proc.bind(Handler).params(request: T::Hash[Symbol, T.untyped]).returns(T.untyped),
89
89
  ).returns(RequestHandler)
90
90
  end
91
91
  def on(msg, parallel: false, &blk)
@@ -103,7 +103,7 @@ module RubyLsp
103
103
  def clear_diagnostics(uri)
104
104
  @writer.write(
105
105
  method: "textDocument/publishDiagnostics",
106
- params: Interface::PublishDiagnosticsParams.new(uri: uri, diagnostics: [])
106
+ params: Interface::PublishDiagnosticsParams.new(uri: uri, diagnostics: []),
107
107
  )
108
108
  end
109
109
 
@@ -111,7 +111,7 @@ module RubyLsp
111
111
  def show_message(type, message)
112
112
  @writer.write(
113
113
  method: "window/showMessage",
114
- params: Interface::ShowMessageParams.new(type: type, message: message)
114
+ params: Interface::ShowMessageParams.new(type: type, message: message),
115
115
  )
116
116
  end
117
117
  end
@@ -28,7 +28,7 @@ module RubyLsp
28
28
  sig do
29
29
  params(
30
30
  writer: LanguageServer::Protocol::Transport::Stdio::Writer,
31
- handlers: T::Hash[String, Handler::RequestHandler]
31
+ handlers: T::Hash[String, Handler::RequestHandler],
32
32
  ).void
33
33
  end
34
34
  def initialize(writer, handlers)
@@ -94,7 +94,7 @@ module RubyLsp
94
94
  sig do
95
95
  params(
96
96
  result: Result,
97
- request: T::Hash[Symbol, T.untyped]
97
+ request: T::Hash[Symbol, T.untyped],
98
98
  ).void
99
99
  end
100
100
  def finalize_request(result, request)
@@ -107,7 +107,7 @@ module RubyLsp
107
107
  id: request[:id],
108
108
  error: {
109
109
  code: LanguageServer::Protocol::Constant::ErrorCodes::INTERNAL_ERROR,
110
- message: result.error.inspect,
110
+ message: error.inspect,
111
111
  data: request.to_json,
112
112
  },
113
113
  )
@@ -117,7 +117,7 @@ module RubyLsp
117
117
 
118
118
  request_time = result.request_time
119
119
  if request_time
120
- @writer.write(method: "telemetry/event", params: telemetry_params(request, request_time, result.error))
120
+ @writer.write(method: "telemetry/event", params: telemetry_params(request, request_time, error))
121
121
  end
122
122
  end
123
123
  end
@@ -152,7 +152,7 @@ module RubyLsp
152
152
  params(
153
153
  request: T::Hash[Symbol, T.untyped],
154
154
  request_time: Float,
155
- error: T.nilable(Exception)
155
+ error: T.nilable(Exception),
156
156
  ).returns(T::Hash[Symbol, T.any(String, Float)])
157
157
  end
158
158
  def telemetry_params(request, request_time, error)
@@ -167,6 +167,12 @@ module RubyLsp
167
167
  if error
168
168
  params[:errorClass] = error.class.name
169
169
  params[:errorMessage] = error.message
170
+
171
+ log_params = request[:params]&.reject { |k, _| k == :textDocument }
172
+ params[:params] = log_params.to_json if log_params&.any?
173
+
174
+ backtrace = error.backtrace
175
+ params[:backtrace] = backtrace.map { |bt| bt.sub(/^#{Dir.home}/, "~") }.join("\n") if backtrace
170
176
  end
171
177
 
172
178
  params[:uri] = uri.sub(%r{.*://#{Dir.home}}, "~") if uri
@@ -23,7 +23,7 @@ module RubyLsp
23
23
  params(
24
24
  uri: String,
25
25
  document: Document,
26
- range: T::Range[Integer]
26
+ range: T::Range[Integer],
27
27
  ).void
28
28
  end
29
29
  def initialize(uri, document, range)
@@ -33,7 +33,7 @@ module RubyLsp
33
33
  T.any(
34
34
  T.all(T::Array[Support::RuboCopDiagnostic], Object),
35
35
  T.all(T::Array[Support::SyntaxErrorDiagnostic], Object),
36
- )
36
+ ),
37
37
  )
38
38
  end
39
39
  def run
@@ -43,7 +43,7 @@ module RubyLsp
43
43
  @highlights
44
44
  end
45
45
 
46
- sig { params(node: T.nilable(SyntaxTree::Node)).void }
46
+ sig { override.params(node: T.nilable(SyntaxTree::Node)).void }
47
47
  def visit(node)
48
48
  return if node.nil?
49
49
 
@@ -25,7 +25,7 @@ module RubyLsp
25
25
  [*::Gem::Specification.default_stubs, *::Gem::Specification.stubs].map! do |s|
26
26
  [s.name, s.version.to_s]
27
27
  end.to_h.freeze,
28
- T::Hash[String, String]
28
+ T::Hash[String, String],
29
29
  )
30
30
 
31
31
  class << self
@@ -82,7 +82,7 @@ module RubyLsp
82
82
  @links
83
83
  end
84
84
 
85
- sig { params(node: SyntaxTree::Comment).void }
85
+ sig { override.params(node: SyntaxTree::Comment).void }
86
86
  def visit_comment(node)
87
87
  match = node.value.match(%r{source://.*#\d+$})
88
88
  return unless match
@@ -95,7 +95,7 @@ module RubyLsp
95
95
  @links << LanguageServer::Protocol::Interface::DocumentLink.new(
96
96
  range: range_from_syntax_tree_node(node),
97
97
  target: "file://#{file_path}##{uri.line_number}",
98
- tooltip: "Jump to #{file_path}##{uri.line_number}"
98
+ tooltip: "Jump to #{file_path}##{uri.line_number}",
99
99
  )
100
100
  end
101
101
 
@@ -79,7 +79,7 @@ module RubyLsp
79
79
  @root = T.let(SymbolHierarchyRoot.new, SymbolHierarchyRoot)
80
80
  @stack = T.let(
81
81
  [@root],
82
- T::Array[T.any(SymbolHierarchyRoot, LanguageServer::Protocol::Interface::DocumentSymbol)]
82
+ T::Array[T.any(SymbolHierarchyRoot, LanguageServer::Protocol::Interface::DocumentSymbol)],
83
83
  )
84
84
  end
85
85
 
@@ -89,13 +89,13 @@ module RubyLsp
89
89
  @root.children
90
90
  end
91
91
 
92
- sig { params(node: SyntaxTree::ClassDeclaration).void }
92
+ sig { override.params(node: SyntaxTree::ClassDeclaration).void }
93
93
  def visit_class(node)
94
94
  symbol = create_document_symbol(
95
95
  name: fully_qualified_name(node),
96
96
  kind: :class,
97
97
  range_node: node,
98
- selection_range_node: node.constant
98
+ selection_range_node: node.constant,
99
99
  )
100
100
 
101
101
  @stack << symbol
@@ -103,7 +103,7 @@ module RubyLsp
103
103
  @stack.pop
104
104
  end
105
105
 
106
- sig { params(node: SyntaxTree::Command).void }
106
+ sig { override.params(node: SyntaxTree::Command).void }
107
107
  def visit_command(node)
108
108
  return unless ATTR_ACCESSORS.include?(node.message.value)
109
109
 
@@ -114,22 +114,22 @@ module RubyLsp
114
114
  name: argument.value.value,
115
115
  kind: :field,
116
116
  range_node: argument,
117
- selection_range_node: argument.value
117
+ selection_range_node: argument.value,
118
118
  )
119
119
  end
120
120
  end
121
121
 
122
- sig { params(node: SyntaxTree::ConstPathField).void }
122
+ sig { override.params(node: SyntaxTree::ConstPathField).void }
123
123
  def visit_const_path_field(node)
124
124
  create_document_symbol(
125
125
  name: node.constant.value,
126
126
  kind: :constant,
127
127
  range_node: node,
128
- selection_range_node: node.constant
128
+ selection_range_node: node.constant,
129
129
  )
130
130
  end
131
131
 
132
- sig { params(node: SyntaxTree::Def).void }
132
+ sig { override.params(node: SyntaxTree::Def).void }
133
133
  def visit_def(node)
134
134
  name = node.name.value
135
135
 
@@ -137,7 +137,7 @@ module RubyLsp
137
137
  name: name,
138
138
  kind: name == "initialize" ? :constructor : :method,
139
139
  range_node: node,
140
- selection_range_node: node.name
140
+ selection_range_node: node.name,
141
141
  )
142
142
 
143
143
  @stack << symbol
@@ -145,7 +145,7 @@ module RubyLsp
145
145
  @stack.pop
146
146
  end
147
147
 
148
- sig { params(node: SyntaxTree::DefEndless).void }
148
+ sig { override.params(node: SyntaxTree::DefEndless).void }
149
149
  def visit_def_endless(node)
150
150
  name = node.name.value
151
151
 
@@ -153,7 +153,7 @@ module RubyLsp
153
153
  name: name,
154
154
  kind: name == "initialize" ? :constructor : :method,
155
155
  range_node: node,
156
- selection_range_node: node.name
156
+ selection_range_node: node.name,
157
157
  )
158
158
 
159
159
  @stack << symbol
@@ -161,13 +161,13 @@ module RubyLsp
161
161
  @stack.pop
162
162
  end
163
163
 
164
- sig { params(node: SyntaxTree::Defs).void }
164
+ sig { override.params(node: SyntaxTree::Defs).void }
165
165
  def visit_defs(node)
166
166
  symbol = create_document_symbol(
167
167
  name: "self.#{node.name.value}",
168
168
  kind: :method,
169
169
  range_node: node,
170
- selection_range_node: node.name
170
+ selection_range_node: node.name,
171
171
  )
172
172
 
173
173
  @stack << symbol
@@ -175,13 +175,13 @@ module RubyLsp
175
175
  @stack.pop
176
176
  end
177
177
 
178
- sig { params(node: SyntaxTree::ModuleDeclaration).void }
178
+ sig { override.params(node: SyntaxTree::ModuleDeclaration).void }
179
179
  def visit_module(node)
180
180
  symbol = create_document_symbol(
181
181
  name: fully_qualified_name(node),
182
182
  kind: :module,
183
183
  range_node: node,
184
- selection_range_node: node.constant
184
+ selection_range_node: node.constant,
185
185
  )
186
186
 
187
187
  @stack << symbol
@@ -189,17 +189,17 @@ module RubyLsp
189
189
  @stack.pop
190
190
  end
191
191
 
192
- sig { params(node: SyntaxTree::TopConstField).void }
192
+ sig { override.params(node: SyntaxTree::TopConstField).void }
193
193
  def visit_top_const_field(node)
194
194
  create_document_symbol(
195
195
  name: node.constant.value,
196
196
  kind: :constant,
197
197
  range_node: node,
198
- selection_range_node: node.constant
198
+ selection_range_node: node.constant,
199
199
  )
200
200
  end
201
201
 
202
- sig { params(node: SyntaxTree::VarField).void }
202
+ sig { override.params(node: SyntaxTree::VarField).void }
203
203
  def visit_var_field(node)
204
204
  kind = case node.value
205
205
  when SyntaxTree::Const
@@ -214,7 +214,7 @@ module RubyLsp
214
214
  name: node.value.value,
215
215
  kind: kind,
216
216
  range_node: node,
217
- selection_range_node: node.value
217
+ selection_range_node: node.value,
218
218
  )
219
219
  end
220
220
 
@@ -225,7 +225,7 @@ module RubyLsp
225
225
  name: String,
226
226
  kind: Symbol,
227
227
  range_node: SyntaxTree::Node,
228
- selection_range_node: SyntaxTree::Node
228
+ selection_range_node: SyntaxTree::Node,
229
229
  ).returns(LanguageServer::Protocol::Interface::DocumentSymbol)
230
230
  end
231
231
  def create_document_symbol(name:, kind:, range_node:, selection_range_node:)
@@ -73,7 +73,7 @@ module RubyLsp
73
73
 
74
74
  private
75
75
 
76
- sig { params(node: T.nilable(SyntaxTree::Node)).void }
76
+ sig { override.params(node: T.nilable(SyntaxTree::Node)).void }
77
77
  def visit(node)
78
78
  return unless handle_partial_range(node)
79
79
 
@@ -137,7 +137,7 @@ module RubyLsp
137
137
  LanguageServer::Protocol::Interface::FoldingRange.new(
138
138
  start_line: @start_line,
139
139
  end_line: @end_line,
140
- kind: @kind
140
+ kind: @kind,
141
141
  )
142
142
  end
143
143
 
@@ -248,7 +248,7 @@ module RubyLsp
248
248
  @ranges << LanguageServer::Protocol::Interface::FoldingRange.new(
249
249
  start_line: start_line - 1,
250
250
  end_line: end_line - 1,
251
- kind: "region"
251
+ kind: "region",
252
252
  )
253
253
  end
254
254
  end
@@ -42,9 +42,9 @@ module RubyLsp
42
42
  LanguageServer::Protocol::Interface::TextEdit.new(
43
43
  range: LanguageServer::Protocol::Interface::Range.new(
44
44
  start: LanguageServer::Protocol::Interface::Position.new(line: 0, character: 0),
45
- end: LanguageServer::Protocol::Interface::Position.new(line: size, character: size)
45
+ end: LanguageServer::Protocol::Interface::Position.new(line: size, character: size),
46
46
  ),
47
- new_text: formatted_text
47
+ new_text: formatted_text,
48
48
  ),
49
49
  ]
50
50
  end
@@ -0,0 +1,56 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module RubyLsp
5
+ module Requests
6
+ # ![Inlay hint demo](../../misc/inlay_hint.gif)
7
+ #
8
+ # [Inlay hints](https://microsoft.github.io/language-server-protocol/specification#textDocument_inlayHint)
9
+ # are labels added directly in the code that explicitly show the user something that might
10
+ # otherwise just be implied.
11
+ #
12
+ # # Example
13
+ #
14
+ # ```ruby
15
+ # begin
16
+ # puts "do something that might raise"
17
+ # rescue # Label "StandardError" goes here as a bare rescue implies rescuing StandardError
18
+ # puts "handle some rescue"
19
+ # end
20
+ # ```
21
+ class InlayHints < BaseRequest
22
+ RESCUE_STRING_LENGTH = T.let("rescue".length, Integer)
23
+
24
+ sig { params(document: Document, range: T::Range[Integer]).void }
25
+ def initialize(document, range)
26
+ super(document)
27
+
28
+ @hints = T.let([], T::Array[LanguageServer::Protocol::Interface::InlayHint])
29
+ @range = range
30
+ end
31
+
32
+ sig { override.returns(T.all(T::Array[LanguageServer::Protocol::Interface::InlayHint], Object)) }
33
+ def run
34
+ visit(@document.tree)
35
+ @hints
36
+ end
37
+
38
+ sig { override.params(node: SyntaxTree::Rescue).void }
39
+ def visit_rescue(node)
40
+ return unless node.exception.nil?
41
+
42
+ loc = node.location
43
+ return unless @range.cover?(loc.start_line - 1) && @range.cover?(loc.end_line - 1)
44
+
45
+ @hints << LanguageServer::Protocol::Interface::InlayHint.new(
46
+ position: { line: loc.start_line - 1, character: loc.start_column + RESCUE_STRING_LENGTH },
47
+ label: "StandardError",
48
+ padding_left: true,
49
+ tooltip: "StandardError is implied in a bare rescue",
50
+ )
51
+
52
+ super
53
+ end
54
+ end
55
+ end
56
+ end
@@ -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
 
@@ -76,7 +76,7 @@ module RubyLsp
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,7 +90,7 @@ 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
@@ -100,12 +100,7 @@ module RubyLsp
100
100
  @encoder.encode(@tokens)
101
101
  end
102
102
 
103
- sig { params(node: SyntaxTree::ARefField).void }
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 }
103
+ sig { override.params(node: SyntaxTree::Call).void }
109
104
  def visit_call(node)
110
105
  visit(node.receiver)
111
106
 
@@ -115,32 +110,32 @@ module RubyLsp
115
110
  visit(node.arguments)
116
111
  end
117
112
 
118
- sig { params(node: SyntaxTree::Command).void }
113
+ sig { override.params(node: SyntaxTree::Command).void }
119
114
  def visit_command(node)
120
115
  add_token(node.message.location, :method) unless special_method?(node.message.value)
121
116
  visit(node.arguments)
122
117
  end
123
118
 
124
- sig { params(node: SyntaxTree::CommandCall).void }
119
+ sig { override.params(node: SyntaxTree::CommandCall).void }
125
120
  def visit_command_call(node)
126
121
  visit(node.receiver)
127
122
  add_token(node.message.location, :method)
128
123
  visit(node.arguments)
129
124
  end
130
125
 
131
- sig { params(node: SyntaxTree::Const).void }
126
+ sig { override.params(node: SyntaxTree::Const).void }
132
127
  def visit_const(node)
133
128
  add_token(node.location, :namespace)
134
129
  end
135
130
 
136
- sig { params(node: SyntaxTree::Def).void }
131
+ sig { override.params(node: SyntaxTree::Def).void }
137
132
  def visit_def(node)
138
133
  add_token(node.name.location, :method, [:declaration])
139
134
  visit(node.params)
140
135
  visit(node.bodystmt)
141
136
  end
142
137
 
143
- sig { params(node: SyntaxTree::DefEndless).void }
138
+ sig { override.params(node: SyntaxTree::DefEndless).void }
144
139
  def visit_def_endless(node)
145
140
  add_token(node.name.location, :method, [:declaration])
146
141
  visit(node.paren)
@@ -148,7 +143,7 @@ module RubyLsp
148
143
  visit(node.statement)
149
144
  end
150
145
 
151
- sig { params(node: SyntaxTree::Defs).void }
146
+ sig { override.params(node: SyntaxTree::Defs).void }
152
147
  def visit_defs(node)
153
148
  visit(node.target)
154
149
  visit(node.operator)
@@ -157,13 +152,13 @@ module RubyLsp
157
152
  visit(node.bodystmt)
158
153
  end
159
154
 
160
- sig { params(node: SyntaxTree::FCall).void }
155
+ sig { override.params(node: SyntaxTree::FCall).void }
161
156
  def visit_fcall(node)
162
157
  add_token(node.value.location, :method) unless special_method?(node.value.value)
163
158
  visit(node.arguments)
164
159
  end
165
160
 
166
- sig { params(node: SyntaxTree::Kw).void }
161
+ sig { override.params(node: SyntaxTree::Kw).void }
167
162
  def visit_kw(node)
168
163
  case node.value
169
164
  when "self"
@@ -171,14 +166,7 @@ module RubyLsp
171
166
  end
172
167
  end
173
168
 
174
- sig { params(node: SyntaxTree::MAssign).void }
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 }
169
+ sig { override.params(node: SyntaxTree::Params).void }
182
170
  def visit_params(node)
183
171
  node.keywords.each do |keyword,|
184
172
  location = keyword.location
@@ -196,7 +184,7 @@ module RubyLsp
196
184
  add_token(name.location, :variable) if name
197
185
  end
198
186
 
199
- sig { params(node: SyntaxTree::VarField).void }
187
+ sig { override.params(node: SyntaxTree::VarField).void }
200
188
  def visit_var_field(node)
201
189
  case node.value
202
190
  when SyntaxTree::Ident
@@ -206,7 +194,7 @@ module RubyLsp
206
194
  end
207
195
  end
208
196
 
209
- sig { params(node: SyntaxTree::VarRef).void }
197
+ sig { override.params(node: SyntaxTree::VarRef).void }
210
198
  def visit_var_ref(node)
211
199
  case node.value
212
200
  when SyntaxTree::Ident
@@ -216,19 +204,19 @@ module RubyLsp
216
204
  end
217
205
  end
218
206
 
219
- sig { params(node: SyntaxTree::VCall).void }
207
+ sig { override.params(node: SyntaxTree::VCall).void }
220
208
  def visit_vcall(node)
221
209
  add_token(node.value.location, :method) unless special_method?(node.value.value)
222
210
  end
223
211
 
224
- sig { params(node: SyntaxTree::ClassDeclaration).void }
212
+ sig { override.params(node: SyntaxTree::ClassDeclaration).void }
225
213
  def visit_class(node)
226
214
  add_token(node.constant.location, :class, [:declaration])
227
215
  add_token(node.superclass.location, :class) if node.superclass
228
216
  visit(node.bodystmt)
229
217
  end
230
218
 
231
- sig { params(node: SyntaxTree::ModuleDeclaration).void }
219
+ sig { override.params(node: SyntaxTree::ModuleDeclaration).void }
232
220
  def visit_module(node)
233
221
  add_token(node.constant.location, :class, [:declaration])
234
222
  visit(node.bodystmt)
@@ -243,8 +231,8 @@ module RubyLsp
243
231
  location: location,
244
232
  length: length,
245
233
  type: T.must(TOKEN_TYPES[type]),
246
- modifier: modifiers_indices
247
- )
234
+ modifier: modifiers_indices,
235
+ ),
248
236
  )
249
237
  end
250
238
 
@@ -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
@@ -7,6 +7,12 @@ rescue LoadError
7
7
  return
8
8
  end
9
9
 
10
+ begin
11
+ gem("rubocop", ">= 1.4.0")
12
+ rescue LoadError
13
+ raise StandardError, "Incompatible RuboCop version. Ruby LSP requires >= 1.4.0"
14
+ end
15
+
10
16
  module RubyLsp
11
17
  module Requests
12
18
  module Support
@@ -15,7 +15,7 @@ module RubyLsp
15
15
 
16
16
  sig do
17
17
  params(
18
- tokens: T::Array[SemanticHighlighting::SemanticToken]
18
+ tokens: T::Array[SemanticHighlighting::SemanticToken],
19
19
  ).returns(LanguageServer::Protocol::Interface::SemanticTokens)
20
20
  end
21
21
  def encode(tokens)
@@ -30,7 +30,7 @@ module URI
30
30
  gem_name: String,
31
31
  gem_version: T.nilable(String),
32
32
  path: String,
33
- line_number: T.nilable(String)
33
+ line_number: T.nilable(String),
34
34
  ).returns(URI::Source)
35
35
  end
36
36
  def build(gem_name:, gem_version:, path:, line_number:)
@@ -23,7 +23,7 @@ module RubyLsp
23
23
  message: "Syntax error",
24
24
  source: "SyntaxTree",
25
25
  severity: LanguageServer::Protocol::Constant::DiagnosticSeverity::ERROR,
26
- range: @edit[:range]
26
+ range: @edit[:range],
27
27
  )
28
28
  end
29
29
  end
@@ -14,6 +14,8 @@ module RubyLsp
14
14
  # - {RubyLsp::Requests::Diagnostics}
15
15
  # - {RubyLsp::Requests::CodeActions}
16
16
  # - {RubyLsp::Requests::DocumentHighlight}
17
+ # - {RubyLsp::Requests::InlayHints}
18
+
17
19
  module Requests
18
20
  autoload :BaseRequest, "ruby_lsp/requests/base_request"
19
21
  autoload :DocumentSymbol, "ruby_lsp/requests/document_symbol"
@@ -26,6 +28,7 @@ module RubyLsp
26
28
  autoload :Diagnostics, "ruby_lsp/requests/diagnostics"
27
29
  autoload :CodeActions, "ruby_lsp/requests/code_actions"
28
30
  autoload :DocumentHighlight, "ruby_lsp/requests/document_highlight"
31
+ autoload :InlayHints, "ruby_lsp/requests/inlay_hints"
29
32
 
30
33
  # :nodoc:
31
34
  module Support
@@ -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
 
@@ -32,12 +32,12 @@ module RubyLsp
32
32
  document_selector: { scheme: "file", language: "ruby" },
33
33
  legend: Interface::SemanticTokensLegend.new(
34
34
  token_types: Requests::SemanticHighlighting::TOKEN_TYPES.keys,
35
- token_modifiers: Requests::SemanticHighlighting::TOKEN_MODIFIERS.keys
35
+ token_modifiers: Requests::SemanticHighlighting::TOKEN_MODIFIERS.keys,
36
36
  ),
37
37
  range: false,
38
38
  full: {
39
39
  delta: true,
40
- }
40
+ },
41
41
  )
42
42
  end
43
43
 
@@ -51,10 +51,14 @@ module RubyLsp
51
51
  on_type_formatting_provider = if enabled_features.include?("onTypeFormatting")
52
52
  Interface::DocumentOnTypeFormattingOptions.new(
53
53
  first_trigger_character: "{",
54
- more_trigger_character: ["\n", "|"]
54
+ more_trigger_character: ["\n", "|"],
55
55
  )
56
56
  end
57
57
 
58
+ inlay_hint_provider = if enabled_features.include?("inlayHint")
59
+ Interface::InlayHintOptions.new(resolve_provider: false)
60
+ end
61
+
58
62
  Interface::InitializeResult.new(
59
63
  capabilities: Interface::ServerCapabilities.new(
60
64
  text_document_sync: Interface::TextDocumentSyncOptions.new(
@@ -71,7 +75,8 @@ module RubyLsp
71
75
  code_action_provider: enabled_features.include?("codeActions"),
72
76
  document_on_type_formatting_provider: on_type_formatting_provider,
73
77
  diagnostic_provider: diagnostics_provider,
74
- )
78
+ inlay_hint_provider: inlay_hint_provider,
79
+ ),
75
80
  )
76
81
  end
77
82
 
@@ -144,9 +149,9 @@ module RubyLsp
144
149
  T.cast(
145
150
  Requests::SemanticHighlighting.new(
146
151
  document,
147
- encoder: Requests::Support::SemanticTokenEncoder.new
152
+ encoder: Requests::Support::SemanticTokenEncoder.new,
148
153
  ).run,
149
- LanguageServer::Protocol::Interface::SemanticTokens
154
+ LanguageServer::Protocol::Interface::SemanticTokens,
150
155
  )
151
156
  end
152
157
  end
@@ -186,6 +191,17 @@ module RubyLsp
186
191
  end
187
192
  end
188
193
 
194
+ on("textDocument/inlayHint", parallel: true) do |request|
195
+ document = store.get(request.dig(:params, :textDocument, :uri))
196
+ range = request.dig(:params, :range)
197
+ start_line = range.dig(:start, :line)
198
+ end_line = range.dig(:end, :line)
199
+
200
+ if document.parsed?
201
+ Requests::InlayHints.new(document, start_line..end_line).run
202
+ end
203
+ end
204
+
189
205
  on("$/cancelRequest") do |request|
190
206
  cancel_request(request[:params][:id])
191
207
  Handler::VOID
@@ -54,7 +54,7 @@ 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))
57
+ block: T.proc.params(document: Document).returns(T.type_parameter(:T)),
58
58
  ).returns(T.nilable(T.type_parameter(:T)))
59
59
  end
60
60
  def cache_fetch(uri, request_name, &block)
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.2
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-09-07 00:00:00.000000000 Z
11
+ date: 2022-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: language_server-protocol
@@ -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,6 +78,7 @@ 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/inlay_hints.rb
82
82
  - lib/ruby_lsp/requests/on_type_formatting.rb
83
83
  - lib/ruby_lsp/requests/selection_ranges.rb
84
84
  - lib/ruby_lsp/requests/semantic_highlighting.rb
data/CHANGELOG.md DELETED
@@ -1,75 +0,0 @@
1
- # Change Log
2
-
3
- All notable changes to the "ruby-lsp" extension will be documented in this file.
4
-
5
- Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
6
-
7
- ## [Unreleased]
8
-
9
- ## [0.3.2]
10
-
11
- - Make the diagnostic request parallel (https://github.com/Shopify/ruby-lsp/pull/293)
12
- - Improve worker stability (https://github.com/Shopify/ruby-lsp/pull/295)
13
-
14
- ## [0.3.1]
15
-
16
- - Resolve TODO for LSP v3.17 (https://github.com/Shopify/ruby-lsp/pull/268)
17
- - Add dependency constraint for LSP v3.17 (https://github.com/Shopify/ruby-lsp/pull/269)
18
- - Handle class/module declarations as a class token with declaration modifier (https://github.com/Shopify/ruby-lsp/pull/260)
19
- - Handle required parameters in semantic highlighting (https://github.com/Shopify/ruby-lsp/pull/271)
20
- - Add comment continuation via on type on_type_formatting (https://github.com/Shopify/ruby-lsp/pull/274)
21
- - Make RuboCop runner use composition instead of inheritance (https://github.com/Shopify/ruby-lsp/pull/278)
22
- - Protect worker against cancellation during popping (https://github.com/Shopify/ruby-lsp/pull/280)
23
- - Handle formatting errors in on_error block (https://github.com/Shopify/ruby-lsp/pull/279)
24
- - Fix on type formatting pipe completion for regular or expressions (https://github.com/Shopify/ruby-lsp/pull/282)
25
- - Do not fail on LoadError (https://github.com/Shopify/ruby-lsp/pull/292)
26
-
27
- ## [0.3.0]
28
- - Add on type formatting completions (https://github.com/Shopify/ruby-lsp/pull/253)
29
- - Upgrade syntax_tree requirement to >= 3.4 (https://github.com/Shopify/ruby-lsp/pull/254)
30
- - Show error message when there's a InfiniteCorrectionLoop exception (https://github.com/Shopify/ruby-lsp/pull/252)
31
- - Add request cancellation (https://github.com/Shopify/ruby-lsp/pull/243)
32
-
33
- ## [0.2.0]
34
-
35
- - Add semantic token for keyword and keyword rest params (https://github.com/Shopify/ruby-lsp/pull/142)
36
- - Return error responses on exceptions (https://github.com/Shopify/ruby-lsp/pull/160)
37
- - Sanitize home directory for telemetry (https://github.com/Shopify/ruby-lsp/pull/171)
38
- - Avoid adding semantic tokens for special methods (https://github.com/Shopify/ruby-lsp/pull/162)
39
- - Properly respect excluded files in RuboCop requests (https://github.com/Shopify/ruby-lsp/pull/173)
40
- - Clear diagnostics when closing files (https://github.com/Shopify/ruby-lsp/pull/174)
41
- - Avoid pushing ranges for single line partial ranges (https://github.com/Shopify/ruby-lsp/pull/185)
42
- - Change folding ranges to include closing tokens (https://github.com/Shopify/ruby-lsp/pull/181)
43
- - Remove RuboCop dependency and fallback to SyntaxTree formatting (https://github.com/Shopify/ruby-lsp/pull/184)
44
-
45
- ## [0.1.0]
46
-
47
- - Implement token modifiers in SemanticTokenEncoder ([#112](https://github.com/Shopify/ruby-lsp/pull/112))
48
- - Add semantic token for name in a method definition ([#133](https://github.com/Shopify/ruby-lsp/pull/133))
49
- - Add semantic highighting for def endless and singleton method names ([#134](https://github.com/Shopify/ruby-lsp/pull/134))
50
- - Add semantic token for keyword self ([#137](https://github.com/Shopify/ruby-lsp/pull/137))
51
- - Add semantic token for constants ([#138](https://github.com/Shopify/ruby-lsp/pull/138))
52
- - Improve error handling + fix formatting hanging issue ([#149](https://github.com/Shopify/ruby-lsp/pull/149))
53
- - Set the minimum syntax_tree version to 2.4 ([#151](https://github.com/Shopify/ruby-lsp/pull/151))
54
-
55
- ## [0.0.4]
56
-
57
- - Add basic document highlight (https://github.com/Shopify/ruby-lsp/pull/91)
58
- - Add error telemetry (https://github.com/Shopify/ruby-lsp/pull/100)
59
- - Always push telemetry events from the server (https://github.com/Shopify/ruby-lsp/pull/109)
60
- - Fix multibyte character handling (https://github.com/Shopify/ruby-lsp/pull/122)
61
- - Add Sorbet to the Ruby LSP (https://github.com/Shopify/ruby-lsp/pull/119, https://github.com/Shopify/ruby-lsp/pull/123)
62
-
63
- ## [0.0.3]
64
-
65
- - Fixed code actions return hanging
66
- - Moved to incremental text synchronization
67
- - Added syntax error resiliency
68
-
69
- ## [0.0.2]
70
-
71
- - Alpha release including
72
- - RuboCop formatting, diagnostics and quick fixes
73
- - Folding ranges
74
- - Initial semantic highlighting
75
- - Document symbols