ruby-lsp 0.23.15 → 0.26.9

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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/exe/ruby-lsp +17 -14
  4. data/exe/ruby-lsp-check +0 -4
  5. data/exe/ruby-lsp-launcher +41 -14
  6. data/exe/ruby-lsp-test-exec +6 -0
  7. data/lib/rubocop/cop/ruby_lsp/use_language_server_aliases.rb +0 -1
  8. data/lib/rubocop/cop/ruby_lsp/use_register_with_handler_method.rb +0 -1
  9. data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +4 -3
  10. data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +42 -20
  11. data/lib/ruby_indexer/lib/ruby_indexer/enhancement.rb +1 -7
  12. data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +49 -62
  13. data/lib/ruby_indexer/lib/ruby_indexer/index.rb +84 -74
  14. data/lib/ruby_indexer/lib/ruby_indexer/prefix_tree.rb +6 -9
  15. data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +9 -14
  16. data/lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb +12 -8
  17. data/lib/ruby_indexer/lib/ruby_indexer/visibility_scope.rb +4 -4
  18. data/lib/ruby_lsp/addon.rb +44 -15
  19. data/lib/ruby_lsp/base_server.rb +56 -37
  20. data/lib/ruby_lsp/client_capabilities.rb +6 -1
  21. data/lib/ruby_lsp/document.rb +174 -62
  22. data/lib/ruby_lsp/erb_document.rb +10 -8
  23. data/lib/ruby_lsp/global_state.rb +86 -33
  24. data/lib/ruby_lsp/internal.rb +6 -3
  25. data/lib/ruby_lsp/listeners/completion.rb +22 -11
  26. data/lib/ruby_lsp/listeners/definition.rb +41 -21
  27. data/lib/ruby_lsp/listeners/document_highlight.rb +26 -1
  28. data/lib/ruby_lsp/listeners/document_link.rb +64 -28
  29. data/lib/ruby_lsp/listeners/hover.rb +27 -16
  30. data/lib/ruby_lsp/listeners/inlay_hints.rb +5 -3
  31. data/lib/ruby_lsp/listeners/semantic_highlighting.rb +2 -2
  32. data/lib/ruby_lsp/listeners/signature_help.rb +2 -2
  33. data/lib/ruby_lsp/listeners/spec_style.rb +155 -79
  34. data/lib/ruby_lsp/listeners/test_discovery.rb +39 -21
  35. data/lib/ruby_lsp/listeners/test_style.rb +75 -35
  36. data/lib/ruby_lsp/rbs_document.rb +3 -6
  37. data/lib/ruby_lsp/requests/code_action_resolve.rb +83 -58
  38. data/lib/ruby_lsp/requests/code_actions.rb +20 -5
  39. data/lib/ruby_lsp/requests/code_lens.rb +27 -6
  40. data/lib/ruby_lsp/requests/completion.rb +3 -3
  41. data/lib/ruby_lsp/requests/completion_resolve.rb +8 -6
  42. data/lib/ruby_lsp/requests/definition.rb +4 -7
  43. data/lib/ruby_lsp/requests/discover_tests.rb +2 -2
  44. data/lib/ruby_lsp/requests/document_highlight.rb +2 -2
  45. data/lib/ruby_lsp/requests/document_link.rb +1 -1
  46. data/lib/ruby_lsp/requests/folding_ranges.rb +1 -1
  47. data/lib/ruby_lsp/requests/go_to_relevant_file.rb +64 -12
  48. data/lib/ruby_lsp/requests/hover.rb +3 -6
  49. data/lib/ruby_lsp/requests/inlay_hints.rb +4 -4
  50. data/lib/ruby_lsp/requests/on_type_formatting.rb +1 -1
  51. data/lib/ruby_lsp/requests/prepare_rename.rb +1 -1
  52. data/lib/ruby_lsp/requests/references.rb +10 -21
  53. data/lib/ruby_lsp/requests/rename.rb +9 -10
  54. data/lib/ruby_lsp/requests/request.rb +8 -8
  55. data/lib/ruby_lsp/requests/selection_ranges.rb +2 -2
  56. data/lib/ruby_lsp/requests/semantic_highlighting.rb +1 -1
  57. data/lib/ruby_lsp/requests/show_syntax_tree.rb +2 -2
  58. data/lib/ruby_lsp/requests/signature_help.rb +2 -2
  59. data/lib/ruby_lsp/requests/support/annotation.rb +1 -1
  60. data/lib/ruby_lsp/requests/support/common.rb +9 -12
  61. data/lib/ruby_lsp/requests/support/formatter.rb +16 -15
  62. data/lib/ruby_lsp/requests/support/package_url.rb +414 -0
  63. data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +7 -1
  64. data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +2 -2
  65. data/lib/ruby_lsp/requests/support/rubocop_runner.rb +13 -3
  66. data/lib/ruby_lsp/requests/support/source_uri.rb +7 -4
  67. data/lib/ruby_lsp/requests/support/test_item.rb +7 -1
  68. data/lib/ruby_lsp/requests/workspace_symbol.rb +20 -12
  69. data/lib/ruby_lsp/response_builders/collection_response_builder.rb +1 -4
  70. data/lib/ruby_lsp/response_builders/document_symbol.rb +2 -3
  71. data/lib/ruby_lsp/response_builders/hover.rb +1 -4
  72. data/lib/ruby_lsp/response_builders/response_builder.rb +6 -7
  73. data/lib/ruby_lsp/response_builders/semantic_highlighting.rb +4 -5
  74. data/lib/ruby_lsp/response_builders/signature_help.rb +1 -2
  75. data/lib/ruby_lsp/response_builders/test_collection.rb +29 -3
  76. data/lib/ruby_lsp/ruby_document.rb +14 -42
  77. data/lib/ruby_lsp/scripts/compose_bundle.rb +3 -3
  78. data/lib/ruby_lsp/scripts/compose_bundle_windows.rb +3 -1
  79. data/lib/ruby_lsp/server.rb +173 -130
  80. data/lib/ruby_lsp/setup_bundler.rb +114 -47
  81. data/lib/ruby_lsp/static_docs.rb +1 -0
  82. data/lib/ruby_lsp/store.rb +6 -16
  83. data/lib/ruby_lsp/test_helper.rb +1 -4
  84. data/lib/ruby_lsp/test_reporters/lsp_reporter.rb +121 -17
  85. data/lib/ruby_lsp/test_reporters/minitest_reporter.rb +65 -25
  86. data/lib/ruby_lsp/test_reporters/test_unit_reporter.rb +16 -18
  87. data/lib/ruby_lsp/utils.rb +102 -13
  88. data/static_docs/break.md +103 -0
  89. metadata +8 -33
  90. data/lib/ruby_indexer/test/class_variables_test.rb +0 -140
  91. data/lib/ruby_indexer/test/classes_and_modules_test.rb +0 -770
  92. data/lib/ruby_indexer/test/configuration_test.rb +0 -280
  93. data/lib/ruby_indexer/test/constant_test.rb +0 -402
  94. data/lib/ruby_indexer/test/enhancements_test.rb +0 -325
  95. data/lib/ruby_indexer/test/global_variable_test.rb +0 -49
  96. data/lib/ruby_indexer/test/index_test.rb +0 -2190
  97. data/lib/ruby_indexer/test/instance_variables_test.rb +0 -240
  98. data/lib/ruby_indexer/test/method_test.rb +0 -973
  99. data/lib/ruby_indexer/test/prefix_tree_test.rb +0 -150
  100. data/lib/ruby_indexer/test/rbs_indexer_test.rb +0 -380
  101. data/lib/ruby_indexer/test/reference_finder_test.rb +0 -330
  102. data/lib/ruby_indexer/test/test_case.rb +0 -51
  103. data/lib/ruby_indexer/test/uri_test.rb +0 -85
  104. data/lib/ruby_lsp/load_sorbet.rb +0 -62
