solargraph 0.44.2 → 0.46.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 (246) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +41 -0
  3. data/.gitignore +9 -9
  4. data/.rspec +2 -2
  5. data/.travis.yml +19 -19
  6. data/CHANGELOG.md +1115 -1088
  7. data/Gemfile +0 -0
  8. data/LICENSE +0 -0
  9. data/README.md +128 -120
  10. data/Rakefile +0 -0
  11. data/SPONSORS.md +18 -15
  12. data/bin/solargraph +0 -0
  13. data/lib/solargraph/api_map/bundler_methods.rb +22 -22
  14. data/lib/solargraph/api_map/cache.rb +70 -70
  15. data/lib/solargraph/api_map/source_to_yard.rb +81 -81
  16. data/lib/solargraph/api_map/store.rb +256 -256
  17. data/lib/solargraph/api_map.rb +686 -681
  18. data/lib/solargraph/bench.rb +27 -27
  19. data/lib/solargraph/compat.rb +37 -37
  20. data/lib/solargraph/complex_type/type_methods.rb +130 -130
  21. data/lib/solargraph/complex_type/unique_type.rb +75 -75
  22. data/lib/solargraph/complex_type.rb +221 -221
  23. data/lib/solargraph/convention/base.rb +33 -33
  24. data/lib/solargraph/convention/gemfile.rb +15 -15
  25. data/lib/solargraph/convention/gemspec.rb +22 -22
  26. data/lib/solargraph/convention/rspec.rb +30 -21
  27. data/lib/solargraph/convention.rb +47 -47
  28. data/lib/solargraph/converters/dd.rb +12 -12
  29. data/lib/solargraph/converters/dl.rb +12 -12
  30. data/lib/solargraph/converters/dt.rb +12 -12
  31. data/lib/solargraph/converters/misc.rb +1 -1
  32. data/lib/solargraph/diagnostics/base.rb +29 -29
  33. data/lib/solargraph/diagnostics/require_not_found.rb +53 -37
  34. data/lib/solargraph/diagnostics/rubocop.rb +98 -98
  35. data/lib/solargraph/diagnostics/rubocop_helpers.rb +63 -63
  36. data/lib/solargraph/diagnostics/severities.rb +15 -15
  37. data/lib/solargraph/diagnostics/type_check.rb +54 -54
  38. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  39. data/lib/solargraph/diagnostics.rb +55 -55
  40. data/lib/solargraph/documentor.rb +76 -76
  41. data/lib/solargraph/environ.rb +45 -45
  42. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
  43. data/lib/solargraph/language_server/error_codes.rb +20 -20
  44. data/lib/solargraph/language_server/host/cataloger.rb +56 -56
  45. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  46. data/lib/solargraph/language_server/host/dispatch.rb +111 -111
  47. data/lib/solargraph/language_server/host/message_worker.rb +59 -59
  48. data/lib/solargraph/language_server/host/sources.rb +156 -156
  49. data/lib/solargraph/language_server/host.rb +865 -865
  50. data/lib/solargraph/language_server/message/base.rb +89 -89
  51. data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
  52. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  53. data/lib/solargraph/language_server/message/client.rb +11 -11
  54. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -58
  55. data/lib/solargraph/language_server/message/completion_item.rb +11 -11
  56. data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
  57. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -100
  58. data/lib/solargraph/language_server/message/extended/document.rb +20 -20
  59. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  60. data/lib/solargraph/language_server/message/extended/download_core.rb +23 -23
  61. data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
  62. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  63. data/lib/solargraph/language_server/message/extended.rb +21 -21
  64. data/lib/solargraph/language_server/message/initialize.rb +162 -162
  65. data/lib/solargraph/language_server/message/initialized.rb +27 -27
  66. data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
  67. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
  68. data/lib/solargraph/language_server/message/shutdown.rb +13 -13
  69. data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
  70. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
  71. data/lib/solargraph/language_server/message/text_document/completion.rb +59 -59
  72. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
  73. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
  74. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
  75. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
  76. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
  77. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  78. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -23
  79. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
  80. data/lib/solargraph/language_server/message/text_document/formatting.rb +126 -126
  81. data/lib/solargraph/language_server/message/text_document/hover.rb +54 -44
  82. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
  83. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  84. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  85. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  86. data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -29
  87. data/lib/solargraph/language_server/message/text_document.rb +28 -28
  88. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +30 -30
  89. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -33
  90. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
  91. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  92. data/lib/solargraph/language_server/message/workspace.rb +14 -14
  93. data/lib/solargraph/language_server/message.rb +93 -93
  94. data/lib/solargraph/language_server/message_types.rb +14 -14
  95. data/lib/solargraph/language_server/request.rb +24 -24
  96. data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
  97. data/lib/solargraph/language_server/transport/adapter.rb +53 -53
  98. data/lib/solargraph/language_server/transport/data_reader.rb +72 -72
  99. data/lib/solargraph/language_server/transport.rb +13 -13
  100. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  101. data/lib/solargraph/language_server.rb +19 -19
  102. data/lib/solargraph/library.rb +546 -546
  103. data/lib/solargraph/location.rb +37 -37
  104. data/lib/solargraph/logging.rb +27 -27
  105. data/lib/solargraph/page.rb +83 -83
  106. data/lib/solargraph/parser/comment_ripper.rb +52 -52
  107. data/lib/solargraph/parser/legacy/class_methods.rb +135 -140
  108. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -16
  109. data/lib/solargraph/parser/legacy/node_chainer.rb +148 -148
  110. data/lib/solargraph/parser/legacy/node_methods.rb +325 -325
  111. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -23
  112. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -35
  113. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -15
  114. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +42 -42
  115. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -25
  116. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -23
  117. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -63
  118. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -36
  119. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -23
  120. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -38
  121. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -28
  122. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -39
  123. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -16
  124. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -36
  125. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -21
  126. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -257
  127. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -18
  128. data/lib/solargraph/parser/legacy/node_processors.rb +54 -54
  129. data/lib/solargraph/parser/legacy.rb +12 -12
  130. data/lib/solargraph/parser/node_methods.rb +43 -43
  131. data/lib/solargraph/parser/node_processor/base.rb +77 -77
  132. data/lib/solargraph/parser/node_processor.rb +43 -43
  133. data/lib/solargraph/parser/region.rb +66 -66
  134. data/lib/solargraph/parser/rubyvm/class_methods.rb +144 -155
  135. data/lib/solargraph/parser/rubyvm/node_chainer.rb +160 -160
  136. data/lib/solargraph/parser/rubyvm/node_methods.rb +315 -315
  137. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -23
  138. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +85 -85
  139. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -15
  140. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +42 -42
  141. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -22
  142. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -23
  143. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +63 -64
  144. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -57
  145. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -23
  146. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -38
  147. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -39
  148. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -20
  149. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -27
  150. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -39
  151. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -26
  152. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -15
  153. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -45
  154. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -21
  155. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -15
  156. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -277
  157. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -18
  158. data/lib/solargraph/parser/rubyvm/node_processors.rb +63 -62
  159. data/lib/solargraph/parser/rubyvm.rb +40 -40
  160. data/lib/solargraph/parser/snippet.rb +13 -13
  161. data/lib/solargraph/parser.rb +26 -26
  162. data/lib/solargraph/pin/base.rb +296 -296
  163. data/lib/solargraph/pin/base_variable.rb +84 -84
  164. data/lib/solargraph/pin/block.rb +72 -72
  165. data/lib/solargraph/pin/class_variable.rb +8 -8
  166. data/lib/solargraph/pin/closure.rb +37 -37
  167. data/lib/solargraph/pin/common.rb +70 -70
  168. data/lib/solargraph/pin/constant.rb +43 -43
  169. data/lib/solargraph/pin/conversions.rb +96 -96
  170. data/lib/solargraph/pin/documenting.rb +105 -105
  171. data/lib/solargraph/pin/duck_method.rb +16 -16
  172. data/lib/solargraph/pin/global_variable.rb +8 -8
  173. data/lib/solargraph/pin/instance_variable.rb +30 -30
  174. data/lib/solargraph/pin/keyword.rb +15 -15
  175. data/lib/solargraph/pin/keyword_param.rb +8 -8
  176. data/lib/solargraph/pin/local_variable.rb +55 -55
  177. data/lib/solargraph/pin/method.rb +245 -245
  178. data/lib/solargraph/pin/method_alias.rb +31 -31
  179. data/lib/solargraph/pin/namespace.rb +91 -91
  180. data/lib/solargraph/pin/parameter.rb +201 -206
  181. data/lib/solargraph/pin/proxy_type.rb +29 -29
  182. data/lib/solargraph/pin/reference/extend.rb +10 -10
  183. data/lib/solargraph/pin/reference/include.rb +10 -10
  184. data/lib/solargraph/pin/reference/override.rb +29 -29
  185. data/lib/solargraph/pin/reference/prepend.rb +10 -10
  186. data/lib/solargraph/pin/reference/require.rb +14 -14
  187. data/lib/solargraph/pin/reference/superclass.rb +10 -10
  188. data/lib/solargraph/pin/reference.rb +14 -14
  189. data/lib/solargraph/pin/search.rb +56 -0
  190. data/lib/solargraph/pin/singleton.rb +11 -11
  191. data/lib/solargraph/pin/symbol.rb +47 -47
  192. data/lib/solargraph/pin.rb +37 -36
  193. data/lib/solargraph/position.rb +100 -100
  194. data/lib/solargraph/range.rb +95 -95
  195. data/lib/solargraph/server_methods.rb +16 -16
  196. data/lib/solargraph/shell.rb +226 -226
  197. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  198. data/lib/solargraph/source/chain/call.rb +204 -204
  199. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  200. data/lib/solargraph/source/chain/constant.rb +75 -75
  201. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  202. data/lib/solargraph/source/chain/hash.rb +28 -28
  203. data/lib/solargraph/source/chain/head.rb +19 -19
  204. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  205. data/lib/solargraph/source/chain/link.rb +71 -71
  206. data/lib/solargraph/source/chain/literal.rb +23 -23
  207. data/lib/solargraph/source/chain/or.rb +23 -23
  208. data/lib/solargraph/source/chain/q_call.rb +11 -11
  209. data/lib/solargraph/source/chain/variable.rb +13 -13
  210. data/lib/solargraph/source/chain/z_super.rb +30 -30
  211. data/lib/solargraph/source/chain.rb +164 -164
  212. data/lib/solargraph/source/change.rb +79 -79
  213. data/lib/solargraph/source/cursor.rb +164 -164
  214. data/lib/solargraph/source/source_chainer.rb +191 -191
  215. data/lib/solargraph/source/updater.rb +54 -54
  216. data/lib/solargraph/source.rb +522 -522
  217. data/lib/solargraph/source_map/clip.rb +224 -224
  218. data/lib/solargraph/source_map/completion.rb +23 -23
  219. data/lib/solargraph/source_map/mapper.rb +212 -212
  220. data/lib/solargraph/source_map.rb +180 -189
  221. data/lib/solargraph/type_checker/checks.rb +99 -99
  222. data/lib/solargraph/type_checker/param_def.rb +35 -35
  223. data/lib/solargraph/type_checker/problem.rb +32 -32
  224. data/lib/solargraph/type_checker/rules.rb +57 -57
  225. data/lib/solargraph/type_checker.rb +543 -510
  226. data/lib/solargraph/version.rb +5 -5
  227. data/lib/solargraph/views/environment.erb +58 -58
  228. data/lib/solargraph/workspace/config.rb +231 -231
  229. data/lib/solargraph/workspace.rb +215 -214
  230. data/lib/solargraph/yard_map/cache.rb +19 -19
  231. data/lib/solargraph/yard_map/core_docs.rb +170 -170
  232. data/lib/solargraph/yard_map/core_fills.rb +208 -203
  233. data/lib/solargraph/yard_map/core_gen.rb +76 -76
  234. data/lib/solargraph/yard_map/helpers.rb +16 -16
  235. data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -25
  236. data/lib/solargraph/yard_map/mapper/to_method.rb +78 -78
  237. data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -27
  238. data/lib/solargraph/yard_map/mapper.rb +77 -77
  239. data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -140
  240. data/lib/solargraph/yard_map/stdlib_fills.rb +43 -43
  241. data/lib/solargraph/yard_map/to_method.rb +79 -79
  242. data/lib/solargraph/yard_map.rb +460 -443
  243. data/lib/solargraph.rb +69 -69
  244. data/lib/yard-solargraph.rb +33 -33
  245. data/solargraph.gemspec +0 -0
  246. metadata +14 -12
