solargraph 0.54.0 → 0.58.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 (200) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/linting.yml +127 -0
  3. data/.github/workflows/plugins.yml +184 -6
  4. data/.github/workflows/rspec.yml +55 -5
  5. data/.github/workflows/typecheck.yml +8 -3
  6. data/.gitignore +7 -0
  7. data/.overcommit.yml +72 -0
  8. data/.rspec +1 -0
  9. data/.rubocop.yml +66 -0
  10. data/.rubocop_todo.yml +1279 -0
  11. data/.yardopts +1 -0
  12. data/CHANGELOG.md +171 -0
  13. data/README.md +20 -6
  14. data/Rakefile +125 -13
  15. data/bin/solargraph +8 -5
  16. data/lib/solargraph/api_map/cache.rb +13 -3
  17. data/lib/solargraph/api_map/constants.rb +279 -0
  18. data/lib/solargraph/api_map/index.rb +193 -0
  19. data/lib/solargraph/api_map/source_to_yard.rb +13 -4
  20. data/lib/solargraph/api_map/store.rb +207 -132
  21. data/lib/solargraph/api_map.rb +394 -261
  22. data/lib/solargraph/bench.rb +18 -1
  23. data/lib/solargraph/complex_type/type_methods.rb +29 -12
  24. data/lib/solargraph/complex_type/unique_type.rb +205 -26
  25. data/lib/solargraph/complex_type.rb +126 -26
  26. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  27. data/lib/solargraph/convention/base.rb +20 -3
  28. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
  29. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
  30. data/lib/solargraph/convention/data_definition.rb +105 -0
  31. data/lib/solargraph/convention/gemspec.rb +3 -2
  32. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
  33. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
  34. data/lib/solargraph/convention/struct_definition.rb +164 -0
  35. data/lib/solargraph/convention.rb +36 -4
  36. data/lib/solargraph/diagnostics/rubocop.rb +6 -1
  37. data/lib/solargraph/diagnostics/rubocop_helpers.rb +5 -3
  38. data/lib/solargraph/doc_map.rb +316 -64
  39. data/lib/solargraph/environ.rb +9 -2
  40. data/lib/solargraph/equality.rb +34 -0
  41. data/lib/solargraph/gem_pins.rb +64 -38
  42. data/lib/solargraph/language_server/host/dispatch.rb +2 -0
  43. data/lib/solargraph/language_server/host/message_worker.rb +54 -5
  44. data/lib/solargraph/language_server/host.rb +36 -18
  45. data/lib/solargraph/language_server/message/base.rb +20 -12
  46. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +2 -0
  47. data/lib/solargraph/language_server/message/extended/document.rb +5 -2
  48. data/lib/solargraph/language_server/message/extended/document_gems.rb +3 -3
  49. data/lib/solargraph/language_server/message/initialize.rb +3 -1
  50. data/lib/solargraph/language_server/message/text_document/completion.rb +0 -3
  51. data/lib/solargraph/language_server/message/text_document/definition.rb +5 -3
  52. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +3 -3
  53. data/lib/solargraph/language_server/message/text_document/formatting.rb +23 -2
  54. data/lib/solargraph/language_server/message/text_document/hover.rb +1 -1
  55. data/lib/solargraph/language_server/message/text_document/type_definition.rb +4 -3
  56. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
  57. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -2
  58. data/lib/solargraph/language_server/progress.rb +27 -2
  59. data/lib/solargraph/language_server/request.rb +4 -1
  60. data/lib/solargraph/library.rb +83 -73
  61. data/lib/solargraph/location.rb +45 -1
  62. data/lib/solargraph/logging.rb +12 -2
  63. data/lib/solargraph/page.rb +3 -0
  64. data/lib/solargraph/parser/comment_ripper.rb +20 -7
  65. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
  66. data/lib/solargraph/parser/node_processor/base.rb +10 -5
  67. data/lib/solargraph/parser/node_processor.rb +26 -8
  68. data/lib/solargraph/parser/parser_gem/class_methods.rb +10 -18
  69. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
  70. data/lib/solargraph/parser/parser_gem/node_chainer.rb +13 -11
  71. data/lib/solargraph/parser/parser_gem/node_methods.rb +10 -19
  72. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
  73. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
  74. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +26 -20
  75. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +7 -4
  76. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
  77. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
  78. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +6 -3
  79. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +2 -1
  80. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
  81. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
  82. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +4 -2
  83. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +2 -1
  84. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +14 -2
  85. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
  86. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
  87. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -0
  88. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +3 -1
  89. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +16 -6
  90. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +64 -32
  91. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
  92. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  94. data/lib/solargraph/parser/parser_gem/node_processors.rb +14 -0
  95. data/lib/solargraph/parser/region.rb +4 -1
  96. data/lib/solargraph/parser/snippet.rb +2 -0
  97. data/lib/solargraph/parser.rb +3 -5
  98. data/lib/solargraph/pin/base.rb +417 -42
  99. data/lib/solargraph/pin/base_variable.rb +21 -12
  100. data/lib/solargraph/pin/block.rb +9 -26
  101. data/lib/solargraph/pin/breakable.rb +9 -0
  102. data/lib/solargraph/pin/callable.rb +231 -0
  103. data/lib/solargraph/pin/closure.rb +30 -10
  104. data/lib/solargraph/pin/common.rb +12 -7
  105. data/lib/solargraph/pin/constant.rb +2 -0
  106. data/lib/solargraph/pin/conversions.rb +3 -2
  107. data/lib/solargraph/pin/delegated_method.rb +20 -1
  108. data/lib/solargraph/pin/documenting.rb +16 -0
  109. data/lib/solargraph/pin/instance_variable.rb +2 -2
  110. data/lib/solargraph/pin/keyword.rb +7 -2
  111. data/lib/solargraph/pin/local_variable.rb +15 -7
  112. data/lib/solargraph/pin/method.rb +241 -70
  113. data/lib/solargraph/pin/method_alias.rb +3 -0
  114. data/lib/solargraph/pin/namespace.rb +21 -13
  115. data/lib/solargraph/pin/parameter.rb +94 -32
  116. data/lib/solargraph/pin/proxy_type.rb +17 -7
  117. data/lib/solargraph/pin/reference/override.rb +24 -6
  118. data/lib/solargraph/pin/reference/require.rb +2 -2
  119. data/lib/solargraph/pin/reference/superclass.rb +5 -0
  120. data/lib/solargraph/pin/reference.rb +17 -0
  121. data/lib/solargraph/pin/search.rb +6 -1
  122. data/lib/solargraph/pin/signature.rb +39 -121
  123. data/lib/solargraph/pin/singleton.rb +1 -1
  124. data/lib/solargraph/pin/symbol.rb +8 -2
  125. data/lib/solargraph/pin/until.rb +18 -0
  126. data/lib/solargraph/pin/while.rb +18 -0
  127. data/lib/solargraph/pin.rb +8 -2
  128. data/lib/solargraph/pin_cache.rb +245 -0
  129. data/lib/solargraph/position.rb +19 -0
  130. data/lib/solargraph/range.rb +23 -4
  131. data/lib/solargraph/rbs_map/conversions.rb +315 -99
  132. data/lib/solargraph/rbs_map/core_fills.rb +50 -16
  133. data/lib/solargraph/rbs_map/core_map.rb +41 -11
  134. data/lib/solargraph/rbs_map/stdlib_map.rb +15 -5
  135. data/lib/solargraph/rbs_map.rb +87 -16
  136. data/lib/solargraph/shell.rb +117 -17
  137. data/lib/solargraph/source/chain/array.rb +13 -8
  138. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  139. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  140. data/lib/solargraph/source/chain/call.rb +135 -66
  141. data/lib/solargraph/source/chain/constant.rb +3 -66
  142. data/lib/solargraph/source/chain/hash.rb +9 -3
  143. data/lib/solargraph/source/chain/head.rb +1 -1
  144. data/lib/solargraph/source/chain/if.rb +7 -2
  145. data/lib/solargraph/source/chain/link.rb +38 -6
  146. data/lib/solargraph/source/chain/literal.rb +27 -2
  147. data/lib/solargraph/source/chain/or.rb +2 -2
  148. data/lib/solargraph/source/chain/z_super.rb +1 -1
  149. data/lib/solargraph/source/chain.rb +140 -63
  150. data/lib/solargraph/source/change.rb +2 -2
  151. data/lib/solargraph/source/cursor.rb +4 -4
  152. data/lib/solargraph/source/source_chainer.rb +3 -3
  153. data/lib/solargraph/source.rb +110 -89
  154. data/lib/solargraph/source_map/clip.rb +22 -28
  155. data/lib/solargraph/source_map/data.rb +34 -0
  156. data/lib/solargraph/source_map/mapper.rb +11 -7
  157. data/lib/solargraph/source_map.rb +50 -43
  158. data/lib/solargraph/type_checker/checks.rb +4 -0
  159. data/lib/solargraph/type_checker/param_def.rb +2 -0
  160. data/lib/solargraph/type_checker/rules.rb +35 -8
  161. data/lib/solargraph/type_checker.rb +331 -189
  162. data/lib/solargraph/version.rb +1 -1
  163. data/lib/solargraph/views/_method.erb +10 -10
  164. data/lib/solargraph/views/_namespace.erb +3 -3
  165. data/lib/solargraph/views/document.erb +10 -10
  166. data/lib/solargraph/views/environment.erb +3 -5
  167. data/lib/solargraph/workspace/config.rb +25 -5
  168. data/lib/solargraph/workspace/require_paths.rb +97 -0
  169. data/lib/solargraph/workspace.rb +53 -72
  170. data/lib/solargraph/yard_map/helpers.rb +29 -1
  171. data/lib/solargraph/yard_map/mapper/to_constant.rb +8 -5
  172. data/lib/solargraph/yard_map/mapper/to_method.rb +55 -19
  173. data/lib/solargraph/yard_map/mapper/to_namespace.rb +11 -7
  174. data/lib/solargraph/yard_map/mapper.rb +5 -3
  175. data/lib/solargraph/yard_map/to_method.rb +6 -3
  176. data/lib/solargraph/yardoc.rb +45 -10
  177. data/lib/solargraph.rb +35 -1
  178. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  179. data/rbs/fills/open3/0/open3.rbs +172 -0
  180. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  181. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  182. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  183. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  184. data/rbs/fills/tuple/tuple.rbs +149 -0
  185. data/rbs_collection.yaml +19 -0
  186. data/sig/shims/ast/0/node.rbs +5 -0
  187. data/sig/shims/ast/2.4/.rbs_meta.yaml +9 -0
  188. data/sig/shims/ast/2.4/ast.rbs +73 -0
  189. data/sig/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  190. data/sig/shims/parser/3.2.0.1/manifest.yaml +7 -0
  191. data/sig/shims/parser/3.2.0.1/parser.rbs +201 -0
  192. data/sig/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  193. data/sig/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  194. data/sig/shims/thor/1.2.0.1/manifest.yaml +7 -0
  195. data/sig/shims/thor/1.2.0.1/thor.rbs +17 -0
  196. data/solargraph.gemspec +32 -10
  197. metadata +237 -37
  198. data/lib/.rubocop.yml +0 -22
  199. data/lib/solargraph/cache.rb +0 -77
  200. data/lib/solargraph/parser/node_methods.rb +0 -83
