ruby-lsp 0.23.10 → 0.23.12

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.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/VERSION +1 -1
  4. data/exe/ruby-lsp-launcher +12 -11
  5. data/lib/rubocop/cop/ruby_lsp/use_register_with_handler_method.rb +3 -5
  6. data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +52 -77
  7. data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +61 -144
  8. data/lib/ruby_indexer/lib/ruby_indexer/enhancement.rb +8 -6
  9. data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +74 -183
  10. data/lib/ruby_indexer/lib/ruby_indexer/index.rb +55 -181
  11. data/lib/ruby_indexer/lib/ruby_indexer/location.rb +4 -27
  12. data/lib/ruby_indexer/lib/ruby_indexer/prefix_tree.rb +12 -14
  13. data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +21 -44
  14. data/lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb +40 -58
  15. data/lib/ruby_indexer/lib/ruby_indexer/uri.rb +9 -16
  16. data/lib/ruby_indexer/lib/ruby_indexer/visibility_scope.rb +5 -9
  17. data/lib/ruby_indexer/test/classes_and_modules_test.rb +75 -0
  18. data/lib/ruby_indexer/test/configuration_test.rb +32 -2
  19. data/lib/ruby_indexer/test/index_test.rb +21 -0
  20. data/lib/ruby_indexer/test/method_test.rb +2 -2
  21. data/lib/ruby_lsp/addon.rb +32 -67
  22. data/lib/ruby_lsp/base_server.rb +12 -11
  23. data/lib/ruby_lsp/client_capabilities.rb +4 -6
  24. data/lib/ruby_lsp/document.rb +21 -32
  25. data/lib/ruby_lsp/erb_document.rb +17 -27
  26. data/lib/ruby_lsp/global_state.rb +30 -32
  27. data/lib/ruby_lsp/internal.rb +6 -0
  28. data/lib/ruby_lsp/listeners/code_lens.rb +21 -39
  29. data/lib/ruby_lsp/listeners/completion.rb +34 -53
  30. data/lib/ruby_lsp/listeners/definition.rb +35 -49
  31. data/lib/ruby_lsp/listeners/document_highlight.rb +60 -69
  32. data/lib/ruby_lsp/listeners/document_link.rb +9 -19
  33. data/lib/ruby_lsp/listeners/document_symbol.rb +34 -48
  34. data/lib/ruby_lsp/listeners/folding_ranges.rb +31 -38
  35. data/lib/ruby_lsp/listeners/hover.rb +37 -47
  36. data/lib/ruby_lsp/listeners/inlay_hints.rb +3 -10
  37. data/lib/ruby_lsp/listeners/semantic_highlighting.rb +29 -35
  38. data/lib/ruby_lsp/listeners/signature_help.rb +4 -23
  39. data/lib/ruby_lsp/listeners/spec_style.rb +199 -0
  40. data/lib/ruby_lsp/listeners/test_style.rb +270 -0
  41. data/lib/ruby_lsp/node_context.rb +8 -35
  42. data/lib/ruby_lsp/rbs_document.rb +7 -5
  43. data/lib/ruby_lsp/requests/code_action_resolve.rb +10 -10
  44. data/lib/ruby_lsp/requests/code_actions.rb +5 -14
  45. data/lib/ruby_lsp/requests/code_lens.rb +4 -13
  46. data/lib/ruby_lsp/requests/completion.rb +4 -15
  47. data/lib/ruby_lsp/requests/completion_resolve.rb +4 -4
  48. data/lib/ruby_lsp/requests/definition.rb +4 -12
  49. data/lib/ruby_lsp/requests/diagnostics.rb +6 -9
  50. data/lib/ruby_lsp/requests/discover_tests.rb +74 -0
  51. data/lib/ruby_lsp/requests/document_highlight.rb +3 -11
  52. data/lib/ruby_lsp/requests/document_link.rb +4 -13
  53. data/lib/ruby_lsp/requests/document_symbol.rb +4 -7
  54. data/lib/ruby_lsp/requests/folding_ranges.rb +4 -7
  55. data/lib/ruby_lsp/requests/formatting.rb +4 -7
  56. data/lib/ruby_lsp/requests/go_to_relevant_file.rb +87 -0
  57. data/lib/ruby_lsp/requests/hover.rb +6 -16
  58. data/lib/ruby_lsp/requests/inlay_hints.rb +4 -13
  59. data/lib/ruby_lsp/requests/on_type_formatting.rb +17 -24
  60. data/lib/ruby_lsp/requests/prepare_rename.rb +3 -8
  61. data/lib/ruby_lsp/requests/prepare_type_hierarchy.rb +4 -13
  62. data/lib/ruby_lsp/requests/range_formatting.rb +3 -4
  63. data/lib/ruby_lsp/requests/references.rb +5 -35
  64. data/lib/ruby_lsp/requests/rename.rb +9 -35
  65. data/lib/ruby_lsp/requests/request.rb +5 -17
  66. data/lib/ruby_lsp/requests/selection_ranges.rb +3 -3
  67. data/lib/ruby_lsp/requests/semantic_highlighting.rb +6 -23
  68. data/lib/ruby_lsp/requests/show_syntax_tree.rb +4 -5
  69. data/lib/ruby_lsp/requests/signature_help.rb +6 -24
  70. data/lib/ruby_lsp/requests/support/annotation.rb +4 -10
  71. data/lib/ruby_lsp/requests/support/common.rb +12 -47
  72. data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +12 -14
  73. data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +7 -10
  74. data/lib/ruby_lsp/requests/support/rubocop_runner.rb +9 -15
  75. data/lib/ruby_lsp/requests/support/selection_range.rb +1 -3
  76. data/lib/ruby_lsp/requests/support/sorbet.rb +1 -7
  77. data/lib/ruby_lsp/requests/support/source_uri.rb +5 -16
  78. data/lib/ruby_lsp/requests/support/syntax_tree_formatter.rb +7 -10
  79. data/lib/ruby_lsp/requests/support/test_item.rb +60 -0
  80. data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +4 -5
  81. data/lib/ruby_lsp/requests/workspace_symbol.rb +3 -3
  82. data/lib/ruby_lsp/response_builders/collection_response_builder.rb +4 -4
  83. data/lib/ruby_lsp/response_builders/document_symbol.rb +8 -11
  84. data/lib/ruby_lsp/response_builders/hover.rb +5 -5
  85. data/lib/ruby_lsp/response_builders/response_builder.rb +1 -1
  86. data/lib/ruby_lsp/response_builders/semantic_highlighting.rb +18 -40
  87. data/lib/ruby_lsp/response_builders/signature_help.rb +4 -5
  88. data/lib/ruby_lsp/response_builders/test_collection.rb +34 -0
  89. data/lib/ruby_lsp/ruby_document.rb +15 -40
  90. data/lib/ruby_lsp/ruby_lsp_reporter_plugin.rb +106 -0
  91. data/lib/ruby_lsp/scope.rb +6 -10
  92. data/lib/ruby_lsp/server.rb +169 -72
  93. data/lib/ruby_lsp/setup_bundler.rb +25 -17
  94. data/lib/ruby_lsp/store.rb +12 -28
  95. data/lib/ruby_lsp/test_helper.rb +3 -12
  96. data/lib/ruby_lsp/test_reporter.rb +71 -0
  97. data/lib/ruby_lsp/test_unit_test_runner.rb +96 -0
  98. data/lib/ruby_lsp/type_inferrer.rb +9 -13
  99. data/lib/ruby_lsp/utils.rb +27 -65
  100. metadata +12 -3
