solargraph 0.59.0.dev.1 → 0.59.0.dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/plugins.yml +4 -1
  3. data/.github/workflows/rspec.yml +3 -14
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +32 -5
  6. data/.rubocop_todo.yml +37 -931
  7. data/CHANGELOG.md +7 -1
  8. data/Gemfile +3 -1
  9. data/Rakefile +25 -23
  10. data/bin/solargraph +2 -1
  11. data/lib/solargraph/api_map/index.rb +5 -11
  12. data/lib/solargraph/api_map/source_to_yard.rb +9 -8
  13. data/lib/solargraph/api_map/store.rb +22 -20
  14. data/lib/solargraph/api_map.rb +50 -37
  15. data/lib/solargraph/bench.rb +44 -45
  16. data/lib/solargraph/complex_type/type_methods.rb +12 -15
  17. data/lib/solargraph/complex_type/unique_type.rb +54 -43
  18. data/lib/solargraph/complex_type.rb +69 -61
  19. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  20. data/lib/solargraph/convention/data_definition/data_definition_node.rb +4 -4
  21. data/lib/solargraph/convention/data_definition.rb +1 -1
  22. data/lib/solargraph/convention/gemfile.rb +15 -15
  23. data/lib/solargraph/convention/gemspec.rb +23 -23
  24. data/lib/solargraph/convention/rakefile.rb +17 -17
  25. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -1
  26. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +3 -3
  27. data/lib/solargraph/convention/struct_definition.rb +3 -3
  28. data/lib/solargraph/convention.rb +78 -78
  29. data/lib/solargraph/converters/dd.rb +19 -17
  30. data/lib/solargraph/converters/dl.rb +17 -15
  31. data/lib/solargraph/converters/dt.rb +17 -15
  32. data/lib/solargraph/converters/misc.rb +3 -1
  33. data/lib/solargraph/diagnostics/rubocop.rb +10 -10
  34. data/lib/solargraph/diagnostics/rubocop_helpers.rb +3 -3
  35. data/lib/solargraph/diagnostics/type_check.rb +10 -10
  36. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  37. data/lib/solargraph/doc_map.rb +9 -10
  38. data/lib/solargraph/equality.rb +3 -3
  39. data/lib/solargraph/gem_pins.rb +7 -5
  40. data/lib/solargraph/language_server/error_codes.rb +20 -20
  41. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  42. data/lib/solargraph/language_server/host/dispatch.rb +2 -3
  43. data/lib/solargraph/language_server/host/message_worker.rb +2 -2
  44. data/lib/solargraph/language_server/host/sources.rb +1 -1
  45. data/lib/solargraph/language_server/host.rb +24 -21
  46. data/lib/solargraph/language_server/message/base.rb +97 -97
  47. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  48. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  49. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +10 -11
  50. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  51. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  52. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  53. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  54. data/lib/solargraph/language_server/message/text_document/completion.rb +8 -8
  55. data/lib/solargraph/language_server/message/text_document/definition.rb +41 -34
  56. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  57. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -21
  58. data/lib/solargraph/language_server/message/text_document/formatting.rb +6 -6
  59. data/lib/solargraph/language_server/message/text_document/hover.rb +3 -5
  60. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  61. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  62. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  63. data/lib/solargraph/language_server/message/text_document/signature_help.rb +2 -2
  64. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -19
  65. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  66. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  67. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  68. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -19
  69. data/lib/solargraph/language_server/message.rb +94 -94
  70. data/lib/solargraph/language_server/request.rb +29 -27
  71. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  72. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  73. data/lib/solargraph/library.rb +28 -33
  74. data/lib/solargraph/location.rb +10 -12
  75. data/lib/solargraph/logging.rb +4 -4
  76. data/lib/solargraph/page.rb +92 -92
  77. data/lib/solargraph/parser/comment_ripper.rb +12 -4
  78. data/lib/solargraph/parser/flow_sensitive_typing.rb +32 -42
  79. data/lib/solargraph/parser/node_processor/base.rb +4 -4
  80. data/lib/solargraph/parser/node_processor.rb +1 -1
  81. data/lib/solargraph/parser/parser_gem/class_methods.rb +4 -4
  82. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  83. data/lib/solargraph/parser/parser_gem/node_chainer.rb +20 -20
  84. data/lib/solargraph/parser/parser_gem/node_methods.rb +66 -65
  85. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +12 -12
  86. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +1 -1
  87. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +3 -3
  88. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  89. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +3 -3
  90. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +2 -1
  91. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +1 -1
  92. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +3 -5
  93. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +118 -112
  94. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  95. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +1 -1
  96. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +1 -1
  97. data/lib/solargraph/parser/parser_gem.rb +14 -12
  98. data/lib/solargraph/parser/snippet.rb +2 -0
  99. data/lib/solargraph/parser.rb +25 -23
  100. data/lib/solargraph/pin/base.rb +78 -64
  101. data/lib/solargraph/pin/base_variable.rb +28 -71
  102. data/lib/solargraph/pin/block.rb +3 -2
  103. data/lib/solargraph/pin/breakable.rb +2 -0
  104. data/lib/solargraph/pin/callable.rb +23 -26
  105. data/lib/solargraph/pin/closure.rb +5 -4
  106. data/lib/solargraph/pin/common.rb +5 -2
  107. data/lib/solargraph/pin/compound_statement.rb +3 -3
  108. data/lib/solargraph/pin/constant.rb +43 -45
  109. data/lib/solargraph/pin/conversions.rb +9 -4
  110. data/lib/solargraph/pin/delegated_method.rb +4 -4
  111. data/lib/solargraph/pin/documenting.rb +3 -2
  112. data/lib/solargraph/pin/local_variable.rb +4 -4
  113. data/lib/solargraph/pin/method.rb +71 -70
  114. data/lib/solargraph/pin/namespace.rb +13 -12
  115. data/lib/solargraph/pin/parameter.rb +28 -27
  116. data/lib/solargraph/pin/proxy_type.rb +2 -0
  117. data/lib/solargraph/pin/reference.rb +17 -0
  118. data/lib/solargraph/pin/search.rb +2 -2
  119. data/lib/solargraph/pin/signature.rb +9 -14
  120. data/lib/solargraph/pin/symbol.rb +1 -0
  121. data/lib/solargraph/pin/until.rb +1 -3
  122. data/lib/solargraph/pin/while.rb +1 -3
  123. data/lib/solargraph/pin_cache.rb +16 -19
  124. data/lib/solargraph/position.rb +35 -17
  125. data/lib/solargraph/range.rb +10 -9
  126. data/lib/solargraph/rbs_map/conversions.rb +312 -206
  127. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  128. data/lib/solargraph/rbs_map/stdlib_map.rb +0 -1
  129. data/lib/solargraph/rbs_map.rb +3 -12
  130. data/lib/solargraph/server_methods.rb +16 -16
  131. data/lib/solargraph/shell.rb +63 -53
  132. data/lib/solargraph/source/chain/array.rb +39 -37
  133. data/lib/solargraph/source/chain/call.rb +49 -44
  134. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  135. data/lib/solargraph/source/chain/constant.rb +3 -1
  136. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  137. data/lib/solargraph/source/chain/hash.rb +8 -6
  138. data/lib/solargraph/source/chain/if.rb +11 -10
  139. data/lib/solargraph/source/chain/instance_variable.rb +3 -1
  140. data/lib/solargraph/source/chain/link.rb +99 -109
  141. data/lib/solargraph/source/chain/literal.rb +4 -6
  142. data/lib/solargraph/source/chain/or.rb +2 -4
  143. data/lib/solargraph/source/chain/q_call.rb +13 -11
  144. data/lib/solargraph/source/chain/variable.rb +15 -13
  145. data/lib/solargraph/source/chain/z_super.rb +28 -30
  146. data/lib/solargraph/source/chain.rb +24 -16
  147. data/lib/solargraph/source/change.rb +3 -3
  148. data/lib/solargraph/source/cursor.rb +18 -18
  149. data/lib/solargraph/source/encoding_fixes.rb +6 -7
  150. data/lib/solargraph/source/source_chainer.rb +46 -32
  151. data/lib/solargraph/source/updater.rb +1 -1
  152. data/lib/solargraph/source.rb +27 -29
  153. data/lib/solargraph/source_map/clip.rb +38 -30
  154. data/lib/solargraph/source_map/mapper.rb +52 -46
  155. data/lib/solargraph/source_map.rb +8 -4
  156. data/lib/solargraph/type_checker/rules.rb +8 -8
  157. data/lib/solargraph/type_checker.rb +95 -101
  158. data/lib/solargraph/version.rb +1 -1
  159. data/lib/solargraph/workspace/config.rb +10 -9
  160. data/lib/solargraph/workspace/gemspecs.rb +1 -1
  161. data/lib/solargraph/workspace.rb +21 -44
  162. data/lib/solargraph/yard_map/helpers.rb +6 -2
  163. data/lib/solargraph/yard_map/mapper/to_method.rb +8 -6
  164. data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -1
  165. data/lib/solargraph/yard_map/mapper.rb +12 -12
  166. data/lib/solargraph/yard_tags.rb +20 -20
  167. data/lib/solargraph.rb +5 -5
  168. data/solargraph.gemspec +35 -34
  169. metadata +28 -28
