ruby-lsp 0.23.11 → 0.23.17

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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/VERSION +1 -1
  4. data/exe/ruby-lsp-launcher +20 -11
  5. data/lib/rubocop/cop/ruby_lsp/use_language_server_aliases.rb +1 -1
  6. data/lib/rubocop/cop/ruby_lsp/use_register_with_handler_method.rb +3 -5
  7. data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +82 -116
  8. data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +134 -183
  9. data/lib/ruby_indexer/lib/ruby_indexer/enhancement.rb +9 -10
  10. data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +97 -217
  11. data/lib/ruby_indexer/lib/ruby_indexer/index.rb +139 -281
  12. data/lib/ruby_indexer/lib/ruby_indexer/location.rb +4 -27
  13. data/lib/ruby_indexer/lib/ruby_indexer/prefix_tree.rb +18 -19
  14. data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +23 -55
  15. data/lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb +47 -61
  16. data/lib/ruby_indexer/lib/ruby_indexer/uri.rb +17 -19
  17. data/lib/ruby_indexer/lib/ruby_indexer/visibility_scope.rb +7 -11
  18. data/lib/ruby_indexer/test/class_variables_test.rb +14 -14
  19. data/lib/ruby_indexer/test/classes_and_modules_test.rb +65 -40
  20. data/lib/ruby_indexer/test/configuration_test.rb +48 -7
  21. data/lib/ruby_indexer/test/constant_test.rb +34 -34
  22. data/lib/ruby_indexer/test/enhancements_test.rb +1 -1
  23. data/lib/ruby_indexer/test/index_test.rb +146 -135
  24. data/lib/ruby_indexer/test/instance_variables_test.rb +37 -37
  25. data/lib/ruby_indexer/test/method_test.rb +149 -123
  26. data/lib/ruby_indexer/test/prefix_tree_test.rb +13 -13
  27. data/lib/ruby_indexer/test/rbs_indexer_test.rb +68 -73
  28. data/lib/ruby_indexer/test/test_case.rb +9 -3
  29. data/lib/ruby_indexer/test/uri_test.rb +15 -2
  30. data/lib/ruby_lsp/addon.rb +44 -71
  31. data/lib/ruby_lsp/base_server.rb +29 -32
  32. data/lib/ruby_lsp/client_capabilities.rb +10 -12
  33. data/lib/ruby_lsp/document.rb +40 -54
  34. data/lib/ruby_lsp/erb_document.rb +37 -41
  35. data/lib/ruby_lsp/global_state.rb +52 -57
  36. data/lib/ruby_lsp/internal.rb +2 -0
  37. data/lib/ruby_lsp/listeners/code_lens.rb +82 -89
  38. data/lib/ruby_lsp/listeners/completion.rb +67 -73
  39. data/lib/ruby_lsp/listeners/definition.rb +44 -58
  40. data/lib/ruby_lsp/listeners/document_highlight.rb +123 -150
  41. data/lib/ruby_lsp/listeners/document_link.rb +50 -70
  42. data/lib/ruby_lsp/listeners/document_symbol.rb +38 -52
  43. data/lib/ruby_lsp/listeners/folding_ranges.rb +40 -43
  44. data/lib/ruby_lsp/listeners/hover.rb +92 -110
  45. data/lib/ruby_lsp/listeners/inlay_hints.rb +4 -11
  46. data/lib/ruby_lsp/listeners/semantic_highlighting.rb +54 -56
  47. data/lib/ruby_lsp/listeners/signature_help.rb +12 -27
  48. data/lib/ruby_lsp/listeners/spec_style.rb +155 -0
  49. data/lib/ruby_lsp/listeners/test_discovery.rb +89 -0
  50. data/lib/ruby_lsp/listeners/test_style.rb +167 -90
  51. data/lib/ruby_lsp/node_context.rb +12 -39
  52. data/lib/ruby_lsp/rbs_document.rb +9 -7
  53. data/lib/ruby_lsp/requests/code_action_resolve.rb +63 -59
  54. data/lib/ruby_lsp/requests/code_actions.rb +14 -26
  55. data/lib/ruby_lsp/requests/code_lens.rb +20 -19
  56. data/lib/ruby_lsp/requests/completion.rb +7 -20
  57. data/lib/ruby_lsp/requests/completion_resolve.rb +6 -6
  58. data/lib/ruby_lsp/requests/definition.rb +7 -17
  59. data/lib/ruby_lsp/requests/diagnostics.rb +8 -11
  60. data/lib/ruby_lsp/requests/discover_tests.rb +18 -5
  61. data/lib/ruby_lsp/requests/document_highlight.rb +5 -15
  62. data/lib/ruby_lsp/requests/document_link.rb +6 -17
  63. data/lib/ruby_lsp/requests/document_symbol.rb +5 -8
  64. data/lib/ruby_lsp/requests/folding_ranges.rb +7 -15
  65. data/lib/ruby_lsp/requests/formatting.rb +6 -9
  66. data/lib/ruby_lsp/requests/go_to_relevant_file.rb +85 -0
  67. data/lib/ruby_lsp/requests/hover.rb +10 -20
  68. data/lib/ruby_lsp/requests/inlay_hints.rb +6 -17
  69. data/lib/ruby_lsp/requests/on_type_formatting.rb +32 -40
  70. data/lib/ruby_lsp/requests/prepare_rename.rb +4 -9
  71. data/lib/ruby_lsp/requests/prepare_type_hierarchy.rb +5 -15
  72. data/lib/ruby_lsp/requests/range_formatting.rb +5 -6
  73. data/lib/ruby_lsp/requests/references.rb +9 -53
  74. data/lib/ruby_lsp/requests/rename.rb +20 -46
  75. data/lib/ruby_lsp/requests/request.rb +8 -19
  76. data/lib/ruby_lsp/requests/selection_ranges.rb +6 -6
  77. data/lib/ruby_lsp/requests/semantic_highlighting.rb +16 -35
  78. data/lib/ruby_lsp/requests/show_syntax_tree.rb +7 -8
  79. data/lib/ruby_lsp/requests/signature_help.rb +8 -26
  80. data/lib/ruby_lsp/requests/support/annotation.rb +4 -10
  81. data/lib/ruby_lsp/requests/support/common.rb +15 -55
  82. data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +27 -35
  83. data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +11 -14
  84. data/lib/ruby_lsp/requests/support/rubocop_runner.rb +22 -34
  85. data/lib/ruby_lsp/requests/support/selection_range.rb +1 -3
  86. data/lib/ruby_lsp/requests/support/sorbet.rb +29 -38
  87. data/lib/ruby_lsp/requests/support/source_uri.rb +20 -32
  88. data/lib/ruby_lsp/requests/support/syntax_tree_formatter.rb +12 -19
  89. data/lib/ruby_lsp/requests/support/test_item.rb +16 -14
  90. data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +5 -6
  91. data/lib/ruby_lsp/requests/workspace_symbol.rb +4 -4
  92. data/lib/ruby_lsp/response_builders/collection_response_builder.rb +5 -5
  93. data/lib/ruby_lsp/response_builders/document_symbol.rb +14 -19
  94. data/lib/ruby_lsp/response_builders/hover.rb +11 -14
  95. data/lib/ruby_lsp/response_builders/response_builder.rb +1 -1
  96. data/lib/ruby_lsp/response_builders/semantic_highlighting.rb +60 -88
  97. data/lib/ruby_lsp/response_builders/signature_help.rb +5 -6
  98. data/lib/ruby_lsp/response_builders/test_collection.rb +43 -10
  99. data/lib/ruby_lsp/ruby_document.rb +24 -92
  100. data/lib/ruby_lsp/scope.rb +7 -11
  101. data/lib/ruby_lsp/scripts/compose_bundle.rb +6 -4
  102. data/lib/ruby_lsp/server.rb +182 -99
  103. data/lib/ruby_lsp/setup_bundler.rb +65 -60
  104. data/lib/ruby_lsp/static_docs.rb +11 -7
  105. data/lib/ruby_lsp/store.rb +29 -47
  106. data/lib/ruby_lsp/test_helper.rb +2 -12
  107. data/lib/ruby_lsp/test_reporters/lsp_reporter.rb +191 -0
  108. data/lib/ruby_lsp/test_reporters/minitest_reporter.rb +105 -0
  109. data/lib/ruby_lsp/test_reporters/test_unit_reporter.rb +94 -0
  110. data/lib/ruby_lsp/type_inferrer.rb +13 -14
  111. data/lib/ruby_lsp/utils.rb +92 -83
  112. metadata +9 -3
