solargraph 0.59.0.dev.1 → 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 (175) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/linting.yml +3 -1
  3. data/.github/workflows/plugins.yml +12 -3
  4. data/.github/workflows/rspec.yml +9 -54
  5. data/.github/workflows/typecheck.yml +2 -1
  6. data/.gitignore +1 -0
  7. data/.rubocop.yml +38 -6
  8. data/.rubocop_todo.yml +40 -931
  9. data/CHANGELOG.md +22 -1
  10. data/Gemfile +3 -1
  11. data/Rakefile +25 -23
  12. data/bin/solargraph +2 -1
  13. data/lib/solargraph/api_map/constants.rb +0 -1
  14. data/lib/solargraph/api_map/index.rb +11 -11
  15. data/lib/solargraph/api_map/source_to_yard.rb +9 -8
  16. data/lib/solargraph/api_map/store.rb +28 -20
  17. data/lib/solargraph/api_map.rb +70 -41
  18. data/lib/solargraph/bench.rb +44 -45
  19. data/lib/solargraph/complex_type/type_methods.rb +14 -16
  20. data/lib/solargraph/complex_type/unique_type.rb +56 -47
  21. data/lib/solargraph/complex_type.rb +70 -62
  22. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  23. data/lib/solargraph/convention/data_definition/data_definition_node.rb +4 -4
  24. data/lib/solargraph/convention/data_definition.rb +1 -1
  25. data/lib/solargraph/convention/gemfile.rb +15 -15
  26. data/lib/solargraph/convention/gemspec.rb +23 -23
  27. data/lib/solargraph/convention/rakefile.rb +17 -17
  28. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -1
  29. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +3 -3
  30. data/lib/solargraph/convention/struct_definition.rb +3 -3
  31. data/lib/solargraph/convention.rb +78 -78
  32. data/lib/solargraph/converters/dd.rb +19 -17
  33. data/lib/solargraph/converters/dl.rb +17 -15
  34. data/lib/solargraph/converters/dt.rb +17 -15
  35. data/lib/solargraph/converters/misc.rb +3 -1
  36. data/lib/solargraph/diagnostics/rubocop.rb +10 -10
  37. data/lib/solargraph/diagnostics/rubocop_helpers.rb +3 -3
  38. data/lib/solargraph/diagnostics/type_check.rb +10 -10
  39. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  40. data/lib/solargraph/doc_map.rb +370 -132
  41. data/lib/solargraph/equality.rb +3 -3
  42. data/lib/solargraph/gem_pins.rb +19 -18
  43. data/lib/solargraph/language_server/error_codes.rb +20 -20
  44. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  45. data/lib/solargraph/language_server/host/dispatch.rb +2 -3
  46. data/lib/solargraph/language_server/host/message_worker.rb +2 -2
  47. data/lib/solargraph/language_server/host/sources.rb +1 -1
  48. data/lib/solargraph/language_server/host.rb +24 -21
  49. data/lib/solargraph/language_server/message/base.rb +97 -97
  50. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  51. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  52. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +10 -11
  53. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  54. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  55. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  56. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  57. data/lib/solargraph/language_server/message/text_document/completion.rb +8 -8
  58. data/lib/solargraph/language_server/message/text_document/definition.rb +41 -34
  59. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  60. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -21
  61. data/lib/solargraph/language_server/message/text_document/formatting.rb +6 -6
  62. data/lib/solargraph/language_server/message/text_document/hover.rb +3 -5
  63. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  64. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  65. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  66. data/lib/solargraph/language_server/message/text_document/signature_help.rb +2 -2
  67. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -19
  68. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  69. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  70. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  71. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -19
  72. data/lib/solargraph/language_server/message.rb +94 -94
  73. data/lib/solargraph/language_server/request.rb +29 -27
  74. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  75. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  76. data/lib/solargraph/library.rb +68 -95
  77. data/lib/solargraph/location.rb +10 -12
  78. data/lib/solargraph/logging.rb +4 -6
  79. data/lib/solargraph/page.rb +92 -92
  80. data/lib/solargraph/parser/comment_ripper.rb +12 -4
  81. data/lib/solargraph/parser/flow_sensitive_typing.rb +32 -44
  82. data/lib/solargraph/parser/node_processor/base.rb +4 -4
  83. data/lib/solargraph/parser/node_processor.rb +1 -1
  84. data/lib/solargraph/parser/parser_gem/class_methods.rb +4 -6
  85. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  86. data/lib/solargraph/parser/parser_gem/node_chainer.rb +20 -20
  87. data/lib/solargraph/parser/parser_gem/node_methods.rb +66 -65
  88. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +12 -12
  89. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +1 -2
  90. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +3 -3
  91. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  92. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +3 -3
  93. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +2 -1
  94. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +1 -1
  95. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +3 -5
  96. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +118 -112
  97. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  98. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +1 -1
  99. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +1 -1
  100. data/lib/solargraph/parser/parser_gem.rb +14 -12
  101. data/lib/solargraph/parser/snippet.rb +2 -0
  102. data/lib/solargraph/parser.rb +25 -23
  103. data/lib/solargraph/pin/base.rb +76 -64
  104. data/lib/solargraph/pin/base_variable.rb +28 -71
  105. data/lib/solargraph/pin/block.rb +3 -2
  106. data/lib/solargraph/pin/breakable.rb +2 -0
  107. data/lib/solargraph/pin/callable.rb +23 -26
  108. data/lib/solargraph/pin/closure.rb +5 -4
  109. data/lib/solargraph/pin/common.rb +5 -2
  110. data/lib/solargraph/pin/compound_statement.rb +3 -3
  111. data/lib/solargraph/pin/constant.rb +43 -45
  112. data/lib/solargraph/pin/conversions.rb +9 -4
  113. data/lib/solargraph/pin/delegated_method.rb +4 -4
  114. data/lib/solargraph/pin/documenting.rb +3 -2
  115. data/lib/solargraph/pin/local_variable.rb +4 -4
  116. data/lib/solargraph/pin/method.rb +74 -70
  117. data/lib/solargraph/pin/namespace.rb +13 -12
  118. data/lib/solargraph/pin/parameter.rb +28 -27
  119. data/lib/solargraph/pin/proxy_type.rb +2 -0
  120. data/lib/solargraph/pin/reference/type_alias.rb +16 -0
  121. data/lib/solargraph/pin/reference.rb +18 -0
  122. data/lib/solargraph/pin/search.rb +2 -2
  123. data/lib/solargraph/pin/signature.rb +9 -14
  124. data/lib/solargraph/pin/symbol.rb +1 -0
  125. data/lib/solargraph/pin/until.rb +1 -3
  126. data/lib/solargraph/pin/while.rb +1 -3
  127. data/lib/solargraph/pin_cache.rb +71 -488
  128. data/lib/solargraph/position.rb +38 -17
  129. data/lib/solargraph/range.rb +10 -9
  130. data/lib/solargraph/rbs_map/conversions.rb +327 -221
  131. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  132. data/lib/solargraph/rbs_map/stdlib_map.rb +0 -1
  133. data/lib/solargraph/rbs_map.rb +5 -15
  134. data/lib/solargraph/server_methods.rb +16 -16
  135. data/lib/solargraph/shell.rb +224 -66
  136. data/lib/solargraph/source/chain/array.rb +39 -37
  137. data/lib/solargraph/source/chain/call.rb +49 -44
  138. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  139. data/lib/solargraph/source/chain/constant.rb +3 -1
  140. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  141. data/lib/solargraph/source/chain/hash.rb +8 -6
  142. data/lib/solargraph/source/chain/if.rb +11 -10
  143. data/lib/solargraph/source/chain/instance_variable.rb +3 -1
  144. data/lib/solargraph/source/chain/link.rb +99 -109
  145. data/lib/solargraph/source/chain/literal.rb +4 -6
  146. data/lib/solargraph/source/chain/or.rb +2 -4
  147. data/lib/solargraph/source/chain/q_call.rb +13 -11
  148. data/lib/solargraph/source/chain/variable.rb +15 -13
  149. data/lib/solargraph/source/chain/z_super.rb +28 -30
  150. data/lib/solargraph/source/chain.rb +26 -16
  151. data/lib/solargraph/source/change.rb +3 -3
  152. data/lib/solargraph/source/cursor.rb +18 -18
  153. data/lib/solargraph/source/encoding_fixes.rb +6 -7
  154. data/lib/solargraph/source/source_chainer.rb +46 -32
  155. data/lib/solargraph/source/updater.rb +1 -1
  156. data/lib/solargraph/source.rb +27 -29
  157. data/lib/solargraph/source_map/clip.rb +38 -30
  158. data/lib/solargraph/source_map/mapper.rb +51 -47
  159. data/lib/solargraph/source_map.rb +8 -4
  160. data/lib/solargraph/type_checker/rules.rb +8 -8
  161. data/lib/solargraph/type_checker.rb +95 -102
  162. data/lib/solargraph/version.rb +1 -1
  163. data/lib/solargraph/workspace/config.rb +11 -10
  164. data/lib/solargraph/workspace/gemspecs.rb +3 -3
  165. data/lib/solargraph/workspace.rb +45 -165
  166. data/lib/solargraph/yard_map/helpers.rb +6 -2
  167. data/lib/solargraph/yard_map/mapper/to_method.rb +8 -6
  168. data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -1
  169. data/lib/solargraph/yard_map/mapper.rb +12 -12
  170. data/lib/solargraph/yard_map.rb +17 -18
  171. data/lib/solargraph/yard_tags.rb +20 -20
  172. data/lib/solargraph/yardoc.rb +26 -33
  173. data/lib/solargraph.rb +7 -5
  174. data/solargraph.gemspec +36 -35
  175. metadata +33 -38