@@ -3,6 +3,7 @@
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
 
@@ -42,11 +43,9 @@ module RubyLsp
42
43
  async: 6,
43
44
  modification: 7,
44
45
  documentation: 8,
45
- default_library: 9,
46
+ defaultLibrary: 9,
46
47
  }.freeze #: Hash[Symbol, Integer]
47
48
 
48
- ResponseType = type_member { { fixed: Interface::SemanticTokens } }
49
-
50
49
  #: ((^(Integer arg0) -> Integer | Prism::CodeUnitsCache) code_units_cache) -> void
51
50
  def initialize(code_units_cache)
52
51
  super()
@@ -185,8 +184,8 @@ module RubyLsp
185
184
  end
186
185
 
187
186
  # Encode an array of modifiers to positions onto a bit flag
188
- # For example, [:default_library] will be encoded as
189
- # 0b1000000000, as :default_library is the 10th bit according
187
+ # For example, [:defaultLibrary] will be encoded as
188
+ # 0b1000000000, as :defaultLibrary is the 10th bit according
190
189
  # to the token modifiers index map.
191
190
  #: (Array[Integer] modifiers) -> Integer
192
191
  def encode_modifiers(modifiers)
@@ -3,9 +3,8 @@
3
3
 
4
4
  module RubyLsp