@@ -1,45 +1,44 @@
1
- # frozen_string_literal: true
2
-
3
-
4
- module Solargraph
5
- # A container of source maps and workspace data to be cataloged in an ApiMap.
6
- #
7
- class Bench
8
- # @return [Set<SourceMap>]
9
- attr_reader :source_maps
10
-
11
- # @return [Workspace]
12
- attr_reader :workspace
13
-
14
- # @return [SourceMap]
15
- attr_reader :live_map
16
-
17
- # @return [Set<String>]
18
- attr_reader :external_requires
19
-
20
- # @param source_maps [Array<SourceMap>, Set<SourceMap>]
21
- # @param workspace [Workspace]
22
- # @param live_map [SourceMap, nil]
23
- # @param external_requires [Array<String>, Set<String>]
24
- def initialize source_maps: [], workspace: Workspace.new, live_map: nil, external_requires: []
25
- @source_maps = source_maps.to_set
26
- @workspace = workspace
27
- @live_map = live_map
28
- @external_requires = external_requires.reject { |path| workspace.would_require?(path) }
29
- .compact
30
- .to_set
31
- end
32
-
33
- # @return [Hash{String => SourceMap}]
34
- def source_map_hash
35
- # @todo Work around #to_h bug in current Ruby head (3.5) with #map#to_h
36
- @source_map_hash ||= source_maps.map { |s| [s.filename, s] }
37
- .to_h
38
- end
39
-
40
- # @return [Set<SourceMap>]
41
- def icebox
42
- @icebox ||= (source_maps - [live_map])
43
- end
44
- end
45
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ # A container of source maps and workspace data to be cataloged in an ApiMap.
5
+ #
6
+ class Bench
7
+ # @return [Set<SourceMap>]
8
+ attr_reader :source_maps
9
+
10
+ # @return [Workspace]
11
+ attr_reader :workspace
12
+
13
+ # @return [SourceMap]
14
+ attr_reader :live_map
15
+
16
+ # @return [Set<String>]
17
+ attr_reader :external_requires
18
+
19
+ # @param source_maps [Array<SourceMap>, Set<SourceMap>]
20
+ # @param workspace [Workspace]
21
+ # @param live_map [SourceMap, nil]
22
+ # @param external_requires [Array<String>, Set<String>]
23
+ def initialize source_maps: [], workspace: Workspace.new, live_map: nil, external_requires: []
24
+ @source_maps = source_maps.to_set
25
+ @workspace = workspace
26
+ @live_map = live_map
27
+ @external_requires = external_requires.reject { |path| workspace.would_require?(path) }
28
+ .compact
29
+ .to_set
30
+ end
31
+
32
+ # @sg-ignore flow sensitive typing needs better handling of ||= on lvars
33
+ # @return [Hash{String => SourceMap}]
34
+ def source_map_hash
35
+ # @todo Work around #to_h bug in current Ruby head (3.5) with #map#to_h
36
+ @source_map_hash ||= source_maps.to_h { |s| [s.filename, s] }
37
+ end
38
+
39
+ # @return [Set<SourceMap>]
40
+ def icebox
41
+ @icebox ||= (source_maps - [live_map])
42
+ end
43
+ end
44
+ 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?
@@ -87,7 +87,7 @@ module Solargraph
87
87
 
