ruby-lsp 0.23.11 → 0.26.2

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 (119) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/VERSION +1 -1
  4. data/exe/ruby-lsp +10 -4
  5. data/exe/ruby-lsp-check +0 -4
  6. data/exe/ruby-lsp-launcher +45 -22
  7. data/exe/ruby-lsp-test-exec +6 -0
  8. data/lib/rubocop/cop/ruby_lsp/use_language_server_aliases.rb +1 -2
  9. data/lib/rubocop/cop/ruby_lsp/use_register_with_handler_method.rb +3 -6
  10. data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +82 -116
  11. data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +140 -183
  12. data/lib/ruby_indexer/lib/ruby_indexer/enhancement.rb +10 -14
  13. data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +107 -236
  14. data/lib/ruby_indexer/lib/ruby_indexer/index.rb +183 -284
  15. data/lib/ruby_indexer/lib/ruby_indexer/location.rb +4 -27
  16. data/lib/ruby_indexer/lib/ruby_indexer/prefix_tree.rb +23 -27
  17. data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +25 -57
  18. data/lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb +58 -68
  19. data/lib/ruby_indexer/lib/ruby_indexer/uri.rb +17 -19
  20. data/lib/ruby_indexer/lib/ruby_indexer/visibility_scope.rb +7 -11
  21. data/lib/ruby_indexer/test/class_variables_test.rb +14 -14
  22. data/lib/ruby_indexer/test/classes_and_modules_test.rb +65 -40
  23. data/lib/ruby_indexer/test/configuration_test.rb +49 -9
  24. data/lib/ruby_indexer/test/constant_test.rb +34 -34
  25. data/lib/ruby_indexer/test/enhancements_test.rb +1 -1
  26. data/lib/ruby_indexer/test/index_test.rb +225 -135
  27. data/lib/ruby_indexer/test/instance_variables_test.rb +61 -37
  28. data/lib/ruby_indexer/test/method_test.rb +166 -123
  29. data/lib/ruby_indexer/test/prefix_tree_test.rb +21 -21
  30. data/lib/ruby_indexer/test/rbs_indexer_test.rb +70 -75
  31. data/lib/ruby_indexer/test/reference_finder_test.rb +79 -14
  32. data/lib/ruby_indexer/test/test_case.rb +9 -3
  33. data/lib/ruby_indexer/test/uri_test.rb +15 -2
  34. data/lib/ruby_lsp/addon.rb +88 -86
  35. data/lib/ruby_lsp/base_server.rb +59 -54
  36. data/lib/ruby_lsp/client_capabilities.rb +16 -13
  37. data/lib/ruby_lsp/document.rb +205 -104
  38. data/lib/ruby_lsp/erb_document.rb +45 -47
  39. data/lib/ruby_lsp/global_state.rb +73 -57
  40. data/lib/ruby_lsp/internal.rb +8 -3
  41. data/lib/ruby_lsp/listeners/code_lens.rb +82 -89
  42. data/lib/ruby_lsp/listeners/completion.rb +81 -76
  43. data/lib/ruby_lsp/listeners/definition.rb +44 -58
  44. data/lib/ruby_lsp/listeners/document_highlight.rb +149 -151
  45. data/lib/ruby_lsp/listeners/document_link.rb +50 -70
  46. data/lib/ruby_lsp/listeners/document_symbol.rb +38 -52
  47. data/lib/ruby_lsp/listeners/folding_ranges.rb +40 -43
  48. data/lib/ruby_lsp/listeners/hover.rb +107 -115
  49. data/lib/ruby_lsp/listeners/inlay_hints.rb +8 -13
  50. data/lib/ruby_lsp/listeners/semantic_highlighting.rb +54 -56
  51. data/lib/ruby_lsp/listeners/signature_help.rb +12 -27
  52. data/lib/ruby_lsp/listeners/spec_style.rb +231 -0
  53. data/lib/ruby_lsp/listeners/test_discovery.rb +107 -0
  54. data/lib/ruby_lsp/listeners/test_style.rb +207 -95
  55. data/lib/ruby_lsp/node_context.rb +12 -39
  56. data/lib/ruby_lsp/rbs_document.rb +10 -11
  57. data/lib/ruby_lsp/requests/code_action_resolve.rb +65 -61
  58. data/lib/ruby_lsp/requests/code_actions.rb +14 -26
  59. data/lib/ruby_lsp/requests/code_lens.rb +31 -21
  60. data/lib/ruby_lsp/requests/completion.rb +8 -21
  61. data/lib/ruby_lsp/requests/completion_resolve.rb +6 -6
  62. data/lib/ruby_lsp/requests/definition.rb +8 -20
  63. data/lib/ruby_lsp/requests/diagnostics.rb +8 -11
  64. data/lib/ruby_lsp/requests/discover_tests.rb +20 -7
  65. data/lib/ruby_lsp/requests/document_highlight.rb +6 -16
  66. data/lib/ruby_lsp/requests/document_link.rb +6 -17
  67. data/lib/ruby_lsp/requests/document_symbol.rb +5 -8
  68. data/lib/ruby_lsp/requests/folding_ranges.rb +7 -15
  69. data/lib/ruby_lsp/requests/formatting.rb +6 -9
  70. data/lib/ruby_lsp/requests/go_to_relevant_file.rb +139 -0
  71. data/lib/ruby_lsp/requests/hover.rb +12 -25
  72. data/lib/ruby_lsp/requests/inlay_hints.rb +8 -19
  73. data/lib/ruby_lsp/requests/on_type_formatting.rb +32 -40
  74. data/lib/ruby_lsp/requests/prepare_rename.rb +5 -10
  75. data/lib/ruby_lsp/requests/prepare_type_hierarchy.rb +5 -15
  76. data/lib/ruby_lsp/requests/range_formatting.rb +5 -6
  77. data/lib/ruby_lsp/requests/references.rb +17 -57
  78. data/lib/ruby_lsp/requests/rename.rb +27 -51
  79. data/lib/ruby_lsp/requests/request.rb +13 -25
  80. data/lib/ruby_lsp/requests/selection_ranges.rb +7 -7
  81. data/lib/ruby_lsp/requests/semantic_highlighting.rb +16 -35
  82. data/lib/ruby_lsp/requests/show_syntax_tree.rb +7 -8
  83. data/lib/ruby_lsp/requests/signature_help.rb +9 -27
  84. data/lib/ruby_lsp/requests/support/annotation.rb +4 -10
  85. data/lib/ruby_lsp/requests/support/common.rb +23 -61
  86. data/lib/ruby_lsp/requests/support/formatter.rb +16 -15
  87. data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +27 -35
  88. data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +13 -16
  89. data/lib/ruby_lsp/requests/support/rubocop_runner.rb +38 -36
  90. data/lib/ruby_lsp/requests/support/selection_range.rb +1 -3
  91. data/lib/ruby_lsp/requests/support/sorbet.rb +29 -38
  92. data/lib/ruby_lsp/requests/support/source_uri.rb +20 -32
  93. data/lib/ruby_lsp/requests/support/syntax_tree_formatter.rb +12 -19
  94. data/lib/ruby_lsp/requests/support/test_item.rb +16 -14
  95. data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +5 -6
  96. data/lib/ruby_lsp/requests/workspace_symbol.rb +4 -4
  97. data/lib/ruby_lsp/response_builders/collection_response_builder.rb +6 -9
  98. data/lib/ruby_lsp/response_builders/document_symbol.rb +15 -21
  99. data/lib/ruby_lsp/response_builders/hover.rb +12 -18
  100. data/lib/ruby_lsp/response_builders/response_builder.rb +6 -7
  101. data/lib/ruby_lsp/response_builders/semantic_highlighting.rb +62 -91
  102. data/lib/ruby_lsp/response_builders/signature_help.rb +6 -8
  103. data/lib/ruby_lsp/response_builders/test_collection.rb +35 -13
  104. data/lib/ruby_lsp/ruby_document.rb +32 -98
  105. data/lib/ruby_lsp/scope.rb +7 -11
  106. data/lib/ruby_lsp/scripts/compose_bundle.rb +6 -4
  107. data/lib/ruby_lsp/server.rb +305 -198
  108. data/lib/ruby_lsp/setup_bundler.rb +122 -82
  109. data/lib/ruby_lsp/static_docs.rb +12 -7
  110. data/lib/ruby_lsp/store.rb +21 -49
  111. data/lib/ruby_lsp/test_helper.rb +3 -16
  112. data/lib/ruby_lsp/test_reporters/lsp_reporter.rb +233 -0
  113. data/lib/ruby_lsp/test_reporters/minitest_reporter.rb +145 -0
  114. data/lib/ruby_lsp/test_reporters/test_unit_reporter.rb +92 -0
  115. data/lib/ruby_lsp/type_inferrer.rb +13 -14
  116. data/lib/ruby_lsp/utils.rb +138 -93
  117. data/static_docs/break.md +103 -0
  118. metadata +14 -20
  119. data/lib/ruby_lsp/load_sorbet.rb +0 -62
