solargraph 0.58.1 → 0.58.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/.gitignore +1 -0
- data/CHANGELOG.md +7 -1
- data/lib/solargraph/api_map/cache.rb +110 -110
- data/lib/solargraph/api_map/constants.rb +279 -279
- data/lib/solargraph/api_map/index.rb +193 -193
- data/lib/solargraph/api_map/source_to_yard.rb +97 -97
- data/lib/solargraph/api_map/store.rb +384 -384
- data/lib/solargraph/api_map.rb +945 -945
- data/lib/solargraph/complex_type/type_methods.rb +228 -228
- data/lib/solargraph/complex_type/unique_type.rb +482 -482
- data/lib/solargraph/complex_type.rb +444 -444
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -91
- data/lib/solargraph/convention/data_definition.rb +105 -105
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -61
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -102
- data/lib/solargraph/convention/struct_definition.rb +164 -164
- data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
- data/lib/solargraph/diagnostics/rubocop.rb +118 -118
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -68
- data/lib/solargraph/diagnostics/type_check.rb +55 -55
- data/lib/solargraph/doc_map.rb +439 -439
- data/lib/solargraph/equality.rb +34 -34
- data/lib/solargraph/gem_pins.rb +98 -98
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +130 -130
- data/lib/solargraph/language_server/host/message_worker.rb +112 -112
- data/lib/solargraph/language_server/host/sources.rb +99 -99
- data/lib/solargraph/language_server/host.rb +878 -878
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
- data/lib/solargraph/language_server/message/extended/document.rb +23 -23
- data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
- data/lib/solargraph/language_server/message/text_document/definition.rb +40 -40
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -148
- data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -25
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
- data/lib/solargraph/library.rb +683 -683
- data/lib/solargraph/location.rb +82 -82
- data/lib/solargraph/logging.rb +37 -37
- data/lib/solargraph/parser/comment_ripper.rb +69 -69
- data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -255
- data/lib/solargraph/parser/node_processor/base.rb +92 -92
- data/lib/solargraph/parser/node_processor.rb +62 -62
- data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -149
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -166
- data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -486
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -23
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -59
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -38
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -52
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -291
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -70
- data/lib/solargraph/parser/region.rb +69 -69
- data/lib/solargraph/parser/snippet.rb +17 -17
- data/lib/solargraph/pin/base.rb +729 -729
- data/lib/solargraph/pin/base_variable.rb +126 -126
- data/lib/solargraph/pin/block.rb +104 -104
- data/lib/solargraph/pin/breakable.rb +9 -9
- data/lib/solargraph/pin/callable.rb +231 -231
- data/lib/solargraph/pin/closure.rb +72 -72
- data/lib/solargraph/pin/common.rb +79 -79
- data/lib/solargraph/pin/conversions.rb +123 -123
- data/lib/solargraph/pin/delegated_method.rb +120 -120
- data/lib/solargraph/pin/documenting.rb +114 -114
- data/lib/solargraph/pin/instance_variable.rb +34 -34
- data/lib/solargraph/pin/keyword.rb +20 -20
- data/lib/solargraph/pin/local_variable.rb +75 -75
- data/lib/solargraph/pin/method.rb +672 -672
- data/lib/solargraph/pin/method_alias.rb +34 -34
- data/lib/solargraph/pin/namespace.rb +115 -115
- data/lib/solargraph/pin/parameter.rb +275 -275
- data/lib/solargraph/pin/proxy_type.rb +39 -39
- data/lib/solargraph/pin/reference/override.rb +47 -47
- data/lib/solargraph/pin/reference/superclass.rb +15 -15
- data/lib/solargraph/pin/reference.rb +39 -39
- data/lib/solargraph/pin/search.rb +61 -61
- data/lib/solargraph/pin/signature.rb +61 -61
- data/lib/solargraph/pin/symbol.rb +53 -53
- data/lib/solargraph/pin/until.rb +18 -18
- data/lib/solargraph/pin/while.rb +18 -18
- data/lib/solargraph/pin.rb +44 -44
- data/lib/solargraph/pin_cache.rb +245 -245
- data/lib/solargraph/position.rb +132 -119
- data/lib/solargraph/range.rb +112 -112
- data/lib/solargraph/rbs_map/conversions.rb +823 -823
- data/lib/solargraph/rbs_map/core_map.rb +58 -58
- data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
- data/lib/solargraph/rbs_map.rb +163 -163
- data/lib/solargraph/shell.rb +352 -352
- data/lib/solargraph/source/chain/call.rb +337 -337
- data/lib/solargraph/source/chain/constant.rb +26 -26
- data/lib/solargraph/source/chain/hash.rb +34 -34
- data/lib/solargraph/source/chain/if.rb +28 -28
- data/lib/solargraph/source/chain/instance_variable.rb +13 -13
- data/lib/solargraph/source/chain/literal.rb +48 -48
- data/lib/solargraph/source/chain/or.rb +23 -23
- data/lib/solargraph/source/chain.rb +291 -291
- data/lib/solargraph/source/change.rb +82 -82
- data/lib/solargraph/source/cursor.rb +166 -166
- data/lib/solargraph/source/source_chainer.rb +194 -194
- data/lib/solargraph/source/updater.rb +55 -55
- data/lib/solargraph/source.rb +498 -498
- data/lib/solargraph/source_map/clip.rb +226 -226
- data/lib/solargraph/source_map/data.rb +34 -34
- data/lib/solargraph/source_map/mapper.rb +259 -259
- data/lib/solargraph/source_map.rb +212 -212
- data/lib/solargraph/type_checker/checks.rb +124 -124
- data/lib/solargraph/type_checker/param_def.rb +37 -37
- data/lib/solargraph/type_checker/problem.rb +32 -32
- data/lib/solargraph/type_checker/rules.rb +84 -84
- data/lib/solargraph/type_checker.rb +814 -814
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +255 -255
- data/lib/solargraph/workspace/require_paths.rb +97 -97
- data/lib/solargraph/workspace.rb +220 -220
- data/lib/solargraph/yard_map/helpers.rb +44 -44
- data/lib/solargraph/yard_map/mapper/to_method.rb +130 -130
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -31
- data/lib/solargraph/yard_map/mapper.rb +79 -79
- data/lib/solargraph/yard_map/to_method.rb +89 -89
- data/lib/solargraph/yardoc.rb +87 -87
- data/lib/solargraph.rb +105 -105
- data/rbs_collection.yaml +1 -1
- metadata +12 -12
- /data/{sig → rbs}/shims/ast/0/node.rbs +0 -0
- /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
|
@@ -1,228 +1,228 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
class ComplexType
|
|
5
|
-
# Methods for accessing type data available from
|
|
6
|
-
# both ComplexType and UniqueType.
|
|
7
|
-
#
|
|
8
|
-
# @abstract This mixin relies on these -
|
|
9
|
-
# instance variables:
|
|
10
|
-
# @name: String
|
|
11
|
-
# @subtypes: Array<ComplexType>
|
|
12
|
-
# @rooted: boolish
|
|
13
|
-
# methods:
|
|
14
|
-
# transform()
|
|
15
|
-
# all_params()
|
|
16
|
-
# rooted?()
|
|
17
|
-
# can_root_name?()
|
|
18
|
-
module TypeMethods
|
|
19
|
-
# @!method transform(new_name = nil, &transform_type)
|
|
20
|
-
# @param new_name [String, nil]
|
|
21
|
-
# @yieldparam t [UniqueType]
|
|
22
|
-
# @yieldreturn [UniqueType]
|
|
23
|
-
# @return [UniqueType, nil]
|
|
24
|
-
# @!method all_params
|
|
25
|
-
# @return [Array<ComplexType>]
|
|
26
|
-
# @!method rooted?
|
|
27
|
-
# @!method can_root_name?(name_to_check = nil)
|
|
28
|
-
# @param name_to_check [String, nil]
|
|
29
|
-
|
|
30
|
-
# @return [String]
|
|
31
|
-
attr_reader :name
|
|
32
|
-
|
|
33
|
-
# @return [Array<ComplexType>]
|
|
34
|
-
attr_reader :subtypes
|
|
35
|
-
|
|
36
|
-
# @return [String]
|
|
37
|
-
def tag
|
|
38
|
-
@tag ||= "#{name}#{substring}"
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
# @return [String]
|
|
42
|
-
def rooted_tag
|
|
43
|
-
@rooted_tag ||= rooted_name + rooted_substring
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def interface?
|
|
47
|
-
name.start_with?('_')
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# @return [Boolean]
|
|
51
|
-
def duck_type?
|
|
52
|
-
@duck_type ||= name.start_with?('#')
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
# @return [Boolean]
|
|
56
|
-
def nil_type?
|
|
57
|
-
@nil_type ||= (name.casecmp('nil') == 0)
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def tuple?
|
|
61
|
-
@tuple_type ||= (name == 'Tuple') || (name == 'Array' && subtypes.length >= 1 && fixed_parameters?)
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def void?
|
|
65
|
-
name == 'void'
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def defined?
|
|
69
|
-
!undefined?
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def undefined?
|
|
73
|
-
name == 'undefined'
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
# @param generics_to_erase [Enumerable<String>]
|
|
77
|
-
# @return [self]
|
|
78
|
-
def erase_generics(generics_to_erase)
|
|
79
|
-
transform do |type|
|
|
80
|
-
if type.name == ComplexType::GENERIC_TAG_NAME
|
|
81
|
-
if type.all_params.length == 1 && generics_to_erase.include?(type.all_params.first.to_s)
|
|
82
|
-
ComplexType::UNDEFINED
|
|
83
|
-
else
|
|
84
|
-
type
|
|
85
|
-
end
|
|
86
|
-
else
|
|
87
|
-
type
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
# @return [Symbol, nil]
|
|
93
|
-
attr_reader :parameters_type
|
|
94
|
-
|
|
95
|
-
# @type [Hash{String => Symbol}]
|
|
96
|
-
PARAMETERS_TYPE_BY_STARTING_TAG = {
|
|
97
|
-
'{' => :hash,
|
|
98
|
-
'(' => :fixed,
|
|
99
|
-
'<' => :list
|
|
100
|
-
}.freeze
|
|
101
|
-
|
|
102
|
-
# @return [Boolean]
|
|
103
|
-
def list_parameters?
|
|
104
|
-
parameters_type == :list
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
# @return [Boolean]
|
|
108
|
-
def fixed_parameters?
|
|
109
|
-
parameters_type == :fixed
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
# @return [Boolean]
|
|
113
|
-
def hash_parameters?
|
|
114
|
-
parameters_type == :hash
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
# @return [Array<ComplexType>]
|
|
118
|
-
def value_types
|
|
119
|
-
@subtypes
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
# @return [Array<ComplexType>]
|
|
123
|
-
def key_types
|
|
124
|
-
@key_types
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
# @return [String]
|
|
128
|
-
def namespace
|
|
129
|
-
# if priority higher than ||=, old implements cause unnecessary check
|
|
130
|
-
@namespace ||= lambda do
|
|
131
|
-
return 'Object' if duck_type?
|
|
132
|
-
return 'NilClass' if nil_type?
|
|
133
|
-
return (name == 'Class' || name == 'Module') && !subtypes.empty? ? subtypes.first.name : name
|
|
134
|
-
end.call
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
# @return [self]
|
|
138
|
-
def namespace_type
|
|
139
|
-
return ComplexType.parse('::Object') if duck_type?
|
|
140
|
-
return ComplexType.parse('::NilClass') if nil_type?
|
|
141
|
-
return subtypes.first if (name == 'Class' || name == 'Module') && !subtypes.empty?
|
|
142
|
-
self
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
# @return [String]
|
|
146
|
-
def rooted_namespace
|
|
147
|
-
return namespace unless rooted? && can_root_name?(namespace)
|
|
148
|
-
"::#{namespace}"
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
# @return [String]
|
|
152
|
-
def rooted_name
|
|
153
|
-
return name unless @rooted && can_root_name?
|
|
154
|
-
"::#{name}"
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
# @return [String]
|
|
158
|
-
def substring
|
|
159
|
-
@substring ||= generate_substring_from(&:tags)
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
# @return [String]
|
|
163
|
-
def rooted_substring
|
|
164
|
-
@rooted_substring = generate_substring_from(&:rooted_tags)
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
# @return [String]
|
|
168
|
-
def generate_substring_from(&to_str)
|
|
169
|
-
key_types_str = key_types.map(&to_str).join(', ')
|
|
170
|
-
subtypes_str = subtypes.map(&to_str).join(', ')
|
|
171
|
-
if key_types.none?(&:defined?) && subtypes.none?(&:defined?)
|
|
172
|
-
''
|
|
173
|
-
elsif key_types.empty? && subtypes.empty?
|
|
174
|
-
''
|
|
175
|
-
elsif hash_parameters?
|
|
176
|
-
"{#{key_types_str} => #{subtypes_str}}"
|
|
177
|
-
elsif fixed_parameters?
|
|
178
|
-
"(#{subtypes_str})"
|
|
179
|
-
else
|
|
180
|
-
if name == 'Hash'
|
|
181
|
-
"<#{key_types_str}, #{subtypes_str}>"
|
|
182
|
-
else
|
|
183
|
-
"<#{key_types_str}#{subtypes_str}>"
|
|
184
|
-
end
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
# @return [::Symbol] :class or :instance
|
|
189
|
-
def scope
|
|
190
|
-
@scope ||= :instance if duck_type? || nil_type?
|
|
191
|
-
@scope ||= (name == 'Class' || name == 'Module') && !subtypes.empty? ? :class : :instance
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
# @param other [Object]
|
|
195
|
-
def == other
|
|
196
|
-
return false unless self.class == other.class
|
|
197
|
-
# @sg-ignore https://github.com/castwide/solargraph/pull/1114
|
|
198
|
-
tag == other.tag
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
# Generate a ComplexType that fully qualifies this type's namespaces.
|
|
202
|
-
#
|
|
203
|
-
# @param api_map [ApiMap] The ApiMap that performs qualification
|
|
204
|
-
# @param context [String] The namespace from which to resolve names
|
|
205
|
-
# @return [self, ComplexType, UniqueType] The generated ComplexType
|
|
206
|
-
def qualify api_map, context = ''
|
|
207
|
-
transform do |t|
|
|
208
|
-
next t if t.name == GENERIC_TAG_NAME
|
|
209
|
-
next t if t.duck_type? || t.void? || t.undefined?
|
|
210
|
-
recon = (t.rooted? ? '' : context)
|
|
211
|
-
fqns = api_map.qualify(t.name, recon)
|
|
212
|
-
if fqns.nil?
|
|
213
|
-
next UniqueType::BOOLEAN if t.tag == 'Boolean'
|
|
214
|
-
next UniqueType::UNDEFINED
|
|
215
|
-
end
|
|
216
|
-
t.recreate(new_name: fqns, make_rooted: true)
|
|
217
|
-
end
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
# @yieldparam [UniqueType]
|
|
221
|
-
# @return [Enumerator<UniqueType>]
|
|
222
|
-
def each_unique_type &block
|
|
223
|
-
return enum_for(__method__) unless block_given?
|
|
224
|
-
yield self
|
|
225
|
-
end
|
|
226
|
-
end
|
|
227
|
-
end
|
|
228
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class ComplexType
|
|
5
|
+
# Methods for accessing type data available from
|
|
6
|
+
# both ComplexType and UniqueType.
|
|
7
|
+
#
|
|
8
|
+
# @abstract This mixin relies on these -
|
|
9
|
+
# instance variables:
|
|
10
|
+
# @name: String
|
|
11
|
+
# @subtypes: Array<ComplexType>
|
|
12
|
+
# @rooted: boolish
|
|
13
|
+
# methods:
|
|
14
|
+
# transform()
|
|
15
|
+
# all_params()
|
|
16
|
+
# rooted?()
|
|
17
|
+
# can_root_name?()
|
|
18
|
+
module TypeMethods
|
|
19
|
+
# @!method transform(new_name = nil, &transform_type)
|
|
20
|
+
# @param new_name [String, nil]
|
|
21
|
+
# @yieldparam t [UniqueType]
|
|
22
|
+
# @yieldreturn [UniqueType]
|
|
23
|
+
# @return [UniqueType, nil]
|
|
24
|
+
# @!method all_params
|
|
25
|
+
# @return [Array<ComplexType>]
|
|
26
|
+
# @!method rooted?
|
|
27
|
+
# @!method can_root_name?(name_to_check = nil)
|
|
28
|
+
# @param name_to_check [String, nil]
|
|
29
|
+
|
|
30
|
+
# @return [String]
|
|
31
|
+
attr_reader :name
|
|
32
|
+
|
|
33
|
+
# @return [Array<ComplexType>]
|
|
34
|
+
attr_reader :subtypes
|
|
35
|
+
|
|
36
|
+
# @return [String]
|
|
37
|
+
def tag
|
|
38
|
+
@tag ||= "#{name}#{substring}"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @return [String]
|
|
42
|
+
def rooted_tag
|
|
43
|
+
@rooted_tag ||= rooted_name + rooted_substring
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def interface?
|
|
47
|
+
name.start_with?('_')
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# @return [Boolean]
|
|
51
|
+
def duck_type?
|
|
52
|
+
@duck_type ||= name.start_with?('#')
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# @return [Boolean]
|
|
56
|
+
def nil_type?
|
|
57
|
+
@nil_type ||= (name.casecmp('nil') == 0)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def tuple?
|
|
61
|
+
@tuple_type ||= (name == 'Tuple') || (name == 'Array' && subtypes.length >= 1 && fixed_parameters?)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def void?
|
|
65
|
+
name == 'void'
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def defined?
|
|
69
|
+
!undefined?
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def undefined?
|
|
73
|
+
name == 'undefined'
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# @param generics_to_erase [Enumerable<String>]
|
|
77
|
+
# @return [self]
|
|
78
|
+
def erase_generics(generics_to_erase)
|
|
79
|
+
transform do |type|
|
|
80
|
+
if type.name == ComplexType::GENERIC_TAG_NAME
|
|
81
|
+
if type.all_params.length == 1 && generics_to_erase.include?(type.all_params.first.to_s)
|
|
82
|
+
ComplexType::UNDEFINED
|
|
83
|
+
else
|
|
84
|
+
type
|
|
85
|
+
end
|
|
86
|
+
else
|
|
87
|
+
type
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# @return [Symbol, nil]
|
|
93
|
+
attr_reader :parameters_type
|
|
94
|
+
|
|
95
|
+
# @type [Hash{String => Symbol}]
|
|
96
|
+
PARAMETERS_TYPE_BY_STARTING_TAG = {
|
|
97
|
+
'{' => :hash,
|
|
98
|
+
'(' => :fixed,
|
|
99
|
+
'<' => :list
|
|
100
|
+
}.freeze
|
|
101
|
+
|
|
102
|
+
# @return [Boolean]
|
|
103
|
+
def list_parameters?
|
|
104
|
+
parameters_type == :list
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# @return [Boolean]
|
|
108
|
+
def fixed_parameters?
|
|
109
|
+
parameters_type == :fixed
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# @return [Boolean]
|
|
113
|
+
def hash_parameters?
|
|
114
|
+
parameters_type == :hash
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# @return [Array<ComplexType>]
|
|
118
|
+
def value_types
|
|
119
|
+
@subtypes
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# @return [Array<ComplexType>]
|
|
123
|
+
def key_types
|
|
124
|
+
@key_types
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# @return [String]
|
|
128
|
+
def namespace
|
|
129
|
+
# if priority higher than ||=, old implements cause unnecessary check
|
|
130
|
+
@namespace ||= lambda do
|
|
131
|
+
return 'Object' if duck_type?
|
|
132
|
+
return 'NilClass' if nil_type?
|
|
133
|
+
return (name == 'Class' || name == 'Module') && !subtypes.empty? ? subtypes.first.name : name
|
|
134
|
+
end.call
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# @return [self]
|
|
138
|
+
def namespace_type
|
|
139
|
+
return ComplexType.parse('::Object') if duck_type?
|
|
140
|
+
return ComplexType.parse('::NilClass') if nil_type?
|
|
141
|
+
return subtypes.first if (name == 'Class' || name == 'Module') && !subtypes.empty?
|
|
142
|
+
self
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# @return [String]
|
|
146
|
+
def rooted_namespace
|
|
147
|
+
return namespace unless rooted? && can_root_name?(namespace)
|
|
148
|
+
"::#{namespace}"
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# @return [String]
|
|
152
|
+
def rooted_name
|
|
153
|
+
return name unless @rooted && can_root_name?
|
|
154
|
+
"::#{name}"
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# @return [String]
|
|
158
|
+
def substring
|
|
159
|
+
@substring ||= generate_substring_from(&:tags)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# @return [String]
|
|
163
|
+
def rooted_substring
|
|
164
|
+
@rooted_substring = generate_substring_from(&:rooted_tags)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# @return [String]
|
|
168
|
+
def generate_substring_from(&to_str)
|
|
169
|
+
key_types_str = key_types.map(&to_str).join(', ')
|
|
170
|
+
subtypes_str = subtypes.map(&to_str).join(', ')
|
|
171
|
+
if key_types.none?(&:defined?) && subtypes.none?(&:defined?)
|
|
172
|
+
''
|
|
173
|
+
elsif key_types.empty? && subtypes.empty?
|
|
174
|
+
''
|
|
175
|
+
elsif hash_parameters?
|
|
176
|
+
"{#{key_types_str} => #{subtypes_str}}"
|
|
177
|
+
elsif fixed_parameters?
|
|
178
|
+
"(#{subtypes_str})"
|
|
179
|
+
else
|
|
180
|
+
if name == 'Hash'
|
|
181
|
+
"<#{key_types_str}, #{subtypes_str}>"
|
|
182
|
+
else
|
|
183
|
+
"<#{key_types_str}#{subtypes_str}>"
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# @return [::Symbol] :class or :instance
|
|
189
|
+
def scope
|
|
190
|
+
@scope ||= :instance if duck_type? || nil_type?
|
|
191
|
+
@scope ||= (name == 'Class' || name == 'Module') && !subtypes.empty? ? :class : :instance
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# @param other [Object]
|
|
195
|
+
def == other
|
|
196
|
+
return false unless self.class == other.class
|
|
197
|
+
# @sg-ignore https://github.com/castwide/solargraph/pull/1114
|
|
198
|
+
tag == other.tag
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# Generate a ComplexType that fully qualifies this type's namespaces.
|
|
202
|
+
#
|
|
203
|
+
# @param api_map [ApiMap] The ApiMap that performs qualification
|
|
204
|
+
# @param context [String] The namespace from which to resolve names
|
|
205
|
+
# @return [self, ComplexType, UniqueType] The generated ComplexType
|
|
206
|
+
def qualify api_map, context = ''
|
|
207
|
+
transform do |t|
|
|
208
|
+
next t if t.name == GENERIC_TAG_NAME
|
|
209
|
+
next t if t.duck_type? || t.void? || t.undefined?
|
|
210
|
+
recon = (t.rooted? ? '' : context)
|
|
211
|
+
fqns = api_map.qualify(t.name, recon)
|
|
212
|
+
if fqns.nil?
|
|
213
|
+
next UniqueType::BOOLEAN if t.tag == 'Boolean'
|
|
214
|
+
next UniqueType::UNDEFINED
|
|
215
|
+
end
|
|
216
|
+
t.recreate(new_name: fqns, make_rooted: true)
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# @yieldparam [UniqueType]
|
|
221
|
+
# @return [Enumerator<UniqueType>]
|
|
222
|
+
def each_unique_type &block
|
|
223
|
+
return enum_for(__method__) unless block_given?
|
|
224
|
+
yield self
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|