88
88
  # @param generics_to_erase [Enumerable<String>]
89
89
  # @return [self]
90
- def erase_generics(generics_to_erase)
90
+ def erase_generics generics_to_erase
91
91
  transform do |type|
92
92
  if type.name == ComplexType::GENERIC_TAG_NAME
93
93
  if type.all_params.length == 1 && generics_to_erase.include?(type.all_params.first.to_s)
@@ -142,7 +142,7 @@ module Solargraph
142
142
  @namespace ||= lambda do
143
143
  return 'Object' if duck_type?
144
144
  return 'NilClass' if nil_type?
145
- return (name == 'Class' || name == 'Module') && !subtypes.empty? ? subtypes.first.name : name
145
+ %w[Class Module].include?(name) && !subtypes.empty? ? subtypes.first.name : name
146
146
  end.call
147
147
  end
148
148
 
@@ -150,7 +150,7 @@ module Solargraph
150
150
  def namespace_type
151
151
  return ComplexType.parse('::Object') if duck_type?
152
152
  return ComplexType.parse('::NilClass') if nil_type?
153
- return subtypes.first if (name == 'Class' || name == 'Module') && !subtypes.empty?
153
+ return subtypes.first if %w[Class Module].include?(name) && !subtypes.empty?
154
154
  self
