solargraph 0.58.2 → 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.
Files changed (203) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.github/workflows/linting.yml +4 -5
  4. data/.github/workflows/plugins.yml +41 -34
  5. data/.github/workflows/rspec.yml +44 -23
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.rubocop.yml +32 -5
  8. data/.rubocop_todo.yml +50 -966
  9. data/Gemfile +3 -1
  10. data/README.md +3 -3
  11. data/Rakefile +26 -23
  12. data/bin/solargraph +2 -1
  13. data/lib/solargraph/api_map/cache.rb +3 -3
  14. data/lib/solargraph/api_map/constants.rb +13 -3
  15. data/lib/solargraph/api_map/index.rb +23 -18
  16. data/lib/solargraph/api_map/source_to_yard.rb +22 -9
  17. data/lib/solargraph/api_map/store.rb +33 -28
  18. data/lib/solargraph/api_map.rb +150 -82
  19. data/lib/solargraph/bench.rb +44 -45
  20. data/lib/solargraph/complex_type/conformance.rb +176 -0
  21. data/lib/solargraph/complex_type/type_methods.rb +28 -17
  22. data/lib/solargraph/complex_type/unique_type.rb +218 -57
  23. data/lib/solargraph/complex_type.rb +170 -57
  24. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  25. data/lib/solargraph/convention/data_definition/data_definition_node.rb +7 -5
  26. data/lib/solargraph/convention/data_definition.rb +5 -2
  27. data/lib/solargraph/convention/gemfile.rb +15 -15
  28. data/lib/solargraph/convention/gemspec.rb +23 -23
  29. data/lib/solargraph/convention/rakefile.rb +17 -17
  30. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +2 -1
  31. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +4 -3
  32. data/lib/solargraph/convention/struct_definition.rb +8 -4
  33. data/lib/solargraph/convention.rb +78 -78
  34. data/lib/solargraph/converters/dd.rb +19 -17
  35. data/lib/solargraph/converters/dl.rb +17 -15
  36. data/lib/solargraph/converters/dt.rb +17 -15
  37. data/lib/solargraph/converters/misc.rb +3 -1
  38. data/lib/solargraph/diagnostics/require_not_found.rb +1 -0
  39. data/lib/solargraph/diagnostics/rubocop.rb +11 -10
  40. data/lib/solargraph/diagnostics/rubocop_helpers.rb +5 -3
  41. data/lib/solargraph/diagnostics/type_check.rb +11 -10
  42. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  43. data/lib/solargraph/doc_map.rb +133 -373
  44. data/lib/solargraph/equality.rb +4 -4
  45. data/lib/solargraph/gem_pins.rb +21 -20
  46. data/lib/solargraph/language_server/error_codes.rb +20 -20
  47. data/lib/solargraph/language_server/host/diagnoser.rb +1 -1
  48. data/lib/solargraph/language_server/host/dispatch.rb +3 -3
  49. data/lib/solargraph/language_server/host/message_worker.rb +4 -3
  50. data/lib/solargraph/language_server/host/sources.rb +2 -1
  51. data/lib/solargraph/language_server/host.rb +30 -22
  52. data/lib/solargraph/language_server/message/base.rb +97 -97
  53. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  54. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  55. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +12 -18
  56. data/lib/solargraph/language_server/message/extended/document.rb +1 -0
  57. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  58. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  59. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  60. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  61. data/lib/solargraph/language_server/message/text_document/completion.rb +10 -8
  62. data/lib/solargraph/language_server/message/text_document/definition.rb +41 -32
  63. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  64. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -19
  65. data/lib/solargraph/language_server/message/text_document/formatting.rb +8 -6
  66. data/lib/solargraph/language_server/message/text_document/hover.rb +5 -5
  67. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  68. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  69. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  70. data/lib/solargraph/language_server/message/text_document/signature_help.rb +3 -2
  71. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -17
  72. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  73. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  74. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  75. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -17
  76. data/lib/solargraph/language_server/message.rb +94 -94
  77. data/lib/solargraph/language_server/request.rb +29 -27
  78. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  79. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  80. data/lib/solargraph/library.rb +85 -44
  81. data/lib/solargraph/location.rb +17 -14
  82. data/lib/solargraph/logging.rb +24 -4
  83. data/lib/solargraph/page.rb +92 -92
  84. data/lib/solargraph/parser/comment_ripper.rb +19 -4
  85. data/lib/solargraph/parser/flow_sensitive_typing.rb +326 -108
  86. data/lib/solargraph/parser/node_processor/base.rb +34 -4
  87. data/lib/solargraph/parser/node_processor.rb +8 -7
  88. data/lib/solargraph/parser/parser_gem/class_methods.rb +32 -14
  89. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  90. data/lib/solargraph/parser/parser_gem/node_chainer.rb +50 -25
  91. data/lib/solargraph/parser/parser_gem/node_methods.rb +91 -70
  92. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +4 -4
  93. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +13 -11
  94. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +9 -0
  95. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +12 -12
  96. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +10 -3
  97. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  98. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +36 -6
  99. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +5 -3
  100. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +1 -0
  101. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +3 -1
  102. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +3 -3
  103. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  104. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -1
  105. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +2 -1
  106. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +4 -5
  107. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +124 -113
  108. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  109. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  110. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +6 -2
  111. data/lib/solargraph/parser/parser_gem/node_processors.rb +4 -0
  112. data/lib/solargraph/parser/parser_gem.rb +14 -12
  113. data/lib/solargraph/parser/region.rb +9 -3
  114. data/lib/solargraph/parser/snippet.rb +3 -1
  115. data/lib/solargraph/parser.rb +25 -23
  116. data/lib/solargraph/pin/base.rb +126 -80
  117. data/lib/solargraph/pin/base_variable.rb +273 -24
  118. data/lib/solargraph/pin/block.rb +29 -6
  119. data/lib/solargraph/pin/breakable.rb +7 -1
  120. data/lib/solargraph/pin/callable.rb +65 -21
  121. data/lib/solargraph/pin/closure.rb +7 -10
  122. data/lib/solargraph/pin/common.rb +24 -6
  123. data/lib/solargraph/pin/compound_statement.rb +55 -0
  124. data/lib/solargraph/pin/constant.rb +43 -45
  125. data/lib/solargraph/pin/conversions.rb +10 -4
  126. data/lib/solargraph/pin/delegated_method.rb +19 -8
  127. data/lib/solargraph/pin/documenting.rb +4 -2
  128. data/lib/solargraph/pin/instance_variable.rb +5 -1
  129. data/lib/solargraph/pin/keyword.rb +0 -4
  130. data/lib/solargraph/pin/local_variable.rb +15 -59
  131. data/lib/solargraph/pin/method.rb +153 -104
  132. data/lib/solargraph/pin/method_alias.rb +8 -0
  133. data/lib/solargraph/pin/namespace.rb +19 -12
  134. data/lib/solargraph/pin/parameter.rb +100 -36
  135. data/lib/solargraph/pin/proxy_type.rb +4 -1
  136. data/lib/solargraph/pin/reference/override.rb +1 -1
  137. data/lib/solargraph/pin/reference/superclass.rb +2 -0
  138. data/lib/solargraph/pin/reference.rb +19 -0
  139. data/lib/solargraph/pin/search.rb +3 -2
  140. data/lib/solargraph/pin/signature.rb +15 -12
  141. data/lib/solargraph/pin/symbol.rb +2 -1
  142. data/lib/solargraph/pin/until.rb +2 -4
  143. data/lib/solargraph/pin/while.rb +2 -4
  144. data/lib/solargraph/pin.rb +2 -0
  145. data/lib/solargraph/pin_cache.rb +490 -73
  146. data/lib/solargraph/position.rb +14 -10
  147. data/lib/solargraph/range.rb +16 -15
  148. data/lib/solargraph/rbs_map/conversions.rb +343 -214
  149. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  150. data/lib/solargraph/rbs_map/core_map.rb +24 -17
  151. data/lib/solargraph/rbs_map/stdlib_map.rb +33 -5
  152. data/lib/solargraph/rbs_map.rb +77 -32
  153. data/lib/solargraph/server_methods.rb +16 -16
  154. data/lib/solargraph/shell.rb +128 -73
  155. data/lib/solargraph/source/chain/array.rb +39 -37
  156. data/lib/solargraph/source/chain/call.rb +96 -56
  157. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  158. data/lib/solargraph/source/chain/constant.rb +5 -1
  159. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  160. data/lib/solargraph/source/chain/hash.rb +8 -5
  161. data/lib/solargraph/source/chain/if.rb +12 -10
  162. data/lib/solargraph/source/chain/instance_variable.rb +24 -1
  163. data/lib/solargraph/source/chain/link.rb +99 -109
  164. data/lib/solargraph/source/chain/literal.rb +9 -6
  165. data/lib/solargraph/source/chain/or.rb +10 -4
  166. data/lib/solargraph/source/chain/q_call.rb +13 -11
  167. data/lib/solargraph/source/chain/variable.rb +15 -13
  168. data/lib/solargraph/source/chain/z_super.rb +28 -30
  169. data/lib/solargraph/source/chain.rb +49 -38
  170. data/lib/solargraph/source/change.rb +12 -5
  171. data/lib/solargraph/source/cursor.rb +23 -17
  172. data/lib/solargraph/source/encoding_fixes.rb +6 -7
  173. data/lib/solargraph/source/source_chainer.rb +56 -32
  174. data/lib/solargraph/source/updater.rb +5 -1
  175. data/lib/solargraph/source.rb +59 -35
  176. data/lib/solargraph/source_map/clip.rb +48 -29
  177. data/lib/solargraph/source_map/data.rb +4 -1
  178. data/lib/solargraph/source_map/mapper.rb +71 -42
  179. data/lib/solargraph/source_map.rb +21 -9
  180. data/lib/solargraph/type_checker/problem.rb +3 -1
  181. data/lib/solargraph/type_checker/rules.rb +81 -8
  182. data/lib/solargraph/type_checker.rb +195 -120
  183. data/lib/solargraph/version.rb +1 -1
  184. data/lib/solargraph/workspace/config.rb +13 -10
  185. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  186. data/lib/solargraph/workspace/require_paths.rb +1 -0
  187. data/lib/solargraph/workspace.rb +149 -30
  188. data/lib/solargraph/yard_map/helpers.rb +8 -3
  189. data/lib/solargraph/yard_map/mapper/to_method.rb +13 -7
  190. data/lib/solargraph/yard_map/mapper/to_namespace.rb +2 -1
  191. data/lib/solargraph/yard_map/mapper.rb +13 -8
  192. data/lib/solargraph/yard_tags.rb +20 -20
  193. data/lib/solargraph/yardoc.rb +33 -23
  194. data/lib/solargraph.rb +29 -8
  195. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  196. data/rbs/fills/tuple/tuple.rbs +28 -0
  197. data/rbs/shims/ast/0/node.rbs +1 -1
  198. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  199. data/solargraph.gemspec +36 -34
  200. metadata +38 -33
  201. data/lib/solargraph/type_checker/checks.rb +0 -124
  202. data/lib/solargraph/type_checker/param_def.rb +0 -37
  203. data/lib/solargraph/yard_map/to_method.rb +0 -89