5
5
  module ResponseBuilders
6
+ #: [ResponseType = Interface::SignatureHelp?]
6
7
  class SignatureHelp < ResponseBuilder
7
- ResponseType = type_member { { fixed: T.nilable(Interface::SignatureHelp) } }
8
-
9
8
  #: -> void
10
9
  def initialize
11
10
  super
@@ -3,15 +3,16 @@
3
3
 
4
4
  module RubyLsp
5
5
  module ResponseBuilders
6
+ #: [ResponseType = Requests::Support::TestItem]
6
7
  class TestCollection < ResponseBuilder
7
- extend T::Generic
8
-
9
- ResponseType = type_member { { fixed: Requests::Support::TestItem } }
8
+ #: Array[Interface::CodeLens]
9
+ attr_reader :code_lens
10
10
 
11
11
  #: -> void
12
12
  def initialize
13
13
  super
14
14
  @items = {} #: Hash[String, ResponseType]
15
+ @code_lens = [] #: Array[Interface::CodeLens]
15
16
  end
16
17
 
17
18
  #: (ResponseType item) -> void
@@ -19,6 +20,31 @@ module RubyLsp
19
20
  @items[item.id] = item
20
21
  end
21
22
 
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
+
22
48
  #: (String id) -> ResponseType?
23
49
  def [](id)
24
50
  @items[id]
@@ -2,11 +2,8 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module RubyLsp
5
+ #: [ParseResultType = Prism::ParseLexResult]
5
6
  class RubyDocument < Document
6
- extend T::Generic
7
-
8
- ParseResultType = type_member { { fixed: Prism::ParseResult } }
9
-
10
7
  METHODS_THAT_CHANGE_DECLARATIONS = [
11
8
  :private_constant,
12
9
  :attr_reader,
@@ -23,23 +20,13 @@ module RubyLsp
23
20
  :private_class_method,
24
21
  ].freeze
25
22
 
26
- class SorbetLevel < T::Enum
27
- enums do
28
- None = new("none")
29
- Ignore = new("ignore")
30
- False = new("false")
31
- True = new("true")
32
- Strict = new("strict")
33
- end
34
- end
35
-
36
23
  class << self
37
24
  #: (Prism::Node node, Integer char_position, code_units_cache: (^(Integer arg0) -> Integer | Prism::CodeUnitsCache), ?node_types: Array[singleton(Prism::Node)]) -> NodeContext
38
25
  def locate(node, char_position, code_units_cache:, node_types: [])
39
26
  queue = node.child_nodes.compact #: Array[Prism::Node?]
40
27
  closest = node
41
28
  parent = nil #: Prism::Node?
42
- nesting_nodes = [] #: Array[(Prism::ClassNode | Prism::ModuleNode | Prism::SingletonClassNode | Prism::DefNode | Prism::BlockNode | Prism::LambdaNode | Prism::ProgramNode)] # rubocop:disable Layout/LineLength
29
+ nesting_nodes = [] #: Array[(Prism::ClassNode | Prism::ModuleNode | Prism::SingletonClassNode | Prism::DefNode | Prism::BlockNode | Prism::LambdaNode | Prism::ProgramNode)]
43
30
 
44
31
  nesting_nodes << node if node.is_a?(Prism::ProgramNode)
45
32
  call_node = nil #: Prism::CallNode?
@@ -53,7 +40,7 @@ module RubyLsp
53
40
  # Add the next child_nodes to the queue to be processed. The order here is important! We want to move in the
54
41
  # same order as the visiting mechanism, which means searching the child nodes before moving on to the next
55
42
  # sibling
56
- T.unsafe(queue).unshift(*candidate.child_nodes)
43
+ queue.unshift(*candidate.child_nodes)
57
44
 
58
45
  # Skip if the current node doesn't cover the desired position
59
46
  loc = candidate.location
@@ -142,11 +129,16 @@ module RubyLsp
142
129
  return false unless @needs_parsing