@@ -3,54 +3,48 @@
3
3
 
4
4
  module RubyLsp
5
5
  module ResponseBuilders
6
+ #: [ResponseType = Array[Interface::DocumentSymbol]]
6
7
  class DocumentSymbol < ResponseBuilder
7
- extend T::Sig
8
-
9
- ResponseType = type_member { { fixed: T::Array[Interface::DocumentSymbol] } }
10
-
11
8
  class SymbolHierarchyRoot
12
- extend T::Sig
13
-
14
- sig { returns(T::Array[Interface::DocumentSymbol]) }
9
+ #: Array[Interface::DocumentSymbol]
15
10
  attr_reader :children
16
11
 
17
- sig { void }
12
+ #: -> void
18
13
  def initialize
19
- @children = T.let([], T::Array[Interface::DocumentSymbol])
14
+ @children = [] #: Array[Interface::DocumentSymbol]
20
15
  end
21
16
  end
22
17
 
23
- sig { void }
18
+ #: -> void
24
19
  def initialize
25
20
  super
26
- @stack = T.let(
27
- [SymbolHierarchyRoot.new],
28
- T::Array[T.any(SymbolHierarchyRoot, Interface::DocumentSymbol)],
29
- )
21
+ @stack = [SymbolHierarchyRoot.new] #: Array[(SymbolHierarchyRoot | Interface::DocumentSymbol)]
30
22
  end