@@ -1,256 +1,256 @@
1
- # frozen_string_literal: true
2
-
3
- require 'set'
4
-
5
- module Solargraph
6
- class ApiMap
7
- class Store
8
- # @return [Enumerable<Solargraph::Pin::Base>]
9
- attr_reader :pins
10
-
11
- # @param pins [Enumerable<Solargraph::Pin::Base>]
12
- def initialize pins = []
13
- @pins = pins
14
- index
15
- end
16
-
17
- # @param fqns [String]
18
- # @param visibility [Array<Symbol>]
19
- # @return [Enumerable<Solargraph::Pin::Base>]
20
- def get_constants fqns, visibility = [:public]
21
- namespace_children(fqns).select { |pin|
22
- !pin.name.empty? && (pin.is_a?(Pin::Namespace) || pin.is_a?(Pin::Constant)) && visibility.include?(pin.visibility)
23
- }
24
- end
25
-
26
- # @param fqns [String]
27
- # @param scope [Symbol]
28
- # @param visibility [Array<Symbol>]
29
- # @return [Enumerable<Solargraph::Pin::Base>]
30
- def get_methods fqns, scope: :instance, visibility: [:public]
31
- namespace_children(fqns).select do |pin|
32
- pin.is_a?(Pin::Method) && pin.scope == scope && visibility.include?(pin.visibility)
33
- end
34
- end
35
-
36
- # @param fqns [String]
37
- # @return [String, nil]
38
- def get_superclass fqns
39
- return superclass_references[fqns].first if superclass_references.key?(fqns)
40
- return 'Object' if fqns != 'BasicObject' && namespace_exists?(fqns)
41
- return 'Object' if fqns == 'Boolean'
42
- nil
43
- end
44
-
45
- # @param fqns [String]
46
- # @return [Array<String>]
47
- def get_includes fqns
48
- include_references[fqns] || []
49
- end
50
-
51
- # @param fqns [String]
52
- # @return [Array<String>]
53
- def get_prepends fqns
54
- prepend_references[fqns] || []
55
- end
56
-
57
- # @param fqns [String]
58
- # @return [Array<String>]
59
- def get_extends fqns
60
- extend_references[fqns] || []
61
- end
62
-
63
- # @param path [String]
64
- # @return [Enumerable<Solargraph::Pin::Base>]
65
- def get_path_pins path
66
- path_pin_hash[path] || []
67
- end
68
-
69
- # @param fqns [String]
70
- # @param scope [Symbol] :class or :instance
71
- # @return [Enumerable<Solargraph::Pin::Base>]
72
- def get_instance_variables(fqns, scope = :instance)
73
- all_instance_variables.select { |pin|
74
- pin.binder.namespace == fqns && pin.binder.scope == scope
75
- }
76
- end
77
-
78
- # @param fqns [String]
79
- # @return [Enumerable<Solargraph::Pin::Base>]
80
- def get_class_variables(fqns)
81
- namespace_children(fqns).select{|pin| pin.is_a?(Pin::ClassVariable)}
82
- end
83
-
84
- # @return [Enumerable<Solargraph::Pin::Base>]
85
- def get_symbols
86
- symbols.uniq(&:name)
87
- end
88
-
89
- # @param fqns [String]
90
- # @return [Boolean]
91
- def namespace_exists?(fqns)
92
- fqns_pins(fqns).any?
93
- end
94
-
95
- # @return [Set<String>]
96
- def namespaces
97
- @namespaces ||= Set.new
98
- end
99
-
100
- # @return [Enumerable<Solargraph::Pin::Base>]
101
- def namespace_pins
102
- pins_by_class(Solargraph::Pin::Namespace)
103
- end
104
-
105
- # @return [Enumerable<Solargraph::Pin::Method>]
106
- def method_pins
107
- pins_by_class(Solargraph::Pin::Method)
108
- end
109
-
110
- # @param fqns [String]
111
- # @return [Array<String>]
112
- def domains(fqns)
113
- result = []
114
- fqns_pins(fqns).each do |nspin|
115
- result.concat nspin.domains
116
- end
117
- result
118
- end
119
-
120
- # @return [Hash]
121
- def named_macros
122
- @named_macros ||= begin
123
- result = {}
124
- pins.each do |pin|
125
- pin.macros.select{|m| m.tag.tag_name == 'macro' && !m.tag.text.empty? }.each do |macro|
126
- next if macro.tag.name.nil? || macro.tag.name.empty?
127
- result[macro.tag.name] = macro
128
- end
129
- end
130
- result
131
- end
132
- end
133
-
134
- # @return [Enumerable<Pin::Block>]
135
- def block_pins
136
- pins_by_class(Pin::Block)
137
- end
138
-
139
- def inspect
140
- # Avoid insane dumps in specs
141
- to_s
142
- end
143
-
144
- # @param klass [Class]
145
- # @return [Enumerable<Solargraph::Pin::Base>]
146
- def pins_by_class klass
147
- @pin_select_cache[klass] ||= @pin_class_hash.each_with_object(Set.new) { |(key, o), n| n.merge(o) if key <= klass }
148
- end
149
-
150
- private
151
-
152
- # @param fqns [String]
153
- # @return [Array<Solargraph::Pin::Namespace>]
154
- def fqns_pins fqns
155
- return [] if fqns.nil?
156
- if fqns.include?('::')
157
- parts = fqns.split('::')
158
- name = parts.pop
159
- base = parts.join('::')
160
- else
161
- base = ''
162
- name = fqns
163
- end
164
- fqns_pins_map[[base, name]]
165
- end
166
-
167
- def fqns_pins_map
168
- @fqns_pins_map ||= Hash.new do |h, (base, name)|
169
- value = namespace_children(base).select { |pin| pin.name == name && pin.is_a?(Pin::Namespace) }
170
- h[[base, name]] = value
171
- end
172
- end
173
-
174
- # @return [Enumerable<Solargraph::Pin::Symbol>]
175
- def symbols
176
- pins_by_class(Pin::Symbol)
177
- end
178
-
179
- def superclass_references
180
- @superclass_references ||= {}
181
- end
182
-
183
- def include_references
184
- @include_references ||= {}
185
- end
186
-
187
- def prepend_references
188
- @prepend_references ||= {}
189
- end
190
-
191
- def extend_references
192
- @extend_references ||= {}
193
- end
194
-
195
- # @param name [String]
196
- # @return [Enumerable<Solargraph::Pin::Base>]
197
- def namespace_children name
198
- namespace_map[name] || []
199
- end
200
-
201
- # @return [Hash]
202
- def namespace_map
203
- @namespace_map ||= {}
204
- end
205
-
206
- def all_instance_variables
207
- pins_by_class(Pin::InstanceVariable)
208
- end
209
-
210
- def path_pin_hash
211
- @path_pin_hash ||= {}
212
- end
213
-
214
- # @return [void]
215
- def index
216
- set = pins.to_set
217
- @pin_class_hash = set.classify(&:class).transform_values(&:to_a)
218
- @pin_select_cache = {}
219
- @namespace_map = set.classify(&:namespace)
220
- @path_pin_hash = set.classify(&:path)
221
- @namespaces = @path_pin_hash.keys.compact.to_set
222
- pins_by_class(Pin::Reference::Include).each do |pin|
223
- include_references[pin.namespace] ||= []
224
- include_references[pin.namespace].push pin.name
225
- end
226
- pins_by_class(Pin::Reference::Prepend).each do |pin|
227
- prepend_references[pin.namespace] ||= []
228
- prepend_references[pin.namespace].push pin.name
229
- end
230
- pins_by_class(Pin::Reference::Extend).each do |pin|
231
- extend_references[pin.namespace] ||= []
232
- extend_references[pin.namespace].push pin.name
233
- end
234
- pins_by_class(Pin::Reference::Superclass).each do |pin|
235
- superclass_references[pin.namespace] ||= []
236
- superclass_references[pin.namespace].push pin.name
237
- end
238
- pins_by_class(Pin::Reference::Override).each do |ovr|
239
- pin = get_path_pins(ovr.name).first
240
- next if pin.nil?
241
- new_pin = if pin.path.end_with?('#initialize')
242
- get_path_pins(pin.path.sub(/#initialize/, '.new')).first
243
- end
244
- (ovr.tags.map(&:tag_name) + ovr.delete).uniq.each do |tag|
245
- pin.docstring.delete_tags tag.to_sym
246
- new_pin.docstring.delete_tags tag.to_sym if new_pin
247
- end
248
- ovr.tags.each do |tag|
249
- pin.docstring.add_tag(tag)
250
- new_pin.docstring.add_tag(tag) if new_pin
251
- end
252
- end
253
- end
254
- end
255
- end
256
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ module Solargraph
6
+ class ApiMap
7
+ class Store
8
+ # @return [Enumerable<Solargraph::Pin::Base>]
9
+ attr_reader :pins
10
+
11
+ # @param pins [Enumerable<Solargraph::Pin::Base>]
12
+ def initialize pins = []
13
+ @pins = pins
14
+ index
15
+ end
16
+
17
+ # @param fqns [String]
18
+ # @param visibility [Array<Symbol>]
19
+ # @return [Enumerable<Solargraph::Pin::Base>]
20
+ def get_constants fqns, visibility = [:public]
21
+ namespace_children(fqns).select { |pin|
22
+ !pin.name.empty? && (pin.is_a?(Pin::Namespace) || pin.is_a?(Pin::Constant)) && visibility.include?(pin.visibility)
23
+ }
24
+ end
25
+
26
+ # @param fqns [String]
27
+ # @param scope [Symbol]
28
+ # @param visibility [Array<Symbol>]
29
+ # @return [Enumerable<Solargraph::Pin::Base>]
30
+ def get_methods fqns, scope: :instance, visibility: [:public]
31
+ namespace_children(fqns).select do |pin|
32
+ pin.is_a?(Pin::Method) && pin.scope == scope && visibility.include?(pin.visibility)
33
+ end
34
+ end
35
+
36
+ # @param fqns [String]
37
+ # @return [String, nil]
38
+ def get_superclass fqns
39
+ return superclass_references[fqns].first if superclass_references.key?(fqns)
40
+ return 'Object' if fqns != 'BasicObject' && namespace_exists?(fqns)
41
+ return 'Object' if fqns == 'Boolean'
42
+ nil
43
+ end
44
+
45
+ # @param fqns [String]
46
+ # @return [Array<String>]
47
+ def get_includes fqns
48
+ include_references[fqns] || []
49
+ end
50
+
51
+ # @param fqns [String]
52
+ # @return [Array<String>]
53
+ def get_prepends fqns
54
+ prepend_references[fqns] || []
55
+ end
56
+
57
+ # @param fqns [String]
58
+ # @return [Array<String>]
59
+ def get_extends fqns
60
+ extend_references[fqns] || []
61
+ end
62
+
63
+ # @param path [String]
64
+ # @return [Enumerable<Solargraph::Pin::Base>]
65
+ def get_path_pins path
66
+ path_pin_hash[path] || []
67
+ end
68
+
69
+ # @param fqns [String]
70
+ # @param scope [Symbol] :class or :instance
71
+ # @return [Enumerable<Solargraph::Pin::Base>]
72
+ def get_instance_variables(fqns, scope = :instance)
73
+ all_instance_variables.select { |pin|
74
+ pin.binder.namespace == fqns && pin.binder.scope == scope
75
+ }
76
+ end
77
+
78
+ # @param fqns [String]
79
+ # @return [Enumerable<Solargraph::Pin::Base>]
80
+ def get_class_variables(fqns)
81
+ namespace_children(fqns).select{|pin| pin.is_a?(Pin::ClassVariable)}
82
+ end
83
+
84
+ # @return [Enumerable<Solargraph::Pin::Base>]
85
+ def get_symbols
86
+ symbols.uniq(&:name)
87
+ end
88
+
89
+ # @param fqns [String]
90
+ # @return [Boolean]
91
+ def namespace_exists?(fqns)
92
+ fqns_pins(fqns).any?
93
+ end
94
+
95
+ # @return [Set<String>]
96
+ def namespaces
97
+ @namespaces ||= Set.new
98
+ end
99
+
100
+ # @return [Enumerable<Solargraph::Pin::Base>]
101
+ def namespace_pins
102
+ pins_by_class(Solargraph::Pin::Namespace)
103
+ end
104
+
105
+ # @return [Enumerable<Solargraph::Pin::Method>]
106
+ def method_pins
107
+ pins_by_class(Solargraph::Pin::Method)
108
+ end
109
+
110
+ # @param fqns [String]
111
+ # @return [Array<String>]
112
+ def domains(fqns)
113
+ result = []
114
+ fqns_pins(fqns).each do |nspin|
115
+ result.concat nspin.domains
116
+ end
117
+ result
118
+ end
119
+
120
+ # @return [Hash]
121
+ def named_macros
122
+ @named_macros ||= begin
123
+ result = {}
124
+ pins.each do |pin|
125
+ pin.macros.select{|m| m.tag.tag_name == 'macro' && !m.tag.text.empty? }.each do |macro|
126
+ next if macro.tag.name.nil? || macro.tag.name.empty?
127
+ result[macro.tag.name] = macro
128
+ end
129
+ end
130
+ result
131
+ end
132
+ end
133
+
134
+ # @return [Enumerable<Pin::Block>]
135
+ def block_pins
136
+ pins_by_class(Pin::Block)
137
+ end
138
+
139
+ def inspect
140
+ # Avoid insane dumps in specs
141
+ to_s
142
+ end
143
+
144
+ # @param klass [Class]
145
+ # @return [Enumerable<Solargraph::Pin::Base>]
146
+ def pins_by_class klass
147
+ @pin_select_cache[klass] ||= @pin_class_hash.each_with_object(Set.new) { |(key, o), n| n.merge(o) if key <= klass }
148
+ end
149
+
150
+ private
151
+
152
+ # @param fqns [String]
153
+ # @return [Array<Solargraph::Pin::Namespace>]
154
+ def fqns_pins fqns
155
+ return [] if fqns.nil?
156
+ if fqns.include?('::')
157
+ parts = fqns.split('::')
158
+ name = parts.pop
159
+ base = parts.join('::')
160
+ else
161
+ base = ''
162
+ name = fqns
163
+ end
164
+ fqns_pins_map[[base, name]]
165
+ end
166
+
167
+ def fqns_pins_map
168
+ @fqns_pins_map ||= Hash.new do |h, (base, name)|
169
+ value = namespace_children(base).select { |pin| pin.name == name && pin.is_a?(Pin::Namespace) }
170
+ h[[base, name]] = value
171
+ end
172
+ end
173
+
174
+ # @return [Enumerable<Solargraph::Pin::Symbol>]
175
+ def symbols
176
+ pins_by_class(Pin::Symbol)
177
+ end
178
+
179
+ def superclass_references
180
+ @superclass_references ||= {}
181
+ end
182
+
183
+ def include_references
184
+ @include_references ||= {}
185
+ end
186
+
187
+ def prepend_references
188
+ @prepend_references ||= {}
189
+ end
190
+
191
+ def extend_references
192
+ @extend_references ||= {}
193
+ end
194
+
195
+ # @param name [String]
196
+ # @return [Enumerable<Solargraph::Pin::Base>]
197
+ def namespace_children name
198
+ namespace_map[name] || []
199
+ end
200
+
201
+ # @return [Hash]
202
+ def namespace_map
203
+ @namespace_map ||= {}
204
+ end
205
+
206
+ def all_instance_variables
207
+ pins_by_class(Pin::InstanceVariable)
208
+ end
209
+
210
+ def path_pin_hash
211
+ @path_pin_hash ||= {}
212
+ end
213
+
214
+ # @return [void]
215
+ def index
216
+ set = pins.to_set
217
+ @pin_class_hash = set.classify(&:class).transform_values(&:to_a)
218
+ @pin_select_cache = {}
219
+ @namespace_map = set.classify(&:namespace)
220
+ @path_pin_hash = set.classify(&:path)
221
+ @namespaces = @path_pin_hash.keys.compact.to_set
222
+ pins_by_class(Pin::Reference::Include).each do |pin|
223
+ include_references[pin.namespace] ||= []
224
+ include_references[pin.namespace].push pin.name
225
+ end
226
+ pins_by_class(Pin::Reference::Prepend).each do |pin|
227
+ prepend_references[pin.namespace] ||= []
228
+ prepend_references[pin.namespace].push pin.name
229
+ end
230
+ pins_by_class(Pin::Reference::Extend).each do |pin|
231
+ extend_references[pin.namespace] ||= []
232
+ extend_references[pin.namespace].push pin.name
233
+ end
234
+ pins_by_class(Pin::Reference::Superclass).each do |pin|
235
+ superclass_references[pin.namespace] ||= []
236
+ superclass_references[pin.namespace].push pin.name
237
+ end
238
+ pins_by_class(Pin::Reference::Override).each do |ovr|
239
+ pin = get_path_pins(ovr.name).first
240
+ next if pin.nil?
241
+ new_pin = if pin.path.end_with?('#initialize')
242
+ get_path_pins(pin.path.sub(/#initialize/, '.new')).first
243
+ end
244
+ (ovr.tags.map(&:tag_name) + ovr.delete).uniq.each do |tag|
245
+ pin.docstring.delete_tags tag.to_sym
246
+ new_pin.docstring.delete_tags tag.to_sym if new_pin
247
+ end
248
+ ovr.tags.each do |tag|
249
+ pin.docstring.add_tag(tag)
250
+ new_pin.docstring.add_tag(tag) if new_pin
251
+ end
252
+ end
253
+ end
254
+ end
255
+ end
256
+ end