@@ -1,23 +1,66 @@
1
1
  # frozen_string_literal: true
2
2
 
3
-
4
3
  module Solargraph
5
4
  class ApiMap
5
+ # Queryable collection of Pins representing a Workspace, gems and the Ruby
6
+ # core.
7
+ #
6
8
  class Store
9
+ # @param pinsets [Array<Enumerable<Pin::Base>>]
10
+ def initialize *pinsets
11
+ @pinsets = pinsets
12
+ catalog pinsets
13
+ end
14
+
7
15
  # @return [Array<Solargraph::Pin::Base>]
8
- attr_reader :pins
16
+ def pins
17
+ index.pins
18
+ end
19
+
20
+ # @param pinsets [Array<Array<Pin::Base>>]
21
+ # - pinsets[0] = core Ruby pins
22
+ # - pinsets[1] = documentation/gem pins
23
+ # - pinsets[2] = convention pins
24
+ # - pinsets[3] = workspace source pins
25
+ # - pinsets[4] = currently open file pins
26
+ # @return [Boolean] True if the index was updated
27
+ def update *pinsets
28
+ return catalog(pinsets) if pinsets.length != @pinsets.length
29
+
30
+ changed = pinsets.find_index.with_index { |pinset, idx| @pinsets[idx] != pinset }
31
+ return false unless changed
32
+
33
+ # @todo Fix this map
34
+ @fqns_pins_map = nil
35
+ return catalog(pinsets) if changed == 0
36
+
37
+ pinsets[changed..].each_with_index do |pins, idx|
38
+ @pinsets[changed + idx] = pins
39
+ @indexes[changed + idx] = if pins.empty?
40
+ @indexes[changed + idx - 1]
41
+ else
42
+ @indexes[changed + idx - 1].merge(pins)
43
+ end
44
+ end
45
+ constants.clear
46
+ cached_qualify_superclass.clear
47
+ true
48
+ end
9
49
 