155
155
  end
156
156
 
@@ -177,30 +177,27 @@ module Solargraph
177
177
  end
178
178
 
179
179
  # @return [String]
180
- def generate_substring_from(&to_str)
180
+ def generate_substring_from &to_str
181
181
  key_types_str = key_types.map(&to_str).join(', ')
182
182
  subtypes_str = subtypes.map(&to_str).join(', ')
183
- if key_types.none?(&:defined?) && subtypes.none?(&:defined?)
184
- ''
185
- elsif key_types.empty? && subtypes.empty?
183
+ if (key_types.none?(&:defined?) && subtypes.none?(&:defined?)) ||
184
+ (key_types.empty? && subtypes.empty?)
186
185
  ''
187
186
  elsif hash_parameters?
188
187
  "{#{key_types_str} => #{subtypes_str}}"
189
188
  elsif fixed_parameters?
190
189
  "(#{subtypes_str})"
190
+ elsif name == 'Hash'
191
+ "<#{key_types_str}, #{subtypes_str}>"
191
192
  else
192
- if name == 'Hash'
193
- "<#{key_types_str}, #{subtypes_str}>"
194
- else
195
- "<#{key_types_str}#{subtypes_str}>"
196
- end
193
+ "<#{key_types_str}#{subtypes_str}>"
197
194
  end
198
195
  end
199
196
 
200
197
  # @return [::Symbol] :class or :instance
201
198
  def scope
202
199
  @scope ||= :instance if duck_type? || nil_type?
203
- @scope ||= (name == 'Class' || name == 'Module') && !subtypes.empty? ? :class : :instance
200
+ @scope ||= %w[Class Module].include?(name) && !subtypes.empty? ? :class : :instance
204
201
  end
205
202
 
206
203
  # @param other [Object]