@@ -3,23 +3,17 @@
3
3
 
4
4
  module RubyLsp
5
5
  class ERBDocument < Document
6
- extend T::Sig
7
6
  extend T::Generic
8
7
 
9
8
  ParseResultType = type_member { { fixed: Prism::ParseResult } }
10
9
 
11
- sig { returns(String) }
10
+ #: String
12
11
  attr_reader :host_language_source
13
12
 
14
- sig do
15
- returns(T.any(
16
- T.proc.params(arg0: Integer).returns(Integer),
17
- Prism::CodeUnitsCache,
18
- ))
19
- end
13
+ #: (^(Integer arg0) -> Integer | Prism::CodeUnitsCache)
20
14
  attr_reader :code_units_cache
21
15
 
22
- sig { params(source: String, version: Integer, uri: URI::Generic, global_state: GlobalState).void }
16
+ #: (source: String, version: Integer, uri: URI::Generic, global_state: GlobalState) -> void
23
17
  def initialize(source:, version:, uri:, global_state:)
24
18
  # This has to be initialized before calling super because we call `parse` in the parent constructor, which
25
19
  # overrides this with the proper virtual host language source
@@ -31,7 +25,8 @@ module RubyLsp
31
25
  ))
32
26
  end
33
27
 
34
- sig { override.returns(T::Boolean) }
28
+ # @override
29
+ #: -> bool
35
30
  def parse!