@@ -51,15 +51,15 @@ module Solargraph
51
51
  #
52
52
 
53
53
  # @param other [Object]
54
- def eql?(other)
54
+ def eql? other
55
55
  self.class == other.class &&
56
56
  # @sg-ignore flow sensitive typing needs to handle self.class == other.class
57
57
  equality_fields == other.equality_fields
58
58
  end
59
59
 
60
60
  # @param other [Object]
61
- def ==(other)
62
- self.eql?(other)
61
+ def == other
62
+ eql?(other)
63
63
  end
64
64
 
65
65
  # @return [Integer]
@@ -115,8 +115,9 @@ module Solargraph
115
115
  end
116
116
  unresolved_requires = (bench.external_requires + conventions_environ.requires + bench.workspace.config.required).to_a.compact.uniq
117
117
  recreate_docmap = @unresolved_requires != unresolved_requires ||
118
+ # @sg-ignore Unresolved call to rbs_collection_path on Solargraph::Workspace, nil
118
119
  workspace.rbs_collection_path != bench.workspace.rbs_collection_path ||
119
- @doc_map.any_uncached?
120
+ @doc_map.uncached_gemspecs.any?
120
121
 
121
122
  if recreate_docmap
122
123
  @doc_map = DocMap.new(unresolved_requires, bench.workspace, out: nil) # @todo Implement gem preferences