@@ -8,12 +8,11 @@ module RubyLsp
8
8
  # WARNING: Methods in this class may be used by Ruby LSP add-ons such as
9
9
  # https://github.com/Shopify/ruby-lsp-rails, or add-ons by created by developers outside of Shopify, so be
10
10
  # cautious of changing anything.
11
- extend T::Sig
12
11
  extend T::Helpers
13
12
 
14
13
  requires_ancestor { Kernel }
15
14
 
16
- sig { params(node: Prism::Node).returns(Interface::Range) }
15
+ #: (Prism::Node node) -> Interface::Range
17
16
  def range_from_node(node)
18
17
  loc = node.location
19
18
 
@@ -26,7 +25,7 @@ module RubyLsp
26
25
  )
27
26
  end
28
27
 
29
- sig { params(location: T.any(Prism::Location, RubyIndexer::Location)).returns(Interface::Range) }
28
+ #: ((Prism::Location | RubyIndexer::Location) location) -> Interface::Range
30
29
  def range_from_location(location)
31
30
  Interface::Range.new(
32
31
  start: Interface::Position.new(
@@ -37,15 +36,7 @@ module RubyLsp
37
36
  )
38
37
  end
39
38
 
40
- sig do
41
- params(
42
- node: Prism::Node,
43
- title: String,
44
- command_name: String,
45
- arguments: T.nilable(T::Array[T.untyped]),
46
- data: T.nilable(T::Hash[T.untyped, T.untyped]),
47
- ).returns(Interface::CodeLens)
48
- end
39
+ #: (Prism::Node node, title: String, command_name: String, arguments: Array[untyped]?, data: Hash[untyped, untyped]?) -> Interface::CodeLens
49
40
  def create_code_lens(node, title:, command_name:, arguments:, data:)
50
41
  range = range_from_node(node)
51
42
 
@@ -60,26 +51,22 @@ module RubyLsp
60
51
  )
