solargraph 0.56.0 → 0.58.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/linting.yml +127 -0
  4. data/.github/workflows/plugins.yml +183 -7
  5. data/.github/workflows/rspec.yml +55 -5
  6. data/.github/workflows/typecheck.yml +6 -3
  7. data/.gitignore +6 -0
  8. data/.overcommit.yml +72 -0
  9. data/.rspec +1 -0
  10. data/.rubocop.yml +66 -0
  11. data/.rubocop_todo.yml +1279 -0
  12. data/.yardopts +1 -0
  13. data/CHANGELOG.md +92 -1
  14. data/README.md +8 -4
  15. data/Rakefile +125 -13
  16. data/bin/solargraph +3 -0
  17. data/lib/solargraph/api_map/cache.rb +110 -109
  18. data/lib/solargraph/api_map/constants.rb +279 -0
  19. data/lib/solargraph/api_map/index.rb +193 -175
  20. data/lib/solargraph/api_map/source_to_yard.rb +97 -88
  21. data/lib/solargraph/api_map/store.rb +384 -266
  22. data/lib/solargraph/api_map.rb +945 -973
  23. data/lib/solargraph/bench.rb +1 -0
  24. data/lib/solargraph/complex_type/type_methods.rb +228 -222
  25. data/lib/solargraph/complex_type/unique_type.rb +482 -475
  26. data/lib/solargraph/complex_type.rb +444 -423
  27. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  28. data/lib/solargraph/convention/base.rb +17 -0
  29. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
  30. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
  31. data/lib/solargraph/convention/data_definition.rb +105 -0
  32. data/lib/solargraph/convention/gemspec.rb +3 -2
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -60
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -100
  35. data/lib/solargraph/convention/struct_definition.rb +164 -101
  36. data/lib/solargraph/convention.rb +32 -2
  37. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  38. data/lib/solargraph/diagnostics/rubocop.rb +118 -113
  39. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  40. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  41. data/lib/solargraph/doc_map.rb +439 -405
  42. data/lib/solargraph/environ.rb +9 -2
  43. data/lib/solargraph/equality.rb +34 -33
  44. data/lib/solargraph/gem_pins.rb +98 -88
  45. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  46. data/lib/solargraph/language_server/host/dispatch.rb +130 -128
  47. data/lib/solargraph/language_server/host/message_worker.rb +112 -109
  48. data/lib/solargraph/language_server/host/sources.rb +99 -99
  49. data/lib/solargraph/language_server/host.rb +878 -871
  50. data/lib/solargraph/language_server/message/base.rb +2 -1
  51. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
  52. data/lib/solargraph/language_server/message/extended/document.rb +23 -23
  53. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  54. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
  55. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  56. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -131
  57. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  58. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  59. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -24
  60. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
  61. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  62. data/lib/solargraph/language_server/progress.rb +8 -0
  63. data/lib/solargraph/language_server/request.rb +4 -1
  64. data/lib/solargraph/library.rb +683 -666
  65. data/lib/solargraph/location.rb +82 -79
  66. data/lib/solargraph/logging.rb +37 -28
  67. data/lib/solargraph/page.rb +3 -0
  68. data/lib/solargraph/parser/comment_ripper.rb +69 -62
  69. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -227
  70. data/lib/solargraph/parser/node_processor/base.rb +92 -87
  71. data/lib/solargraph/parser/node_processor.rb +62 -46
  72. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -159
  73. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
  74. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -164
  75. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -497
  76. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -21
  77. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
  78. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  79. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -45
  80. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +1 -21
  81. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
  82. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -21
  83. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
  84. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
  85. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -53
  86. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +0 -22
  87. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -41
  88. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -16
  89. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -37
  90. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -43
  91. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -271
  92. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +1 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
  94. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -66
  95. data/lib/solargraph/parser/region.rb +69 -66
  96. data/lib/solargraph/parser/snippet.rb +17 -15
  97. data/lib/solargraph/pin/base.rb +729 -651
  98. data/lib/solargraph/pin/base_variable.rb +126 -125
  99. data/lib/solargraph/pin/block.rb +104 -103
  100. data/lib/solargraph/pin/breakable.rb +9 -9
  101. data/lib/solargraph/pin/callable.rb +231 -218
  102. data/lib/solargraph/pin/closure.rb +72 -74
  103. data/lib/solargraph/pin/common.rb +79 -75
  104. data/lib/solargraph/pin/constant.rb +2 -0
  105. data/lib/solargraph/pin/conversions.rb +123 -123
  106. data/lib/solargraph/pin/delegated_method.rb +120 -120
  107. data/lib/solargraph/pin/documenting.rb +114 -114
  108. data/lib/solargraph/pin/instance_variable.rb +34 -34
  109. data/lib/solargraph/pin/keyword.rb +20 -20
  110. data/lib/solargraph/pin/local_variable.rb +75 -76
  111. data/lib/solargraph/pin/method.rb +672 -651
  112. data/lib/solargraph/pin/method_alias.rb +34 -31
  113. data/lib/solargraph/pin/namespace.rb +115 -115
  114. data/lib/solargraph/pin/parameter.rb +275 -261
  115. data/lib/solargraph/pin/proxy_type.rb +39 -35
  116. data/lib/solargraph/pin/reference/override.rb +47 -33
  117. data/lib/solargraph/pin/reference/superclass.rb +15 -10
  118. data/lib/solargraph/pin/reference.rb +39 -22
  119. data/lib/solargraph/pin/search.rb +61 -56
  120. data/lib/solargraph/pin/signature.rb +61 -59
  121. data/lib/solargraph/pin/symbol.rb +53 -48
  122. data/lib/solargraph/pin/until.rb +18 -18
  123. data/lib/solargraph/pin/while.rb +18 -18
  124. data/lib/solargraph/pin.rb +44 -44
  125. data/lib/solargraph/pin_cache.rb +245 -185
  126. data/lib/solargraph/position.rb +132 -116
  127. data/lib/solargraph/range.rb +112 -107
  128. data/lib/solargraph/rbs_map/conversions.rb +823 -773
  129. data/lib/solargraph/rbs_map/core_fills.rb +18 -0
  130. data/lib/solargraph/rbs_map/core_map.rb +58 -51
  131. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
  132. data/lib/solargraph/rbs_map.rb +163 -150
  133. data/lib/solargraph/shell.rb +352 -268
  134. data/lib/solargraph/source/chain/call.rb +337 -333
  135. data/lib/solargraph/source/chain/constant.rb +26 -89
  136. data/lib/solargraph/source/chain/hash.rb +34 -34
  137. data/lib/solargraph/source/chain/if.rb +28 -28
  138. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  139. data/lib/solargraph/source/chain/link.rb +11 -2
  140. data/lib/solargraph/source/chain/literal.rb +48 -48
  141. data/lib/solargraph/source/chain/or.rb +23 -23
  142. data/lib/solargraph/source/chain.rb +291 -282
  143. data/lib/solargraph/source/change.rb +82 -82
  144. data/lib/solargraph/source/cursor.rb +166 -167
  145. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  146. data/lib/solargraph/source/source_chainer.rb +194 -194
  147. data/lib/solargraph/source/updater.rb +55 -55
  148. data/lib/solargraph/source.rb +498 -495
  149. data/lib/solargraph/source_map/clip.rb +226 -234
  150. data/lib/solargraph/source_map/data.rb +34 -30
  151. data/lib/solargraph/source_map/mapper.rb +259 -259
  152. data/lib/solargraph/source_map.rb +212 -200
  153. data/lib/solargraph/type_checker/checks.rb +124 -124
  154. data/lib/solargraph/type_checker/param_def.rb +37 -35
  155. data/lib/solargraph/type_checker/problem.rb +32 -32
  156. data/lib/solargraph/type_checker/rules.rb +84 -62
  157. data/lib/solargraph/type_checker.rb +814 -699
  158. data/lib/solargraph/version.rb +5 -5
  159. data/lib/solargraph/workspace/config.rb +255 -239
  160. data/lib/solargraph/workspace/require_paths.rb +97 -0
  161. data/lib/solargraph/workspace.rb +220 -249
  162. data/lib/solargraph/yard_map/helpers.rb +44 -16
  163. data/lib/solargraph/yard_map/mapper/to_constant.rb +5 -5
  164. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -134
  165. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -30
  166. data/lib/solargraph/yard_map/mapper.rb +79 -79
  167. data/lib/solargraph/yard_map/to_method.rb +89 -88
  168. data/lib/solargraph/yardoc.rb +87 -49
  169. data/lib/solargraph.rb +105 -90
  170. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  171. data/rbs/fills/open3/0/open3.rbs +172 -0
  172. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  173. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  174. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  175. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  176. data/rbs/fills/{tuple.rbs → tuple/tuple.rbs} +2 -3
  177. data/rbs/shims/ast/0/node.rbs +5 -0
  178. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  179. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  180. data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  181. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  182. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  183. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  184. data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  185. data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
  186. data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
  187. data/rbs_collection.yaml +4 -4
  188. data/solargraph.gemspec +26 -5
  189. metadata +187 -15
  190. data/lib/.rubocop.yml +0 -22
  191. data/lib/solargraph/parser/node_methods.rb +0 -97
