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