31
23
 
32
- sig { params(symbol: Interface::DocumentSymbol).void }
24
+ #: (Interface::DocumentSymbol symbol) -> void
33
25
  def push(symbol)
34
26
  @stack << symbol
35
27
  end
36
28
 
37
29
  alias_method(:<<, :push)
38
30
 
39
- sig { returns(T.nilable(Interface::DocumentSymbol)) }
31
+ #: -> Interface::DocumentSymbol?
40
32
  def pop
41
33
  if @stack.size > 1
42
- T.cast(@stack.pop, Interface::DocumentSymbol)
34
+ @stack.pop #: as Interface::DocumentSymbol
43
35
  end
44
36
  end
45
37
 
46
- sig { returns(T.any(SymbolHierarchyRoot, Interface::DocumentSymbol)) }
38
+ #: -> (SymbolHierarchyRoot | Interface::DocumentSymbol)
47
39
  def last
48
- T.must(@stack.last)
40
+ @stack.last #: as !nil
49
41
  end
50
42
 
51
- sig { override.returns(T::Array[Interface::DocumentSymbol]) }
43
+ # @override
44
+ #: -> Array[Interface::DocumentSymbol]
52
45
  def response
53
- T.must(@stack.first).children
46
+ @stack.first #: as !nil
47
+ .children
54
48
  end
55
49
  end
56
50
  end
@@ -3,27 +3,20 @@
3
3
 
4
4
  module RubyLsp
5
5
  module ResponseBuilders
6
+ #: [ResponseType = String]
6
7
  class Hover < ResponseBuilder
7
- extend T::Sig
8
- extend T::Generic
9
-
10
- ResponseType = type_member { { fixed: String } }
11
-
12
- sig { void }
8
+ #: -> void
13
9
  def initialize
14
10
  super
15
11
 
16
- @response = T.let(
17
- {
18
- title: +"",
19
- links: +"",
20
- documentation: +"",
21
- },
22
- T::Hash[Symbol, String],
23
- )
12
+ @response = {
13
+ title: +"",
14
+ links: +"",
15
+ documentation: +"",
16
+ } #: Hash[Symbol, String]
24
17
  end
25
18
 
26
- sig { params(content: String, category: Symbol).void }
19
+ #: (String content, category: Symbol) -> void
27
20
  def push(content, category:)
28
21
  hover_content = @response[category]
29
22
  if hover_content
@@ -31,14 +24,15 @@ module RubyLsp
31
24
  end
32
25
  end
33
26
 
34
- sig { returns(T::Boolean) }
27
+ #: -> bool
35
28
  def empty?
36
29
  @response.values.all?(&:empty?)
37
30
  end
38
31
 
39
- sig { override.returns(ResponseType) }
32
+ # @override
33
+ #: -> ResponseType
40
34
  def response