36
31
  return false unless @needs_parsing
37
32
 
@@ -46,22 +41,19 @@ module RubyLsp
46
41
  true
47
42
  end
48
43
 
49
- sig { override.returns(T::Boolean) }
44
+ # @override
45
+ #: -> bool
50
46
  def syntax_error?
51
47
  @parse_result.failure?
52
48
  end
53
49
 
54
- sig { override.returns(LanguageId) }
50
+ # @override
51
+ #: -> LanguageId
55
52
  def language_id
56
53
  LanguageId::ERB
57
54
  end
58
55
 
59
- sig do
60
- params(
61
- position: T::Hash[Symbol, T.untyped],
62
- node_types: T::Array[T.class_of(Prism::Node)],
63
- ).returns(NodeContext)
64
- end
56
+ #: (Hash[Symbol, untyped] position, ?node_types: Array[singleton(Prism::Node)]) -> NodeContext
65
57
  def locate_node(position, node_types: [])
66
58
  char_position, _ = find_index_by_position(position)
67
59
 
@@ -73,19 +65,17 @@ module RubyLsp
73
65
  )
74
66
  end
75
67
 
76
- sig { params(char_position: Integer).returns(T.nilable(T::Boolean)) }
68
+ #: (Integer char_position) -> bool?
77
69
  def inside_host_language?(char_position)
78
70
  char = @host_language_source[char_position]
79
71
  char && char != " "
80
72
  end
81
73
 
82
74
  class ERBScanner
83
- extend T::Sig
84
-
85
- sig { returns(String) }
75
+ #: String
86
76
  attr_reader :ruby, :host_language
87
77
 
88
- sig { params(source: String).void }
78
+ #: (String source) -> void
89
79
  def initialize(source)
90
80
  @source = source
91
81
  @host_language = T.let(+"", String)
@@ -94,7 +84,7 @@ module RubyLsp
94
84
  @inside_ruby = T.let(false, T::Boolean)
95
85
  end
96
86
 
97
- sig { void }
87
+ #: -> void
98
88
  def scan
99
89
  while @current_pos < @source.length
100
90
  scan_char
@@ -104,7 +94,7 @@ module RubyLsp
104
94
 
105
95
  private
106
96
 
107
- sig { void }
97
+ #: -> void
108
98
  def scan_char
109
99
  char = @source[@current_pos]
110
100
 
@@ -159,7 +149,7 @@ module RubyLsp
159
149
  end
160
150
  end
161
151
 
162
- sig { params(char: String).void }
152
+ #: (String char) -> void
163
153
  def push_char(char)
164
154
  if @inside_ruby
165
155
  @ruby << char
@@ -170,7 +160,7 @@ module RubyLsp
170
160
  end
171
161
  end
172
162
 
173
- sig { returns(String) }
163
+ #: -> String
174
164
  def next_char
175
165
  @source[@current_pos + 1] || ""
176
166
  end
@@ -3,39 +3,37 @@
3
3
 
4
4
  module RubyLsp
5
5
  class GlobalState
6
- extend T::Sig
7
-
8
- sig { returns(String) }
6
+ #: String
9
7
  attr_reader :test_library
10
8
 
11
- sig { returns(String) }
9
+ #: String
12
10
  attr_accessor :formatter
13
11
 
14
- sig { returns(T::Boolean) }
12
+ #: bool
15
13
  attr_reader :has_type_checker
16
14
 
17
- sig { returns(RubyIndexer::Index) }
15
+ #: RubyIndexer::Index
18
16
  attr_reader :index