61
52
  end
62
53
 
63
- sig { params(file_path: String).returns(T.nilable(T::Boolean)) }
54
+ #: (String file_path) -> bool?
64
55
  def not_in_dependencies?(file_path)
65
56
  BUNDLE_PATH &&
66
- !file_path.start_with?(T.must(BUNDLE_PATH)) &&
57
+ !file_path.start_with?(
58
+ BUNDLE_PATH, #: as !nil
59
+ ) &&
67
60
  !file_path.start_with?(RbConfig::CONFIG["rubylibdir"])
68
61
  end
69
62
 
70
- sig { params(node: Prism::CallNode).returns(T::Boolean) }
63
+ #: (Prism::CallNode node) -> bool
71
64
  def self_receiver?(node)
72
65
  receiver = node.receiver
73
66
  receiver.nil? || receiver.is_a?(Prism::SelfNode)
74
67
  end
75
68
 
76
- sig do
77
- params(
78
- title: String,
79
- entries: T.any(T::Array[RubyIndexer::Entry], RubyIndexer::Entry),
80
- max_entries: T.nilable(Integer),
81
- ).returns(T::Hash[Symbol, String])
82
- end
69
+ #: (String title, (Array[RubyIndexer::Entry] | RubyIndexer::Entry) entries, ?Integer? max_entries) -> Hash[Symbol, String]
83
70
  def categorized_markdown_from_index_entries(title, entries, max_entries = nil)
84
71
  markdown_title = "```ruby\n#{title}\n```"
85
72
  definitions = []
@@ -112,14 +99,7 @@ module RubyLsp
112
99
  }
113
100
  end
114
101
 
115
- sig do
116
- params(
117
- title: String,
118
- entries: T.any(T::Array[RubyIndexer::Entry], RubyIndexer::Entry),
119
- max_entries: T.nilable(Integer),
120
- extra_links: T.nilable(String),
121
- ).returns(String)
122
- end
102
+ #: (String title, (Array[RubyIndexer::Entry] | RubyIndexer::Entry) entries, ?Integer? max_entries, ?extra_links: String?) -> String
123
103
  def markdown_from_index_entries(title, entries, max_entries = nil, extra_links: nil)
124
104
  categorized_markdown = categorized_markdown_from_index_entries(title, entries, max_entries)
125
105
 
@@ -135,22 +115,12 @@ module RubyLsp
135
115
  MARKDOWN
136
116
  end
137
117
 
138
- sig do
139
- params(
140
- node: T.any(
141
- Prism::ConstantPathNode,
142
- Prism::ConstantReadNode,
143
- Prism::ConstantPathTargetNode,
144
- Prism::CallNode,
145
- Prism::MissingNode,
146
- ),
147
- ).returns(T.nilable(String))
148
- end
118
+ #: ((Prism::ConstantPathNode | Prism::ConstantReadNode | Prism::ConstantPathTargetNode | Prism::CallNode | Prism::MissingNode) node) -> String?
149
119
  def constant_name(node)
150
120
  RubyIndexer::Index.constant_name(node)
151
121
  end
152
122
 
153
- sig { params(node: T.any(Prism::ModuleNode, Prism::ClassNode)).returns(T.nilable(String)) }
123
+ #: ((Prism::ModuleNode | Prism::ClassNode) node) -> String?
154
124
  def namespace_constant_name(node)
155
125
  path = node.constant_path
156
126
  case path
@@ -162,14 +132,9 @@ module RubyLsp
162
132
  # Iterates over each part of a constant path, so that we can easily push response items for each section of the
163
133
  # name. For example, for `Foo::Bar::Baz`, this method will invoke the block with `Foo`, then `Bar` and finally
164
134
  # `Baz`.
165
- sig do
166
- params(
167
- node: Prism::Node,
168
- block: T.proc.params(part: Prism::Node).void,
169
- ).void
170
- end
135
+ #: (Prism::Node node) { (Prism::Node part) -> void } -> void
171
136
  def each_constant_path_part(node, &block)