@@ -11,10 +11,6 @@ module Solargraph
11
11
 
12
12
  attr_reader :all_params, :subtypes, :key_types
13
13
 
14
- protected def equality_fields
15
- [@name, @all_params, @subtypes, @key_types]
16
- end
17
-
18
14
  # Create a UniqueType with the specified name and an optional substring.
19
15
  # The substring is the parameter section of a parametrized type, e.g.,
20
16
  # for the type `Array<String>`, the name is `Array` and the substring is
@@ -25,11 +21,9 @@ module Solargraph
25
21
  # @param make_rooted [Boolean, nil]
26
22
  # @return [UniqueType]
27
23
  def self.parse name, substring = '', make_rooted: nil
28
- if name.start_with?(':::')
29
- raise ComplexTypeError, "Illegal prefix: #{name}"
30
- end
24
+ raise ComplexTypeError, "Illegal prefix: #{name}" if name.start_with?(':::')
31
25
  if name.start_with?('::')
32
- name = name[2..-1]
26
+ name = name[2..]
33
27
  rooted = true
34
28
  elsif !can_root_name?(name)
35
29
  rooted = true
@@ -48,13 +42,17 @@ module Solargraph
48
42
  # @sg-ignore Need to add nil check here
49
43
  parameters_type = PARAMETERS_TYPE_BY_STARTING_TAG.fetch(substring[0])
50
44
  if parameters_type == :hash
51
- raise ComplexTypeError, "Bad hash type: name=#{name}, substring=#{substring}" unless !subs.is_a?(ComplexType) and subs.length == 2 and !subs[0].is_a?(UniqueType) and !subs[1].is_a?(UniqueType)
45
+ unless !subs.is_a?(ComplexType) && (subs.length == 2) && !subs[0].is_a?(UniqueType) && !subs[1].is_a?(UniqueType)
46
+ raise ComplexTypeError,
47
+ "Bad hash type: name=#{name}, substring=#{substring}"
48
+ end
52
49
  key_types.concat(subs[0].map { |u| ComplexType.new([u]) })
53
50
  subtypes.concat(subs[1].map { |u| ComplexType.new([u]) })
54
51
  elsif parameters_type == :list && name == 'Hash'
55
52
  # Treat Hash<A, B> as Hash{A => B}
56
53
  if subs.length != 2
57
- raise ComplexTypeError, "Bad hash type: name=#{name}, substring=#{substring} - must have exactly two parameters"
54
+ raise ComplexTypeError,
55
+ "Bad hash type: name=#{name}, substring=#{substring} - must have exactly two parameters"
58
56
  end
59
57
  key_types.concat(subs[0].map { |u| ComplexType.new([u]) })
60
58
  subtypes.concat(subs[1].map { |u| ComplexType.new([u]) })
@@ -71,9 +69,9 @@ module Solargraph
71
69
  # @param subtypes [Array<ComplexType>]
72
70
  # @param rooted [Boolean]
73
71
  # @param parameters_type [Symbol, nil]
74
- def initialize(name, key_types = [], subtypes = [], rooted:, parameters_type: nil)
75
- if parameters_type.nil?
76
- raise "You must supply parameters_type if you provide parameters" unless key_types.empty? && subtypes.empty?
72
+ def initialize name, key_types = [], subtypes = [], rooted:, parameters_type: nil
73
+ if parameters_type.nil? && !(key_types.empty? && subtypes.empty?)
74
+ raise 'You must supply parameters_type if you provide parameters'
77
75
  end
78
76
  raise "Please remove leading :: and set rooted instead - #{name.inspect}" if name.start_with?('::')
79
77
  @name = name
@@ -95,7 +93,7 @@ module Solargraph
95
93
  # @todo use api_map to establish number of generics in type;
96
94
  # if only one is allowed but multiple are passed in, treat
97
95
  # those as implicit unions