41
- result = T.must(@response[:title])
35
+ result = @response[:title] #: as !nil
42
36
  result << "\n" << @response[:links] if @response[:links]
43
37
  result << "\n" << @response[:documentation] if @response[:documentation]
44
38
 
@@ -3,14 +3,13 @@
3
3
 
4
4
  module RubyLsp
5
5
  module ResponseBuilders
6
+ # @abstract
6
7
  class ResponseBuilder
7
- extend T::Sig
8
- extend T::Generic
9
-
10
- abstract!
11
-
12
- sig { abstract.returns(T.anything) }
13
- def response; end
8
+ # @abstract
9
+ #: -> top
10
+ def response
11
+ raise AbstractMethodInvokedError
12
+ end
14
13
  end
15
14
  end
16
15
  end
@@ -3,71 +3,57 @@
3
3
 
4
4
  module RubyLsp
5
5
  module ResponseBuilders
6
+ #: [ResponseType = Interface::SemanticTokens]
6
7
  class SemanticHighlighting < ResponseBuilder
7
8
  class UndefinedTokenType < StandardError; end
8
9
 
9
- extend T::Sig
10
-
11
- TOKEN_TYPES = T.let(
12
- {
13
- namespace: 0,
14
- type: 1,
15
- class: 2,
16
- enum: 3,
17
- interface: 4,
18
- struct: 5,
19
- typeParameter: 6,
20
- parameter: 7,
21
- variable: 8,
22
- property: 9,
23
- enumMember: 10,
24
- event: 11,
25
- function: 12,
26
- method: 13,
27
- macro: 14,
28
- keyword: 15,
29
- modifier: 16,
30
- comment: 17,
31
- string: 18,
32
- number: 19,
33
- regexp: 20,
34
- operator: 21,
35
- decorator: 22,
36
- }.freeze,
37
- T::Hash[Symbol, Integer],
38
- )
39
-
40
- TOKEN_MODIFIERS = T.let(
41
- {
42
- declaration: 0,
43
- definition: 1,
44
- readonly: 2,
45
- static: 3,
46
- deprecated: 4,
47
- abstract: 5,
48
- async: 6,
49
- modification: 7,
50
- documentation: 8,
51
- default_library: 9,
52
- }.freeze,
53
- T::Hash[Symbol, Integer],
54
- )
55
-
56
- ResponseType = type_member { { fixed: Interface::SemanticTokens } }
57
-
58
- sig do
59
- params(code_units_cache: T.any(
60
- T.proc.params(arg0: Integer).returns(Integer),
61
- Prism::CodeUnitsCache,
62
- )).void
63
- end
10
+ TOKEN_TYPES = {
11
+ namespace: 0,
12
+ type: 1,
13
+ class: 2,
14
+ enum: 3,
15
+ interface: 4,
16
+ struct: 5,
17
+ typeParameter: 6,
18
+ parameter: 7,
19
+ variable: 8,
20
+ property: 9,
21
+ enumMember: 10,
22
+ event: 11,
23
+ function: 12,
24
+ method: 13,
25
+ macro: 14,
26
+ keyword: 15,
27
+ modifier: 16,
28
+ comment: 17,
29
+ string: 18,
30
+ number: 19,
31
+ regexp: 20,
32
+ operator: 21,
33
+ decorator: 22,
34
+ }.freeze #: Hash[Symbol, Integer]
35
+
36
+ TOKEN_MODIFIERS = {
37
+ declaration: 0,
38
+ definition: 1,
39
+ readonly: 2,
40
+ static: 3,
41
+ deprecated: 4,
42
+ abstract: 5,
43
+ async: 6,
44
+ modification: 7,
45
+ documentation: 8,
46
+ default_library: 9,
47
+ }.freeze #: Hash[Symbol, Integer]
48
+
49
+ #: ((^(Integer arg0) -> Integer | Prism::CodeUnitsCache) code_units_cache) -> void
64
50
  def initialize(code_units_cache)
65
51
  super()
66
52
  @code_units_cache = code_units_cache
67
- @stack = T.let([], T::Array[SemanticToken])
53
+ @stack = [] #: Array[SemanticToken]
68
54
  end
69
55
 
70
- sig { params(location: Prism::Location, type: Symbol, modifiers: T::Array[Symbol]).void }
56
+ #: (Prism::Location location, Symbol type, ?Array[Symbol] modifiers) -> void
71
57
  def add_token(location, type, modifiers = [])
72
58
  end_code_unit = location.cached_end_code_units_offset(@code_units_cache)