10
- # @param pins [Enumerable<Solargraph::Pin::Base>]
11
- def initialize pins = []
12
- @pins = pins
13
- index
50
+ def to_s
51
+ self.class.to_s
52
+ end
53
+
54
+ def inspect
55
+ to_s
14
56
  end
15
57
 
16
58
  # @param fqns [String]
17
59
  # @param visibility [Array<Symbol>]
18
- # @return [Enumerable<Solargraph::Pin::Base>]
60
+ # @return [Enumerable<Solargraph::Pin::Namespace, Solargraph::Pin::Constant>]
19
61
  def get_constants fqns, visibility = [:public]
20
62
  namespace_children(fqns).select { |pin|
63
+ # @sg-ignore flow-sensitive typing not smart enough to handle this case
21
64
  !pin.name.empty? && (pin.is_a?(Pin::Namespace) || pin.is_a?(Pin::Constant)) && visibility.include?(pin.visibility)
22
65
  }
23
66
  end
@@ -27,34 +70,52 @@ module Solargraph
27
70
  # @param visibility [Array<Symbol>]
28
71
  # @return [Enumerable<Solargraph::Pin::Method>]
29
72
  def get_methods fqns, scope: :instance, visibility: [:public]
30
- namespace_children(fqns).select do |pin|
73
+ all_pins = namespace_children(fqns).select do |pin|
74
+ # @sg-ignore https://github.com/castwide/solargraph/pull/1114
31
75
  pin.is_a?(Pin::Method) && pin.scope == scope && visibility.include?(pin.visibility)