@@ -127,13 +128,6 @@ module Solargraph
127
128
  self
128
129
  end
129
130
 
130
- # @todo need to model type def statement in chains as a symbol so
131
- # that this overload of 'protected' will typecheck @sg-ignore
132
- # @sg-ignore
133
- protected def equality_fields
134
- [self.class, @source_map_hash, conventions_environ, @doc_map, @unresolved_requires, @missing_docs, @loose_unions]
135
- end
136
-
137
131
  # @return [DocMap]
138
132
  def doc_map
139
133
  @doc_map ||= DocMap.new([], Workspace.new('.'))
@@ -144,6 +138,16 @@ module Solargraph
144
138
  doc_map.uncached_gemspecs || []
145
139
  end
146
140
 
141
+ # @return [::Array<Gem::Specification>]
142
+ def uncached_rbs_collection_gemspecs
143
+ @doc_map.uncached_rbs_collection_gemspecs
144
+ end
145
+
146
+ # @return [::Array<Gem::Specification>]
147
+ def uncached_yard_gemspecs
148
+ @doc_map.uncached_yard_gemspecs
149
+ end
150
+
147
151
  # @return [Enumerable<Pin::Base>]
148
152
  def core_pins
149
153
  @@core_map.pins
@@ -205,14 +209,14 @@ module Solargraph
205
209
  # @param rebuild [Boolean] whether to rebuild the pins even if they are cached