73
59
  length = end_code_unit - location.cached_start_code_units_offset(@code_units_cache)
@@ -77,13 +63,13 @@ module RubyLsp
77
63
  start_line: location.start_line,
78
64
  start_code_unit_column: location.cached_start_code_units_column(@code_units_cache),
79
65
  length: length,
80
- type: T.must(TOKEN_TYPES[type]),
66
+ type: TOKEN_TYPES[type], #: as !nil
81
67
  modifier: modifiers_indices,
82
68
  ),
83
69
  )
84
70
  end
85
71
 
86
- sig { params(location: Prism::Location).returns(T::Boolean) }
72
+ #: (Prism::Location location) -> bool
87
73
  def last_token_matches?(location)
88
74
  token = @stack.last
89
75
  return false unless token
@@ -92,43 +78,34 @@ module RubyLsp
92
78
  token.start_code_unit_column == location.cached_start_code_units_column(@code_units_cache)
93
79
  end
94
80
 
95
- sig { returns(T.nilable(SemanticToken)) }
81
+ #: -> SemanticToken?
96
82
  def last
97
83
  @stack.last
98
84
  end
99
85
 
100
- sig { override.returns(T::Array[SemanticToken]) }
86
+ # @override
87
+ #: -> Array[SemanticToken]
101
88
  def response
102
89
  @stack
103
90
  end
104
91
 
105
92
  class SemanticToken
106
- extend T::Sig
107
-
108
- sig { returns(Integer) }
93
+ #: Integer
109
94
  attr_reader :start_line
110
95
 
111
- sig { returns(Integer) }
96
+ #: Integer
112
97
  attr_reader :start_code_unit_column
113
98
 
114
- sig { returns(Integer) }
99
+ #: Integer
115
100
  attr_reader :length
116
101
 
117
- sig { returns(Integer) }
102
+ #: Integer
118
103
  attr_reader :type
119
104
 
120
- sig { returns(T::Array[Integer]) }
105
+ #: Array[Integer]
121
106
  attr_reader :modifier
122
107
 
123
- sig do
124
- params(
125
- start_line: Integer,
126
- start_code_unit_column: Integer,
127
- length: Integer,
128
- type: Integer,
129
- modifier: T::Array[Integer],
130
- ).void
131
- end
108
+ #: (start_line: Integer, start_code_unit_column: Integer, length: Integer, type: Integer, modifier: Array[Integer]) -> void
132
109
  def initialize(start_line:, start_code_unit_column:, length:, type:, modifier:)
133
110
  @start_line = start_line
134
111
  @start_code_unit_column = start_code_unit_column
@@ -137,7 +114,7 @@ module RubyLsp
137
114
  @modifier = modifier
138
115
  end
139
116
 
140
- sig { params(type_symbol: Symbol).void }
117
+ #: (Symbol type_symbol) -> void
141
118
  def replace_type(type_symbol)
142
119
  type_int = TOKEN_TYPES[type_symbol]
143
120
  raise UndefinedTokenType, "Undefined token type: #{type_symbol}" unless type_int
@@ -145,7 +122,7 @@ module RubyLsp
145
122
  @type = type_int
146
123
  end
147
124
 
148
- sig { params(modifier_symbols: T::Array[Symbol]).void }
125
+ #: (Array[Symbol] modifier_symbols) -> void
149
126
  def replace_modifier(modifier_symbols)
150
127
  @modifier = modifier_symbols.filter_map do |modifier_symbol|
151
128
  modifier_index = TOKEN_MODIFIERS[modifier_symbol]
@@ -157,19 +134,13 @@ module RubyLsp
157
134
  end
158
135
 
159
136
  class SemanticTokenEncoder
160
- extend T::Sig
161
-
162
- sig { void }
137
+ #: -> void
163
138
  def initialize
164
- @current_row = T.let(0, Integer)
165
- @current_column = T.let(0, Integer)
139
+ @current_row = 0 #: Integer
140
+ @current_column = 0 #: Integer
166
141
  end
167
142
 
168
- sig do
169
- params(
170
- tokens: T::Array[SemanticToken],
171
- ).returns(T::Array[Integer])
172
- end
143
+ #: (Array[SemanticToken] tokens) -> Array[Integer]
173
144
  def encode(tokens)
174
145
  sorted_tokens = tokens.sort_by.with_index do |token, index|
175
146
  # Enumerable#sort_by is not deterministic when the compared values are equal.