@@ -0,0 +1,176 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class ComplexType
5
+ # Checks whether a type can be used in a given situation
6
+ class Conformance
7
+ # @param api_map [ApiMap]
8
+ # @param inferred [ComplexType::UniqueType]
9
+ # @param expected [ComplexType::UniqueType]
10
+ # @param situation [:method_call, :return_type]
11
+ # @param rules [Array<:allow_subtype_skew, :allow_empty_params, :allow_reverse_match,
12
+ # :allow_any_match, :allow_undefined, :allow_unresolved_generic,
13
+ # :allow_unmatched_interface>]
14
+ # @param variance [:invariant, :covariant, :contravariant]
15
+ def initialize api_map, inferred, expected,
16
+ situation = :method_call, rules = [],
17
+ variance: inferred.erased_variance(situation)
18
+ @api_map = api_map
19
+ @inferred = inferred
20
+ @expected = expected
21
+ @situation = situation
22
+ @rules = rules
23
+ @variance = variance
24
+ # :nocov:
25
+ unless expected.is_a?(UniqueType)
26
+ # @sg-ignore This should never happen and the typechecker is angry about it
27
+ raise "Expected type must be a UniqueType, got #{expected.class} in #{expected.inspect}"
28
+ end
29
+ # :nocov:
30
+ return if inferred.is_a?(UniqueType)
31
+ # :nocov:
32
+ # @sg-ignore This should never happen and the typechecker is angry about it
33
+ raise "Inferred type must be a UniqueType, got #{inferred.class} in #{inferred.inspect}"
34
+ # :nocov:
35
+ end
36
+
37
+ def conforms_to_unique_type?
38
+ unless expected.is_a?(UniqueType)
39
+ # :nocov:
40
+ raise "Expected type must be a UniqueType, got #{expected.class} in #{expected.inspect}"
41
+ # :nocov:
42
+ end
43
+
44
+ return true if ignore_interface?
45
+ return true if conforms_via_reverse_match?
46
+
47
+ downcast_inferred = inferred.downcast_to_literal_if_possible
48
+ downcast_expected = expected.downcast_to_literal_if_possible
49
+ if (downcast_inferred.name != inferred.name) || (downcast_expected.name != expected.name)
50
+ return with_new_types(downcast_inferred, downcast_expected).conforms_to_unique_type?
51
+ end
52
+
53
+ if rules.include?(:allow_subtype_skew) && !expected.all_params.empty?
54
+ # parameters are not considered in this case
55
+ return with_new_types(inferred, expected.erase_parameters).conforms_to_unique_type?
56
+ end
57
+
58
+ return with_new_types(inferred.erase_parameters, expected).conforms_to_unique_type? if only_inferred_parameters?
59
+
60
+ return conforms_via_stripped_expected_parameters? if can_strip_expected_parameters?
61
+
62
+ return true if inferred == expected
63
+
64
+ return false unless erased_type_conforms?
65
+
66
+ return true if inferred.all_params.empty? && rules.include?(:allow_empty_params)
67
+
68
+ # at this point we know the erased type is fine - time to look at parameters
69
+
70
+ # there's an implicit 'any' on the expectation parameters
71
+ # if there are none specified
72
+ return true if expected.all_params.empty?
73
+
74
+ return false unless key_types_conform?
75
+
76
+ subtypes_conform?
77
+ end
78
+
79
+ private
80
+
81
+ def only_inferred_parameters?
82
+ !expected.parameters? && inferred.parameters?
83
+ end
84
+
85
+ def conforms_via_stripped_expected_parameters?
86
+ with_new_types(inferred, expected.erase_parameters).conforms_to_unique_type?
87
+ end
88
+
89
+ def ignore_interface?
90
+ (expected.any?(&:interface?) && rules.include?(:allow_unmatched_interface)) ||
91
+ (inferred.interface? && rules.include?(:allow_unmatched_interface))
92
+ end
93
+
94
+ def can_strip_expected_parameters?
95
+ expected.parameters? && !inferred.parameters? && rules.include?(:allow_empty_params)
96
+ end
97
+
98
+ def conforms_via_reverse_match?
99
+ return false unless rules.include? :allow_reverse_match
100
+
101
+ expected.conforms_to?(api_map, inferred, situation,
102
+ rules - [:allow_reverse_match],
103
+ variance: variance)
104
+ end
105
+
106
+ def erased_type_conforms?
107
+ case variance
108
+ when :invariant
109
+ return false unless inferred.name == expected.name
110
+ when :covariant
111
+ # covariant: we can pass in a more specific type
112
+ # we contain the expected mix-in, or we have a more specific type
113
+ return false unless api_map.type_include?(inferred.name, expected.name) ||
114
+ api_map.super_and_sub?(expected.name, inferred.name) ||
115
+ inferred.name == expected.name
116
+ when :contravariant
117
+ # contravariant: we can pass in a more general type
118
+ # we contain the expected mix-in, or we have a more general type
119
+ return false unless api_map.type_include?(inferred.name, expected.name) ||
120
+ api_map.super_and_sub?(inferred.name, expected.name) ||
121
+ inferred.name == expected.name
122
+ else
123
+ # :nocov:
124
+ raise "Unknown variance: #{variance.inspect}"
125
+ # :nocov:
126
+ end
127
+ true
128
+ end
129
+
130
+ def key_types_conform?
131
+ return true if expected.key_types.empty?
132
+
133
+ return false if inferred.key_types.empty?
134
+
135
+ unless ComplexType.new(inferred.key_types).conforms_to?(api_map,
136
+ ComplexType.new(expected.key_types),
137
+ situation,
138
+ rules,
139
+ variance: inferred.parameter_variance(situation))
140
+ return false
141
+ end
142
+
143
+ true
144
+ end
145
+
146
+ def subtypes_conform?
147
+ return true if expected.subtypes.empty?
148
+
149
+ return true if expected.subtypes.any?(&:undefined?) && rules.include?(:allow_undefined)
150
+
151
+ return true if inferred.subtypes.any?(&:undefined?) && rules.include?(:allow_undefined)
152
+
153
+ return true if inferred.subtypes.all?(&:generic?) && rules.include?(:allow_unresolved_generic)
154
+
155
+ return true if expected.subtypes.all?(&:generic?) && rules.include?(:allow_unresolved_generic)
156
+
157
+ return false if inferred.subtypes.empty?
158
+
159
+ ComplexType.new(inferred.subtypes).conforms_to?(api_map,
160
+ ComplexType.new(expected.subtypes),
161
+ situation,
162
+ rules,
163
+ variance: inferred.parameter_variance(situation))
164
+ end
165
+
166
+ # @return [self]
167
+ # @param inferred [ComplexType::UniqueType]
168
+ # @param expected [ComplexType::UniqueType]
169
+ def with_new_types inferred, expected
170
+ self.class.new(api_map, inferred, expected, situation, rules, variance: variance)
171
+ end
172
+
173
+ attr_reader :api_map, :inferred, :expected, :situation, :rules, :variance
174
+ end
175
+ end
176
+ end
@@ -54,11 +54,11 @@ module Solargraph
54
54
 