206
210
  # @return [void]
207
211
  def cache_all_for_doc_map! out: $stderr, rebuild: false
208
- doc_map.cache_doc_map_gems!(out, rebuild: rebuild)
212
+ doc_map.cache_all!(out, rebuild: rebuild)
209
213
  end
210
214
 
211
215
  # @param gemspec [Gem::Specification]
212
216
  # @param rebuild [Boolean]
213
217
  # @param out [StringIO, IO, nil]
214
218
  # @return [void]
215
- def cache_gem(gemspec, rebuild: false, out: nil)
219
+ def cache_gem gemspec, rebuild: false, out: nil
216
220
  doc_map.cache(gemspec, rebuild: rebuild, out: out)
217
221
  end
218
222
 
@@ -252,6 +256,12 @@ module Solargraph
252
256
  store.pins_by_class(Pin::Keyword)
253
257
  end
254
258
 
259
+ # @param name [String]
260
+ # @return [ComplexType, nil]
261
+ def unalias name
262
+ store.unalias(name)
263
+ end
264
+
255
265
  # True if the namespace exists.
256
266
  #
257
267
  # @param name [String] The namespace to match
@@ -317,19 +327,19 @@ module Solargraph
317
327
  #
318
328
  # @param pin [Pin::Reference]
319
329
  # @return [String, nil]
320
- def dereference(pin)
330
+ def dereference pin
321
331
  store.constants.dereference(pin)
322
332
  end
323
333
 
324
334
  # @param fqns [String]
325
335
  # @return [Array<Pin::Reference::Extend>]
326
- def get_extends(fqns)
336
+ def get_extends fqns
327
337
  store.get_extends(fqns)
328
338
  end
329
339
 
330
340
  # @param fqns [String]
331
341
  # @return [Array<Pin::Reference::Include>]
332
- def get_includes(fqns)
342
+ def get_includes fqns
333
343
  store.get_includes(fqns)
334
344
  end
335
345
 
@@ -341,7 +351,7 @@ module Solargraph
341
351
  # @return [Array<Solargraph::Pin::InstanceVariable>]
342
352
  def get_instance_variable_pins namespace, scope = :instance
343
353
  result = []
344
- used = [namespace]
354
+ [namespace]
345
355
  result.concat store.get_instance_variables(namespace, scope)
346
356
  sc_fqns = namespace
347
357
  while (sc = store.get_superclass(sc_fqns))
@@ -364,12 +374,12 @@ module Solargraph
364
374
  # @param location [Location]
365
375
  #
366
376
  # @return [Pin::BaseVariable, nil]
367
- def var_at_location(candidates, name, closure, location)
368
- with_correct_name = candidates.select { |pin| pin.name == name}
377
+ def var_at_location candidates, name, closure, location
378
+ with_correct_name = candidates.select { |pin| pin.name == name }
369
379
  vars_at_location = with_correct_name.reject do |pin|
370
380
  # visible_at? excludes the starting position, but we want to
371
381
  # include it for this purpose
372
- (!pin.visible_at?(closure, location) && !pin.starts_at?(location))
382
+ !pin.visible_at?(closure, location) && !pin.starts_at?(location)
373
383
  end
374
384
 
375
385
  vars_at_location.inject(&:combine_with)
@@ -446,7 +456,7 @@ module Solargraph
446
456
  comments: init_pin.comments,
447
457
  closure: init_pin.closure,
448
458
  source: init_pin.source,
449
- type_location: init_pin.type_location,
459
+ type_location: init_pin.type_location
450
460
  )