19
17
 
20
- sig { returns(Encoding) }
18
+ #: Encoding
21
19
  attr_reader :encoding
22
20
 
23
- sig { returns(T::Boolean) }
21
+ #: bool
24
22
  attr_reader :top_level_bundle
25
23
 
26
- sig { returns(TypeInferrer) }
24
+ #: TypeInferrer
27
25
  attr_reader :type_inferrer
28
26
 
29
- sig { returns(ClientCapabilities) }
27
+ #: ClientCapabilities
30
28
  attr_reader :client_capabilities
31
29
 
32
- sig { returns(URI::Generic) }
30
+ #: URI::Generic
33
31
  attr_reader :workspace_uri
34
32
 
35
- sig { returns(T.nilable(String)) }
33
+ #: String?
36
34
  attr_reader :telemetry_machine_id
37
35
 
38
- sig { void }
36
+ #: -> void
39
37
  def initialize
40
38
  @workspace_uri = T.let(URI::Generic.from_path(path: Dir.pwd), URI::Generic)
41
39
  @encoding = T.let(Encoding::UTF_8, Encoding)
@@ -63,33 +61,33 @@ module RubyLsp
63
61
  @telemetry_machine_id = T.let(nil, T.nilable(String))
64
62
  end
65
63
 
66
- sig { type_parameters(:T).params(block: T.proc.returns(T.type_parameter(:T))).returns(T.type_parameter(:T)) }
64
+ #: [T] { -> T } -> T
67
65
  def synchronize(&block)
68
66
  @mutex.synchronize(&block)
69
67
  end
70
68
 
71
- sig { params(addon_name: String).returns(T.nilable(T::Hash[Symbol, T.untyped])) }
69
+ #: (String addon_name) -> Hash[Symbol, untyped]?
72
70
  def settings_for_addon(addon_name)
73
71
  @addon_settings[addon_name]
74
72
  end
75
73
 
76
- sig { params(identifier: String, instance: Requests::Support::Formatter).void }
74
+ #: (String identifier, Requests::Support::Formatter instance) -> void
77
75
  def register_formatter(identifier, instance)
78
76
  @supported_formatters[identifier] = instance
79
77
  end
80
78
 
81
- sig { returns(T.nilable(Requests::Support::Formatter)) }
79
+ #: -> Requests::Support::Formatter?
82
80
  def active_formatter
83
81
  @supported_formatters[@formatter]
84
82
  end
85
83
 
86
- sig { returns(T::Array[Requests::Support::Formatter]) }
84
+ #: -> Array[Requests::Support::Formatter]
87
85
  def active_linters
88
86
  @linters.filter_map { |name| @supported_formatters[name] }
89
87
  end
90
88
 
91
89
  # Applies the options provided by the editor and returns an array of notifications to send back to the client
92
- sig { params(options: T::Hash[Symbol, T.untyped]).returns(T::Array[Notification]) }
90
+ #: (Hash[Symbol, untyped] options) -> Array[Notification]
93
91
  def apply_options(options)
94
92
  notifications = []
95
93
  direct_dependencies = gather_direct_dependencies
@@ -183,17 +181,17 @@ module RubyLsp
183
181
  notifications
184
182
  end
185
183
 
186
- sig { params(flag: Symbol).returns(T.nilable(T::Boolean)) }
184
+ #: (Symbol flag) -> bool?
187
185
  def enabled_feature?(flag)
188
186
  @enabled_feature_flags[:all] || @enabled_feature_flags[flag]
189
187
  end
190
188
 
191
- sig { returns(String) }
189
+ #: -> String
192
190
  def workspace_path
193
191
  T.must(@workspace_uri.to_standardized_path)
194
192
  end
195
193
 
196
- sig { returns(String) }
194
+ #: -> String
197
195
  def encoding_name
198
196
  case @encoding
199
197
  when Encoding::UTF_8
@@ -205,14 +203,14 @@ module RubyLsp
205
203
  end
206
204
  end
207
205
 
208
- sig { returns(T::Boolean) }
206
+ #: -> bool
209
207
  def supports_watching_files
210
208
  @client_capabilities.supports_watching_files
211
209
  end
212
210
 
213
211
  private