143
130
 
144
131
  @needs_parsing = false
145
- @parse_result = Prism.parse(@source)
132
+ @parse_result = Prism.parse_lex(@source)
146
133
  @code_units_cache = @parse_result.code_units_cache(@encoding)
147
134
  true
148
135
  end
149
136
 
137
+ #: -> Prism::ProgramNode
138
+ def ast
139
+ @parse_result.value.first
140
+ end
141
+
150
142
  # @override
151
143
  #: -> bool
152
144
  def syntax_error?
@@ -154,29 +146,9 @@ module RubyLsp
154
146
  end
155
147
 
156
148
  # @override
157
- #: -> LanguageId
149
+ #: -> Symbol
158
150
  def language_id
159
- LanguageId::Ruby
160
- end
161
-
162
- #: -> SorbetLevel
163
- def sorbet_level
164
- sigil = parse_result.magic_comments.find do |comment|
165
- comment.key == "typed"
166
- end&.value
167
-
168
- case sigil
169
- when "ignore"
170
- SorbetLevel::Ignore
171
- when "false"
172
- SorbetLevel::False
173
- when "true"
174
- SorbetLevel::True
175
- when "strict", "strong"
176
- SorbetLevel::Strict
177
- else
178
- SorbetLevel::None
179
- end
151
+ :ruby
180
152
  end
181
153
 
182
154
  #: (Hash[Symbol, untyped] range, ?node_types: Array[singleton(Prism::Node)]) -> Prism::Node?
@@ -184,7 +156,7 @@ module RubyLsp
184
156
  start_position, end_position = find_index_by_position(range[:start], range[:end])
185
157
 
186
158
  desired_range = (start_position...end_position)
187
- queue = @parse_result.value.child_nodes.compact #: Array[Prism::Node?]
159
+ queue = ast.child_nodes.compact #: Array[Prism::Node?]
188
160
 
189
161
  until queue.empty?
190
162
  candidate = queue.shift
@@ -195,7 +167,7 @@ module RubyLsp
195
167
  # Add the next child_nodes to the queue to be processed. The order here is important! We want to move in the
196
168
  # same order as the visiting mechanism, which means searching the child nodes before moving on to the next
197
169
  # sibling
198
- T.unsafe(queue).unshift(*candidate.child_nodes)
170
+ queue.unshift(*candidate.child_nodes)
199
171
 
200
172
  # Skip if the current node doesn't cover the desired position
201
173
  loc = candidate.location
@@ -212,7 +184,7 @@ module RubyLsp
212
184
  char_position, _ = find_index_by_position(position)
213
185
 
214
186
  RubyDocument.locate(
215
- @parse_result.value,
187
+ ast,
216
188
  char_position,
217
189
  code_units_cache: @code_units_cache,
218
190
  node_types: node_types,
@@ -1,18 +1,18 @@
1
1
  # typed: true
2
2
  # frozen_string_literal: true
3
3
 
4
- def compose(raw_initialize)
4
+ def compose(raw_initialize, **options)
5
5
  require_relative "../setup_bundler"
6
6
  require "json"
7
7
  require "uri"
8
- require "ruby_indexer/lib/ruby_indexer/uri"
8
+ require_relative "../../ruby_indexer/lib/ruby_indexer/uri"
9
9
 
10
10
  initialize_request = JSON.parse(raw_initialize, symbolize_names: true)
11
11
  workspace_uri = initialize_request.dig(:params, :workspaceFolders, 0, :uri)
12
12
  workspace_path = workspace_uri && URI(workspace_uri).to_standardized_path
13
13
  workspace_path ||= Dir.pwd
14
14
 
15
- env = RubyLsp::SetupBundler.new(workspace_path, launcher: true).setup!
15
+ env = RubyLsp::SetupBundler.new(workspace_path, launcher: true, **options).setup!
16
16
 
17
17
  File.open(File.join(".ruby-lsp", "bundle_env"), "w") do |f|
18
18
  f.flock(File::LOCK_EX)
@@ -5,4 +5,6 @@ require_relative "compose_bundle"
5
5
 
6
6
  # When this is invoked on Windows, we pass the raw initialize as an argument to this script. On other platforms, we
7
7
  # invoke the compose method from inside a forked process
8
- compose(ARGV.first)
8
+ options = {}
9
+ options[:beta] = true if ARGV.include?("--beta")
10
+ compose(ARGV.first, **options)