451
461
  new_pin.parameters = init_pin.parameters.map do |init_param|
452
462
  param = init_param.clone
@@ -505,7 +515,7 @@ module Solargraph
505
515
  result = Set.new
506
516
  complex_type.each do |type|
507
517
  if type.duck_type?
508
- result.add Pin::DuckMethod.new(name: type.to_s[1..-1], source: :api_map)
518
+ result.add Pin::DuckMethod.new(name: type.to_s[1..], source: :api_map)
509
519
  result.merge get_methods('Object')
510
520
  else
511
521
  unless type.nil? || type.name == 'void'
@@ -536,7 +546,8 @@ module Solargraph
536
546
  # @param preserve_generics [Boolean] True to preserve any
537
547
  # unresolved generic parameters, false to erase them
538
548
  # @return [Array<Solargraph::Pin::Method>]
539
- def get_method_stack rooted_tag, name, scope: :instance, visibility: [:private, :protected, :public], preserve_generics: false
549
+ def get_method_stack rooted_tag, name, scope: :instance, visibility: %i[private protected public],
550
+ preserve_generics: false
540
551
  rooted_type = ComplexType.parse(rooted_tag)
541
552
  fqns = rooted_type.namespace
542
553
  namespace_pin = store.get_path_pins(fqns).first
@@ -619,7 +630,6 @@ module Solargraph
619
630
  # @param cursor [Source::Cursor]
620
631
  # @return [SourceMap::Clip]
621
632
  def clip cursor
622
- # @sg-ignore Need to add nil check here
623
633
  raise FileNotFoundError, "ApiMap did not catalog #{cursor.filename}" unless source_map_hash.key?(cursor.filename)
624
634
 
625
635
  SourceMap::Clip.new(self, cursor)
@@ -661,7 +671,7 @@ module Solargraph
661
671
  # @param sup [String] The superclass
662
672
  # @param sub [String] The subclass
663
673
  # @return [Boolean]
664
- def super_and_sub?(sup, sub)
674
+ def super_and_sub? sup, sub
665
675
  sup = ComplexType.try_parse(sup)
666
676
  sub = ComplexType.try_parse(sub)
667
677
  # @todo If two literals are different values of the same type, it would
@@ -693,14 +703,14 @@ module Solargraph
693
703
  # @param module_ns [String] The module namespace (no type parameters)
694
704
  #
695
705
  # @return [Boolean]
696
- def type_include?(host_ns, module_ns)
706
+ def type_include? host_ns, module_ns
697
707
  store.get_includes(host_ns).map { |inc_tag| inc_tag.type.name }.include?(module_ns)
698
708
  end
699
709
 
700
710
  # @param pins [Enumerable<Pin::Base>]
701
711
  # @param visibility [Enumerable<Symbol>]
702
712
  # @return [Array<Pin::Base>]
703
- def resolve_method_aliases pins, visibility = [:public, :private, :protected]
713
+ def resolve_method_aliases pins, visibility = %i[public private protected]
704
714
  with_resolved_aliases = pins.map do |pin|
705
715
  next pin unless pin.is_a?(Pin::MethodAlias)
706
716
  resolved = resolve_method_alias(pin)
@@ -714,7 +724,7 @@ module Solargraph
714
724
  GemPins.combine_method_pins_by_path(with_resolved_aliases)
715
725
  end
716
726
 
717
- # @return [Workspace]
727
+ # @return [Workspace, nil]
718
728
  def workspace
719
729
  doc_map.workspace
720
730
  end
@@ -730,7 +740,7 @@ module Solargraph
730
740
  # @param skip [Set<String>]
731
741
  # @param no_core [Boolean] Skip core classes if true
732
742
  # @return [Array<Pin::Base>]
733
- def inner_get_methods_from_reference(fq_reference_tag, namespace_pin, type, scope, visibility, deep, skip, no_core)
743
+ def inner_get_methods_from_reference fq_reference_tag, namespace_pin, type, scope, visibility, deep, skip, no_core
734
744
  logger.debug { "ApiMap#add_methods_from_reference(type=#{type}) starting" }
