ruby-lsp 0.23.11 → 0.25.0

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 +18 -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 +106 -236
  14. data/lib/ruby_indexer/lib/ruby_indexer/index.rb +155 -281
  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 -8
  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 +170 -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 +73 -86
  35. data/lib/ruby_lsp/base_server.rb +41 -42
  36. data/lib/ruby_lsp/client_capabilities.rb +16 -13
  37. data/lib/ruby_lsp/document.rb +201 -98
  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 +76 -74
  43. data/lib/ruby_lsp/listeners/definition.rb +44 -58
  44. data/lib/ruby_lsp/listeners/document_highlight.rb +123 -150
  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 +214 -0
  53. data/lib/ruby_lsp/listeners/test_discovery.rb +92 -0
  54. data/lib/ruby_lsp/listeners/test_style.rb +203 -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 +85 -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 +16 -58
  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 +30 -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 +266 -143
  108. data/lib/ruby_lsp/setup_bundler.rb +113 -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 +236 -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,125 +3,243 @@
3
3
 
4
4
  module RubyLsp
5
5
  module Listeners
6
- class TestStyle
7
- extend T::Sig
6
+ class TestStyle < TestDiscovery
7
+ class << self
8
+ # Resolves the minimal set of commands required to execute the requested tests
9
+ #: (Array[Hash[Symbol, untyped]]) -> Array[String]
10
+ def resolve_test_commands(items)
11
+ # A nested hash of file_path => test_group => { tags: [], examples: [test_example] } to ensure we build the
12
+ # minimum amount of commands needed to execute the requested tests. This is only used for specific examples
13
+ # where we will need more complex regexes to execute it all at the same time
14
+ aggregated_tests = Hash.new do |hash, key|
15
+ hash[key] = Hash.new do |inner_h, inner_k|
16
+ inner_h[inner_k] = { tags: Set.new, examples: [] }
17
+ end
18
+ end
19
+
20
+ # Full files are paths that should be executed as a whole e.g.: an entire test file or directory
21
+ full_files = []
22
+ queue = items.dup
23
+
24
+ until queue.empty?
25
+ item = queue.shift #: as !nil
26
+ tags = Set.new(item[:tags])
27
+ next unless tags.include?("framework:minitest") || tags.include?("framework:test_unit")
28
+
29
+ children = item[:children]
30
+ uri = URI(item[:uri])
31
+ path = uri.full_path
32
+ next unless path
33
+
34
+ if tags.include?("test_dir")
35
+ if children.empty?
36
+ full_files.concat(Dir.glob(
37
+ "#{path}/**/{*_test,test_*,*_spec}.rb",
38
+ File::Constants::FNM_EXTGLOB | File::Constants::FNM_PATHNAME,
39
+ ))
40
+ end
41
+ elsif tags.include?("test_file")
42
+ full_files << path if children.empty?
43
+ elsif tags.include?("test_group")
44
+ # If all of the children of the current test group are other groups, then there's no need to add it to the
45
+ # aggregated examples
46
+ unless children.any? && children.all? { |child| child[:tags].include?("test_group") }
47
+ aggregated_tests[path][item[:id]] = { tags: tags, examples: [] }
48
+ end
49
+ else
50
+ class_name, method_name = item[:id].split("#")
51
+ aggregated_tests[path][class_name][:examples] << method_name
52
+ aggregated_tests[path][class_name][:tags].merge(tags)
53
+ end
54
+
55
+ queue.concat(children) unless children.empty?
56
+ end
57
+
58
+ commands = []
59
+
60
+ aggregated_tests.each do |file_path, groups_and_examples|
61
+ # Separate groups into Minitest and Test Unit. You can have both frameworks in the same file, but you cannot
62
+ # have a group belongs to both at the same time
63
+ minitest_groups, test_unit_groups = groups_and_examples.partition do |_, info|
64
+ info[:tags].include?("framework:minitest")
65
+ end
66
+
67
+ if minitest_groups.any?
68
+ commands << handle_minitest_groups(file_path, minitest_groups)
69
+ end
70
+
71
+ if test_unit_groups.any?
72
+ commands.concat(handle_test_unit_groups(file_path, test_unit_groups))
73
+ end
74
+ end
75
+
76
+ unless full_files.empty?
77
+ specs, tests = full_files.partition { |path| spec?(path) }
78
+ commands << "#{BASE_COMMAND} -Itest -e \"ARGV.each { |f| require f }\" #{tests.join(" ")}" if tests.any?
79
+ commands << "#{BASE_COMMAND} -Ispec -e \"ARGV.each { |f| require f }\" #{specs.join(" ")}" if specs.any?
80
+ end
81
+
82
+ commands
83
+ end
84
+
85
+ private
86
+
87
+ #: (String) -> bool
88
+ def spec?(path)
89
+ File.fnmatch?("**/spec/**/*_spec.rb", path, File::FNM_PATHNAME | File::FNM_EXTGLOB)
90
+ end
91
+
92
+ #: (String, Hash[String, Hash[Symbol, untyped]]) -> String
93
+ def handle_minitest_groups(file_path, groups_and_examples)
94
+ regexes = groups_and_examples.flat_map do |group, info|
95
+ examples = info[:examples].map { |e| Shellwords.escape(e).gsub(/test_\d{4}/, "test_\\d{4}") }
96
+ group_regex = Shellwords.escape(group).gsub(
97
+ Shellwords.escape(TestDiscovery::DYNAMIC_REFERENCE_MARKER),
98
+ ".*",
99
+ )
100
+ if examples.empty?
101
+ "^#{group_regex}(#|::)"
102
+ elsif examples.length == 1
103
+ "^#{group_regex}##{examples[0]}\\$"
104
+ else
105
+ "^#{group_regex}#(#{examples.join("|")})\\$"
106
+ end
107
+ end
108
+
109
+ regex = if regexes.length == 1
110
+ regexes[0]
111
+ else
112
+ "(#{regexes.join("|")})"
113
+ end
114
+
115
+ load_path = spec?(file_path) ? "-Ispec" : "-Itest"
116
+ "#{BASE_COMMAND} #{load_path} #{file_path} --name \"/#{regex}/\""
117
+ end
118
+
119
+ #: (String, Hash[String, Hash[Symbol, untyped]]) -> Array[String]
120
+ def handle_test_unit_groups(file_path, groups_and_examples)
121
+ groups_and_examples.map do |group, info|
122
+ examples = info[:examples]
123
+ group_regex = Shellwords.escape(group).gsub(
124
+ Shellwords.escape(TestDiscovery::DYNAMIC_REFERENCE_MARKER),
125
+ ".*",
126
+ )
127
+ command = +"#{BASE_COMMAND} -Itest #{file_path} --testcase \"/^#{group_regex}\\$/\""
128
+
129
+ unless examples.empty?
130
+ command << if examples.length == 1
131
+ " --name \"/#{examples[0]}\\$/\""
132
+ else
133
+ " --name \"/(#{examples.join("|")})\\$/\""
134
+ end
135
+ end
136
+
137
+ command
138
+ end
139
+ end
140
+ end
141
+
8
142
  include Requests::Support::Common