55
55
  # @return [Boolean]
56
56
  def nil_type?
57
- @nil_type ||= (name.casecmp('nil') == 0)
57
+ @nil_type ||= name.casecmp('nil').zero?
58
58
  end
59
59
 
60
60
  def tuple?
61
- @tuple_type ||= (name == 'Tuple') || (name == 'Array' && subtypes.length >= 1 && fixed_parameters?)
61
+ @tuple ||= (name == 'Tuple') || (name == 'Array' && subtypes.length >= 1 && fixed_parameters?)
62
62
  end
63
63
 
64
64
  def void?
@@ -73,9 +73,21 @@ module Solargraph
73
73
  name == 'undefined'
74
74
  end
75
75
 
76
+ # Variance of the type ignoring any type parameters
77
+ # @return [Symbol]
78
+ # @param situation [Symbol] The situation in which the variance is being considered.
79
+ def erased_variance situation = :method_call
80
+ # :nocov:
81
+ unless %i[method_call return_type assignment].include?(situation)
82
+ raise "Unknown situation: #{situation.inspect}"
83
+ end
84
+ # :nocov:
85
+ :covariant
86
+ end
87
+
76
88
  # @param generics_to_erase [Enumerable<String>]
77
89
  # @return [self]
78
- def erase_generics(generics_to_erase)
90
+ def erase_generics generics_to_erase
79
91
  transform do |type|