214
212
 
215
- sig { params(direct_dependencies: T::Array[String], all_dependencies: T::Array[String]).returns(String) }
213
+ #: (Array[String] direct_dependencies, Array[String] all_dependencies) -> String
216
214
  def detect_formatter(direct_dependencies, all_dependencies)
217
215
  # NOTE: Intentionally no $ at end, since we want to match rubocop-shopify, etc.
218
216
  return "rubocop_internal" if direct_dependencies.any?(/^rubocop/)
@@ -228,7 +226,7 @@ module RubyLsp
228
226
 
229
227
  # Try to detect if there are linters in the project's dependencies. For auto-detection, we always only consider a
230
228
  # single linter. To have multiple linters running, the user must configure them manually
231
- sig { params(dependencies: T::Array[String], all_dependencies: T::Array[String]).returns(T::Array[String]) }
229
+ #: (Array[String] dependencies, Array[String] all_dependencies) -> Array[String]
232
230
  def detect_linters(dependencies, all_dependencies)
233
231
  linters = []
234
232
 
@@ -239,7 +237,7 @@ module RubyLsp
239
237
  linters
240
238
  end
241
239
 
242
- sig { params(dependencies: T::Array[String]).returns(String) }
240
+ #: (Array[String] dependencies) -> String
243
241
  def detect_test_library(dependencies)
244
242
  if dependencies.any?(/^rspec/)
245
243
  "rspec"
@@ -259,7 +257,7 @@ module RubyLsp
259
257
  end
260
258
  end
261
259
 
262
- sig { params(dependencies: T::Array[String]).returns(T::Boolean) }
260
+ #: (Array[String] dependencies) -> bool
263
261
  def detect_typechecker(dependencies)
264
262
  return false if ENV["RUBY_LSP_BYPASS_TYPECHECKER"]
265
263
 
@@ -268,17 +266,17 @@ module RubyLsp
268
266
  false
269
267
  end
270
268
 
271
- sig { returns(T::Boolean) }
269
+ #: -> bool
272
270
  def bin_rails_present
273
271
  File.exist?(File.join(workspace_path, "bin/rails"))
274
272
  end
275
273
 
276
- sig { returns(T::Boolean) }
274
+ #: -> bool
277
275
  def dot_rubocop_yml_present
278
276
  File.exist?(File.join(workspace_path, ".rubocop.yml"))
279
277
  end
280
278
 
281
- sig { returns(T::Array[String]) }
279
+ #: -> Array[String]
282
280
  def gather_direct_dependencies
283
281
  Bundler.with_original_env { Bundler.default_gemfile }
284
282
 
@@ -288,14 +286,14 @@ module RubyLsp
288
286
  []
289
287
  end
290
288
 
291
- sig { returns(T::Array[String]) }
289
+ #: -> Array[String]
292
290
  def gemspec_dependencies
293
291
  (Bundler.locked_gems&.sources || [])
294
292
  .grep(Bundler::Source::Gemspec)
295
293
  .flat_map { _1.gemspec&.dependencies&.map(&:name) }
296
294
  end
297
295
 
298
- sig { returns(T::Array[String]) }
296
+ #: -> Array[String]
299
297
  def gather_direct_and_indirect_dependencies
300
298
  Bundler.with_original_env { Bundler.default_gemfile }
301
299
  Bundler.locked_gems&.specs&.map(&:name) || []
@@ -24,6 +24,8 @@ require "rbs"
24
24
  require "fileutils"
25
25
  require "open3"
26
26
  require "securerandom"
27
+ require "shellwords"
28
+ require "set"
27
29
 
28
30
  require "ruby-lsp"
29
31
  require "ruby_lsp/base_server"
@@ -50,6 +52,7 @@ require "ruby_lsp/response_builders/document_symbol"
50
52
  require "ruby_lsp/response_builders/hover"
51
53
  require "ruby_lsp/response_builders/semantic_highlighting"
52
54
  require "ruby_lsp/response_builders/signature_help"
55
+ require "ruby_lsp/response_builders/test_collection"
53
56
 
54
57
  # Request support
55
58
  require "ruby_lsp/requests/support/selection_range"
