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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/VERSION +1 -1
- data/exe/ruby-lsp-launcher +20 -11
- data/lib/rubocop/cop/ruby_lsp/use_language_server_aliases.rb +1 -1
- data/lib/rubocop/cop/ruby_lsp/use_register_with_handler_method.rb +3 -5
- data/lib/ruby_indexer/lib/ruby_indexer/configuration.rb +82 -116
- data/lib/ruby_indexer/lib/ruby_indexer/declaration_listener.rb +134 -183
- data/lib/ruby_indexer/lib/ruby_indexer/enhancement.rb +9 -10
- data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +97 -217
- data/lib/ruby_indexer/lib/ruby_indexer/index.rb +139 -281
- data/lib/ruby_indexer/lib/ruby_indexer/location.rb +4 -27
- data/lib/ruby_indexer/lib/ruby_indexer/prefix_tree.rb +18 -19
- data/lib/ruby_indexer/lib/ruby_indexer/rbs_indexer.rb +23 -55
- data/lib/ruby_indexer/lib/ruby_indexer/reference_finder.rb +47 -61
- data/lib/ruby_indexer/lib/ruby_indexer/uri.rb +17 -19
- data/lib/ruby_indexer/lib/ruby_indexer/visibility_scope.rb +7 -11
- data/lib/ruby_indexer/test/class_variables_test.rb +14 -14
- data/lib/ruby_indexer/test/classes_and_modules_test.rb +65 -40
- data/lib/ruby_indexer/test/configuration_test.rb +48 -7
- data/lib/ruby_indexer/test/constant_test.rb +34 -34
- data/lib/ruby_indexer/test/enhancements_test.rb +1 -1
- data/lib/ruby_indexer/test/index_test.rb +146 -135
- data/lib/ruby_indexer/test/instance_variables_test.rb +37 -37
- data/lib/ruby_indexer/test/method_test.rb +149 -123
- data/lib/ruby_indexer/test/prefix_tree_test.rb +13 -13
- data/lib/ruby_indexer/test/rbs_indexer_test.rb +68 -73
- data/lib/ruby_indexer/test/test_case.rb +9 -3
- data/lib/ruby_indexer/test/uri_test.rb +15 -2
- data/lib/ruby_lsp/addon.rb +44 -71
- data/lib/ruby_lsp/base_server.rb +29 -32
- data/lib/ruby_lsp/client_capabilities.rb +10 -12
- data/lib/ruby_lsp/document.rb +40 -54
- data/lib/ruby_lsp/erb_document.rb +37 -41
- data/lib/ruby_lsp/global_state.rb +52 -57
- data/lib/ruby_lsp/internal.rb +2 -0
- data/lib/ruby_lsp/listeners/code_lens.rb +82 -89
- data/lib/ruby_lsp/listeners/completion.rb +67 -73
- data/lib/ruby_lsp/listeners/definition.rb +44 -58
- data/lib/ruby_lsp/listeners/document_highlight.rb +123 -150
- data/lib/ruby_lsp/listeners/document_link.rb +50 -70
- data/lib/ruby_lsp/listeners/document_symbol.rb +38 -52
- data/lib/ruby_lsp/listeners/folding_ranges.rb +40 -43
- data/lib/ruby_lsp/listeners/hover.rb +92 -110
- data/lib/ruby_lsp/listeners/inlay_hints.rb +4 -11
- data/lib/ruby_lsp/listeners/semantic_highlighting.rb +54 -56
- data/lib/ruby_lsp/listeners/signature_help.rb +12 -27
- data/lib/ruby_lsp/listeners/spec_style.rb +155 -0
- data/lib/ruby_lsp/listeners/test_discovery.rb +89 -0
- data/lib/ruby_lsp/listeners/test_style.rb +167 -90
- data/lib/ruby_lsp/node_context.rb +12 -39
- data/lib/ruby_lsp/rbs_document.rb +9 -7
- data/lib/ruby_lsp/requests/code_action_resolve.rb +63 -59
- data/lib/ruby_lsp/requests/code_actions.rb +14 -26
- data/lib/ruby_lsp/requests/code_lens.rb +20 -19
- data/lib/ruby_lsp/requests/completion.rb +7 -20
- data/lib/ruby_lsp/requests/completion_resolve.rb +6 -6
- data/lib/ruby_lsp/requests/definition.rb +7 -17
- data/lib/ruby_lsp/requests/diagnostics.rb +8 -11
- data/lib/ruby_lsp/requests/discover_tests.rb +18 -5
- data/lib/ruby_lsp/requests/document_highlight.rb +5 -15
- data/lib/ruby_lsp/requests/document_link.rb +6 -17
- data/lib/ruby_lsp/requests/document_symbol.rb +5 -8
- data/lib/ruby_lsp/requests/folding_ranges.rb +7 -15
- data/lib/ruby_lsp/requests/formatting.rb +6 -9
- data/lib/ruby_lsp/requests/go_to_relevant_file.rb +85 -0
- data/lib/ruby_lsp/requests/hover.rb +10 -20
- data/lib/ruby_lsp/requests/inlay_hints.rb +6 -17
- data/lib/ruby_lsp/requests/on_type_formatting.rb +32 -40
- data/lib/ruby_lsp/requests/prepare_rename.rb +4 -9
- data/lib/ruby_lsp/requests/prepare_type_hierarchy.rb +5 -15
- data/lib/ruby_lsp/requests/range_formatting.rb +5 -6
- data/lib/ruby_lsp/requests/references.rb +9 -53
- data/lib/ruby_lsp/requests/rename.rb +20 -46
- data/lib/ruby_lsp/requests/request.rb +8 -19
- data/lib/ruby_lsp/requests/selection_ranges.rb +6 -6
- data/lib/ruby_lsp/requests/semantic_highlighting.rb +16 -35
- data/lib/ruby_lsp/requests/show_syntax_tree.rb +7 -8
- data/lib/ruby_lsp/requests/signature_help.rb +8 -26
- data/lib/ruby_lsp/requests/support/annotation.rb +4 -10
- data/lib/ruby_lsp/requests/support/common.rb +15 -55
- data/lib/ruby_lsp/requests/support/rubocop_diagnostic.rb +27 -35
- data/lib/ruby_lsp/requests/support/rubocop_formatter.rb +11 -14
- data/lib/ruby_lsp/requests/support/rubocop_runner.rb +22 -34
- data/lib/ruby_lsp/requests/support/selection_range.rb +1 -3
- data/lib/ruby_lsp/requests/support/sorbet.rb +29 -38
- data/lib/ruby_lsp/requests/support/source_uri.rb +20 -32
- data/lib/ruby_lsp/requests/support/syntax_tree_formatter.rb +12 -19
- data/lib/ruby_lsp/requests/support/test_item.rb +16 -14
- data/lib/ruby_lsp/requests/type_hierarchy_supertypes.rb +5 -6
- data/lib/ruby_lsp/requests/workspace_symbol.rb +4 -4
- data/lib/ruby_lsp/response_builders/collection_response_builder.rb +5 -5
- data/lib/ruby_lsp/response_builders/document_symbol.rb +14 -19
- data/lib/ruby_lsp/response_builders/hover.rb +11 -14
- data/lib/ruby_lsp/response_builders/response_builder.rb +1 -1
- data/lib/ruby_lsp/response_builders/semantic_highlighting.rb +60 -88
- data/lib/ruby_lsp/response_builders/signature_help.rb +5 -6
- data/lib/ruby_lsp/response_builders/test_collection.rb +43 -10
- data/lib/ruby_lsp/ruby_document.rb +24 -92
- data/lib/ruby_lsp/scope.rb +7 -11
- data/lib/ruby_lsp/scripts/compose_bundle.rb +6 -4
- data/lib/ruby_lsp/server.rb +182 -99
- data/lib/ruby_lsp/setup_bundler.rb +65 -60
- data/lib/ruby_lsp/static_docs.rb +11 -7
- data/lib/ruby_lsp/store.rb +29 -47
- data/lib/ruby_lsp/test_helper.rb +2 -12
- data/lib/ruby_lsp/test_reporters/lsp_reporter.rb +191 -0
- data/lib/ruby_lsp/test_reporters/minitest_reporter.rb +105 -0
- data/lib/ruby_lsp/test_reporters/test_unit_reporter.rb +94 -0
- data/lib/ruby_lsp/type_inferrer.rb +13 -14
- data/lib/ruby_lsp/utils.rb +92 -83
- 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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
54
|
+
#: (String file_path) -> bool?
|
64
55
|
def not_in_dependencies?(file_path)
|
65
56
|
BUNDLE_PATH &&
|
66
|
-
!file_path.start_with?(
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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 =
|
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
|
-
|
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
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
80
|
+
#: -> Integer?
|
89
81
|
def severity
|
90
82
|
RUBOCOP_TO_LSP_SEVERITY[@offense.severity.name]
|
91
83
|
end
|
92
84
|
|
93
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
14
|
+
#: -> void
|
16
15
|
def initialize
|
17
|
-
@diagnostic_runner =
|
16
|
+
@diagnostic_runner = RuboCopRunner.new #: RuboCopRunner
|
18
17
|
# -a is for "--auto-correct" (or "--autocorrect" on newer versions of RuboCop)
|
19
|
-
@format_runner =
|
18
|
+
@format_runner = RuboCopRunner.new("-a") #: RuboCopRunner
|
20
19
|
end
|
21
20
|
|
22
|
-
|
21
|
+
# @override
|
22
|
+
#: (URI::Generic uri, RubyDocument document) -> String?
|
23
23
|
def run_formatting(uri, document)
|
24
|
-
filename =
|
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
|
-
|
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
|
-
|
38
|
-
|
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 =
|
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
|
-
|
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 =
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
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
|
-
|
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
|
-
|
78
|
+
#: (*String args) -> void
|
86
79
|
def initialize(*args)
|
87
|
-
@options =
|
88
|
-
@offenses =
|
89
|
-
@errors =
|
90
|
-
@warnings =
|
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 =
|
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
|
-
|
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
|
-
|
117
|
+
#: -> String
|
125
118
|
def formatted_source
|
126
119
|
@options[:stdin]
|
127
120
|
end
|
128
121
|
|
129
122
|
class << self
|
130
|
-
|
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
|
-
|
130
|
+
#: -> Hash[String, [singleton(::RuboCop::Cop::Base)]]
|
140
131
|
def cop_registry
|
141
|
-
@cop_registry ||=
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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 =
|
22
|
+
PARSER = const_defined?(:RFC2396_PARSER) ? RFC2396_PARSER : DEFAULT_PARSER #: RFC2396_Parser
|
28
23
|
|
29
|
-
|
30
|
-
|
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
|
-
|
29
|
+
#: String?
|
33
30
|
attr_reader :gem_version
|
34
31
|
|
35
32
|
class << self
|
36
|
-
|
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
|
-
|
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 =
|
65
|
-
@path =
|
52
|
+
@gem_version = gem_version #: String?
|
53
|
+
@path = path #: String?
|
66
54
|
end
|
67
55
|
|
68
|
-
|
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
|
-
|
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 =
|
76
|
+
@@schemes = @@schemes #: Hash[String, untyped] # rubocop:disable Style/ClassVars
|
89
77
|
@@schemes["SOURCE"] = self
|
90
78
|
end
|
91
79
|
end
|