98
- ['Hash', 'Array', 'Set', '_ToAry', 'Enumerable', '_Each'].include?(name) && parameters_type != :fixed
96
+ %w[Hash Array Set _ToAry Enumerable _Each].include?(name) && parameters_type != :fixed
99
97
  end
100
98
 
101
99
  def to_s
@@ -175,7 +173,7 @@ module Solargraph
175
173
  # | `false`
176
174
  return name if name.empty?
177
175
  return 'NilClass' if name == 'nil'
178
- return 'Boolean' if ['true', 'false'].include?(name)
176
+ return 'Boolean' if %w[true false].include?(name)
179
177
  return 'Symbol' if name[0] == ':'
180
178
  # @sg-ignore Need to add nil check here
181
179
  return 'String' if ['"', "'"].include?(name[0])
@@ -183,7 +181,7 @@ module Solargraph
183
181
  name
184
182
  end
185
183
 
186
- def eql?(other)
184
+ def eql? other
187
185
  self.class == other.class &&
188
186
  # @sg-ignore flow sensitive typing should support .class == .class
189
187
  @name == other.name &&
@@ -199,7 +197,7 @@ module Solargraph
199
197
  @parameters_type == other.parameters_type
200
198
  end
201
199
 
202
- def ==(other)
200
+ def == other
203
201
  eql?(other)
204
202
  end
205
203
 
@@ -231,7 +229,7 @@ module Solargraph
231
229
  # covariant
232
230
  # contravariant?: Proc - can be changed, so we can pass
233
231
  # in less specific super types
234
- if ['Hash', 'Tuple', 'Array', 'Set', 'Enumerable'].include?(name) && fixed_parameters?
232
+ if %w[Hash Tuple Array Set Enumerable].include?(name) && fixed_parameters?
235
233
  :covariant
236
234
  else
237
235
  default
@@ -244,7 +242,7 @@ module Solargraph
244
242
  end
245
243
 
246
244
  # @param other [UniqueType]
247
- def erased_version_of?(other)
245
+ def erased_version_of? other
248
246
  name == other.name && (all_params.empty? || all_params.all?(&:undefined?))
249
247
  end
250
248
 
@@ -253,8 +251,8 @@ module Solargraph
253
251
  # @param situation [:method_call, :assignment, :return_type]
254
252
  # @param rules [Array<:allow_subtype_skew, :allow_empty_params, :allow_reverse_match, :allow_any_match, :allow_undefined, :allow_unresolved_generic>]
255
253
  # @param variance [:invariant, :covariant, :contravariant]
256
- def conforms_to?(api_map, expected, situation, rules = [],
257
- variance: erased_variance(situation))
254
+ def conforms_to? api_map, expected, situation, rules = [],
255
+ variance: erased_variance(situation)
258
256
  return true if undefined? && rules.include?(:allow_undefined)
259
257
 
260
258
  # @todo teach this to validate duck types as inferred type
@@ -315,9 +313,9 @@ module Solargraph
315
313
  'nil'
316
314
  elsif name == GENERIC_TAG_NAME
317
315
  all_params.first&.name
318
- elsif ['Class', 'Module'].include?(name)
316
+ elsif %w[Class Module].include?(name)
319
317
  rbs_name
320
- elsif ['Tuple', 'Array'].include?(name) && fixed_parameters?
318
+ elsif %w[Tuple Array].include?(name) && fixed_parameters?
321
319
  # tuples don't have a name; they're just [foo, bar, baz].
322
320
  if substring == '()'
323
321
  # but there are no zero element tuples, so we go with an array
@@ -342,7 +340,7 @@ module Solargraph
342
340
 
343
341
  # @param types [Array<UniqueType, ComplexType>]
344
342
  # @return [String]
345
- def rbs_union(types)
343
+ def rbs_union types
346
344
  if types.length == 1
347
345
  types.first.to_rbs
348
346
  else
@@ -397,7 +395,8 @@ module Solargraph
397
395
  end
398
396
  if new_binding
399
397
  resolved_generic_values.transform_values! do |complex_type|
