solargraph 0.59.0.dev.1 → 0.59.0.dev.2
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/.github/workflows/plugins.yml +4 -1
- data/.github/workflows/rspec.yml +3 -14
- data/.gitignore +1 -0
- data/.rubocop.yml +32 -5
- data/.rubocop_todo.yml +37 -931
- data/CHANGELOG.md +7 -1
- data/Gemfile +3 -1
- data/Rakefile +25 -23
- data/bin/solargraph +2 -1
- data/lib/solargraph/api_map/index.rb +5 -11
- data/lib/solargraph/api_map/source_to_yard.rb +9 -8
- data/lib/solargraph/api_map/store.rb +22 -20
- data/lib/solargraph/api_map.rb +50 -37
- data/lib/solargraph/bench.rb +44 -45
- data/lib/solargraph/complex_type/type_methods.rb +12 -15
- data/lib/solargraph/complex_type/unique_type.rb +54 -43
- data/lib/solargraph/complex_type.rb +69 -61
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +4 -4
- data/lib/solargraph/convention/data_definition.rb +1 -1
- data/lib/solargraph/convention/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +23 -23
- data/lib/solargraph/convention/rakefile.rb +17 -17
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -1
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +3 -3
- data/lib/solargraph/convention/struct_definition.rb +3 -3
- data/lib/solargraph/convention.rb +78 -78
- data/lib/solargraph/converters/dd.rb +19 -17
- data/lib/solargraph/converters/dl.rb +17 -15
- data/lib/solargraph/converters/dt.rb +17 -15
- data/lib/solargraph/converters/misc.rb +3 -1
- data/lib/solargraph/diagnostics/rubocop.rb +10 -10
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +3 -3
- data/lib/solargraph/diagnostics/type_check.rb +10 -10
- data/lib/solargraph/diagnostics/update_errors.rb +37 -41
- data/lib/solargraph/doc_map.rb +9 -10
- data/lib/solargraph/equality.rb +3 -3
- data/lib/solargraph/gem_pins.rb +7 -5
- data/lib/solargraph/language_server/error_codes.rb +20 -20
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +2 -3
- data/lib/solargraph/language_server/host/message_worker.rb +2 -2
- data/lib/solargraph/language_server/host/sources.rb +1 -1
- data/lib/solargraph/language_server/host.rb +24 -21
- data/lib/solargraph/language_server/message/base.rb +97 -97
- data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +10 -11
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/initialize.rb +197 -191
- data/lib/solargraph/language_server/message/text_document/completion.rb +8 -8
- data/lib/solargraph/language_server/message/text_document/definition.rb +41 -34
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -21
- data/lib/solargraph/language_server/message/text_document/formatting.rb +6 -6
- data/lib/solargraph/language_server/message/text_document/hover.rb +3 -5
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +2 -2
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -19
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -19
- data/lib/solargraph/language_server/message.rb +94 -94
- data/lib/solargraph/language_server/request.rb +29 -27
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/library.rb +28 -33
- data/lib/solargraph/location.rb +10 -12
- data/lib/solargraph/logging.rb +4 -4
- data/lib/solargraph/page.rb +92 -92
- data/lib/solargraph/parser/comment_ripper.rb +12 -4
- data/lib/solargraph/parser/flow_sensitive_typing.rb +32 -42
- data/lib/solargraph/parser/node_processor/base.rb +4 -4
- data/lib/solargraph/parser/node_processor.rb +1 -1
- data/lib/solargraph/parser/parser_gem/class_methods.rb +4 -4
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +20 -20
- data/lib/solargraph/parser/parser_gem/node_methods.rb +66 -65
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +12 -12
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +3 -5
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +118 -112
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem.rb +14 -12
- data/lib/solargraph/parser/snippet.rb +2 -0
- data/lib/solargraph/parser.rb +25 -23
- data/lib/solargraph/pin/base.rb +78 -64
- data/lib/solargraph/pin/base_variable.rb +28 -71
- data/lib/solargraph/pin/block.rb +3 -2
- data/lib/solargraph/pin/breakable.rb +2 -0
- data/lib/solargraph/pin/callable.rb +23 -26
- data/lib/solargraph/pin/closure.rb +5 -4
- data/lib/solargraph/pin/common.rb +5 -2
- data/lib/solargraph/pin/compound_statement.rb +3 -3
- data/lib/solargraph/pin/constant.rb +43 -45
- data/lib/solargraph/pin/conversions.rb +9 -4
- data/lib/solargraph/pin/delegated_method.rb +4 -4
- data/lib/solargraph/pin/documenting.rb +3 -2
- data/lib/solargraph/pin/local_variable.rb +4 -4
- data/lib/solargraph/pin/method.rb +71 -70
- data/lib/solargraph/pin/namespace.rb +13 -12
- data/lib/solargraph/pin/parameter.rb +28 -27
- data/lib/solargraph/pin/proxy_type.rb +2 -0
- data/lib/solargraph/pin/reference.rb +17 -0
- data/lib/solargraph/pin/search.rb +2 -2
- data/lib/solargraph/pin/signature.rb +9 -14
- data/lib/solargraph/pin/symbol.rb +1 -0
- data/lib/solargraph/pin/until.rb +1 -3
- data/lib/solargraph/pin/while.rb +1 -3
- data/lib/solargraph/pin_cache.rb +16 -19
- data/lib/solargraph/position.rb +35 -17
- data/lib/solargraph/range.rb +10 -9
- data/lib/solargraph/rbs_map/conversions.rb +312 -206
- data/lib/solargraph/rbs_map/core_fills.rb +91 -84
- data/lib/solargraph/rbs_map/stdlib_map.rb +0 -1
- data/lib/solargraph/rbs_map.rb +3 -12
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +63 -53
- data/lib/solargraph/source/chain/array.rb +39 -37
- data/lib/solargraph/source/chain/call.rb +49 -44
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +3 -1
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +8 -6
- data/lib/solargraph/source/chain/if.rb +11 -10
- data/lib/solargraph/source/chain/instance_variable.rb +3 -1
- data/lib/solargraph/source/chain/link.rb +99 -109
- data/lib/solargraph/source/chain/literal.rb +4 -6
- data/lib/solargraph/source/chain/or.rb +2 -4
- data/lib/solargraph/source/chain/q_call.rb +13 -11
- data/lib/solargraph/source/chain/variable.rb +15 -13
- data/lib/solargraph/source/chain/z_super.rb +28 -30
- data/lib/solargraph/source/chain.rb +24 -16
- data/lib/solargraph/source/change.rb +3 -3
- data/lib/solargraph/source/cursor.rb +18 -18
- data/lib/solargraph/source/encoding_fixes.rb +6 -7
- data/lib/solargraph/source/source_chainer.rb +46 -32
- data/lib/solargraph/source/updater.rb +1 -1
- data/lib/solargraph/source.rb +27 -29
- data/lib/solargraph/source_map/clip.rb +38 -30
- data/lib/solargraph/source_map/mapper.rb +52 -46
- data/lib/solargraph/source_map.rb +8 -4
- data/lib/solargraph/type_checker/rules.rb +8 -8
- data/lib/solargraph/type_checker.rb +95 -101
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +10 -9
- data/lib/solargraph/workspace/gemspecs.rb +1 -1
- data/lib/solargraph/workspace.rb +21 -44
- data/lib/solargraph/yard_map/helpers.rb +6 -2
- data/lib/solargraph/yard_map/mapper/to_method.rb +8 -6
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -1
- data/lib/solargraph/yard_map/mapper.rb +12 -12
- data/lib/solargraph/yard_tags.rb +20 -20
- data/lib/solargraph.rb +5 -5
- data/solargraph.gemspec +35 -34
- metadata +28 -28
|
@@ -4,7 +4,7 @@ module Solargraph
|
|
|
4
4
|
# A container for type data based on YARD type tags.
|
|
5
5
|
#
|
|
6
6
|
class ComplexType
|
|
7
|
-
GENERIC_TAG_NAME = 'generic'
|
|
7
|
+
GENERIC_TAG_NAME = 'generic'
|
|
8
8
|
# @!parse
|
|
9
9
|
# include TypeMethods
|
|
10
10
|
include Equality
|
|
@@ -19,7 +19,7 @@ module Solargraph
|
|
|
19
19
|
# @type [Array<UniqueType>]
|
|
20
20
|
items = types.flat_map(&:items).uniq(&:to_s)
|
|
21
21
|
if items.any? { |i| i.name == 'false' } && items.any? { |i| i.name == 'true' }
|
|
22
|
-
items.delete_if { |i|
|
|
22
|
+
items.delete_if { |i| %w[false true].include?(i.name) }
|
|
23
23
|
items.unshift(UniqueType::BOOLEAN)
|
|
24
24
|
end
|
|
25
25
|
# @type [Array<UniqueType>]
|
|
@@ -29,17 +29,14 @@ module Solargraph
|
|
|
29
29
|
@items = items
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
protected def equality_fields
|
|
33
|
-
[self.class, items]
|
|
34
|
-
end
|
|
35
|
-
|
|
36
32
|
# @param api_map [ApiMap]
|
|
37
|
-
# @param
|
|
33
|
+
# @param gates [Array<String>]
|
|
34
|
+
#
|
|
38
35
|
# @return [ComplexType]
|
|
39
36
|
def qualify api_map, *gates
|
|
40
37
|
red = reduce_object
|
|
41
38
|
types = red.items.map do |t|
|
|
42
|
-
next t if [
|
|
39
|
+
next t if %w[nil void undefined].include?(t.name)
|
|
43
40
|
next t if ['::Boolean'].include?(t.rooted_name)
|
|
44
41
|
t.qualify api_map, *gates
|
|
45
42
|
end
|
|
@@ -53,7 +50,10 @@ module Solargraph
|
|
|
53
50
|
def resolve_generics_from_context generics_to_resolve, context_type, resolved_generic_values: {}
|
|
54
51
|
return self unless generic?
|
|
55
52
|
|
|
56
|
-
ComplexType.new(@items.map
|
|
53
|
+
ComplexType.new(@items.map do |i|
|
|
54
|
+
i.resolve_generics_from_context(generics_to_resolve, context_type,
|
|
55
|
+
resolved_generic_values: resolved_generic_values)
|
|
56
|
+
end)
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
# @return [UniqueType]
|
|
@@ -84,14 +84,14 @@ module Solargraph
|
|
|
84
84
|
# @sg-ignore Declared return type
|
|
85
85
|
# ::Array<::Solargraph::ComplexType::UniqueType> does not match
|
|
86
86
|
# inferred type ::Array<::Proc> for Solargraph::ComplexType#map
|
|
87
|
-
def map
|
|
87
|
+
def map &block
|
|
88
88
|
@items.map(&block)
|
|
89
89
|
end
|
|
90
90
|
|
|
91
91
|
# @yieldparam [UniqueType]
|
|
92
92
|
# @return [Enumerable<UniqueType>]
|
|
93
93
|
def each &block
|
|
94
|
-
@items.each
|
|
94
|
+
@items.each(&block)
|
|
95
95
|
end
|
|
96
96
|
|
|
97
97
|
# @yieldparam [UniqueType]
|
|
@@ -102,17 +102,17 @@ module Solargraph
|
|
|
102
102
|
return enum_for(__method__) unless block_given?
|
|
103
103
|
|
|
104
104
|
@items.each do |item|
|
|
105
|
-
item.each_unique_type
|
|
105
|
+
item.each_unique_type(&block)
|
|
106
106
|
end
|
|
107
107
|
end
|
|
108
108
|
|
|
109
109
|
# @param new_name [String, nil]
|
|
110
110
|
# @param make_rooted [Boolean, nil]
|
|
111
111
|
# @param new_key_types [Array<ComplexType>, nil]
|
|
112
|
-
# @param
|
|
112
|
+
# @param make_rooted [Boolean, nil]
|
|
113
113
|
# @param new_subtypes [Array<ComplexType>, nil]
|
|
114
114
|
# @return [self]
|
|
115
|
-
def recreate
|
|
115
|
+
def recreate new_name: nil, make_rooted: nil, new_key_types: nil, new_subtypes: nil
|
|
116
116
|
ComplexType.new(map do |ut|
|
|
117
117
|
ut.recreate(new_name: new_name,
|
|
118
118
|
make_rooted: make_rooted,
|
|
@@ -133,13 +133,13 @@ module Solargraph
|
|
|
133
133
|
|
|
134
134
|
# @param index [Integer]
|
|
135
135
|
# @return [UniqueType]
|
|
136
|
-
def []
|
|
136
|
+
def [] index
|
|
137
137
|
@items[index]
|
|
138
138
|
end
|
|
139
139
|
|
|
140
140
|
# @return [Array<UniqueType>]
|
|
141
141
|
def select &block
|
|
142
|
-
@items.select
|
|
142
|
+
@items.select(&block)
|
|
143
143
|
end
|
|
144
144
|
|
|
145
145
|
# @return [String]
|
|
@@ -154,7 +154,9 @@ module Solargraph
|
|
|
154
154
|
end
|
|
155
155
|
|
|
156
156
|
# @param name [Symbol]
|
|
157
|
+
#
|
|
157
158
|
# @return [Object, nil]
|
|
159
|
+
# @param [Array<Object>] args
|
|
158
160
|
def method_missing name, *args, &block
|
|
159
161
|
return if @items.first.nil?
|
|
160
162
|
return @items.first.send(name, *args, &block) if respond_to_missing?(name)
|
|
@@ -163,7 +165,7 @@ module Solargraph
|
|
|
163
165
|
|
|
164
166
|
# @param name [Symbol]
|
|
165
167
|
# @param include_private [Boolean]
|
|
166
|
-
def respond_to_missing?
|
|
168
|
+
def respond_to_missing? name, include_private = false
|
|
167
169
|
TypeMethods.public_instance_methods.include?(name) || super
|
|
168
170
|
end
|
|
169
171
|
|
|
@@ -198,24 +200,29 @@ module Solargraph
|
|
|
198
200
|
# @param api_map [ApiMap]
|
|
199
201
|
# @param expected [ComplexType, ComplexType::UniqueType]
|
|
200
202
|
# @param situation [:method_call, :return_type, :assignment]
|
|
201
|
-
# @param allow_subtype_skew [Boolean] if false, check if any
|
|
202
|
-
# subtypes of the expected type match the inferred type
|
|
203
|
-
# @param allow_reverse_match [Boolean] if true, check if any subtypes
|
|
204
|
-
# of the expected type match the inferred type
|
|
205
|
-
# @param allow_empty_params [Boolean] if true, allow a general
|
|
206
|
-
# inferred type without parameters to conform to a more specific
|
|
207
|
-
# expected type
|
|
208
|
-
# @param allow_any_match [Boolean] if true, any unique type
|
|
209
|
-
# matched in the inferred qualifies as a match
|
|
210
|
-
# @param allow_undefined [Boolean] if true, treat undefined as a
|
|
211
|
-
# wildcard that matches anything
|
|
212
203
|
# @param rules [Array<:allow_subtype_skew, :allow_empty_params, :allow_reverse_match, :allow_any_match, :allow_undefined, :allow_unresolved_generic, :allow_unmatched_interface>]
|
|
204
|
+
#
|
|
205
|
+
# allow_subtype_skew: if not provided, check if any subtypes of
|
|
206
|
+
# the expected type match the inferred type
|
|
207
|
+
#
|
|
208
|
+
# allow_reverse_match: check if any subtypes
|
|
209
|
+
# of the expected type match the inferred type
|
|
210
|
+
#
|
|
211
|
+
# allow_empty_params: allow a general inferred type without
|
|
212
|
+
# parameters to conform to a more specific expected type
|
|
213
|
+
#
|
|
214
|
+
# allow_any_match: any unique type matched in the inferred
|
|
215
|
+
# qualifies as a match
|
|
216
|
+
#
|
|
217
|
+
# allow_undefined: treat undefined as a wildcard that matches
|
|
218
|
+
# anything
|
|
219
|
+
#
|
|
213
220
|
# @param variance [:invariant, :covariant, :contravariant]
|
|
214
221
|
# @return [Boolean]
|
|
215
|
-
def conforms_to?
|
|
222
|
+
def conforms_to? api_map, expected,
|
|
216
223
|
situation,
|
|
217
224
|
rules = [],
|
|
218
|
-
variance: erased_variance(situation)
|
|
225
|
+
variance: erased_variance(situation)
|
|
219
226
|
expected = expected.downcast_to_literal_if_possible
|
|
220
227
|
inferred = downcast_to_literal_if_possible
|
|
221
228
|
|
|
@@ -256,14 +263,14 @@ module Solargraph
|
|
|
256
263
|
|
|
257
264
|
# @yieldparam [UniqueType]
|
|
258
265
|
def all? &block
|
|
259
|
-
@items.all?
|
|
266
|
+
@items.all?(&block)
|
|
260
267
|
end
|
|
261
268
|
|
|
262
269
|
# @yieldparam [UniqueType]
|
|
263
270
|
# @yieldreturn [Boolean]
|
|
264
271
|
# @return [Boolean]
|
|
265
272
|
def any? &block
|
|
266
|
-
@items.compact.any?
|
|
273
|
+
@items.compact.any?(&block)
|
|
267
274
|
end
|
|
268
275
|
|
|
269
276
|
def selfy?
|
|
@@ -283,8 +290,10 @@ module Solargraph
|
|
|
283
290
|
# @yieldparam t [UniqueType]
|
|
284
291
|
# @yieldreturn [UniqueType]
|
|
285
292
|
# @return [ComplexType]
|
|
286
|
-
def transform
|
|
287
|
-
|
|
293
|
+
def transform new_name = nil, &transform_type
|
|
294
|
+
if new_name&.start_with?('::')
|
|
295
|
+
raise "Please remove leading :: and set rooted with recreate() instead - #{new_name}"
|
|
296
|
+
end
|
|
288
297
|
ComplexType.new(map { |ut| ut.transform(new_name, &transform_type) })
|
|
289
298
|
end
|
|
290
299
|
|
|
@@ -322,7 +331,7 @@ module Solargraph
|
|
|
322
331
|
# @return [ComplexType]
|
|
323
332
|
def reduce_class_type
|
|
324
333
|
new_items = items.flat_map do |type|
|
|
325
|
-
next type unless [
|
|
334
|
+
next type unless %w[Module Class].include?(type.name)
|
|
326
335
|
next type if type.all_params.empty?
|
|
327
336
|
|
|
328
337
|
type.all_params
|
|
@@ -337,7 +346,7 @@ module Solargraph
|
|
|
337
346
|
end
|
|
338
347
|
|
|
339
348
|
# @param other [ComplexType, UniqueType]
|
|
340
|
-
def erased_version_of?
|
|
349
|
+
def erased_version_of? other
|
|
341
350
|
return false if items.length != 1 || other.items.length != 1
|
|
342
351
|
|
|
343
352
|
@items.first.erased_version_of?(other.items.first)
|
|
@@ -351,10 +360,6 @@ module Solargraph
|
|
|
351
360
|
|
|
352
361
|
attr_reader :items
|
|
353
362
|
|
|
354
|
-
def rooted?
|
|
355
|
-
@items.all?(&:rooted?)
|
|
356
|
-
end
|
|
357
|
-
|
|
358
363
|
# @param exclude_types [ComplexType, nil]
|
|
359
364
|
# @param api_map [ApiMap]
|
|
360
365
|
# @return [ComplexType, self]
|
|
@@ -391,6 +396,10 @@ module Solargraph
|
|
|
391
396
|
|
|
392
397
|
protected
|
|
393
398
|
|
|
399
|
+
def equality_fields
|
|
400
|
+
[self.class, items]
|
|
401
|
+
end
|
|
402
|
+
|
|
394
403
|
# @return [ComplexType]
|
|
395
404
|
def reduce_object
|
|
396
405
|
new_items = items.flat_map do |ut|
|
|
@@ -410,13 +419,11 @@ module Solargraph
|
|
|
410
419
|
# @example
|
|
411
420
|
# ComplexType.parse 'String', 'Foo', 'nil' #=> [String, Foo, nil]
|
|
412
421
|
#
|
|
413
|
-
# @
|
|
414
|
-
#
|
|
415
|
-
#
|
|
416
|
-
#
|
|
417
|
-
#
|
|
418
|
-
# used internally.
|
|
419
|
-
#
|
|
422
|
+
# @param partial [Boolean] if true, method is receiving a string
|
|
423
|
+
# that will be used inside another ComplexType. It returns
|
|
424
|
+
# arrays of ComplexTypes instead of a single cohesive one.
|
|
425
|
+
# Consumers should not need to use this parameter; it should
|
|
426
|
+
# only be used internally.
|
|
420
427
|
# @param strings [Array<String>] The type definitions to parse
|
|
421
428
|
# @return [ComplexType]
|
|
422
429
|
# # @overload parse(*strings, partial: false)
|
|
@@ -446,14 +453,14 @@ module Solargraph
|
|
|
446
453
|
# @param char [String]
|
|
447
454
|
type_string&.each_char do |char|
|
|
448
455
|
if char == '='
|
|
449
|
-
#raise ComplexTypeError, "Invalid = in type #{type_string}" unless curly_stack > 0
|
|
456
|
+
# raise ComplexTypeError, "Invalid = in type #{type_string}" unless curly_stack > 0
|
|
450
457
|
elsif char == '<'
|
|
451
458
|
point_stack += 1
|
|
452
459
|
elsif char == '>'
|
|
453
|
-
if subtype_string.end_with?('=') && curly_stack
|
|
460
|
+
if subtype_string.end_with?('=') && curly_stack.positive?
|
|
454
461
|
subtype_string += char
|
|
455
462
|
elsif base.end_with?('=')
|
|
456
|
-
raise ComplexTypeError,
|
|
463
|
+
raise ComplexTypeError, 'Invalid hash thing' unless key_types.nil?
|
|
457
464
|
# types.push ComplexType.new([UniqueType.new(base[0..-2].strip)])
|
|
458
465
|
# @sg-ignore Need to add nil check here
|
|
459
466
|
types.push UniqueType.parse(base[0..-2].strip, subtype_string)
|
|
@@ -466,7 +473,7 @@ module Solargraph
|
|
|
466
473
|
subtype_string.clear
|
|
467
474
|
next
|
|
468
475
|
else
|
|
469
|
-
raise ComplexTypeError, "Invalid close in type #{type_string}" if point_stack
|
|
476
|
+
raise ComplexTypeError, "Invalid close in type #{type_string}" if point_stack.zero?
|
|
470
477
|
point_stack -= 1
|
|
471
478
|
subtype_string += char
|
|
472
479
|
end
|
|
@@ -476,34 +483,37 @@ module Solargraph
|
|
|
476
483
|
elsif char == '}'
|
|
477
484
|
curly_stack -= 1
|
|
478
485
|
subtype_string += char
|
|
479
|
-
raise ComplexTypeError, "Invalid close in type #{type_string}" if curly_stack
|
|
486
|
+
raise ComplexTypeError, "Invalid close in type #{type_string}" if curly_stack.negative?
|
|
480
487
|
next
|
|
481
488
|
elsif char == '('
|
|
482
489
|
paren_stack += 1
|
|
483
490
|
elsif char == ')'
|
|
484
491
|
paren_stack -= 1
|
|
485
492
|
subtype_string += char
|
|
486
|
-
raise ComplexTypeError, "Invalid close in type #{type_string}" if paren_stack
|
|
493
|
+
raise ComplexTypeError, "Invalid close in type #{type_string}" if paren_stack.negative?
|
|
487
494
|
next
|
|
488
|
-
elsif char == ',' && point_stack
|
|
495
|
+
elsif char == ',' && point_stack.zero? && curly_stack.zero? && paren_stack.zero?
|
|
489
496
|
# types.push ComplexType.new([UniqueType.new(base.strip, subtype_string.strip)])
|
|
490
497
|
types.push UniqueType.parse(base.strip, subtype_string.strip)
|
|
491
498
|
base.clear
|
|
492
499
|
subtype_string.clear
|
|
493
500
|
next
|
|
494
501
|
end
|
|
495
|
-
if point_stack
|
|
502
|
+
if point_stack.zero? && curly_stack.zero? && paren_stack.zero?
|
|
496
503
|
base.concat char
|
|
497
504
|
else
|
|
498
505
|
subtype_string.concat char
|
|
499
506
|
end
|
|
500
507
|
end
|
|
501
|
-
|
|
508
|
+
if point_stack != 0 || curly_stack != 0 || paren_stack != 0
|
|
509
|
+
raise ComplexTypeError,
|
|
510
|
+
"Unclosed subtype in #{type_string}"
|
|
511
|
+
end
|
|
502
512
|
# types.push ComplexType.new([UniqueType.new(base, subtype_string)])
|
|
503
513
|
types.push UniqueType.parse(base.strip, subtype_string.strip)
|
|
504
514
|
end
|
|
505
515
|
unless key_types.nil?
|
|
506
|
-
raise ComplexTypeError,
|
|
516
|
+
raise ComplexTypeError, 'Invalid use of key/value parameters' unless partial
|
|
507
517
|
return key_types if types.empty?
|
|
508
518
|
return [key_types, types]
|
|
509
519
|
end
|
|
@@ -515,7 +525,7 @@ module Solargraph
|
|
|
515
525
|
# @param strings [Array<String>]
|
|
516
526
|
# @return [ComplexType]
|
|
517
527
|
def try_parse *strings
|
|
518
|
-
parse
|
|
528
|
+
parse(*strings)
|
|
519
529
|
rescue ComplexTypeError => e
|
|
520
530
|
Solargraph.logger.info "Error parsing complex type `#{strings.join(', ')}`: #{e.message}"
|
|
521
531
|
ComplexType::UNDEFINED
|
|
@@ -540,9 +550,7 @@ module Solargraph
|
|
|
540
550
|
# @param dst [String]
|
|
541
551
|
# @return [String]
|
|
542
552
|
def reduce_class dst
|
|
543
|
-
while dst =~ /^(Class|Module)
|
|
544
|
-
dst = dst.sub(/^(Class|Module)\</, '').sub(/\>$/, '')
|
|
545
|
-
end
|
|
553
|
+
dst = dst.sub(/^(Class|Module)</, '').sub(/>$/, '') while dst =~ /^(Class|Module)<(.*?)>$/
|
|
546
554
|
dst
|
|
547
555
|
end
|
|
548
556
|
end
|
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Convention
|
|
5
|
-
module DataDefinition
|
|
6
|
-
# A node wrapper for a Data definition via const assignment.
|
|
7
|
-
# @example
|
|
8
|
-
# MyData = Data.new(:bar, :baz) do
|
|
9
|
-
# def foo
|
|
10
|
-
# end
|
|
11
|
-
# end
|
|
12
|
-
class DataAssignmentNode < DataDefintionNode
|
|
13
|
-
class << self
|
|
14
|
-
# @example
|
|
15
|
-
# s(:casgn, nil, :Foo,
|
|
16
|
-
# s(:block,
|
|
17
|
-
# s(:send,
|
|
18
|
-
# s(:const, nil, :Data), :define,
|
|
19
|
-
# s(:sym, :bar),
|
|
20
|
-
# s(:sym, :baz)),
|
|
21
|
-
# s(:args),
|
|
22
|
-
# s(:def, :foo,
|
|
23
|
-
# s(:args),
|
|
24
|
-
# s(:send, nil, :bar))))
|
|
25
|
-
# @param node [::Parser::AST::Node]
|
|
26
|
-
def match?
|
|
27
|
-
return false unless node&.type == :casgn
|
|
28
|
-
return false if node.children[2].nil?
|
|
29
|
-
|
|
30
|
-
data_node = if node.children[2].type == :block
|
|
31
|
-
node.children[2].children[0]
|
|
32
|
-
else
|
|
33
|
-
node.children[2]
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
data_definition_node?(data_node)
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def class_name
|
|
41
|
-
if node.children[0]
|
|
42
|
-
Parser::NodeMethods.unpack_name(node.children[0]) + "::#{node.children[1]}"
|
|
43
|
-
else
|
|
44
|
-
node.children[1].to_s
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
private
|
|
49
|
-
|
|
50
|
-
# @return [Parser::AST::Node]
|
|
51
|
-
def data_node
|
|
52
|
-
if node.children[2].type == :block
|
|
53
|
-
node.children[2].children[0]
|
|
54
|
-
else
|
|
55
|
-
node.children[2]
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Convention
|
|
5
|
+
module DataDefinition
|
|
6
|
+
# A node wrapper for a Data definition via const assignment.
|
|
7
|
+
# @example
|
|
8
|
+
# MyData = Data.new(:bar, :baz) do
|
|
9
|
+
# def foo
|
|
10
|
+
# end
|
|
11
|
+
# end
|
|
12
|
+
class DataAssignmentNode < DataDefintionNode
|
|
13
|
+
class << self
|
|
14
|
+
# @example
|
|
15
|
+
# s(:casgn, nil, :Foo,
|
|
16
|
+
# s(:block,
|
|
17
|
+
# s(:send,
|
|
18
|
+
# s(:const, nil, :Data), :define,
|
|
19
|
+
# s(:sym, :bar),
|
|
20
|
+
# s(:sym, :baz)),
|
|
21
|
+
# s(:args),
|
|
22
|
+
# s(:def, :foo,
|
|
23
|
+
# s(:args),
|
|
24
|
+
# s(:send, nil, :bar))))
|
|
25
|
+
# @param node [::Parser::AST::Node]
|
|
26
|
+
def match? node
|
|
27
|
+
return false unless node&.type == :casgn
|
|
28
|
+
return false if node.children[2].nil?
|
|
29
|
+
|
|
30
|
+
data_node = if node.children[2].type == :block
|
|
31
|
+
node.children[2].children[0]
|
|
32
|
+
else
|
|
33
|
+
node.children[2]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
data_definition_node?(data_node)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def class_name
|
|
41
|
+
if node.children[0]
|
|
42
|
+
Parser::NodeMethods.unpack_name(node.children[0]) + "::#{node.children[1]}"
|
|
43
|
+
else
|
|
44
|
+
node.children[1].to_s
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
# @return [Parser::AST::Node]
|
|
51
|
+
def data_node
|
|
52
|
+
if node.children[2].type == :block
|
|
53
|
+
node.children[2].children[0]
|
|
54
|
+
else
|
|
55
|
+
node.children[2]
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -27,7 +27,7 @@ module Solargraph
|
|
|
27
27
|
# s(:send, nil, :bar)))
|
|
28
28
|
#
|
|
29
29
|
# @param node [Parser::AST::Node]
|
|
30
|
-
def match?
|
|
30
|
+
def match? node
|
|
31
31
|
return false unless node&.type == :class
|
|
32
32
|
|
|
33
33
|
data_definition_node?(node.children[1])
|
|
@@ -37,7 +37,7 @@ module Solargraph
|
|
|
37
37
|
|
|
38
38
|
# @param data_node [Parser::AST::Node]
|
|
39
39
|
# @return [Boolean]
|
|
40
|
-
def data_definition_node?
|
|
40
|
+
def data_definition_node? data_node
|
|
41
41
|
return false unless data_node.is_a?(::Parser::AST::Node)
|
|
42
42
|
return false unless data_node&.type == :send
|
|
43
43
|
return false unless data_node.children[0]&.type == :const
|
|
@@ -49,7 +49,7 @@ module Solargraph
|
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
# @param node [Parser::AST::Node]
|
|
52
|
-
def initialize
|
|
52
|
+
def initialize node
|
|
53
53
|
@node = node
|
|
54
54
|
end
|
|
55
55
|
|
|
@@ -85,7 +85,7 @@ module Solargraph
|
|
|
85
85
|
# @return [Array<Parser::AST::Node>]
|
|
86
86
|
def data_attribute_nodes
|
|
87
87
|
# @sg-ignore Need to add nil check here
|
|
88
|
-
data_node.children[2
|
|
88
|
+
data_node.children[2..]
|
|
89
89
|
end
|
|
90
90
|
end
|
|
91
91
|
end
|
|
@@ -93,7 +93,7 @@ module Solargraph
|
|
|
93
93
|
# @param attribute_node [Parser::AST::Node]
|
|
94
94
|
# @param attribute_name [String]
|
|
95
95
|
# @return [String, nil]
|
|
96
|
-
def attribute_comments
|
|
96
|
+
def attribute_comments attribute_node, attribute_name
|
|
97
97
|
data_comments = comments_for(attribute_node)
|
|
98
98
|
return if data_comments.nil? || data_comments.empty?
|
|
99
99
|
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Convention
|
|
5
|
-
class Gemfile < Base
|
|
6
|
-
def local source_map
|
|
7
|
-
return EMPTY_ENVIRON unless File.basename(source_map.filename) == 'Gemfile'
|
|
8
|
-
@
|
|
9
|
-
requires: ['bundler'],
|
|
10
|
-
domains: ['Bundler::Dsl']
|
|
11
|
-
)
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Convention
|
|
5
|
+
class Gemfile < Base
|
|
6
|
+
def local source_map
|
|
7
|
+
return EMPTY_ENVIRON unless File.basename(source_map.filename) == 'Gemfile'
|
|
8
|
+
@local ||= Environ.new(
|
|
9
|
+
requires: ['bundler'],
|
|
10
|
+
domains: ['Bundler::Dsl']
|
|
11
|
+
)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Convention
|
|
5
|
-
class Gemspec < Base
|
|
6
|
-
def local source_map
|
|
7
|
-
return Convention::Base::EMPTY_ENVIRON unless File.basename(source_map.filename).end_with?('.gemspec')
|
|
8
|
-
@
|
|
9
|
-
requires: ['rubygems'],
|
|
10
|
-
pins: [
|
|
11
|
-
Solargraph::Pin::Reference::Override.from_comment(
|
|
12
|
-
'Gem::Specification.new',
|
|
13
|
-
%(
|
|
14
|
-
@yieldparam [self]
|
|
15
|
-
),
|
|
16
|
-
source: :gemspec
|
|
17
|
-
)
|
|
18
|
-
]
|
|
19
|
-
)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Convention
|
|
5
|
+
class Gemspec < Base
|
|
6
|
+
def local source_map
|
|
7
|
+
return Convention::Base::EMPTY_ENVIRON unless File.basename(source_map.filename).end_with?('.gemspec')
|
|
8
|
+
@local ||= Environ.new(
|
|
9
|
+
requires: ['rubygems'],
|
|
10
|
+
pins: [
|
|
11
|
+
Solargraph::Pin::Reference::Override.from_comment(
|
|
12
|
+
'Gem::Specification.new',
|
|
13
|
+
%(
|
|
14
|
+
@yieldparam [self]
|
|
15
|
+
),
|
|
16
|
+
source: :gemspec
|
|
17
|
+
)
|
|
18
|
+
]
|
|
19
|
+
)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Convention
|
|
5
|
-
class Rakefile < Base
|
|
6
|
-
def local source_map
|
|
7
|
-
basename = File.basename(source_map.filename)
|
|
8
|
-
return EMPTY_ENVIRON unless basename.end_with?('.rake') || basename == 'Rakefile'
|
|
9
|
-
|
|
10
|
-
@
|
|
11
|
-
requires: ['rake'],
|
|
12
|
-
domains: ['Rake::DSL']
|
|
13
|
-
)
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Convention
|
|
5
|
+
class Rakefile < Base
|
|
6
|
+
def local source_map
|
|
7
|
+
basename = File.basename(source_map.filename)
|
|
8
|
+
return EMPTY_ENVIRON unless basename.end_with?('.rake') || basename == 'Rakefile'
|
|
9
|
+
|
|
10
|
+
@local ||= Environ.new(
|
|
11
|
+
requires: ['rake'],
|
|
12
|
+
domains: ['Rake::DSL']
|
|
13
|
+
)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -27,7 +27,7 @@ module Solargraph
|
|
|
27
27
|
# s(:send, nil, :bar)))
|
|
28
28
|
#
|
|
29
29
|
# @param node [Parser::AST::Node]
|
|
30
|
-
def match?
|
|
30
|
+
def match? node
|
|
31
31
|
return false unless node&.type == :class
|
|
32
32
|
|
|
33
33
|
struct_definition_node?(node.children[1])
|
|
@@ -37,7 +37,7 @@ module Solargraph
|
|
|
37
37
|
|
|
38
38
|
# @param struct_node [Parser::AST::Node]
|
|
39
39
|
# @return [Boolean]
|
|
40
|
-
def struct_definition_node?
|
|
40
|
+
def struct_definition_node? struct_node
|
|
41
41
|
return false unless struct_node.is_a?(::Parser::AST::Node)
|
|
42
42
|
return false unless struct_node&.type == :send
|
|
43
43
|
return false unless struct_node.children[0]&.type == :const
|
|
@@ -49,7 +49,7 @@ module Solargraph
|
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
# @param node [Parser::AST::Node]
|
|
52
|
-
def initialize
|
|
52
|
+
def initialize node
|
|
53
53
|
@node = node
|
|
54
54
|
end
|
|
55
55
|
|