735
745
 
736
746
  # Ensure the types returned by the methods in the referenced
@@ -786,7 +796,7 @@ module Solargraph
786
796
  def inner_get_methods rooted_tag, scope, visibility, deep, skip, no_core = false
787
797
  rooted_type = ComplexType.parse(rooted_tag).force_rooted
788
798
  fqns = rooted_type.namespace
789
- fqns_generic_params = rooted_type.all_params
799
+ rooted_type.all_params
790
800
  namespace_pin = store.get_path_pins(fqns).select { |p| p.is_a?(Pin::Namespace) }.first
791
801
  return [] if no_core && fqns =~ /^(Object|BasicObject|Class|Module)$/
792
802
  reqstr = "#{fqns}|#{scope}|#{visibility.sort}|#{deep}"
@@ -797,7 +807,9 @@ module Solargraph
797
807
  # ensure we start out with any immediate methods in this
798
808
  # namespace so we roughly match the same ordering of get_methods
799
809
  # and obey the 'deep' instruction
800
- direct_convention_methods, convention_methods_by_reference = environ.pins.partition { |p| p.namespace == rooted_tag }
810
+ direct_convention_methods, convention_methods_by_reference = environ.pins.partition do |p|
811
+ p.namespace == rooted_tag
812
+ end
801
813
  result.concat direct_convention_methods
802
814
 
803
815
  if deep && scope == :instance
@@ -809,8 +821,10 @@ module Solargraph
809
821
  # Store#get_methods doesn't know about full tags, just
810
822
  # namespaces; resolving the generics in the method pins is this
811
823
  # class' responsibility
812
- methods = store.get_methods(fqns, scope: scope, visibility: visibility).sort{ |a, b| a.name <=> b.name }
813
- logger.info { "ApiMap#inner_get_methods(rooted_tag=#{rooted_tag.inspect}, scope=#{scope.inspect}, visibility=#{visibility.inspect}, deep=#{deep.inspect}, skip=#{skip.inspect}, fqns=#{fqns}) - added from store: #{methods}" }
824
+ methods = store.get_methods(fqns, scope: scope, visibility: visibility).sort { |a, b| a.name <=> b.name }
825
+ logger.info do
826
+ "ApiMap#inner_get_methods(rooted_tag=#{rooted_tag.inspect}, scope=#{scope.inspect}, visibility=#{visibility.inspect}, deep=#{deep.inspect}, skip=#{skip.inspect}, fqns=#{fqns}) - added from store: #{methods}"
827
+ end
814
828
  result.concat methods
815
829
  if deep
816
830
  result.concat convention_methods_by_reference
@@ -819,7 +833,8 @@ module Solargraph
819
833
  store.get_includes(fqns).reverse.each do |ref|
820
834
  in_tag = dereference(ref)
821
835
  # @sg-ignore Need to add nil check here
822
- result.concat inner_get_methods_from_reference(in_tag, namespace_pin, rooted_type, scope, visibility, deep, skip, true)
836
+ result.concat inner_get_methods_from_reference(in_tag, namespace_pin, rooted_type, scope, visibility, deep,
837
+ skip, true)
823
838
  end
824
839
  rooted_sc_tag = qualify_superclass(rooted_tag)
825
840
  unless rooted_sc_tag.nil?
@@ -827,7 +842,9 @@ module Solargraph
827
842
  visibility, true, skip, no_core)
828
843
  end
829
844
  else
830
- logger.info { "ApiMap#inner_get_methods(#{fqns}, #{scope}, #{visibility}, #{deep}, #{skip}) - looking for get_extends() from #{fqns}" }
845
+ logger.info do
846
+ "ApiMap#inner_get_methods(#{fqns}, #{scope}, #{visibility}, #{deep}, #{skip}) - looking for get_extends() from #{fqns}"
847
+ end
831
848
  store.get_extends(fqns).reverse.each do |em|
832
849
  fqem = dereference(em)