32
76
  end
77
+ GemPins.combine_method_pins_by_path(all_pins)
33
78
  end
34
79
 
80
+ BOOLEAN_SUPERCLASS_PIN = Pin::Reference::Superclass.new(name: 'Boolean', closure: Pin::ROOT_PIN, source: :solargraph)
81
+ OBJECT_SUPERCLASS_PIN = Pin::Reference::Superclass.new(name: 'Object', closure: Pin::ROOT_PIN, source: :solargraph)
82
+
35
83
  # @param fqns [String]
36
- # @return [String, nil]
84
+ # @return [Pin::Reference::Superclass]
37
85
  def get_superclass fqns
38
- return superclass_references[fqns].first if superclass_references.key?(fqns)
39
- return 'Object' if fqns != 'BasicObject' && namespace_exists?(fqns)
40
- return 'Object' if fqns == 'Boolean'
41
- nil
86
+ return nil if fqns.nil? || fqns.empty?
87
+ return BOOLEAN_SUPERCLASS_PIN if %w[TrueClass FalseClass].include?(fqns)
88
+
89
+ superclass_references[fqns].first || try_special_superclasses(fqns)
90
+ end
91
+
92
+ # @param fq_sub_tag [String]
93
+ # @return [String, nil]
94
+ def qualify_superclass fq_sub_tag
95
+ cached_qualify_superclass[fq_sub_tag] || qualify_and_cache_superclass(fq_sub_tag)
96
+ type = ComplexType.try_parse(fq_sub_tag)
97
+ return type.simplify_literals.to_s if type.literal?
98
+ ref = get_superclass(fq_sub_tag)
99
+ return unless ref
100
+ res = constants.dereference(ref)
101
+ return unless res
102
+ res
42
103
  end
43
104
 
44
105
  # @param fqns [String]
45
- # @return [Array<String>]
106
+ # @return [Array<Pin::Reference::Include>]
46
107
  def get_includes fqns
47
108
  include_references[fqns] || []
48
109
  end
49
110
 
50
111
  # @param fqns [String]
51
- # @return [Array<String>]
112
+ # @return [Array<Pin::Reference::Prepend>]
52
113
  def get_prepends fqns
53
114
  prepend_references[fqns] || []
54
115
  end
55
116
 
56
117
  # @param fqns [String]
57
- # @return [Array<String>]
118
+ # @return [Array<Pin::Reference::Extend>]
58
119
  def get_extends fqns
59
120
  extend_references[fqns] || []
60
121
  end
@@ -62,11 +123,7 @@ module Solargraph
62
123
  # @param path [String]