9
143
 
144
+ MINITEST_REPORTER_PATH = File.expand_path("../test_reporters/minitest_reporter.rb", __dir__) #: String
145
+ TEST_UNIT_REPORTER_PATH = File.expand_path("../test_reporters/test_unit_reporter.rb", __dir__) #: String
10
146
  ACCESS_MODIFIERS = [:public, :private, :protected].freeze
11
- DYNAMIC_REFERENCE_MARKER = "<dynamic_reference>"
12
-
13
- sig do
14
- params(
15
- response_builder: ResponseBuilders::TestCollection,
16
- global_state: GlobalState,
17
- dispatcher: Prism::Dispatcher,
18
- uri: URI::Generic,
19
- ).void
20
- end
147
+ BASE_COMMAND = begin
148
+ Bundler.with_original_env { Bundler.default_lockfile }
149
+ "bundle exec ruby"
150
+ rescue Bundler::GemfileNotFound
151
+ "ruby"
152
+ end #: String
153
+
154
+ #: (ResponseBuilders::TestCollection, GlobalState, Prism::Dispatcher, URI::Generic) -> void
21
155
  def initialize(response_builder, global_state, dispatcher, uri)
22
- @response_builder = response_builder
23
- @uri = uri
24
- @index = T.let(global_state.index, RubyIndexer::Index)
25
- @visibility_stack = T.let([:public], T::Array[Symbol])
26
- @nesting = T.let([], T::Array[String])
27
-
28
- dispatcher.register(
29
- self,
156
+ super(response_builder, global_state, uri)
157
+
158
+ @framework = :minitest #: Symbol
159
+ @parent_stack = [@response_builder] #: Array[(Requests::Support::TestItem | ResponseBuilders::TestCollection)?]
160
+
161
+ register_events(
162
+ dispatcher,
30
163
  :on_class_node_enter,
31
- :on_class_node_leave,
32
- :on_module_node_enter,
33
- :on_module_node_leave,
34
164
  :on_def_node_enter,
35
165
  :on_call_node_enter,
36
166
  :on_call_node_leave,
37
167
  )
38
168
  end
39
169
 
40
- sig { params(node: Prism::ClassNode).void }
41
- def on_class_node_enter(node)
42
- @visibility_stack << :public
43
- name = constant_name(node.constant_path)
44
- name ||= name_with_dynamic_reference(node.constant_path)
170
+ #: (Prism::ClassNode node) -> void
171
+ def on_class_node_enter(node) # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
172
+ with_test_ancestor_tracking(node) do |name, ancestors|
173
+ @framework = :test_unit if ancestors.include?("Test::Unit::TestCase")
45
174
 
46
- fully_qualified_name = RubyIndexer::Index.actual_nesting(@nesting, name).join("::")
175
+ if @framework == :test_unit || non_declarative_minitest?(ancestors, name)
176
+ test_item = Requests::Support::TestItem.new(
177
+ name,
178
+ name,
179
+ @uri,
180
+ range_from_node(node),
181
+ framework: @framework,
182
+ )
47
183
 
48
- attached_ancestors = begin
49
- @index.linearized_ancestors_of(fully_qualified_name)
50
- rescue RubyIndexer::Index::NonExistingNamespaceError
51
- # When there are dynamic parts in the constant path, we will not have indexed the namespace. We can still
52
- # provide test functionality if the class inherits directly from Test::Unit::TestCase or Minitest::Test
53
- [node.superclass&.slice].compact
184
+ last_test_group.add(test_item)
185
+ @response_builder.add_code_lens(test_item)
186
+ @parent_stack << test_item
187
+ else
188
+ @parent_stack << nil
189
+ end
54
190
  end
55
-
56
- if attached_ancestors.include?("Test::Unit::TestCase") ||
57
- non_declarative_minitest?(attached_ancestors, fully_qualified_name)
58
-
59
- @response_builder.add(Requests::Support::TestItem.new(
60
- fully_qualified_name,
61
- fully_qualified_name,
62
- @uri,
63
- range_from_node(node),
64
- ))
65
- end
66
-
67
- @nesting << name
68
191
  end
69
192
 
70
- sig { params(node: Prism::ModuleNode).void }
71
- def on_module_node_enter(node)
72
- @visibility_stack << :public
73
-
74
- name = constant_name(node.constant_path)
75
- name ||= name_with_dynamic_reference(node.constant_path)
76
-
77
- @nesting << name
193
+ #: (Prism::ClassNode node) -> void
194
+ def on_class_node_leave(node) # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
195
+ @parent_stack.pop
196
+ super
78
197
  end
79
198
 
80
- sig { params(node: Prism::ModuleNode).void }
81
- def on_module_node_leave(node)
82
- @visibility_stack.pop
83
- @nesting.pop
199
+ #: (Prism::ModuleNode node) -> void
200
+ def on_module_node_enter(node) # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
201
+ @parent_stack << nil
202
+ super
84
203
  end
85
204
 
86
- sig { params(node: Prism::ClassNode).void }
87
- def on_class_node_leave(node)
88
- @visibility_stack.pop
89
- @nesting.pop
205
+ #: (Prism::ModuleNode node) -> void
206
+ def on_module_node_leave(node) # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
207
+ @parent_stack.pop
208
+ super
90
209
  end
91
210
 
92
- sig { params(node: Prism::DefNode).void }
93
- def on_def_node_enter(node)
211
+ #: (Prism::DefNode node) -> void
212
+ def on_def_node_enter(node) # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
94
213
  return if @visibility_stack.last != :public
95
214
 
96
215
  name = node.name.to_s
97
216
  return unless name.start_with?("test_")
98
217
 
99
218
  current_group_name = RubyIndexer::Index.actual_nesting(@nesting, nil).join("::")
219
+ parent = @parent_stack.last
220
+ return unless parent.is_a?(Requests::Support::TestItem)
100
221
 
101
- # If we're finding a test method, but for the wrong framework, then the group test item will not have been
102
- # previously pushed and thus we return early and avoid adding items for a framework this listener is not
103
- # interested in
104
- test_item = @response_builder[current_group_name]
105
- return unless test_item
106
-
107
- test_item.add(Requests::Support::TestItem.new(
222
+ example_item = Requests::Support::TestItem.new(
108
223
  "#{current_group_name}##{name}",
109
224
  name,
110
225
  @uri,
111
226
  range_from_node(node),
112
- ))
227
+ framework: @framework,
228
+ )
229
+ parent.add(example_item)
230
+ @response_builder.add_code_lens(example_item)
113
231
  end
114
232
 
115
- sig { params(node: Prism::CallNode).void }
116
- def on_call_node_enter(node)
233
+ #: (Prism::CallNode node) -> void
234
+ def on_call_node_enter(node) # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
117
235
  name = node.name
118
236
  return unless ACCESS_MODIFIERS.include?(name)
119
237
 
120
238
  @visibility_stack << name
121
239
  end
122
240
 
123
- sig { params(node: Prism::CallNode).void }
124
- def on_call_node_leave(node)
241
+ #: (Prism::CallNode node) -> void
242
+ def on_call_node_leave(node) # rubocop:disable RubyLsp/UseRegisterWithHandlerMethod
125
243
  name = node.name
126
244
  return unless ACCESS_MODIFIERS.include?(name)
127
245
  return unless node.arguments&.arguments
@@ -131,7 +249,13 @@ module RubyLsp
131
249
 
132
250
  private
133
251
 
134
- sig { params(attached_ancestors: T::Array[String], fully_qualified_name: String).returns(T::Boolean) }
252
+ #: -> (Requests::Support::TestItem | ResponseBuilders::TestCollection)
253
+ def last_test_group
254
+ index = @parent_stack.rindex { |i| i } #: as !nil
255
+ @parent_stack[index] #: as Requests::Support::TestItem | ResponseBuilders::TestCollection
256
+ end
257
+
258
+ #: (Array[String] attached_ancestors, String fully_qualified_name) -> bool
135
259
  def non_declarative_minitest?(attached_ancestors, fully_qualified_name)
136
260
  return false unless attached_ancestors.include?("Minitest::Test")
137
261
 
@@ -143,22 +267,6 @@ module RubyLsp
143
267
  rescue RubyIndexer::Index::NonExistingNamespaceError
144
268
  true
145
269
  end
146
-
147
- sig do
148
- params(
149
- node: T.any(
150
- Prism::ConstantPathNode,
151
- Prism::ConstantReadNode,
152
- Prism::ConstantPathTargetNode,
153
- Prism::CallNode,
154
- Prism::MissingNode,
155
- ),
156
- ).returns(String)
157
- end
158
- def name_with_dynamic_reference(node)
159
- slice = node.slice
160
- slice.gsub(/((?<=::)|^)[a-z]\w*/, DYNAMIC_REFERENCE_MARKER)
161
- end
162
270
  end
163
271
  end
164
272
  end
@@ -5,36 +5,19 @@ module RubyLsp
5
5
  # This class allows listeners to access contextual information about a node in the AST, such as its parent,
6
6
  # its namespace nesting, and the surrounding CallNode (e.g. a method call).
7
7
  class NodeContext
8
- extend T::Sig
9
-
10
- sig { returns(T.nilable(Prism::Node)) }
8
+ #: Prism::Node?
11
9
  attr_reader :node, :parent
12
10
 
13
- sig { returns(T::Array[String]) }
11
+ #: Array[String]
14
12
  attr_reader :nesting
15
13
 
16
- sig { returns(T.nilable(Prism::CallNode)) }
14
+ #: Prism::CallNode?
17
15
  attr_reader :call_node
18
16
 
19
- sig { returns(T.nilable(String)) }
17
+ #: String?
20
18
  attr_reader :surrounding_method
21
19
 
22
- sig do
23
- params(
24
- node: T.nilable(Prism::Node),
25
- parent: T.nilable(Prism::Node),
26
- nesting_nodes: T::Array[T.any(
27
- Prism::ClassNode,
28
- Prism::ModuleNode,
29
- Prism::SingletonClassNode,
30
- Prism::DefNode,
31
- Prism::BlockNode,
32
- Prism::LambdaNode,
33
- Prism::ProgramNode,
34
- )],
35
- call_node: T.nilable(Prism::CallNode),
36
- ).void
37
- end
20
+ #: (Prism::Node? node, Prism::Node? parent, Array[(Prism::ClassNode | Prism::ModuleNode | Prism::SingletonClassNode | Prism::DefNode | Prism::BlockNode | Prism::LambdaNode | Prism::ProgramNode)] nesting_nodes, Prism::CallNode? call_node) -> void
38
21
  def initialize(node, parent, nesting_nodes, call_node)
39
22
  @node = node
40
23
  @parent = parent
@@ -42,16 +25,16 @@ module RubyLsp
42
25
  @call_node = call_node
43
26
 
44
27
  nesting, surrounding_method = handle_nesting_nodes(nesting_nodes)
45
- @nesting = T.let(nesting, T::Array[String])
46
- @surrounding_method = T.let(surrounding_method, T.nilable(String))
28
+ @nesting = nesting #: Array[String]
29
+ @surrounding_method = surrounding_method #: String?
47
30
  end
48
31
 
49
- sig { returns(String) }
32
+ #: -> String
50
33
  def fully_qualified_name
51
- @fully_qualified_name ||= T.let(@nesting.join("::"), T.nilable(String))
34
+ @fully_qualified_name ||= @nesting.join("::") #: String?
52
35
  end
53
36
 
54
- sig { returns(T::Array[Symbol]) }
37
+ #: -> Array[Symbol]
55
38
  def locals_for_scope
56
39
  locals = []
57
40
 
@@ -69,20 +52,10 @@ module RubyLsp
69
52
 
70
53
  private
71
54
 
72
- sig do
73
- params(nodes: T::Array[T.any(
74
- Prism::ClassNode,
75
- Prism::ModuleNode,
76
- Prism::SingletonClassNode,
77
- Prism::DefNode,
78
- Prism::BlockNode,
79
- Prism::LambdaNode,
80
- Prism::ProgramNode,
81
- )]).returns([T::Array[String], T.nilable(String)])
82
- end
55
+ #: (Array[(Prism::ClassNode | Prism::ModuleNode | Prism::SingletonClassNode | Prism::DefNode | Prism::BlockNode | Prism::LambdaNode | Prism::ProgramNode)] nodes) -> [Array[String], String?]
83
56
  def handle_nesting_nodes(nodes)
84
57
  nesting = []
85
- surrounding_method = T.let(nil, T.nilable(String))
58
+ surrounding_method = nil #: String?
86
59
 
87
60
  @nesting_nodes.each do |node|
88
61
  case node
@@ -2,19 +2,16 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module RubyLsp
5
+ #: [ParseResultType = Array[RBS::AST::Declarations::Base]]
5
6
  class RBSDocument < Document
6
- extend T::Sig
7
- extend T::Generic
8
-
9
- ParseResultType = type_member { { fixed: T::Array[RBS::AST::Declarations::Base] } }
10
-
11
- sig { params(source: String, version: Integer, uri: URI::Generic, global_state: GlobalState).void }
7
+ #: (source: String, version: Integer, uri: URI::Generic, global_state: GlobalState) -> void
12
8
  def initialize(source:, version:, uri:, global_state:)
13
- @syntax_error = T.let(false, T::Boolean)
9
+ @syntax_error = false #: bool
14
10
  super
15
11
  end
16
12
 
17
- sig { override.returns(T::Boolean) }
13
+ # @override
14
+ #: -> bool
18
15
  def parse!
19
16
  return false unless @needs_parsing
20
17
 
@@ -29,14 +26,16 @@ module RubyLsp
29
26
  true
30
27
  end
31
28
 
32
- sig { override.returns(T::Boolean) }
29
+ # @override
30
+ #: -> bool
33
31
  def syntax_error?
34
32
  @syntax_error
35
33
  end
36
34
 
37
- sig { override.returns(LanguageId) }
35
+ # @override
36
+ #: -> Symbol
38
37
  def language_id
39
- LanguageId::RBS
38
+ :rbs
40
39
  end
41
40
  end
42
41
  end