@@ -60,6 +63,7 @@ require "ruby_lsp/requests/support/formatter"
60
63
  require "ruby_lsp/requests/support/rubocop_runner"
61
64
  require "ruby_lsp/requests/support/rubocop_formatter"
62
65
  require "ruby_lsp/requests/support/syntax_tree_formatter"
66
+ require "ruby_lsp/requests/support/test_item"
63
67
 
64
68
  # Requests
65
69
  require "ruby_lsp/requests/request"
@@ -70,11 +74,13 @@ require "ruby_lsp/requests/completion_resolve"
70
74
  require "ruby_lsp/requests/completion"
71
75
  require "ruby_lsp/requests/definition"
72
76
  require "ruby_lsp/requests/diagnostics"
77
+ require "ruby_lsp/requests/discover_tests"
73
78
  require "ruby_lsp/requests/document_highlight"
74
79
  require "ruby_lsp/requests/document_link"
75
80
  require "ruby_lsp/requests/document_symbol"
76
81
  require "ruby_lsp/requests/folding_ranges"
77
82
  require "ruby_lsp/requests/formatting"
83
+ require "ruby_lsp/requests/go_to_relevant_file"
78
84
  require "ruby_lsp/requests/hover"
79
85
  require "ruby_lsp/requests/inlay_hints"
80
86
  require "ruby_lsp/requests/on_type_formatting"
@@ -6,7 +6,6 @@ require "shellwords"
6
6
  module RubyLsp
7
7
  module Listeners
8
8
  class CodeLens
9
- extend T::Sig
10
9
  include Requests::Support::Common
11
10
 
12
11
  BASE_COMMAND = T.let(
@@ -20,18 +19,9 @@ module RubyLsp
20
19
  )
21
20
  ACCESS_MODIFIERS = T.let([:public, :private, :protected], T::Array[Symbol])
22
21
  SUPPORTED_TEST_LIBRARIES = T.let(["minitest", "test-unit"], T::Array[String])
23
- DESCRIBE_KEYWORD = T.let(:describe, Symbol)
24
- IT_KEYWORD = T.let(:it, Symbol)
25
22
  DYNAMIC_REFERENCE_MARKER = T.let("<dynamic_reference>", String)
26
23
 
27
- sig do
28
- params(
29
- response_builder: ResponseBuilders::CollectionResponseBuilder[Interface::CodeLens],
30
- global_state: GlobalState,
31
- uri: URI::Generic,
32
- dispatcher: Prism::Dispatcher,
33
- ).void
34
- end
24
+ #: (ResponseBuilders::CollectionResponseBuilder[Interface::CodeLens] response_builder, GlobalState global_state, URI::Generic uri, Prism::Dispatcher dispatcher) -> void
35
25
  def initialize(response_builder, global_state, uri, dispatcher)
36
26
  @response_builder = response_builder
37
27
  @global_state = global_state
@@ -59,7 +49,7 @@ module RubyLsp
59
49
  )
60
50
  end
61
51
 
62
- sig { params(node: Prism::ClassNode).void }
52
+ #: (Prism::ClassNode node) -> void
63
53
  def on_class_node_enter(node)
64
54
  @visibility_stack.push([:public, :public])
65
55
  class_name = node.constant_path.slice
@@ -79,7 +69,7 @@ module RubyLsp
79
69
  end
80
70
  end
81
71
 
82
- sig { params(node: Prism::ClassNode).void }
72
+ #: (Prism::ClassNode node) -> void
83
73
  def on_class_node_leave(node)
84
74
  @visibility_stack.pop
85
75
  @group_stack.pop
@@ -91,7 +81,7 @@ module RubyLsp
91
81
  end
92
82
  end
93
83
 
94
- sig { params(node: Prism::DefNode).void }
84
+ #: (Prism::DefNode node) -> void
95
85
  def on_def_node_enter(node)
96
86
  @def_depth += 1
97
87
  return if @def_depth > 1
@@ -114,12 +104,12 @@ module RubyLsp
114
104
  end
115
105
  end
116
106
 
117
- sig { params(node: Prism::DefNode).void }
107
+ #: (Prism::DefNode node) -> void
118
108
  def on_def_node_leave(node)
119
109
  @def_depth -= 1
120
110
  end