172
- current = T.let(node, T.nilable(Prism::Node))
137
+ current = node #: Prism::Node?
173
138
 
174
139
  while current.is_a?(Prism::ConstantPathNode)
175
140
  block.call(current)
@@ -177,7 +142,7 @@ module RubyLsp
177
142
  end
178
143
  end
179
144
 
180
- sig { params(entry: RubyIndexer::Entry).returns(T.nilable(Integer)) }
145
+ #: (RubyIndexer::Entry entry) -> Integer?
181
146
  def kind_for_entry(entry)
182
147
  case entry
183
148
  when RubyIndexer::Entry::Class
@@ -194,11 +159,6 @@ module RubyLsp
194
159
  Constant::SymbolKind::FIELD
195
160
  end
196
161
  end
197
-
198
- sig { params(sorbet_level: RubyDocument::SorbetLevel).returns(T::Boolean) }
199
- def sorbet_level_true_or_higher?(sorbet_level)
200
- sorbet_level == RubyDocument::SorbetLevel::True || sorbet_level == RubyDocument::SorbetLevel::Strict
201
- end
202
162
  end
203
163
  end
204
164
  end
@@ -5,40 +5,32 @@ module RubyLsp
5
5
  module Requests
6
6
  module Support
7
7
  class RuboCopDiagnostic
8
- extend T::Sig
9
-
10
- RUBOCOP_TO_LSP_SEVERITY = T.let(
11
- {
12
- info: Constant::DiagnosticSeverity::HINT,
13
- refactor: Constant::DiagnosticSeverity::INFORMATION,
14
- convention: Constant::DiagnosticSeverity::INFORMATION,
15
- warning: Constant::DiagnosticSeverity::WARNING,
16
- error: Constant::DiagnosticSeverity::ERROR,
17
- fatal: Constant::DiagnosticSeverity::ERROR,
18
- }.freeze,
19
- T::Hash[Symbol, Integer],
20
- )
21
-
22
- ENHANCED_DOC_URL = T.let(
23
- begin
24
- gem("rubocop", ">= 1.64.0")
25
- true
26
- rescue LoadError
27
- false
28
- end,
29
- T::Boolean,
30
- )
8
+ RUBOCOP_TO_LSP_SEVERITY = {
9
+ info: Constant::DiagnosticSeverity::HINT,
10
+ refactor: Constant::DiagnosticSeverity::INFORMATION,
11
+ convention: Constant::DiagnosticSeverity::INFORMATION,
12
+ warning: Constant::DiagnosticSeverity::WARNING,
13
+ error: Constant::DiagnosticSeverity::ERROR,
14
+ fatal: Constant::DiagnosticSeverity::ERROR,
15
+ }.freeze #: Hash[Symbol, Integer]
16
+
17
+ ENHANCED_DOC_URL = begin
18
+ gem("rubocop", ">= 1.64.0")
19
+ true
20
+ rescue LoadError
21
+ false
22
+ end #: bool
31
23
 
32
24
  # TODO: avoid passing document once we have alternative ways to get at
33
25
  # encoding and file source
34
- sig { params(document: RubyDocument, offense: ::RuboCop::Cop::Offense, uri: URI::Generic).void }
26
+ #: (RubyDocument document, ::RuboCop::Cop::Offense offense, URI::Generic uri) -> void
35
27
  def initialize(document, offense, uri)
36
28
  @document = document
37
29
  @offense = offense
38
30
  @uri = uri
39
31
  end
40
32
 
41
- sig { returns(T::Array[Interface::CodeAction]) }
33
+ #: -> Array[Interface::CodeAction]
42
34
  def to_lsp_code_actions
43
35
  code_actions = []
44
36
 
@@ -48,7 +40,7 @@ module RubyLsp
48
40
  code_actions
49
41
  end
50
42
 
51
- sig { params(config: ::RuboCop::Config).returns(Interface::Diagnostic) }
43
+ #: (::RuboCop::Config config) -> Interface::Diagnostic
52
44
  def to_lsp_diagnostic(config)
53
45
  # highlighted_area contains the begin and end position of the first line
54
46
  # This ensures that multiline offenses don't clutter the editor
@@ -78,19 +70,19 @@ module RubyLsp
78
70
 
79
71
  private
80
72
 
81
- sig { returns(String) }
73
+ #: -> String
82
74
  def message
83
75
  message = @offense.message
84
76
  message += "\n\nThis offense is not auto-correctable.\n" unless correctable?
85
77
  message
86
78
  end
87
79
 
88
- sig { returns(T.nilable(Integer)) }
80
+ #: -> Integer?
89
81
  def severity
90
82
  RUBOCOP_TO_LSP_SEVERITY[@offense.severity.name]
91
83
  end
92
84
 
93
- sig { params(config: ::RuboCop::Config).returns(T.nilable(Interface::CodeDescription)) }
85
+ #: (::RuboCop::Config config) -> Interface::CodeDescription?
94
86
  def code_description(config)