400
- complex_type.resolve_generics_from_context(generics_to_resolve, nil, resolved_generic_values: resolved_generic_values)
398
+ complex_type.resolve_generics_from_context(generics_to_resolve, nil,
399
+ resolved_generic_values: resolved_generic_values)
401
400
  end
402
401
  end
403
402
  # @sg-ignore flow sensitive typing needs to eliminate literal from union with [:bar].include?(foo)
@@ -405,8 +404,10 @@ module Solargraph
405
404
  end
406
405
 
407
406
  # @todo typechecking should complain when the method being called has no @yieldparam tag
408
- new_key_types = resolve_param_generics_from_context(generics_to_resolve, context_type, resolved_generic_values, &:key_types)
409
- new_subtypes = resolve_param_generics_from_context(generics_to_resolve, context_type, resolved_generic_values, &:subtypes)
407
+ new_key_types = resolve_param_generics_from_context(generics_to_resolve, context_type, resolved_generic_values,
408
+ &:key_types)
409
+ new_subtypes = resolve_param_generics_from_context(generics_to_resolve, context_type, resolved_generic_values,
410
+ &:subtypes)
410
411
  recreate(new_key_types: new_key_types, new_subtypes: new_subtypes)
411
412
  end
412
413
 
@@ -415,7 +416,7 @@ module Solargraph
415
416
  # @param resolved_generic_values [Hash{String => ComplexType}]
416
417
  # @yieldreturn [Array<ComplexType>]
417
418
  # @return [Array<ComplexType>]
418
- def resolve_param_generics_from_context(generics_to_resolve, context_type, resolved_generic_values)
419
+ def resolve_param_generics_from_context generics_to_resolve, context_type, resolved_generic_values
419
420
  types = yield self
420
421
  types.each_with_index.flat_map do |ct, i|
421
422
  ct.items.flat_map do |ut|
@@ -423,10 +424,12 @@ module Solargraph
423
424
  if context_params && context_params[i]
424
425
  type_arg = context_params[i]
425
426
  type_arg.map do |new_unique_context_type|
426
- ut.resolve_generics_from_context generics_to_resolve, new_unique_context_type, resolved_generic_values: resolved_generic_values
427
+ ut.resolve_generics_from_context generics_to_resolve, new_unique_context_type,
428
+ resolved_generic_values: resolved_generic_values
427
429
  end
428
430
  else
429
- ut.resolve_generics_from_context generics_to_resolve, nil, resolved_generic_values: resolved_generic_values
431
+ ut.resolve_generics_from_context generics_to_resolve, nil,
432
+ resolved_generic_values: resolved_generic_values
430
433
  end
431
434
  end
432
435
  end
@@ -448,7 +451,7 @@ module Solargraph
448
451
  idx = definitions.generics.index(generic_name)
449
452
  next t if idx.nil?
450
453
  if context_type.parameters_type == :hash
451
- if idx == 0
454
+ if idx.zero?
452
455
  next ComplexType.new(context_type.key_types)
453
456
  elsif idx == 1
454
457
  next ComplexType.new(context_type.subtypes)
@@ -456,7 +459,7 @@ module Solargraph
456
459
  next ComplexType::UNDEFINED
457
460
  end
458
461
  elsif context_type.all?(&:implicit_union?)
459
- if idx == 0 && !context_type.all_params.empty?
462
+ if idx.zero? && !context_type.all_params.empty?
460
463
  ComplexType.new(context_type.all_params)
461
464
  else
462
465
  ComplexType::UNDEFINED
@@ -482,7 +485,7 @@ module Solargraph
482
485
  # @yieldreturn [self]
483
486
  # @return [Enumerable<self>]
484
487
  def each &block
485
- [self].each &block
488
+ [self].each(&block)
486
489
  end
487
490
 
488
491
  # @return [Array<UniqueType>]
@@ -493,10 +496,10 @@ module Solargraph
493
496
  # @param new_name [String, nil]
