solargraph 0.46.0 → 0.54.5

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