@@ -194,7 +165,7 @@ module RubyLsp
194
165
 
195
166
  # For more information on how each number is calculated, read:
196
167
  # https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_semanticTokens
197
- sig { params(token: SemanticToken).returns(T::Array[Integer]) }
168
+ #: (SemanticToken token) -> Array[Integer]
198
169
  def compute_delta(token)
199
170
  row = token.start_line - 1
200
171
  column = token.start_code_unit_column
@@ -216,7 +187,7 @@ module RubyLsp
216
187
  # For example, [:default_library] will be encoded as
217
188
  # 0b1000000000, as :default_library is the 10th bit according
218
189
  # to the token modifiers index map.
219
- sig { params(modifiers: T::Array[Integer]).returns(Integer) }
190
+ #: (Array[Integer] modifiers) -> Integer
220
191
  def encode_modifiers(modifiers)
221
192
  modifiers.inject(0) do |encoded_modifiers, modifier|
222
193
  encoded_modifiers | (1 << modifier)
@@ -3,23 +3,21 @@
3
3
 
4
4
  module RubyLsp
5
5
  module ResponseBuilders
6
+ #: [ResponseType = Interface::SignatureHelp?]
6
7
  class SignatureHelp < ResponseBuilder
7
- extend T::Sig
8
-
9
- ResponseType = type_member { { fixed: T.nilable(Interface::SignatureHelp) } }
10
-
11
- sig { void }
8
+ #: -> void
12
9
  def initialize
13
10
  super
14
- @signature_help = T.let(nil, ResponseType)
11
+ @signature_help = nil #: ResponseType
15
12
  end
16
13
 
17
- sig { params(signature_help: ResponseType).void }
14
+ #: (ResponseType signature_help) -> void
18
15
  def replace(signature_help)
19
16
  @signature_help = signature_help
20
17
  end
21
18
 
22
- sig { override.returns(ResponseType) }
19
+ # @override
20
+ #: -> ResponseType
23
21
  def response
24
22
  @signature_help
25
23
  end
@@ -3,33 +3,55 @@
3
3
 
4
4
  module RubyLsp
5
5
  module ResponseBuilders
6
+ #: [ResponseType = Requests::Support::TestItem]
6
7
  class TestCollection < ResponseBuilder
7
- class DuplicateIdError < StandardError; end
8
+ #: Array[Interface::CodeLens]
9
+ attr_reader :code_lens
8
10
 
9
- extend T::Sig
10
- extend T::Generic
11
-
12
- ResponseType = type_member { { fixed: Requests::Support::TestItem } }
13
-
14
- sig { void }
11
+ #: -> void
15
12
  def initialize
16
13
  super
17
- @items = T.let({}, T::Hash[String, ResponseType])
14
+ @items = {} #: Hash[String, ResponseType]
15
+ @code_lens = [] #: Array[Interface::CodeLens]
18
16
  end
19
17
 
20
- sig { params(item: ResponseType).void }
18
+ #: (ResponseType item) -> void
21
19
  def add(item)
22
- raise DuplicateIdError, "TestItem ID is already in use" if @items.key?(item.id)
23
-
24
20
  @items[item.id] = item
25
21
  end
26
22
 
27
- sig { params(id: String).returns(T.nilable(ResponseType)) }
23
+ #: (ResponseType item) -> void
24
+ def add_code_lens(item)
25
+ arguments = [item.uri.to_standardized_path, item.id]
26
+ start = item.range.start
27
+ range = Interface::Range.new(
28
+ start: start,
29
+ end: Interface::Position.new(line: start.line, character: start.character + 1),
30
+ )
31
+
32
+ @code_lens << Interface::CodeLens.new(
33
+ range: range,
34
+ data: { arguments: arguments, kind: "run_test" },
35
+ )
36
+
37
+ @code_lens << Interface::CodeLens.new(
38
+ range: range,
39
+ data: { arguments: arguments, kind: "run_test_in_terminal" },
40
+ )
41
+
42
+ @code_lens << Interface::CodeLens.new(
43
+ range: range,
44
+ data: { arguments: arguments, kind: "debug_test" },
45
+ )
46
+ end
47
+
48
+ #: (String id) -> ResponseType?
28
49
  def [](id)
29
50
  @items[id]
30
51
  end
31
52
 
32
- sig { override.returns(T::Array[ResponseType]) }
53
+ # @override
54
+ #: -> Array[ResponseType]
33
55
  def response
34
56
  @items.values
35
57
  end