833
850
  result.concat inner_get_methods(fqem, :instance, visibility, deep, skip, true) unless fqem.nil?
@@ -863,7 +880,7 @@ module Solargraph
863
880
  def get_namespace_type fqns
864
881
  return nil if fqns.nil?
865
882
  # @type [Pin::Namespace, nil]
866
- pin = store.get_path_pins(fqns).select{|p| p.is_a?(Pin::Namespace)}.first
883
+ pin = store.get_path_pins(fqns).select { |p| p.is_a?(Pin::Namespace) }.first
867
884
  return nil if pin.nil?
868
885
  pin.type
869
886
  end
@@ -889,7 +906,7 @@ module Solargraph
889
906
 
890
907
  # @param alias_pin [Pin::MethodAlias]
891
908
  # @return [Pin::Method, nil]
892
- def resolve_method_alias(alias_pin)
909
+ def resolve_method_alias alias_pin
893
910
  ancestors = store.get_ancestors(alias_pin.full_context.reduce_class_type.tag)
894
911
  # @type [Pin::Method, nil]
895
912
  original = nil
@@ -920,7 +937,9 @@ module Solargraph
920
937
  end
921
938
  if original.nil?
922
939
  # :nocov:
923
- Solargraph.assert_or_log(:alias_target_missing) { "Rejecting alias - target is missing while looking for #{alias_pin.full_context.tag} #{alias_pin.original} in #{alias_pin.scope} scope = #{alias_pin.inspect}" }
940
+ Solargraph.assert_or_log(:alias_target_missing) do
941
+ "Rejecting alias - target is missing while looking for #{alias_pin.full_context.tag} #{alias_pin.original} in #{alias_pin.scope} scope = #{alias_pin.inspect}"
942
+ end
924
943
  return nil
925
944
  # :nocov:
926
945
  end
@@ -933,7 +952,7 @@ module Solargraph
933
952
  # @param alias_pin [Pin::MethodAlias] The alias pin to resolve
934
953
  # @param original [Pin::Method] The original method pin that was already found
935
954
  # @return [Pin::Method] The resolved method pin
936
- def create_resolved_alias_pin(alias_pin, original)
955
+ def create_resolved_alias_pin alias_pin, original
937
956
  # Build the resolved method pin directly (same logic as resolve_method_alias but without lookup)
938
957
  args = {
939
958
  location: alias_pin.location,
@@ -949,7 +968,7 @@ module Solargraph
949
968
  return_type: original.return_type,
950
969
  source: :resolve_method_alias
951
970
  }
952
- resolved_pin = Pin::Method.new **args
971
+ resolved_pin = Pin::Method.new(**args)
953
972
 
954
973
  # Clone signatures and parameters
955
974
  resolved_pin.signatures.each do |sig|
@@ -987,7 +1006,7 @@ module Solargraph
987
1006
  end
988
1007
 
989
1008
  # @param namespace_pin [Pin::Namespace, Pin::Constant]
990
- def has_generics?(namespace_pin)
1009
+ def has_generics? namespace_pin
991
1010
  namespace_pin.is_a?(Pin::Namespace) && !namespace_pin.generics.empty?
992
1011
  end
993
1012
 
@@ -996,5 +1015,15 @@ module Solargraph
996
1015
  def can_resolve_generics? namespace_pin, rooted_type
997
1016
  has_generics?(namespace_pin) && !rooted_type.all_params.empty?
998
1017
  end
1018
+
1019
+ protected
1020
+
1021
+ # @todo need to model type def statement in chains as a symbol so
1022
+ # that this overload of 'protected' will typecheck @sg-ignore
1023
+ # @sg-ignore
1024
+ def equality_fields
1025
+ [self.class, @source_map_hash, conventions_environ, @doc_map, @unresolved_requires, @missing_docs,
1026
+ @loose_unions]
1027
+ end
999
1028
  end
1000
1029
  end
@@ -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
@@ -43,8 +43,9 @@ module Solargraph
43
43
  @rooted_tag ||= rooted_name + rooted_substring
44
44
  end
45
45
 