494
497
  # @param make_rooted [Boolean, nil]
495
498
  # @param new_key_types [Array<ComplexType>, nil]
496
- # @param rooted [Boolean, nil]
499
+ # @param make_rooted [Boolean, nil]
497
500
  # @param new_subtypes [Array<ComplexType>, nil]
498
501
  # @return [self]
499
- def recreate(new_name: nil, make_rooted: nil, new_key_types: nil, new_subtypes: nil)
502
+ def recreate new_name: nil, make_rooted: nil, new_key_types: nil, new_subtypes: nil
500
503
  raise "Please remove leading :: and set rooted instead - #{new_name}" if new_name&.start_with?('::')
501
504
 
502
505
  new_name ||= name
@@ -530,8 +533,10 @@ module Solargraph
530
533
  # @yieldparam t [UniqueType]
531
534
  # @yieldreturn [self]
532
535
  # @return [self]
533
- def transform(new_name = nil, &transform_type)
534
- raise "Please remove leading :: and set rooted with recreate() instead - #{new_name}" if new_name&.start_with?('::')
536
+ def transform new_name = nil, &transform_type
537
+ if new_name&.start_with?('::')
538
+ raise "Please remove leading :: and set rooted with recreate() instead - #{new_name}"
539
+ end
535
540
  if name == ComplexType::GENERIC_TAG_NAME
536
541
  # doesn't make sense to manipulate the name of the generic
537
542
  new_key_types = @key_types
@@ -540,14 +545,15 @@ module Solargraph
540
545
  new_key_types = @key_types.flat_map { |ct| ct.items.map { |ut| ut.transform(&transform_type) } }
541
546
  new_subtypes = @subtypes.flat_map { |ct| ct.items.map { |ut| ut.transform(&transform_type) } }
542
547
  end
543
- new_type = recreate(new_name: new_name || name, new_key_types: new_key_types, new_subtypes: new_subtypes, make_rooted: @rooted)
548
+ new_type = recreate(new_name: new_name || name, new_key_types: new_key_types, new_subtypes: new_subtypes,
549
+ make_rooted: @rooted)
544
550
  yield new_type
545
551
  end
546
552
 
547
553
  # Generate a ComplexType that fully qualifies this type's namespaces.
548
554
  #
549
555
  # @param api_map [ApiMap] The ApiMap that performs qualification
550
- # @param context [String] The namespace from which to resolve names
556
+ # @param gates [Array<String>] The namespaces from which to resolve names
551
557
  # @return [self, ComplexType, UniqueType] The generated ComplexType
552
558
  def qualify api_map, *gates
553
559
  transform do |t|
@@ -585,7 +591,7 @@ module Solargraph
585
591
  # @return [ComplexType]
586
592
  def reduce_class_type
587
593
  new_items = items.flat_map do |type|
588
- next type unless ['Module', 'Class'].include?(type.name)
594
+ next type unless %w[Module Class].include?(type.name)
589
595
  next type if type.all_params.empty?
590
596
 
591
597
  type.all_params
@@ -603,12 +609,12 @@ module Solargraph
603
609
  end
604
610
 
605
611
  # @param name_to_check [String]
606
- def can_root_name?(name_to_check = name)
612
+ def can_root_name? name_to_check = name
607
613
  self.class.can_root_name?(name_to_check)
608
614
  end
609
615
 
610
616
  # @param name [String]
611
- def self.can_root_name?(name)
617
+ def self.can_root_name? name
612
618
  # name is not lowercase
613
619
  !name.empty? && name != name.downcase
614
620
  end
@@ -625,8 +631,13 @@ module Solargraph
625
631
  '::NilClass' => UniqueType::NIL
626
632
  }.freeze
627
633
 
628
-
629
634
  include Logging
635
+
636
+ protected
637
+
638
+ def equality_fields
639
+ [@name, @all_params, @subtypes, @key_types]
640
+ end
630
641
  end
631
642
  end
632
643
  end