ruby-lsp 0.23.11 → 0.23.16
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 +123 -169
- data/lib/ruby_indexer/lib/ruby_indexer/enhancement.rb +9 -7
- data/lib/ruby_indexer/lib/ruby_indexer/entry.rb +92 -202
- data/lib/ruby_indexer/lib/ruby_indexer/index.rb +116 -222
- 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 +22 -45
- 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 +5 -9
- 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 +139 -135
- data/lib/ruby_indexer/test/instance_variables_test.rb +37 -37
- data/lib/ruby_indexer/test/method_test.rb +143 -117
- data/lib/ruby_indexer/test/prefix_tree_test.rb +13 -13
- data/lib/ruby_indexer/test/rbs_indexer_test.rb +65 -71
- data/lib/ruby_indexer/test/test_case.rb +2 -2
- 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 +39 -45
- data/lib/ruby_lsp/erb_document.rb +36 -40
- 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 +60 -66
- data/lib/ruby_lsp/listeners/definition.rb +38 -52
- data/lib/ruby_lsp/listeners/document_highlight.rb +123 -150
- data/lib/ruby_lsp/listeners/document_link.rb +46 -63
- 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 +83 -102
- 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 +11 -26
- 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 +160 -88
- data/lib/ruby_lsp/node_context.rb +12 -39
- data/lib/ruby_lsp/rbs_document.rb +8 -6
- data/lib/ruby_lsp/requests/code_action_resolve.rb +24 -25
- data/lib/ruby_lsp/requests/code_actions.rb +14 -26
- data/lib/ruby_lsp/requests/code_lens.rb +6 -17
- 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 +8 -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 +87 -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 +8 -37
- data/lib/ruby_lsp/requests/rename.rb +19 -42
- data/lib/ruby_lsp/requests/request.rb +7 -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 +16 -51
- 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 +10 -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 +13 -18
- 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 +6 -10
- data/lib/ruby_lsp/ruby_document.rb +24 -62
- data/lib/ruby_lsp/scope.rb +7 -11
- data/lib/ruby_lsp/scripts/compose_bundle.rb +6 -4
- data/lib/ruby_lsp/server.rb +147 -79
- data/lib/ruby_lsp/setup_bundler.rb +65 -60
- data/lib/ruby_lsp/static_docs.rb +11 -7
- data/lib/ruby_lsp/store.rb +24 -42
- data/lib/ruby_lsp/test_helper.rb +2 -12
- data/lib/ruby_lsp/test_reporters/lsp_reporter.rb +164 -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 +49 -83
- metadata +9 -3
@@ -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
|
@@ -13,23 +13,19 @@ module RubyLsp
|
|
13
13
|
module Support
|
14
14
|
# :nodoc:
|
15
15
|
class SyntaxTreeFormatter
|
16
|
-
extend T::Sig
|
17
16
|
include Support::Formatter
|
18
17
|
|
19
|
-
|
18
|
+
#: -> void
|
20
19
|
def initialize
|
21
|
-
@options =
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
opts
|
27
|
-
end,
|
28
|
-
SyntaxTree::CLI::Options,
|
29
|
-
)
|
20
|
+
@options = begin
|
21
|
+
opts = SyntaxTree::CLI::Options.new
|
22
|
+
opts.parse(SyntaxTree::CLI::ConfigFile.new.arguments)
|
23
|
+
opts
|
24
|
+
end #: SyntaxTree::CLI::Options
|
30
25
|
end
|
31
26
|
|
32
|
-
|
27
|
+
# @override
|
28
|
+
#: (URI::Generic uri, RubyDocument document) -> String?
|
33
29
|
def run_formatting(uri, document)
|
34
30
|
path = uri.to_standardized_path
|
35
31
|
return if path && @options.ignore_files.any? { |pattern| File.fnmatch?("*/#{pattern}", path) }
|
@@ -37,7 +33,8 @@ module RubyLsp
|
|
37
33
|
SyntaxTree.format(document.source, @options.print_width, options: @options.formatter_options)
|
38
34
|
end
|
39
35
|
|
40
|
-
|
36
|
+
# @override
|
37
|
+
#: (URI::Generic uri, String source, Integer base_indentation) -> String?
|
41
38
|
def run_range_formatting(uri, source, base_indentation)
|
42
39
|
path = uri.to_standardized_path
|
43
40
|
return if path && @options.ignore_files.any? { |pattern| File.fnmatch?("*/#{pattern}", path) }
|
@@ -45,12 +42,8 @@ module RubyLsp
|
|
45
42
|
SyntaxTree.format(source, @options.print_width, base_indentation, options: @options.formatter_options)
|
46
43
|
end
|
47
44
|
|
48
|
-
|
49
|
-
|
50
|
-
uri: URI::Generic,
|
51
|
-
document: RubyDocument,
|
52
|
-
).returns(T.nilable(T::Array[Interface::Diagnostic]))
|
53
|
-
end
|
45
|
+
# @override
|
46
|
+
#: (URI::Generic uri, RubyDocument document) -> Array[Interface::Diagnostic]?
|
54
47
|
def run_diagnostic(uri, document)
|
55
48
|
nil
|
56
49
|
end
|
@@ -10,46 +10,42 @@ module RubyLsp
|
|
10
10
|
# Note: this test item object can only represent test groups or examples discovered inside files. It cannot be
|
11
11
|
# used to represent test files, directories or workspaces
|
12
12
|
class TestItem
|
13
|
-
|
14
|
-
|
15
|
-
sig { returns(String) }
|
13
|
+
#: String
|
16
14
|
attr_reader :id, :label
|
17
15
|
|
18
|
-
|
19
|
-
def initialize(id, label, uri, range)
|
16
|
+
#: (String id, String label, URI::Generic uri, Interface::Range range, Symbol framework) -> void
|
17
|
+
def initialize(id, label, uri, range, framework:)
|
20
18
|
@id = id
|
21
19
|
@label = label
|
22
20
|
@uri = uri
|
23
21
|
@range = range
|
24
|
-
@
|
22
|
+
@tags = ["framework:#{framework}"] #: Array[String]
|
23
|
+
@children = {} #: Hash[String, TestItem]
|
25
24
|
end
|
26
25
|
|
27
|
-
|
26
|
+
#: (TestItem item) -> void
|
28
27
|
def add(item)
|
29
|
-
if @children.key?(item.id)
|
30
|
-
raise ResponseBuilders::TestCollection::DuplicateIdError, "TestItem ID is already in use"
|
31
|
-
end
|
32
|
-
|
33
28
|
@children[item.id] = item
|
34
29
|
end
|
35
30
|
|
36
|
-
|
31
|
+
#: (String id) -> TestItem?
|
37
32
|
def [](id)
|
38
33
|
@children[id]
|
39
34
|
end
|
40
35
|
|
41
|
-
|
36
|
+
#: -> Array[TestItem]
|
42
37
|
def children
|
43
38
|
@children.values
|
44
39
|
end
|
45
40
|
|
46
|
-
|
41
|
+
#: -> Hash[Symbol, untyped]
|
47
42
|
def to_hash
|
48
43
|
{
|
49
44
|
id: @id,
|
50
45
|
label: @label,
|
51
46
|
uri: @uri,
|
52
47
|
range: @range,
|
48
|
+
tags: @tags,
|
53
49
|
children: children.map(&:to_hash),
|
54
50
|
}
|
55
51
|
end
|
@@ -7,11 +7,9 @@ module RubyLsp
|
|
7
7
|
# request](https://microsoft.github.io/language-server-protocol/specification#typeHierarchy_supertypes)
|
8
8
|
# displays the list of ancestors (supertypes) for the selected type.
|
9
9
|
class TypeHierarchySupertypes < Request
|
10
|
-
extend T::Sig
|
11
|
-
|
12
10
|
include Support::Common
|
13
11
|
|
14
|
-
|
12
|
+
#: (RubyIndexer::Index index, Hash[Symbol, untyped] item) -> void
|
15
13
|
def initialize(index, item)
|
16
14
|
super()
|
17
15
|
|
@@ -19,12 +17,13 @@ module RubyLsp
|
|
19
17
|
@item = item
|
20
18
|
end
|
21
19
|
|
22
|
-
|
20
|
+
# @override
|
21
|
+
#: -> Array[Interface::TypeHierarchyItem]?
|
23
22
|
def perform
|
24
23
|
name = @item[:name]
|
25
24
|
entries = @index[name]
|
26
25
|
|
27
|
-
parents =
|
26
|
+
parents = Set.new #: Set[RubyIndexer::Entry::Namespace]
|
28
27
|
return unless entries&.any?
|
29
28
|
|
30
29
|
entries.each do |entry|
|
@@ -60,7 +59,7 @@ module RubyLsp
|
|
60
59
|
|
61
60
|
private
|
62
61
|
|
63
|
-
|
62
|
+
#: (RubyIndexer::Entry entry) -> Interface::TypeHierarchyItem
|
64
63
|
def hierarchy_item(entry)
|
65
64
|
Interface::TypeHierarchyItem.new(
|
66
65
|
name: entry.name,
|
@@ -7,18 +7,18 @@ module RubyLsp
|
|
7
7
|
# request allows fuzzy searching declarations in the entire project. On VS Code, use CTRL/CMD + T to search for
|
8
8
|
# symbols.
|
9
9
|
class WorkspaceSymbol < Request
|
10
|
-
extend T::Sig
|
11
10
|
include Support::Common
|
12
11
|
|
13
|
-
|
12
|
+
#: (GlobalState global_state, String? query) -> void
|
14
13
|
def initialize(global_state, query)
|
15
14
|
super()
|
16
15
|
@global_state = global_state
|
17
16
|
@query = query
|
18
|
-
@index =
|
17
|
+
@index = global_state.index #: RubyIndexer::Index
|
19
18
|
end
|
20
19
|
|
21
|
-
|
20
|
+
# @override
|
21
|
+
#: -> Array[Interface::WorkspaceSymbol]
|
22
22
|
def perform
|
23
23
|
@index.fuzzy_search(@query).filter_map do |entry|
|
24
24
|
uri = entry.uri
|
@@ -4,23 +4,23 @@
|
|
4
4
|
module RubyLsp
|
5
5
|
module ResponseBuilders
|
6
6
|
class CollectionResponseBuilder < ResponseBuilder
|
7
|
-
extend T::Sig
|
8
7
|
extend T::Generic
|
9
8
|
|
10
9
|
ResponseType = type_member { { upper: Object } }
|
11
10
|
|
12
|
-
|
11
|
+
#: -> void
|
13
12
|
def initialize
|
14
13
|
super
|
15
|
-
@items =
|
14
|
+
@items = [] #: Array[ResponseType]
|
16
15
|
end
|
17
16
|
|
18
|
-
|
17
|
+
#: (ResponseType item) -> void
|
19
18
|
def <<(item)
|
20
19
|
@items << item
|
21
20
|
end
|
22
21
|
|
23
|
-
|
22
|
+
# @override
|
23
|
+
#: -> Array[ResponseType]
|
24
24
|
def response
|
25
25
|
@items
|
26
26
|
end
|
@@ -4,53 +4,48 @@
|
|
4
4
|
module RubyLsp
|
5
5
|
module ResponseBuilders
|
6
6
|
class DocumentSymbol < ResponseBuilder
|
7
|
-
extend T::Sig
|
8
|
-
|
9
7
|
ResponseType = type_member { { fixed: T::Array[Interface::DocumentSymbol] } }
|
10
8
|
|
11
9
|
class SymbolHierarchyRoot
|
12
|
-
|
13
|
-
|
14
|
-
sig { returns(T::Array[Interface::DocumentSymbol]) }
|
10
|
+
#: Array[Interface::DocumentSymbol]
|
15
11
|
attr_reader :children
|
16
12
|
|
17
|
-
|
13
|
+
#: -> void
|
18
14
|
def initialize
|
19
|
-
@children =
|
15
|
+
@children = [] #: Array[Interface::DocumentSymbol]
|
20
16
|
end
|
21
17
|
end
|
22
18
|
|
23
|
-
|
19
|
+
#: -> void
|
24
20
|
def initialize
|
25
21
|
super
|
26
|
-
@stack =
|
27
|
-
[SymbolHierarchyRoot.new],
|
28
|
-
T::Array[T.any(SymbolHierarchyRoot, Interface::DocumentSymbol)],
|
29
|
-
)
|
22
|
+
@stack = [SymbolHierarchyRoot.new] #: Array[(SymbolHierarchyRoot | Interface::DocumentSymbol)]
|
30
23
|
end
|
31
24
|
|
32
|
-
|
25
|
+
#: (Interface::DocumentSymbol symbol) -> void
|
33
26
|
def push(symbol)
|
34
27
|
@stack << symbol
|
35
28
|
end
|
36
29
|
|
37
30
|
alias_method(:<<, :push)
|
38
31
|
|
39
|
-
|
32
|
+
#: -> Interface::DocumentSymbol?
|
40
33
|
def pop
|
41
34
|
if @stack.size > 1
|
42
35
|
T.cast(@stack.pop, Interface::DocumentSymbol)
|
43
36
|
end
|
44
37
|
end
|
45
38
|
|
46
|
-
|
39
|
+
#: -> (SymbolHierarchyRoot | Interface::DocumentSymbol)
|
47
40
|
def last
|
48
|
-
|
41
|
+
@stack.last #: as !nil
|
49
42
|
end
|
50
43
|
|
51
|
-
|
44
|
+
# @override
|
45
|
+
#: -> Array[Interface::DocumentSymbol]
|
52
46
|
def response
|
53
|
-
|
47
|
+
@stack.first #: as !nil
|
48
|
+
.children
|
54
49
|
end
|
55
50
|
end
|
56
51
|
end
|