46
+ # Whether this is an RBS interface like _ToAry or Hash::_Key.
46
47
  def interface?
47
- name.start_with?('_')
48
+ name.start_with?('_') || name.include?('::_')
48
49
  end
49
50
 
50
51
  # @return [Boolean]
@@ -54,11 +55,11 @@ module Solargraph
54
55
 
55
56
  # @return [Boolean]
56
57
  def nil_type?
57
- @nil_type ||= (name.casecmp('nil') == 0)
58
+ @nil_type ||= name.casecmp('nil').zero?
58
59
  end
59
60
 
60
61
  def tuple?
61
- @tuple_type ||= (name == 'Tuple') || (name == 'Array' && subtypes.length >= 1 && fixed_parameters?)
62
+ @tuple ||= (name == 'Tuple') || (name == 'Array' && subtypes.length >= 1 && fixed_parameters?)
62
63
  end
63
64
 
64
65
  def void?
@@ -87,7 +88,7 @@ module Solargraph
87
88
 
88
89
  # @param generics_to_erase [Enumerable<String>]
89
90
  # @return [self]
90
- def erase_generics(generics_to_erase)
91
+ def erase_generics generics_to_erase
91
92
  transform do |type|
92
93
  if type.name == ComplexType::GENERIC_TAG_NAME
93
94
  if type.all_params.length == 1 && generics_to_erase.include?(type.all_params.first.to_s)
@@ -142,7 +143,7 @@ module Solargraph
142
143
  @namespace ||= lambda do
143
144
  return 'Object' if duck_type?
144
145
  return 'NilClass' if nil_type?
145
- return (name == 'Class' || name == 'Module') && !subtypes.empty? ? subtypes.first.name : name
146
+ %w[Class Module].include?(name) && !subtypes.empty? ? subtypes.first.name : name
146
147
  end.call
147
148
  end
148
149
 
@@ -150,7 +151,7 @@ module Solargraph
150
151
  def namespace_type
151
152
  return ComplexType.parse('::Object') if duck_type?
152
153
  return ComplexType.parse('::NilClass') if nil_type?
153
- return subtypes.first if (name == 'Class' || name == 'Module') && !subtypes.empty?
154
+ return subtypes.first if %w[Class Module].include?(name) && !subtypes.empty?
154
155
  self
155
156
  end
156
157
 
@@ -177,30 +178,27 @@ module Solargraph
177
178
  end
178
179
 
179
180
  # @return [String]
180
- def generate_substring_from(&to_str)
181
+ def generate_substring_from &to_str
181
182
  key_types_str = key_types.map(&to_str).join(', ')
182
183
  subtypes_str = subtypes.map(&to_str).join(', ')
183
- if key_types.none?(&:defined?) && subtypes.none?(&:defined?)
184
- ''
185
- elsif key_types.empty? && subtypes.empty?
184
+ if (key_types.none?(&:defined?) && subtypes.none?(&:defined?)) ||
185
+ (key_types.empty? && subtypes.empty?)
186
186
  ''
187
187
  elsif hash_parameters?
188
188
  "{#{key_types_str} => #{subtypes_str}}"
189
189
  elsif fixed_parameters?
190
190
  "(#{subtypes_str})"
191
+ elsif name == 'Hash'
192
+ "<#{key_types_str}, #{subtypes_str}>"
191
193
  else
192
- if name == 'Hash'
193
- "<#{key_types_str}, #{subtypes_str}>"
194
- else
195
- "<#{key_types_str}#{subtypes_str}>"
196
- end
194
+ "<#{key_types_str}#{subtypes_str}>"
197
195
  end
198
196
  end
199
197
 
200
198
  # @return [::Symbol] :class or :instance
201
199
  def scope
202
200
  @scope ||= :instance if duck_type? || nil_type?
203
- @scope ||= (name == 'Class' || name == 'Module') && !subtypes.empty? ? :class : :instance
201
+ @scope ||= %w[Class Module].include?(name) && !subtypes.empty? ? :class : :instance
204
202
  end
205
203
 
206
204
  # @param other [Object]