solargraph 0.58.0 → 0.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.gitattributes +2 -0
  4. data/.github/workflows/linting.yml +6 -5
  5. data/.github/workflows/plugins.yml +48 -35
  6. data/.github/workflows/rspec.yml +15 -28
  7. data/.github/workflows/typecheck.yml +3 -2
  8. data/.gitignore +1 -0
  9. data/.rubocop.yml +38 -6
  10. data/.rubocop_todo.yml +53 -966
  11. data/CHANGELOG.md +24 -0
  12. data/Gemfile +3 -1
  13. data/README.md +3 -3
  14. data/Rakefile +26 -23
  15. data/bin/solargraph +9 -8
  16. data/lib/solargraph/api_map/cache.rb +110 -110
  17. data/lib/solargraph/api_map/constants.rb +288 -279
  18. data/lib/solargraph/api_map/index.rb +204 -193
  19. data/lib/solargraph/api_map/source_to_yard.rb +110 -97
  20. data/lib/solargraph/api_map/store.rb +395 -384
  21. data/lib/solargraph/api_map.rb +1029 -945
  22. data/lib/solargraph/bench.rb +44 -45
  23. data/lib/solargraph/complex_type/conformance.rb +176 -0
  24. data/lib/solargraph/complex_type/type_methods.rb +240 -228
  25. data/lib/solargraph/complex_type/unique_type.rb +641 -482
  26. data/lib/solargraph/complex_type.rb +557 -444
  27. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  28. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  29. data/lib/solargraph/convention/data_definition.rb +108 -105
  30. data/lib/solargraph/convention/gemfile.rb +15 -15
  31. data/lib/solargraph/convention/gemspec.rb +23 -23
  32. data/lib/solargraph/convention/rakefile.rb +17 -17
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  35. data/lib/solargraph/convention/struct_definition.rb +168 -164
  36. data/lib/solargraph/convention.rb +78 -78
  37. data/lib/solargraph/converters/dd.rb +19 -17
  38. data/lib/solargraph/converters/dl.rb +17 -15
  39. data/lib/solargraph/converters/dt.rb +17 -15
  40. data/lib/solargraph/converters/misc.rb +3 -1
  41. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  42. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  43. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  44. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  45. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  46. data/lib/solargraph/doc_map.rb +438 -439
  47. data/lib/solargraph/equality.rb +34 -34
  48. data/lib/solargraph/gem_pins.rb +98 -98
  49. data/lib/solargraph/language_server/error_codes.rb +20 -20
  50. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  51. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  52. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  53. data/lib/solargraph/language_server/host/sources.rb +100 -99
  54. data/lib/solargraph/language_server/host.rb +886 -878
  55. data/lib/solargraph/language_server/message/base.rb +97 -97
  56. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  57. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  58. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +108 -114
  59. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  60. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  61. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  62. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  63. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  64. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  65. data/lib/solargraph/language_server/message/text_document/definition.rb +49 -40
  66. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  67. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +36 -26
  68. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  69. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  70. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  71. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  72. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  73. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  74. data/lib/solargraph/language_server/message/text_document/type_definition.rb +33 -25
  75. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  76. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  77. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  78. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +33 -23
  79. data/lib/solargraph/language_server/message.rb +94 -94
  80. data/lib/solargraph/language_server/request.rb +29 -27
  81. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  82. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  83. data/lib/solargraph/library.rb +702 -683
  84. data/lib/solargraph/location.rb +85 -82
  85. data/lib/solargraph/logging.rb +55 -37
  86. data/lib/solargraph/page.rb +92 -92
  87. data/lib/solargraph/parser/comment_ripper.rb +84 -69
  88. data/lib/solargraph/parser/flow_sensitive_typing.rb +471 -255
  89. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  90. data/lib/solargraph/parser/node_processor.rb +63 -62
  91. data/lib/solargraph/parser/parser_gem/class_methods.rb +165 -149
  92. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  93. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  94. data/lib/solargraph/parser/parser_gem/node_methods.rb +507 -486
  95. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  96. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  97. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  98. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +45 -46
  99. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  100. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  101. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  102. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +42 -40
  103. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  104. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  105. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  106. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  107. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  108. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  109. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +51 -52
  110. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +302 -291
  111. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  112. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  113. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  114. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  115. data/lib/solargraph/parser/parser_gem.rb +14 -12
  116. data/lib/solargraph/parser/region.rb +75 -69
  117. data/lib/solargraph/parser/snippet.rb +19 -17
  118. data/lib/solargraph/parser.rb +25 -23
  119. data/lib/solargraph/pin/base.rb +773 -729
  120. data/lib/solargraph/pin/base_variable.rb +375 -126
  121. data/lib/solargraph/pin/block.rb +127 -104
  122. data/lib/solargraph/pin/breakable.rb +15 -9
  123. data/lib/solargraph/pin/callable.rb +275 -231
  124. data/lib/solargraph/pin/closure.rb +69 -72
  125. data/lib/solargraph/pin/common.rb +97 -79
  126. data/lib/solargraph/pin/compound_statement.rb +55 -0
  127. data/lib/solargraph/pin/constant.rb +43 -45
  128. data/lib/solargraph/pin/conversions.rb +129 -123
  129. data/lib/solargraph/pin/delegated_method.rb +131 -120
  130. data/lib/solargraph/pin/documenting.rb +116 -114
  131. data/lib/solargraph/pin/instance_variable.rb +38 -34
  132. data/lib/solargraph/pin/keyword.rb +16 -20
  133. data/lib/solargraph/pin/local_variable.rb +31 -75
  134. data/lib/solargraph/pin/method.rb +724 -672
  135. data/lib/solargraph/pin/method_alias.rb +42 -34
  136. data/lib/solargraph/pin/namespace.rb +122 -115
  137. data/lib/solargraph/pin/parameter.rb +339 -275
  138. data/lib/solargraph/pin/proxy_type.rb +42 -39
  139. data/lib/solargraph/pin/reference/override.rb +47 -47
  140. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  141. data/lib/solargraph/pin/reference/type_alias.rb +16 -0
  142. data/lib/solargraph/pin/reference.rb +59 -39
  143. data/lib/solargraph/pin/search.rb +62 -61
  144. data/lib/solargraph/pin/signature.rb +64 -61
  145. data/lib/solargraph/pin/symbol.rb +54 -53
  146. data/lib/solargraph/pin/until.rb +16 -18
  147. data/lib/solargraph/pin/while.rb +16 -18
  148. data/lib/solargraph/pin.rb +46 -44
  149. data/lib/solargraph/pin_cache.rb +248 -245
  150. data/lib/solargraph/position.rb +139 -119
  151. data/lib/solargraph/range.rb +113 -112
  152. data/lib/solargraph/rbs_map/conversions.rb +952 -823
  153. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  154. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  155. data/lib/solargraph/rbs_map/stdlib_map.rb +71 -43
  156. data/lib/solargraph/rbs_map.rb +207 -163
  157. data/lib/solargraph/server_methods.rb +16 -16
  158. data/lib/solargraph/shell.rb +555 -352
  159. data/lib/solargraph/source/chain/array.rb +39 -37
  160. data/lib/solargraph/source/chain/call.rb +377 -337
  161. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  162. data/lib/solargraph/source/chain/constant.rb +30 -26
  163. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  164. data/lib/solargraph/source/chain/hash.rb +37 -34
  165. data/lib/solargraph/source/chain/if.rb +30 -28
  166. data/lib/solargraph/source/chain/instance_variable.rb +36 -13
  167. data/lib/solargraph/source/chain/link.rb +99 -109
  168. data/lib/solargraph/source/chain/literal.rb +51 -48
  169. data/lib/solargraph/source/chain/or.rb +29 -23
  170. data/lib/solargraph/source/chain/q_call.rb +13 -11
  171. data/lib/solargraph/source/chain/variable.rb +15 -13
  172. data/lib/solargraph/source/chain/z_super.rb +28 -30
  173. data/lib/solargraph/source/chain.rb +304 -291
  174. data/lib/solargraph/source/change.rb +89 -82
  175. data/lib/solargraph/source/cursor.rb +172 -166
  176. data/lib/solargraph/source/encoding_fixes.rb +22 -23
  177. data/lib/solargraph/source/source_chainer.rb +218 -194
  178. data/lib/solargraph/source/updater.rb +59 -55
  179. data/lib/solargraph/source.rb +522 -498
  180. data/lib/solargraph/source_map/clip.rb +245 -226
  181. data/lib/solargraph/source_map/data.rb +37 -34
  182. data/lib/solargraph/source_map/mapper.rb +286 -259
  183. data/lib/solargraph/source_map.rb +224 -212
  184. data/lib/solargraph/type_checker/problem.rb +34 -32
  185. data/lib/solargraph/type_checker/rules.rb +157 -84
  186. data/lib/solargraph/type_checker.rb +888 -814
  187. data/lib/solargraph/version.rb +5 -5
  188. data/lib/solargraph/workspace/config.rb +258 -255
  189. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  190. data/lib/solargraph/workspace/require_paths.rb +98 -97
  191. data/lib/solargraph/workspace.rb +242 -220
  192. data/lib/solargraph/yard_map/helpers.rb +49 -44
  193. data/lib/solargraph/yard_map/mapper/to_method.rb +136 -130
  194. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  195. data/lib/solargraph/yard_map/mapper.rb +84 -79
  196. data/lib/solargraph/yard_map.rb +17 -18
  197. data/lib/solargraph/yard_tags.rb +20 -20
  198. data/lib/solargraph/yardoc.rb +90 -87
  199. data/lib/solargraph.rb +128 -105
  200. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  201. data/rbs/fills/tuple/tuple.rbs +28 -0
  202. data/rbs/shims/ast/0/node.rbs +5 -0
  203. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  204. data/rbs_collection.yaml +1 -1
  205. data/solargraph.gemspec +37 -35
  206. metadata +52 -51
  207. data/lib/solargraph/type_checker/checks.rb +0 -124
  208. data/lib/solargraph/type_checker/param_def.rb +0 -37
  209. data/lib/solargraph/yard_map/to_method.rb +0 -89
  210. data/sig/shims/ast/0/node.rbs +0 -5
  211. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  212. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  213. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  214. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  215. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  216. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  217. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  218. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  219. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,228 +1,240 @@
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
+ # Whether this is an RBS interface like _ToAry or Hash::_Key.
47
+ def interface?
48
+ name.start_with?('_') || name.include?('::_')
49
+ end
50
+
51
+ # @return [Boolean]
52
+ def duck_type?
53
+ @duck_type ||= name.start_with?('#')
54
+ end
55
+
56
+ # @return [Boolean]
57
+ def nil_type?
58
+ @nil_type ||= name.casecmp('nil').zero?
59
+ end
60
+
61
+ def tuple?
62
+ @tuple ||= (name == 'Tuple') || (name == 'Array' && subtypes.length >= 1 && fixed_parameters?)
63
+ end
64
+
65
+ def void?
66
+ name == 'void'
67
+ end
68
+
69
+ def defined?
70
+ !undefined?
71
+ end
72
+
73
+ def undefined?
74
+ name == 'undefined'
75
+ end
76
+
77
+ # Variance of the type ignoring any type parameters
78
+ # @return [Symbol]
79
+ # @param situation [Symbol] The situation in which the variance is being considered.
80
+ def erased_variance situation = :method_call
81
+ # :nocov:
82
+ unless %i[method_call return_type assignment].include?(situation)
83
+ raise "Unknown situation: #{situation.inspect}"
84
+ end
85
+ # :nocov:
86
+ :covariant
87
+ end
88
+
89
+ # @param generics_to_erase [Enumerable<String>]
90
+ # @return [self]
91
+ def erase_generics generics_to_erase
92
+ transform do |type|
93
+ if type.name == ComplexType::GENERIC_TAG_NAME
94
+ if type.all_params.length == 1 && generics_to_erase.include?(type.all_params.first.to_s)
95
+ ComplexType::UNDEFINED
96
+ else
97
+ type
98
+ end
99
+ else
100
+ type
101
+ end
102
+ end
103
+ end
104
+
105
+ # @return [Symbol, nil]
106
+ attr_reader :parameters_type
107
+
108
+ # @type [Hash{String => Symbol}]
109
+ PARAMETERS_TYPE_BY_STARTING_TAG = {
110
+ '{' => :hash,
111
+ '(' => :fixed,
112
+ '<' => :list
113
+ }.freeze
114
+
115
+ # @return [Boolean]
116
+ def list_parameters?
117
+ parameters_type == :list
118
+ end
119
+
120
+ # @return [Boolean]
121
+ def fixed_parameters?
122
+ parameters_type == :fixed
123
+ end
124
+
125
+ # @return [Boolean]
126
+ def hash_parameters?
127
+ parameters_type == :hash
128
+ end
129
+
130
+ # @return [Array<ComplexType>]
131
+ def value_types
132
+ @subtypes
133
+ end
134
+
135
+ # @return [Array<ComplexType>]
136
+ def key_types
137
+ @key_types
138
+ end
139
+
140
+ # @return [String]
141
+ def namespace
142
+ # if priority higher than ||=, old implements cause unnecessary check
143
+ @namespace ||= lambda do
144
+ return 'Object' if duck_type?
145
+ return 'NilClass' if nil_type?
146
+ %w[Class Module].include?(name) && !subtypes.empty? ? subtypes.first.name : name
147
+ end.call
148
+ end
149
+
150
+ # @return [self]
151
+ def namespace_type
152
+ return ComplexType.parse('::Object') if duck_type?
153
+ return ComplexType.parse('::NilClass') if nil_type?
154
+ return subtypes.first if %w[Class Module].include?(name) && !subtypes.empty?
155
+ self
156
+ end
157
+
158
+ # @return [String]
159
+ def rooted_namespace
160
+ return namespace unless rooted? && can_root_name?(namespace)
161
+ "::#{namespace}"
162
+ end
163
+
164
+ # @return [String]
165
+ def rooted_name
166
+ return name unless @rooted && can_root_name?
167
+ "::#{name}"
168
+ end
169
+
170
+ # @return [String]
171
+ def substring
172
+ @substring ||= generate_substring_from(&:tags)
173
+ end
174
+
175
+ # @return [String]
176
+ def rooted_substring
177
+ @rooted_substring = generate_substring_from(&:rooted_tags)
178
+ end
179
+
180
+ # @return [String]
181
+ def generate_substring_from &to_str
182
+ key_types_str = key_types.map(&to_str).join(', ')
183
+ subtypes_str = subtypes.map(&to_str).join(', ')
184
+ if (key_types.none?(&:defined?) && subtypes.none?(&:defined?)) ||
185
+ (key_types.empty? && subtypes.empty?)
186
+ ''
187
+ elsif hash_parameters?
188
+ "{#{key_types_str} => #{subtypes_str}}"
189
+ elsif fixed_parameters?
190
+ "(#{subtypes_str})"
191
+ elsif name == 'Hash'
192
+ "<#{key_types_str}, #{subtypes_str}>"
193
+ else
194
+ "<#{key_types_str}#{subtypes_str}>"
195
+ end
196
+ end
197
+
198
+ # @return [::Symbol] :class or :instance
199
+ def scope
200
+ @scope ||= :instance if duck_type? || nil_type?
201
+ @scope ||= %w[Class Module].include?(name) && !subtypes.empty? ? :class : :instance
202
+ end
203
+
204
+ # @param other [Object]
205
+ def == other
206
+ return false unless self.class == other.class
207
+ # @sg-ignore flow sensitive typing should support .class == .class
208
+ tag == other.tag
209
+ end
210
+
211
+ # Generate a ComplexType that fully qualifies this type's namespaces.
212
+ #
213
+ # @param api_map [ApiMap] The ApiMap that performs qualification
214
+ # @param context [String] The namespace from which to resolve names
215
+ # @return [self, ComplexType, UniqueType] The generated ComplexType
216
+ def qualify api_map, context = ''
217
+ transform do |t|
218
+ next t if t.name == GENERIC_TAG_NAME
219
+ next t if t.duck_type? || t.void? || t.undefined?
220
+ recon = (t.rooted? ? '' : context)
221
+ fqns = api_map.qualify(t.name, recon)
222
+ if fqns.nil?
223
+ next UniqueType::BOOLEAN if t.tag == 'Boolean'
224
+ next UniqueType::UNDEFINED
225
+ end
226
+ t.recreate(new_name: fqns, make_rooted: true)
227
+ end
228
+ end
229
+
230
+ # @yieldparam [UniqueType]
231
+ # @return [void]
232
+ # @overload each_unique_type()
233
+ # @return [Enumerator<UniqueType>]
234
+ def each_unique_type &block
235
+ return enum_for(__method__) unless block_given?
236
+ yield self
237
+ end
238
+ end
239
+ end
240
+ end