80
92
  if type.name == ComplexType::GENERIC_TAG_NAME
81
93
  if type.all_params.length == 1 && generics_to_erase.include?(type.all_params.first.to_s)
@@ -130,7 +142,7 @@ module Solargraph
130
142
  @namespace ||= lambda do
131
143
  return 'Object' if duck_type?
132
144
  return 'NilClass' if nil_type?
133
- return (name == 'Class' || name == 'Module') && !subtypes.empty? ? subtypes.first.name : name
145
+ %w[Class Module].include?(name) && !subtypes.empty? ? subtypes.first.name : name
134
146
  end.call
135
147
  end
136
148
 
@@ -138,7 +150,7 @@ module Solargraph
138
150
  def namespace_type
139
151
  return ComplexType.parse('::Object') if duck_type?
140
152
  return ComplexType.parse('::NilClass') if nil_type?
141
- return subtypes.first if (name == 'Class' || name == 'Module') && !subtypes.empty?
153
+ return subtypes.first if %w[Class Module].include?(name) && !subtypes.empty?
142
154
  self
143
155
  end
144
156
 
@@ -165,36 +177,33 @@ module Solargraph
165
177
  end
166
178
 
167
179
  # @return [String]
168
- def generate_substring_from(&to_str)
180
+ def generate_substring_from &to_str
169
181
  key_types_str = key_types.map(&to_str).join(', ')