63
124
  # @return [Array<Solargraph::Pin::Base>]
64
125
  def get_path_pins path
65
- path_pin_hash[path] || []
66
- end
67
-
68
- def cacheable_pins
69
- @cacheable_pins ||= pins_by_class(Pin::Namespace) + pins_by_class(Pin::Constant) + pins_by_class(Pin::Method) + pins_by_class(Pin::Reference)
126
+ index.path_pin_hash[path]
70
127
  end
71
128
 
72
129
  # @param fqns [String]
@@ -79,9 +136,10 @@ module Solargraph
79
136
  end
80
137
 
81
138
  # @param fqns [String]
82
- # @return [Enumerable<Solargraph::Pin::Base>]
139
+ #
140
+ # @return [Enumerable<Solargraph::Pin::ClassVariable>]
83
141
  def get_class_variables(fqns)
84
- namespace_children(fqns).select{|pin| pin.is_a?(Pin::ClassVariable)}
142
+ namespace_children(fqns).select { |pin| pin.is_a?(Pin::ClassVariable)}
85
143
  end
86
144
 
87
145
  # @return [Enumerable<Solargraph::Pin::Base>]
@@ -95,12 +153,7 @@ module Solargraph
95
153
  fqns_pins(fqns).any?
96
154
  end
97
155
 
98
- # @return [Set<String>]
99
- def namespaces
100
- @namespaces ||= Set.new
101
- end
102
-
103
- # @return [Array<Solargraph::Pin::Base>]
156
+ # @return [Enumerable<Solargraph::Pin::Namespace>]
104
157
  def namespace_pins
105
158
  pins_by_class(Solargraph::Pin::Namespace)
106
159
  end
@@ -139,18 +192,11 @@ module Solargraph
139
192
  pins_by_class(Pin::Block)
140
193
  end
141
194
 
142
- def inspect
143
- # Avoid insane dumps in specs
144
- to_s
145
- end
146
-
147
195
  # @generic T
148
- # @param klass [Class<T>]
149
- # @return [Array<T>]
196
+ # @param klass [Class<generic<T>>]
197
+ # @return [Set<generic<T>>]
150
198
  def pins_by_class klass
151
- # @type [Set<Solargraph::Pin::Base>]
152
- s = Set.new
153
- @pin_select_cache[klass] ||= @pin_class_hash.each_with_object(s) { |(key, o), n| n.merge(o) if key <= klass }
199
+ index.pins_by_class klass
154
200
  end
155
201
 
156
202
  # @param fqns [String]
@@ -168,10 +214,89 @@ module Solargraph
168
214
  fqns_pins_map[[base, name]]
169
215
  end
170
216
 
217
+ # Get all ancestors (superclasses, includes, prepends, extends) for a namespace
218
+ # @param fqns [String] The fully qualified namespace
219
+ # @return [Array<String>] Array of ancestor namespaces including the original
220
+ def get_ancestors(fqns)
221
+ return [] if fqns.nil? || fqns.empty?
222
+
223
+ ancestors = [fqns]
224
+ visited = Set.new
225
+ queue = [fqns]
226
+
227
+ until queue.empty?
228
+ current = queue.shift
229
+ next if current.nil? || current.empty? || visited.include?(current)
230
+ visited.add(current)
231
+
232
+ current = current.gsub(/^::/, '')
233
+
234
+ # Add superclass
235
+ ref = get_superclass(current)
236
+ superclass = ref && constants.dereference(ref)
237
+ if superclass && !superclass.empty? && !visited.include?(superclass)
238
+ ancestors << superclass
239
+ queue << superclass
240
+ end
241
+
242
+ # Add includes, prepends, and extends
243
+ [get_includes(current), get_prepends(current), get_extends(current)].each do |refs|
244
+ next if refs.nil?
245
+ # @param ref [String]
246
+ refs.map(&:type).map(&:to_s).each do |ref|
247
+ next if ref.nil? || ref.empty? || visited.include?(ref)
248
+ ancestors << ref
249
+ queue << ref
250
+ end
251
+ end
252
+ end
253
+
254
+ ancestors.compact.uniq
255
+ end
256
+
257
+ # @param fqns [String]
258
+ #
259
+ # @return [Array<Solargraph::Pin::Reference>]
260
+ def get_ancestor_references(fqns)
261
+ (get_prepends(fqns) + get_includes(fqns) + [get_superclass(fqns)]).compact
262
+ end
263
+
264
+ # @return [Constants]
265
+ def constants
266
+ @constants ||= Constants.new(self)
267
+ end
268
+
171
269
  private