@@ -1,266 +1,384 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class ApiMap
5
- # Queryable collection of Pins representing a Workspace, gems and the Ruby
6
- # core.
7
- #
8
- class Store
9
- # @param pinsets [Array<Enumerable<Pin::Base>>]
10
- def initialize *pinsets
11
- catalog pinsets
12
- end
13
-
14
- # @return [Array<Solargraph::Pin::Base>]
15
- def pins
16
- index.pins
17
- end
18
-
19
- # @param pinsets [Array<Enumerable<Pin::Base>>]
20
- # @return [Boolean] True if the index was updated
21
- def update *pinsets
22
- return catalog(pinsets) if pinsets.length != @pinsets.length
23
-
24
- changed = pinsets.find_index.with_index { |pinset, idx| @pinsets[idx] != pinset }
25
- return false unless changed
26
-
27
- # @todo Fix this map
28
- @fqns_pins_map = nil
29
- return catalog(pinsets) if changed == 0
30
-
31
- pinsets[changed..].each_with_index do |pins, idx|
32
- @pinsets[changed + idx] = pins
33
- @indexes[changed + idx] = if pins.empty?
34
- @indexes[changed + idx - 1]
35
- else
36
- @indexes[changed + idx - 1].merge(pins)
37
- end
38
- end
39
- true
40
- end
41
-
42
- def to_s
43
- self.class.to_s
44
- end
45
-
46
- def inspect
47
- to_s
48
- end
49
-
50
- # @param fqns [String]
51
- # @param visibility [Array<Symbol>]
52
- # @return [Enumerable<Solargraph::Pin::Base>]
53
- def get_constants fqns, visibility = [:public]
54
- namespace_children(fqns).select { |pin|
55
- !pin.name.empty? && (pin.is_a?(Pin::Namespace) || pin.is_a?(Pin::Constant)) && visibility.include?(pin.visibility)
56
- }
57
- end
58
-
59
- # @param fqns [String]
60
- # @param scope [Symbol]
61
- # @param visibility [Array<Symbol>]
62
- # @return [Enumerable<Solargraph::Pin::Method>]
63
- def get_methods fqns, scope: :instance, visibility: [:public]
64
- all_pins = namespace_children(fqns).select do |pin|
65
- pin.is_a?(Pin::Method) && pin.scope == scope && visibility.include?(pin.visibility)
66
- end
67
- GemPins.combine_method_pins_by_path(all_pins)
68
- end
69
-
70
- # @param fq_tag [String]
71
- # @return [String, nil]
72
- def get_superclass fq_tag
73
- raise "Do not prefix fully qualified tags with '::' - #{fq_tag.inspect}" if fq_tag.start_with?('::')
74
- sub = ComplexType.parse(fq_tag)
75
- fqns = sub.namespace
76
- return superclass_references[fq_tag].first if superclass_references.key?(fq_tag)
77
- return superclass_references[fqns].first if superclass_references.key?(fqns)
78
- return 'Object' if fqns != 'BasicObject' && namespace_exists?(fqns)
79
- return 'Object' if fqns == 'Boolean'
80
- simplified_literal_name = ComplexType.parse("#{fqns}").simplify_literals.name
81
- return simplified_literal_name if simplified_literal_name != fqns
82
- nil
83
- end
84
-
85
- # @param fqns [String]
86
- # @return [Array<String>]
87
- def get_includes fqns
88
- include_references[fqns] || []
89
- end
90
-
91
- # @param fqns [String]
92
- # @return [Array<String>]
93
- def get_prepends fqns
94
- prepend_references[fqns] || []
95
- end
96
-
97
- # @param fqns [String]
98
- # @return [Array<String>]
99
- def get_extends fqns
100
- extend_references[fqns] || []
101
- end
102
-
103
- # @param path [String]
104
- # @return [Array<Solargraph::Pin::Base>]
105
- def get_path_pins path
106
- index.path_pin_hash[path]
107
- end
108
-
109
- # @param fqns [String]
110
- # @param scope [Symbol] :class or :instance
111
- # @return [Enumerable<Solargraph::Pin::Base>]
112
- def get_instance_variables(fqns, scope = :instance)
113
- all_instance_variables.select { |pin|
114
- pin.binder.namespace == fqns && pin.binder.scope == scope
115
- }
116
- end
117
-
118
- # @param fqns [String]
119
- # @return [Enumerable<Solargraph::Pin::Base>]
120
- def get_class_variables(fqns)
121
- namespace_children(fqns).select { |pin| pin.is_a?(Pin::ClassVariable)}
122
- end
123
-
124
- # @return [Enumerable<Solargraph::Pin::Base>]
125
- def get_symbols
126
- symbols.uniq(&:name)
127
- end
128
-
129
- # @param fqns [String]
130
- # @return [Boolean]
131
- def namespace_exists?(fqns)
132
- fqns_pins(fqns).any?
133
- end
134
-
135
- # @return [Set<String>]
136
- def namespaces
137
- index.namespaces
138
- end
139
-
140
- # @return [Enumerable<Solargraph::Pin::Namespace>]
141
- def namespace_pins
142
- pins_by_class(Solargraph::Pin::Namespace)
143
- end
144
-
145
- # @return [Enumerable<Solargraph::Pin::Method>]
146
- def method_pins
147
- pins_by_class(Solargraph::Pin::Method)
148
- end
149
-
150
- # @param fqns [String]
151
- # @return [Array<String>]
152
- def domains(fqns)
153
- result = []
154
- fqns_pins(fqns).each do |nspin|
155
- result.concat nspin.domains
156
- end
157
- result
158
- end
159
-
160
- # @return [Hash{String => YARD::Tags::MacroDirective}]
161
- def named_macros
162
- @named_macros ||= begin
163
- result = {}
164
- pins.each do |pin|
165
- pin.macros.select{|m| m.tag.tag_name == 'macro' && !m.tag.text.empty? }.each do |macro|
166
- next if macro.tag.name.nil? || macro.tag.name.empty?
167
- result[macro.tag.name] = macro
168
- end
169
- end
170
- result
171
- end
172
- end
173
-
174
- # @return [Enumerable<Pin::Block>]
175
- def block_pins
176
- pins_by_class(Pin::Block)
177
- end
178
-
179
- # @generic T
180
- # @param klass [Class<generic<T>>]
181
- # @return [Set<generic<T>>]
182
- def pins_by_class klass
183
- index.pins_by_class klass
184
- end
185
-
186
- # @param fqns [String]
187
- # @return [Array<Solargraph::Pin::Namespace>]
188
- def fqns_pins fqns
189
- return [] if fqns.nil?
190
- if fqns.include?('::')
191
- parts = fqns.split('::')
192
- name = parts.pop
193
- base = parts.join('::')
194
- else
195
- base = ''
196
- name = fqns
197
- end
198
- fqns_pins_map[[base, name]]
199
- end
200
-
201
- private
202
-
203
- def index
204
- @indexes.last
205
- end
206
-
207
- def catalog pinsets
208
- @pinsets = pinsets
209
- @indexes = []
210
- pinsets.each do |pins|
211
- if @indexes.last && pins.empty?
212
- @indexes.push @indexes.last
213
- else
214
- @indexes.push(@indexes.last&.merge(pins) || Solargraph::ApiMap::Index.new(pins))
215
- end
216
- end
217
- true
218
- end
219
-
220
- # @return [Hash{::Array(String, String) => ::Array<Pin::Namespace>}]
221
- def fqns_pins_map
222
- @fqns_pins_map ||= Hash.new do |h, (base, name)|
223
- value = namespace_children(base).select { |pin| pin.name == name && pin.is_a?(Pin::Namespace) }
224
- h[[base, name]] = value
225
- end
226
- end
227
-
228
- # @return [Enumerable<Solargraph::Pin::Symbol>]
229
- def symbols
230
- index.pins_by_class(Pin::Symbol)
231
- end
232
-
233
- # @return [Hash{String => Array<String>}]
234
- def superclass_references
235
- index.superclass_references
236
- end
237
-
238
- # @return [Hash{String => Array<String>}]
239
- def include_references
240
- index.include_references
241
- end
242
-
243
- # @return [Hash{String => Array<String>}]
244
- def prepend_references
245
- index.prepend_references
246
- end
247
-
248
- # @return [Hash{String => Array<String>}]
249
- def extend_references
250
- index.extend_references
251
- end
252
-
253
- # @param name [String]
254
- # @return [Enumerable<Solargraph::Pin::Base>]
255
- def namespace_children name
256
- return [] unless index.namespace_hash.key?(name)
257
- index.namespace_hash[name]
258
- end
259
-
260
- # @return [Enumerable<Pin::InstanceVariable>]
261
- def all_instance_variables
262
- index.pins_by_class(Pin::InstanceVariable)
263
- end
264
- end
265
- end
266
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class ApiMap
5
+ # Queryable collection of Pins representing a Workspace, gems and the Ruby
6
+ # core.
7
+ #
8
+ class Store
9
+ # @param pinsets [Array<Enumerable<Pin::Base>>]
10
+ def initialize *pinsets
11
+ @pinsets = pinsets
12
+ catalog pinsets
13
+ end
14
+
15
+ # @return [Array<Solargraph::Pin::Base>]
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
49
+
50
+ def to_s
51
+ self.class.to_s
52
+ end
53
+
54
+ def inspect
55
+ to_s
56
+ end
57
+
58
+ # @param fqns [String]
59
+ # @param visibility [Array<Symbol>]
60
+ # @return [Enumerable<Solargraph::Pin::Namespace, Solargraph::Pin::Constant>]
61
+ def get_constants fqns, visibility = [:public]
62
+ namespace_children(fqns).select { |pin|
63
+ # @sg-ignore flow-sensitive typing not smart enough to handle this case
64
+ !pin.name.empty? && (pin.is_a?(Pin::Namespace) || pin.is_a?(Pin::Constant)) && visibility.include?(pin.visibility)
65
+ }
66
+ end
67
+
68
+ # @param fqns [String]
69
+ # @param scope [Symbol]
70
+ # @param visibility [Array<Symbol>]
71
+ # @return [Enumerable<Solargraph::Pin::Method>]
72
+ def get_methods fqns, scope: :instance, visibility: [:public]
73
+ all_pins = namespace_children(fqns).select do |pin|
74
+ # @sg-ignore https://github.com/castwide/solargraph/pull/1114
75
+ pin.is_a?(Pin::Method) && pin.scope == scope && visibility.include?(pin.visibility)
76
+ end
77
+ GemPins.combine_method_pins_by_path(all_pins)
78
+ end
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
+
83
+ # @param fqns [String]
84
+ # @return [Pin::Reference::Superclass]
85
+ def get_superclass fqns
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
103
+ end
104
+
105
+ # @param fqns [String]
106
+ # @return [Array<Pin::Reference::Include>]
107
+ def get_includes fqns
108
+ include_references[fqns] || []
109
+ end
110
+
111
+ # @param fqns [String]
112
+ # @return [Array<Pin::Reference::Prepend>]
113
+ def get_prepends fqns
114
+ prepend_references[fqns] || []
115
+ end
116
+
117
+ # @param fqns [String]
118
+ # @return [Array<Pin::Reference::Extend>]
119
+ def get_extends fqns
120
+ extend_references[fqns] || []
121
+ end
122
+
123
+ # @param path [String]
124
+ # @return [Array<Solargraph::Pin::Base>]
125
+ def get_path_pins path
126
+ index.path_pin_hash[path]
127
+ end
128
+
129
+ # @param fqns [String]
130
+ # @param scope [Symbol] :class or :instance
131
+ # @return [Enumerable<Solargraph::Pin::Base>]
132
+ def get_instance_variables(fqns, scope = :instance)
133
+ all_instance_variables.select { |pin|
134
+ pin.binder.namespace == fqns && pin.binder.scope == scope
135
+ }
136
+ end
137
+
138
+ # @param fqns [String]
139
+ #
140
+ # @return [Enumerable<Solargraph::Pin::ClassVariable>]
141
+ def get_class_variables(fqns)
142
+ namespace_children(fqns).select { |pin| pin.is_a?(Pin::ClassVariable)}
143
+ end
144
+
145
+ # @return [Enumerable<Solargraph::Pin::Base>]
146
+ def get_symbols
147
+ symbols.uniq(&:name)
148
+ end
149
+
150
+ # @param fqns [String]
151
+ # @return [Boolean]
152
+ def namespace_exists?(fqns)
153
+ fqns_pins(fqns).any?
154
+ end
155
+
156
+ # @return [Enumerable<Solargraph::Pin::Namespace>]
157
+ def namespace_pins
158
+ pins_by_class(Solargraph::Pin::Namespace)
159
+ end
160
+
161
+ # @return [Enumerable<Solargraph::Pin::Method>]
162
+ def method_pins
163
+ pins_by_class(Solargraph::Pin::Method)
164
+ end
165
+
166
+ # @param fqns [String]
167
+ # @return [Array<String>]
168
+ def domains(fqns)
169
+ result = []
170
+ fqns_pins(fqns).each do |nspin|
171
+ result.concat nspin.domains
172
+ end
173
+ result
174
+ end
175
+
176
+ # @return [Hash{String => YARD::Tags::MacroDirective}]
177
+ def named_macros
178
+ @named_macros ||= begin
179
+ result = {}
180
+ pins.each do |pin|
181
+ pin.macros.select{|m| m.tag.tag_name == 'macro' && !m.tag.text.empty? }.each do |macro|
182
+ next if macro.tag.name.nil? || macro.tag.name.empty?
183
+ result[macro.tag.name] = macro
184
+ end
185
+ end
186
+ result
187
+ end
188
+ end
189
+
190
+ # @return [Enumerable<Pin::Block>]
191
+ def block_pins
192
+ pins_by_class(Pin::Block)
193
+ end
194
+
195
+ # @generic T
196
+ # @param klass [Class<generic<T>>]
197
+ # @return [Set<generic<T>>]
198
+ def pins_by_class klass
199
+ index.pins_by_class klass
200
+ end
201
+
202
+ # @param fqns [String]
203
+ # @return [Array<Solargraph::Pin::Namespace>]
204
+ def fqns_pins fqns
205
+ return [] if fqns.nil?
206
+ if fqns.include?('::')
207
+ parts = fqns.split('::')
208
+ name = parts.pop
209
+ base = parts.join('::')
210
+ else
211
+ base = ''
212
+ name = fqns
213
+ end
214
+ fqns_pins_map[[base, name]]
215
+ end
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
+
269
+ private
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
+
295
+ # @return [Hash{::Array(String, String) => ::Array<Pin::Namespace>}]
296
+ def fqns_pins_map
297
+ # @param h [Hash{::Array(String, String) => ::Array<Pin::Namespace>}]
298
+ # @param base [String]
299
+ # @param name [String]
300
+ @fqns_pins_map ||= Hash.new do |h, (base, name)|
301
+ value = namespace_children(base).select { |pin| pin.name == name && pin.is_a?(Pin::Namespace) }
302
+ h[[base, name]] = value
303
+ end
304
+ end
305
+
306
+ # @return [Enumerable<Solargraph::Pin::Symbol>]
307
+ def symbols
308
+ index.pins_by_class(Pin::Symbol)
309
+ end
310
+
311
+ # @return [Hash{String => Array<String>}]
312
+ def superclass_references
313
+ index.superclass_references
314
+ end
315
+
316
+ # @return [Hash{String => Array<Pin::Reference::Include>}]
317
+ def include_references
318
+ index.include_references
319
+ end
320
+
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>}]
327
+ def prepend_references
328
+ index.prepend_references
329
+ end
330
+
331
+ # @return [Hash{String => Array<Pin::Reference::Extend>}]
332
+ def extend_references
333
+ index.extend_references
334
+ end
335
+
336
+ # @param name [String]
337
+ # @return [Enumerable<Solargraph::Pin::Base>]
338
+ def namespace_children name
339
+ return [] unless index.namespace_hash.key?(name)
340
+ index.namespace_hash[name]
341
+ end
342
+
343
+ # @return [Enumerable<Pin::InstanceVariable>]
344
+ def all_instance_variables
345
+ index.pins_by_class(Pin::InstanceVariable)
346
+ end
347
+
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
358
+ end
359
+
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)
364
+ end
365
+
366
+ # @return [Hash{String => String, nil}]
367
+ def cached_qualify_superclass
368
+ @cached_qualify_superclass ||= {}
369
+ end
370
+
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
381
+ end
382
+ end
383
+ end
384
+ end