170
182
  subtypes_str = subtypes.map(&to_str).join(', ')
171
- if key_types.none?(&:defined?) && subtypes.none?(&:defined?)
172
- ''
173
- elsif key_types.empty? && subtypes.empty?
183
+ if (key_types.none?(&:defined?) && subtypes.none?(&:defined?)) ||
184
+ (key_types.empty? && subtypes.empty?)
174
185
  ''
175
186
  elsif hash_parameters?
176
187
  "{#{key_types_str} => #{subtypes_str}}"
177
188
  elsif fixed_parameters?
178
189
  "(#{subtypes_str})"
190
+ elsif name == 'Hash'
191
+ "<#{key_types_str}, #{subtypes_str}>"
179
192
  else
180
- if name == 'Hash'
181
- "<#{key_types_str}, #{subtypes_str}>"
182
- else
183
- "<#{key_types_str}#{subtypes_str}>"
184
- end
193
+ "<#{key_types_str}#{subtypes_str}>"
185
194
  end
186
195
  end
187
196
 
188
197
  # @return [::Symbol] :class or :instance
189
198
  def scope
190
199
  @scope ||= :instance if duck_type? || nil_type?
191
- @scope ||= (name == 'Class' || name == 'Module') && !subtypes.empty? ? :class : :instance
200
+ @scope ||= %w[Class Module].include?(name) && !subtypes.empty? ? :class : :instance
192
201
  end
193
202
 
194
203
  # @param other [Object]
195
204
  def == other
196
205
  return false unless self.class == other.class
197
- # @sg-ignore https://github.com/castwide/solargraph/pull/1114
206
+ # @sg-ignore flow sensitive typing should support .class == .class
198
207
  tag == other.tag
199
208
  end
200
209
 
@@ -218,7 +227,9 @@ module Solargraph
218
227
  end
219
228
 
220
229
  # @yieldparam [UniqueType]
221
- # @return [Enumerator<UniqueType>]
230
+ # @return [void]
231
+ # @overload each_unique_type()
232
+ # @return [Enumerator<UniqueType>]
222
233
  def each_unique_type &block
223
234
  return enum_for(__method__) unless block_given?
224
235
  yield self