172
270
 
271
+ # @return [Index]
272
+ def index
273
+ @indexes.last
274
+ end
275
+
276
+ # @param pinsets [Array<Array<Pin::Base>>]
277
+ #
278
+ # @return [void]
279
+ def catalog pinsets
280
+ @pinsets = pinsets
281
+ # @type [Array<Index>]
282
+ @indexes = []
283
+ pinsets.each do |pins|
284
+ if @indexes.last && pins.empty?
285
+ @indexes.push @indexes.last
286
+ else
287
+ @indexes.push(@indexes.last&.merge(pins) || Solargraph::ApiMap::Index.new(pins))
288
+ end
289
+ end
290
+ constants.clear
291
+ cached_qualify_superclass.clear
292
+ true
293
+ end
294
+
173
295
  # @return [Hash{::Array(String, String) => ::Array<Pin::Namespace>}]
174
296
  def fqns_pins_map
297
+ # @param h [Hash{::Array(String, String) => ::Array<Pin::Namespace>}]
298
+ # @param base [String]
299
+ # @param name [String]
175
300
  @fqns_pins_map ||= Hash.new do |h, (base, name)|
176
301
  value = namespace_children(base).select { |pin| pin.name == name && pin.is_a?(Pin::Namespace) }
177
302
  h[[base, name]] = value
@@ -180,129 +305,79 @@ module Solargraph
180
305
 
181
306
  # @return [Enumerable<Solargraph::Pin::Symbol>]
182
307
  def symbols
183
- pins_by_class(Pin::Symbol)
308
+ index.pins_by_class(Pin::Symbol)
184
309
  end
185
310
 
186
311
  # @return [Hash{String => Array<String>}]
187
312
  def superclass_references
188
- @superclass_references ||= {}
313
+ index.superclass_references
189
314
  end
190
315
 
191
- # @return [Hash{String => Array<String>}]
316
+ # @return [Hash{String => Array<Pin::Reference::Include>}]
192
317
  def include_references
193
- @include_references ||= {}
318
+ index.include_references
194
319
  end
195
320
 
196
- # @return [Hash{String => Array<String>}]
321
+ # @return [Hash{String => Array<Solargraph::Pin::Reference::Include>}]
322
+ def include_reference_pins
323
+ index.include_reference_pins
324
+ end
325
+
326
+ # @return [Hash{String => Array<Pin::Reference::Prepend>}]
197
327
  def prepend_references
198
- @prepend_references ||= {}
328
+ index.prepend_references
199
329
  end
200
330
 
201
- # @return [Hash{String => Array<String>}]
331
+ # @return [Hash{String => Array<Pin::Reference::Extend>}]
202
332
  def extend_references
203
- @extend_references ||= {}
333
+ index.extend_references
204
334
  end
205
335
 
206
336
  # @param name [String]
207
337
  # @return [Enumerable<Solargraph::Pin::Base>]
208
338
  def namespace_children name
209
- namespace_map[name] || []
210
- end
211
-
212
- # @return [Hash{String => Enumerable<Pin::Base>}
213
- def namespace_map
214
- @namespace_map ||= {}
339
+ return [] unless index.namespace_hash.key?(name)
340
+ index.namespace_hash[name]
215
341
  end
216
342
 
217
343
  # @return [Enumerable<Pin::InstanceVariable>]
218
344
  def all_instance_variables
219
- pins_by_class(Pin::InstanceVariable)
345
+ index.pins_by_class(Pin::InstanceVariable)
220
346
  end
221
347
 
222
- # @return [Hash{String => Array<Pin::Base>}]
223
- def path_pin_hash
224
- @path_pin_hash ||= {}
348
+ # @param fqns [String]
349
+ # @return [Pin::Reference::Superclass, nil]
350
+ def try_special_superclasses(fqns)
351
+ return OBJECT_SUPERCLASS_PIN if fqns == 'Boolean'
352
+ return OBJECT_SUPERCLASS_PIN if !%w[BasicObject Object].include?(fqns) && namespace_exists?(fqns)
353
+
354
+ sub = ComplexType.try_parse(fqns)
355
+ return get_superclass(sub.simplify_literals.name) if sub.literal?
356
+
357
+ get_superclass(sub.namespace) if sub.namespace != fqns
225
358
  end