121
111
 
122
- sig { params(node: Prism::ModuleNode).void }
112
+ #: (Prism::ModuleNode node) -> void
123
113
  def on_module_node_enter(node)
124
114
  if (path = namespace_constant_name(node))
125
115
  @group_stack.push(path)
@@ -128,12 +118,12 @@ module RubyLsp
128
118
  end
129
119
  end
130
120
 
131
- sig { params(node: Prism::ModuleNode).void }
121
+ #: (Prism::ModuleNode node) -> void
132
122
  def on_module_node_leave(node)
133
123
  @group_stack.pop
134
124
  end
135
125
 
136
- sig { params(node: Prism::CallNode).void }
126
+ #: (Prism::CallNode node) -> void
137
127
  def on_call_node_enter(node)
138
128
  name = node.name
139
129
  arguments = node.arguments
@@ -151,23 +141,21 @@ module RubyLsp
151
141
  return
152
142
  end
153
143
 
154
- if [DESCRIBE_KEYWORD, IT_KEYWORD].include?(name)
155
- case name
156
- when DESCRIBE_KEYWORD
157
- add_spec_code_lens(node, kind: :group)
158
- @group_id_stack.push(@group_id)
159
- @group_id += 1
160
- when IT_KEYWORD
161
- add_spec_code_lens(node, kind: :example)
162
- end
144
+ case name
145
+ when :describe
146
+ add_spec_code_lens(node, kind: :group)
147
+ @group_id_stack.push(@group_id)
148
+ @group_id += 1
149
+ when :it, :specify # `specify` is an alias for `it`
150
+ add_spec_code_lens(node, kind: :example)
163
151
  end
164
152
  end
165
153
 
166
- sig { params(node: Prism::CallNode).void }
154
+ #: (Prism::CallNode node) -> void
167
155
  def on_call_node_leave(node)
168
156
  _, prev_visibility = @visibility_stack.pop
169
157
  @visibility_stack.push([prev_visibility, prev_visibility])
170
- if node.name == DESCRIBE_KEYWORD
158
+ if node.name == :describe
171
159
  @group_id_stack.pop
172
160
  @group_stack.pop
173
161
  end
@@ -175,7 +163,7 @@ module RubyLsp
175
163
 
176
164
  private
177
165
 
178
- sig { params(node: Prism::Node, name: String, command: String, kind: Symbol, id: String).void }
166
+ #: (Prism::Node node, name: String, command: String, kind: Symbol, ?id: String) -> void
179
167
  def add_test_code_lens(node, name:, command:, kind:, id: name)
180
168
  # don't add code lenses if the test library is not supported or unknown
181
169
  return unless SUPPORTED_TEST_LIBRARIES.include?(@global_state.test_library) && @path
@@ -221,13 +209,7 @@ module RubyLsp
221
209
  )
222
210
  end
223
211
 
224
- sig do
225
- params(
226
- group_stack: T::Array[String],
227
- spec_name: T.nilable(String),
228
- method_name: T.nilable(String),
229
- ).returns(String)
230
- end
212
+ #: (?group_stack: Array[String], ?spec_name: String?, ?method_name: String?) -> String
231
213
  def generate_test_command(group_stack: [], spec_name: nil, method_name: nil)
232
214
  path = T.must(@path)
233
215
  command = BASE_COMMAND
@@ -274,7 +256,7 @@ module RubyLsp
274
256
  command
275
257
  end
276
258
 
277
- sig { params(node: Prism::CallNode, kind: Symbol).void }
259
+ #: (Prism::CallNode node, kind: Symbol) -> void
278
260
  def add_spec_code_lens(node, kind:)
279
261
  arguments = node.arguments
280
262
  return unless arguments
@@ -312,7 +294,7 @@ module RubyLsp
312
294
  end
313
295
  end
314
296
 
315
- sig { params(group_stack: T::Array[String], method_name: T.nilable(String)).returns(String) }
297
+ #: (group_stack: Array[String], ?method_name: String?) -> String
316
298
  def generate_fully_qualified_id(group_stack:, method_name: nil)
317
299
  if method_name
318
300
  # For tests, this will be the test class and method name: `Foo::BarTest#test_baz`.