95
87
  cop = RuboCopRunner.find_cop_by_name(@offense.cop_name)
96
88
  return unless cop
@@ -103,7 +95,7 @@ module RubyLsp
103
95
  Interface::CodeDescription.new(href: doc_url) if doc_url
104
96
  end
105
97
 
106
- sig { returns(Interface::CodeAction) }
98
+ #: -> Interface::CodeAction
107
99
  def autocorrect_action
108
100
  Interface::CodeAction.new(
109
101
  title: "Autocorrect #{@offense.cop_name}",
@@ -123,7 +115,7 @@ module RubyLsp
123
115
  )
124
116
  end
125
117
 
126
- sig { returns(T::Array[Interface::TextEdit]) }
118
+ #: -> Array[Interface::TextEdit]
127
119
  def offense_replacements
128
120
  @offense.corrector.as_replacements.map do |range, replacement|
129
121
  Interface::TextEdit.new(
@@ -136,7 +128,7 @@ module RubyLsp
136
128
  end
137
129
  end
138
130
 
139
- sig { returns(Interface::CodeAction) }
131
+ #: -> Interface::CodeAction
140
132
  def disable_line_action
141
133
  Interface::CodeAction.new(
142
134
  title: "Disable #{@offense.cop_name} for this line",
@@ -155,7 +147,7 @@ module RubyLsp
155
147
  )
156
148
  end
157
149
 
158
- sig { returns(T::Array[Interface::TextEdit]) }
150
+ #: -> Array[Interface::TextEdit]
159
151
  def line_disable_comment
160
152
  new_text = if @offense.source_line.include?(" # rubocop:disable ")
161
153
  ",#{@offense.cop_name}"
@@ -178,7 +170,7 @@ module RubyLsp
178
170
  [inline_comment]
179
171
  end
180
172
 
181
- sig { params(line: String).returns(Integer) }
173
+ #: (String line) -> Integer
182
174
  def length_of_line(line)
183
175
  if @document.encoding == Encoding::UTF_16LE
184
176
  line_length = 0
@@ -197,7 +189,7 @@ module RubyLsp
197
189
  # When `RuboCop::LSP.enable` is called, contextual autocorrect will not offer itself
198
190
  # as `correctable?` to prevent annoying changes while typing. Instead check if
199
191
  # a corrector is present. If it is, then that means some code transformation can be applied.
200
- sig { returns(T::Boolean) }
192
+ #: -> bool
201
193
  def correctable?
202
194
  !@offense.corrector.nil?
203
195
  end
@@ -9,19 +9,19 @@ module RubyLsp
9
9
  module Requests
10
10
  module Support
11
11
  class RuboCopFormatter
12
- extend T::Sig
13
12
  include Formatter
14
13
 
15
- sig { void }
14
+ #: -> void
16
15
  def initialize
17
- @diagnostic_runner = T.let(RuboCopRunner.new, RuboCopRunner)
16
+ @diagnostic_runner = RuboCopRunner.new #: RuboCopRunner
18
17
  # -a is for "--auto-correct" (or "--autocorrect" on newer versions of RuboCop)
19
- @format_runner = T.let(RuboCopRunner.new("-a"), RuboCopRunner)
18
+ @format_runner = RuboCopRunner.new("-a") #: RuboCopRunner
20
19
  end
21
20
 
22
- sig { override.params(uri: URI::Generic, document: RubyDocument).returns(T.nilable(String)) }
21
+ # @override
22
+ #: (URI::Generic uri, RubyDocument document) -> String?
23
23
  def run_formatting(uri, document)
24
- filename = T.must(uri.to_standardized_path || uri.opaque)
24
+ filename = uri.to_standardized_path || uri.opaque #: as !nil
25
25
 
26
26
  # Invoke RuboCop with just this file in `paths`
27
27
  @format_runner.run(filename, document.source)
@@ -29,19 +29,16 @@ module RubyLsp
29
29
  end
30
30
 
31
31
  # RuboCop does not support range formatting
32
- sig { override.params(uri: URI::Generic, source: String, base_indentation: Integer).returns(T.nilable(String)) }
32
+ # @override
33
+ #: (URI::Generic uri, String source, Integer base_indentation) -> String?
33
34
  def run_range_formatting(uri, source, base_indentation)
34
35
  nil
35
36
  end
36
37
 
37
- sig do
38
- override.params(
39
- uri: URI::Generic,
40
- document: RubyDocument,
41
- ).returns(T.nilable(T::Array[Interface::Diagnostic]))
42
- end
38
+ # @override
39
+ #: (URI::Generic uri, RubyDocument document) -> Array[Interface::Diagnostic]?
43
40
  def run_diagnostic(uri, document)
44
- filename = T.must(uri.to_standardized_path || uri.opaque)
41
+ filename = uri.to_standardized_path || uri.opaque #: as !nil
45
42
  # Invoke RuboCop with just this file in `paths`
46
43
  @diagnostic_runner.run(filename, document.source)
47
44
 
@@ -32,15 +32,13 @@ module RubyLsp
32
32
  module Requests
33
33
  module Support
34
34
  class InternalRuboCopError < StandardError
35
- extend T::Sig
36
-
37
35
  MESSAGE = <<~EOS
38
36
  An internal error occurred %s.
39
37
  Updating to a newer version of RuboCop may solve this.
40
38
  For more details, run RuboCop on the command line.
41
39
  EOS
42
40
 
43
- sig { params(rubocop_error: T.any(::RuboCop::ErrorWithAnalyzedFileLocation, StandardError)).void }
41
+ #: ((::RuboCop::ErrorWithAnalyzedFileLocation | StandardError) rubocop_error) -> void
44
42
  def initialize(rubocop_error)
45
43
  message = case rubocop_error
46
44
  when ::RuboCop::ErrorWithAnalyzedFileLocation
@@ -54,24 +52,19 @@ module RubyLsp
54
52
 
55
53
  # :nodoc:
56
54
  class RuboCopRunner < ::RuboCop::Runner
57
- extend T::Sig
58
-
59
55
  class ConfigurationError < StandardError; end
60
56
 
61
- DEFAULT_ARGS = T.let(
62
- [
63
- "--stderr", # Print any output to stderr so that our stdout does not get polluted
64
- "--force-exclusion",
65
- "--format",
66
- "RuboCop::Formatter::BaseFormatter", # Suppress any output by using the base formatter
67
- ],
68
- T::Array[String],
69
- )
70
-
71
- sig { returns(T::Array[::RuboCop::Cop::Offense]) }
57
+ DEFAULT_ARGS = [
58
+ "--stderr", # Print any output to stderr so that our stdout does not get polluted
59
+ "--force-exclusion",
60
+ "--format",
61
+ "RuboCop::Formatter::BaseFormatter", # Suppress any output by using the base formatter
62
+ ] #: Array[String]
63
+
64
+ #: Array[::RuboCop::Cop::Offense]
72
65
  attr_reader :offenses
73
66
 
74
- sig { returns(::RuboCop::Config) }
67
+ #: ::RuboCop::Config
75
68
  attr_reader :config_for_working_directory
76
69
 
77
70
  begin
@@ -82,24 +75,24 @@ module RubyLsp
82
75
  end
83
76
  DEFAULT_ARGS.freeze
84
77
 
85
- sig { params(args: String).void }
78
+ #: (*String args) -> void
86
79
  def initialize(*args)
87
- @options = T.let({}, T::Hash[Symbol, T.untyped])
88
- @offenses = T.let([], T::Array[::RuboCop::Cop::Offense])
89
- @errors = T.let([], T::Array[String])
90
- @warnings = T.let([], T::Array[String])
80
+ @options = {} #: Hash[Symbol, untyped]
81
+ @offenses = [] #: Array[::RuboCop::Cop::Offense]
82
+ @errors = [] #: Array[String]
83
+ @warnings = [] #: Array[String]
91
84
 
92
85
  args += DEFAULT_ARGS
93
86
  rubocop_options = ::RuboCop::Options.new.parse(args).first
94
87
 
95
88
  config_store = ::RuboCop::ConfigStore.new
96
89
  config_store.options_config = rubocop_options[:config] if rubocop_options[:config]
97
- @config_for_working_directory = T.let(config_store.for_pwd, ::RuboCop::Config)
90
+ @config_for_working_directory = config_store.for_pwd #: ::RuboCop::Config
98
91
 
99
92
  super(rubocop_options, config_store)
100
93
  end
101
94
 
102
- sig { params(path: String, contents: String).void }
95
+ #: (String path, String contents) -> void
103
96
  def run(path, contents)
104
97
  # Clear Runner state between runs since we get a single instance of this class
105
98
  # on every use site.
@@ -121,33 +114,28 @@ module RubyLsp
121
114
  raise InternalRuboCopError, error
122
115
  end
123
116
 
124
- sig { returns(String) }
117
+ #: -> String
125
118
  def formatted_source
126
119
  @options[:stdin]
127
120
  end
128
121
 
129
122
  class << self
130
- extend T::Sig
131
-
132
- sig { params(cop_name: String).returns(T.nilable(T.class_of(::RuboCop::Cop::Base))) }
123
+ #: (String cop_name) -> singleton(::RuboCop::Cop::Base)?
133
124
  def find_cop_by_name(cop_name)
134
125
  cop_registry[cop_name]&.first
135
126
  end
136
127
 
137
128
  private
138
129
 
139
- sig { returns(T::Hash[String, [T.class_of(::RuboCop::Cop::Base)]]) }
130
+ #: -> Hash[String, [singleton(::RuboCop::Cop::Base)]]
140
131
  def cop_registry
141
- @cop_registry ||= T.let(
142
- ::RuboCop::Cop::Registry.global.to_h,
143
- T.nilable(T::Hash[String, [T.class_of(::RuboCop::Cop::Base)]]),
144
- )
132
+ @cop_registry ||= ::RuboCop::Cop::Registry.global.to_h #: Hash[String, [singleton(::RuboCop::Cop::Base)]]?
145
133
  end
146
134
  end
147
135
 
148
136
  private
149
137
 
150
- sig { params(_file: String, offenses: T::Array[::RuboCop::Cop::Offense]).void }
138
+ #: (String _file, Array[::RuboCop::Cop::Offense] offenses) -> void
151
139
  def file_finished(_file, offenses)
152
140
  @offenses = offenses
153
141
  end
@@ -5,9 +5,7 @@ module RubyLsp
5
5
  module Requests
6
6
  module Support
7
7
  class SelectionRange < Interface::SelectionRange
8
- extend T::Sig
9
-
10
- sig { params(position: T::Hash[Symbol, T.untyped]).returns(T::Boolean) }
8
+ #: (Hash[Symbol, untyped] position) -> bool
11
9
  def cover?(position)
12
10
  start_covered = range.start.line < position[:line] ||
13
11
  (range.start.line == position[:line] && range.start.character <= position[:character])
@@ -6,45 +6,36 @@ module RubyLsp
6
6
  module Support
7
7
  class Sorbet
8
8
  class << self
9
- extend T::Sig
9
+ ANNOTATIONS = {
10
+ abstract!: Annotation.new(arity: 0),
11
+ absurd: Annotation.new(arity: 1, receiver: true),
12
+ all: Annotation.new(arity: (2..), receiver: true),
13
+ any: Annotation.new(arity: (2..), receiver: true),
14
+ assert_type!: Annotation.new(arity: 2, receiver: true),
15
+ attached_class: Annotation.new(arity: 0, receiver: true),
16
+ bind: Annotation.new(arity: 2, receiver: true),
17
+ cast: Annotation.new(arity: 2, receiver: true),
18
+ class_of: Annotation.new(arity: 1, receiver: true),
19
+ enums: Annotation.new(arity: 0),
20
+ interface!: Annotation.new(arity: 0),
21
+ let: Annotation.new(arity: 2, receiver: true),
22
+ mixes_in_class_methods: Annotation.new(arity: 1),
23
+ must: Annotation.new(arity: 1, receiver: true),
24
+ must_because: Annotation.new(arity: 1, receiver: true),
25
+ nilable: Annotation.new(arity: 1, receiver: true),
26
+ noreturn: Annotation.new(arity: 0, receiver: true),
27
+ requires_ancestor: Annotation.new(arity: 0),
28
+ reveal_type: Annotation.new(arity: 1, receiver: true),
29
+ sealed!: Annotation.new(arity: 0),
30
+ self_type: Annotation.new(arity: 0, receiver: true),
31
+ sig: Annotation.new(arity: 0),
32
+ type_member: Annotation.new(arity: (0..1)),
33
+ type_template: Annotation.new(arity: 0),
34
+ unsafe: Annotation.new(arity: 1),
35
+ untyped: Annotation.new(arity: 0, receiver: true),
36
+ } #: Hash[Symbol, Annotation]
10
37
 
11
- ANNOTATIONS = T.let(
12
- {
13
- abstract!: Annotation.new(arity: 0),
14
- absurd: Annotation.new(arity: 1, receiver: true),
15
- all: Annotation.new(arity: (2..), receiver: true),
16
- any: Annotation.new(arity: (2..), receiver: true),
17
- assert_type!: Annotation.new(arity: 2, receiver: true),
18
- attached_class: Annotation.new(arity: 0, receiver: true),
19
- bind: Annotation.new(arity: 2, receiver: true),
20
- cast: Annotation.new(arity: 2, receiver: true),
21
- class_of: Annotation.new(arity: 1, receiver: true),
22
- enums: Annotation.new(arity: 0),
23
- interface!: Annotation.new(arity: 0),
24
- let: Annotation.new(arity: 2, receiver: true),
25
- mixes_in_class_methods: Annotation.new(arity: 1),
26
- must: Annotation.new(arity: 1, receiver: true),
27
- must_because: Annotation.new(arity: 1, receiver: true),
28
- nilable: Annotation.new(arity: 1, receiver: true),
29
- noreturn: Annotation.new(arity: 0, receiver: true),
30
- requires_ancestor: Annotation.new(arity: 0),
31
- reveal_type: Annotation.new(arity: 1, receiver: true),
32
- sealed!: Annotation.new(arity: 0),
33
- self_type: Annotation.new(arity: 0, receiver: true),
34
- sig: Annotation.new(arity: 0),
35
- type_member: Annotation.new(arity: (0..1)),
36
- type_template: Annotation.new(arity: 0),
37
- unsafe: Annotation.new(arity: 1),
38
- untyped: Annotation.new(arity: 0, receiver: true),
39
- },
40
- T::Hash[Symbol, Annotation],
41
- )
42
-
43
- sig do
44
- params(
45
- node: Prism::CallNode,
46
- ).returns(T::Boolean)
47
- end
38
+ #: (Prism::CallNode node) -> bool
48
39
  def annotation?(node)
49
40
  !!ANNOTATIONS[node.name]&.match?(node)
50
41
  end
@@ -6,43 +6,31 @@ require "uri/file"
6
6
  module URI
7
7
  # Must be kept in sync with the one in Tapioca
8
8
  class Source < URI::File
9
- extend T::Sig
10
-
11
- COMPONENT = T.let(
12
- [
13
- :scheme,
14
- :gem_name,
15
- :gem_version,
16
- :path,
17
- :line_number,
18
- ].freeze,
19
- T::Array[Symbol],
20
- )
9
+ COMPONENT = [
10
+ :scheme,
11
+ :gem_name,
12
+ :gem_version,
13
+ :path,
14
+ :line_number,
15
+ ].freeze #: Array[Symbol]
21
16
 
22
17
  # `uri` for Ruby 3.4 switched the default parser from RFC2396 to RFC3986. The new parser emits a deprecation
23
18
  # warning on a few methods and delegates them to RFC2396, namely `extract`/`make_regexp`/`escape`/`unescape`.
24
19
  # On earlier versions of the uri gem, the RFC2396_PARSER constant doesn't exist, so it needs some special
25
20
  # handling to select a parser that doesn't emit deprecations. While it was backported to Ruby 3.1, users may
26
21
  # have the uri gem in their own bundle and thus not use a compatible version.
27
- PARSER = T.let(const_defined?(:RFC2396_PARSER) ? RFC2396_PARSER : DEFAULT_PARSER, RFC2396_Parser)
22
+ PARSER = const_defined?(:RFC2396_PARSER) ? RFC2396_PARSER : DEFAULT_PARSER #: RFC2396_Parser
28
23
 
29
- T.unsafe(self).alias_method(:gem_name, :host)
30
- T.unsafe(self).alias_method(:line_number, :fragment)
24
+ self #: as untyped # rubocop:disable Style/RedundantSelf
25
+ .alias_method(:gem_name, :host)
26
+ self #: as untyped # rubocop:disable Style/RedundantSelf
27
+ .alias_method(:line_number, :fragment)
31
28
 
32
- sig { returns(T.nilable(String)) }
29
+ #: String?
33
30
  attr_reader :gem_version
34
31
 
35
32
  class << self
36
- extend T::Sig
37
-
38
- sig do
39
- params(
40
- gem_name: String,
41
- gem_version: T.nilable(String),
42
- path: String,
43
- line_number: T.nilable(String),
44
- ).returns(URI::Source)
45
- end
33
+ #: (gem_name: String, gem_version: String?, path: String, line_number: String?) -> URI::Source
46
34
  def build(gem_name:, gem_version:, path:, line_number:)
47
35
  super(
48
36
  {
@@ -55,17 +43,17 @@ module URI
55
43
  end
56
44
  end
57
45
 
58
- sig { params(v: T.nilable(String)).void }
46
+ #: (String? v) -> void
59
47
  def set_path(v) # rubocop:disable Naming/AccessorMethodName
60
48
  return if v.nil?
61
49
 
62
50
  gem_version, path = v.delete_prefix("/").split("/", 2)
63
51
 
64
- @gem_version = T.let(gem_version, T.nilable(String))
65
- @path = T.let(path, T.nilable(String))
52
+ @gem_version = gem_version #: String?
53
+ @path = path #: String?
66
54
  end
67
55
 
68
- sig { params(v: T.nilable(String)).returns(T::Boolean) }
56
+ #: (String? v) -> bool
69
57
  def check_host(v)
70
58
  return true unless v
71
59
 
@@ -77,7 +65,7 @@ module URI
77
65
  true
78
66
  end
79
67
 
80
- sig { returns(String) }
68
+ #: -> String
81
69
  def to_s
82
70
  "source://#{gem_name}/#{gem_version}#{path}##{line_number}"
83
71
  end
@@ -85,7 +73,7 @@ module URI
85
73
  if URI.respond_to?(:register_scheme)
86
74
  URI.register_scheme("SOURCE", self)
87
75
  else
88
- @@schemes = T.let(@@schemes, T::Hash[String, T.untyped]) # rubocop:disable Style/ClassVars
76
+ @@schemes = @@schemes #: Hash[String, untyped] # rubocop:disable Style/ClassVars
89
77
  @@schemes["SOURCE"] = self
90
78
  end
91
79
  end