226
359
 
227
- # Add references to a map
228
- #
229
- # @param h [Hash{String => Pin:Base}]
230
- # @param reference_pin [Pin::Reference]
231
- #
232
- # @return [void]
233
- def store_parametric_reference(h, reference_pin)
234
- referenced_ns = reference_pin.name
235
- referenced_tag_params = reference_pin.generic_values
236
- referenced_tag = referenced_ns +
237
- if referenced_tag_params && referenced_tag_params.length > 0
238
- "<" + referenced_tag_params.join(', ') + ">"
239
- else
240
- ''
241
- end
242
- referencing_ns = reference_pin.namespace
243
- h[referencing_ns] ||= []
244
- h[referencing_ns].push referenced_tag
360
+ # @param fq_sub_tag [String]
361
+ # @return [String, nil]
362
+ def qualify_and_cache_superclass fq_sub_tag
363
+ cached_qualify_superclass[fq_sub_tag] = uncached_qualify_superclass(fq_sub_tag)
245
364
  end
246
365
 
247
- # @return [void]
248
- def index
249
- set = pins.to_set
250
- @pin_class_hash = set.classify(&:class).transform_values(&:to_a)
251
- # @type [Hash{Class => ::Array<Solargraph::Pin::Base>}]
252
- @pin_select_cache = {}
253
- @namespace_map = set.classify(&:namespace)
254
- @path_pin_hash = set.classify(&:path)
255
- @namespaces = @path_pin_hash.keys.compact.to_set
256
- pins_by_class(Pin::Reference::Include).each do |pin|
257
- store_parametric_reference(include_references, pin)
258
- end
259
- # @todo move the rest of these reference pins over to use
260
- # generic types, adding rbs_map/conversions.rb code to
261
- # populate type parameters and adding related specs ensuring
262
- # the generics get resolved, along with any api_map.rb
263
- # changes needed in
264
- pins_by_class(Pin::Reference::Prepend).each do |pin|
265
- prepend_references[pin.namespace] ||= []
266
- prepend_references[pin.namespace].push pin.name
267
- end
268
- pins_by_class(Pin::Reference::Extend).each do |pin|
269
- extend_references[pin.namespace] ||= []
270
- extend_references[pin.namespace].push pin.name
271
- end
272
- pins_by_class(Pin::Reference::Superclass).each do |pin|
273
- superclass_references[pin.namespace] ||= []
274
- superclass_references[pin.namespace].push pin.name
275
- end
276
- pins_by_class(Pin::Reference::Override).each do |ovr|
277
- pin = get_path_pins(ovr.name).first
278
- next if pin.nil?
279
- new_pin = if pin.path.end_with?('#initialize')
280
- get_path_pins(pin.path.sub(/#initialize/, '.new')).first
281
- end
282
- (ovr.tags.map(&:tag_name) + ovr.delete).uniq.each do |tag|
283
- pin.docstring.delete_tags tag.to_sym
284
- new_pin.docstring.delete_tags tag.to_sym if new_pin
285
- end
286
- ovr.tags.each do |tag|
287
- pin.docstring.add_tag(tag)
288
- redefine_return_type pin, tag
289
- if new_pin
290
- new_pin.docstring.add_tag(tag)
291
- redefine_return_type new_pin, tag
292
- end
293
- end
294
- end
366
+ # @return [Hash{String => String, nil}]
367
+ def cached_qualify_superclass
368
+ @cached_qualify_superclass ||= {}
295
369
  end
296
370
 
297
- # @param pin [Pin::Base]
298
- # @param tag [String]
299
- # @return [void]
300
- def redefine_return_type pin, tag
301
- return unless pin && tag.tag_name == 'return'
302
- pin.instance_variable_set(:@return_type, ComplexType.try_parse(tag.type))
303
- pin.signatures.each do |sig|
304
- sig.instance_variable_set(:@return_type, ComplexType.try_parse(tag.type))
305
- end
371
+ # @param fq_sub_tag [String]
372
+ # @return [String, nil]
373
+ def uncached_qualify_superclass fq_sub_tag
374
+ type = ComplexType.try_parse(fq_sub_tag)
375
+ return type.simplify_literals.to_s if type.literal?
376
+ ref = get_superclass(fq_sub_tag)
377
+ return unless ref
378
+ res = constants.dereference(ref)
379
+ return unless res
380
+ res + type.substring
306
381
  end
307
382
  end
308
383
  end