jimeh-solargraph 0.40.4.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 (252) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +54 -0
  3. data/.gitignore +9 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +24 -0
  6. data/.yardopts +2 -0
  7. data/CHANGELOG.md +1003 -0
  8. data/Gemfile +7 -0
  9. data/LICENSE +21 -0
  10. data/README.md +123 -0
  11. data/Rakefile +25 -0
  12. data/SPONSORS.md +15 -0
  13. data/bin/solargraph +5 -0
  14. data/jimeh-solargraph.gemspec +44 -0
  15. data/lib/.rubocop.yml +21 -0
  16. data/lib/solargraph.rb +67 -0
  17. data/lib/solargraph/api_map.rb +752 -0
  18. data/lib/solargraph/api_map/bundler_methods.rb +27 -0
  19. data/lib/solargraph/api_map/cache.rb +70 -0
  20. data/lib/solargraph/api_map/source_to_yard.rb +81 -0
  21. data/lib/solargraph/api_map/store.rb +256 -0
  22. data/lib/solargraph/bench.rb +30 -0
  23. data/lib/solargraph/compat.rb +23 -0
  24. data/lib/solargraph/complex_type.rb +213 -0
  25. data/lib/solargraph/complex_type/type_methods.rb +127 -0
  26. data/lib/solargraph/complex_type/unique_type.rb +75 -0
  27. data/lib/solargraph/convention.rb +47 -0
  28. data/lib/solargraph/convention/base.rb +33 -0
  29. data/lib/solargraph/convention/gemfile.rb +15 -0
  30. data/lib/solargraph/convention/gemspec.rb +22 -0
  31. data/lib/solargraph/convention/rspec.rb +21 -0
  32. data/lib/solargraph/converters/dd.rb +12 -0
  33. data/lib/solargraph/converters/dl.rb +12 -0
  34. data/lib/solargraph/converters/dt.rb +12 -0
  35. data/lib/solargraph/converters/misc.rb +1 -0
  36. data/lib/solargraph/diagnostics.rb +55 -0
  37. data/lib/solargraph/diagnostics/base.rb +29 -0
  38. data/lib/solargraph/diagnostics/require_not_found.rb +37 -0
  39. data/lib/solargraph/diagnostics/rubocop.rb +90 -0
  40. data/lib/solargraph/diagnostics/rubocop_helpers.rb +45 -0
  41. data/lib/solargraph/diagnostics/severities.rb +15 -0
  42. data/lib/solargraph/diagnostics/type_check.rb +54 -0
  43. data/lib/solargraph/diagnostics/update_errors.rb +41 -0
  44. data/lib/solargraph/documentor.rb +78 -0
  45. data/lib/solargraph/environ.rb +45 -0
  46. data/lib/solargraph/language_server.rb +19 -0
  47. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -0
  48. data/lib/solargraph/language_server/error_codes.rb +20 -0
  49. data/lib/solargraph/language_server/host.rb +746 -0
  50. data/lib/solargraph/language_server/host/cataloger.rb +56 -0
  51. data/lib/solargraph/language_server/host/diagnoser.rb +81 -0
  52. data/lib/solargraph/language_server/host/dispatch.rb +112 -0
  53. data/lib/solargraph/language_server/host/sources.rb +156 -0
  54. data/lib/solargraph/language_server/message.rb +92 -0
  55. data/lib/solargraph/language_server/message/base.rb +85 -0
  56. data/lib/solargraph/language_server/message/cancel_request.rb +13 -0
  57. data/lib/solargraph/language_server/message/client.rb +11 -0
  58. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -0
  59. data/lib/solargraph/language_server/message/completion_item.rb +11 -0
  60. data/lib/solargraph/language_server/message/completion_item/resolve.rb +57 -0
  61. data/lib/solargraph/language_server/message/exit_notification.rb +13 -0
  62. data/lib/solargraph/language_server/message/extended.rb +21 -0
  63. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -0
  64. data/lib/solargraph/language_server/message/extended/document.rb +20 -0
  65. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -0
  66. data/lib/solargraph/language_server/message/extended/download_core.rb +23 -0
  67. data/lib/solargraph/language_server/message/extended/environment.rb +25 -0
  68. data/lib/solargraph/language_server/message/extended/search.rb +20 -0
  69. data/lib/solargraph/language_server/message/initialize.rb +153 -0
  70. data/lib/solargraph/language_server/message/initialized.rb +26 -0
  71. data/lib/solargraph/language_server/message/method_not_found.rb +16 -0
  72. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -0
  73. data/lib/solargraph/language_server/message/shutdown.rb +13 -0
  74. data/lib/solargraph/language_server/message/text_document.rb +28 -0
  75. data/lib/solargraph/language_server/message/text_document/base.rb +19 -0
  76. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -0
  77. data/lib/solargraph/language_server/message/text_document/completion.rb +57 -0
  78. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -0
  79. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -0
  80. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -0
  81. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -0
  82. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -0
  83. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -0
  84. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -0
  85. data/lib/solargraph/language_server/message/text_document/formatting.rb +105 -0
  86. data/lib/solargraph/language_server/message/text_document/hover.rb +44 -0
  87. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -0
  88. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -0
  89. data/lib/solargraph/language_server/message/text_document/references.rb +16 -0
  90. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -0
  91. data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -0
  92. data/lib/solargraph/language_server/message/workspace.rb +14 -0
  93. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +29 -0
  94. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -0
  95. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -0
  96. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -0
  97. data/lib/solargraph/language_server/message_types.rb +14 -0
  98. data/lib/solargraph/language_server/request.rb +24 -0
  99. data/lib/solargraph/language_server/symbol_kinds.rb +36 -0
  100. data/lib/solargraph/language_server/transport.rb +13 -0
  101. data/lib/solargraph/language_server/transport/adapter.rb +56 -0
  102. data/lib/solargraph/language_server/transport/data_reader.rb +72 -0
  103. data/lib/solargraph/language_server/uri_helpers.rb +49 -0
  104. data/lib/solargraph/library.rb +426 -0
  105. data/lib/solargraph/location.rb +37 -0
  106. data/lib/solargraph/logging.rb +27 -0
  107. data/lib/solargraph/page.rb +83 -0
  108. data/lib/solargraph/parser.rb +26 -0
  109. data/lib/solargraph/parser/comment_ripper.rb +52 -0
  110. data/lib/solargraph/parser/legacy.rb +12 -0
  111. data/lib/solargraph/parser/legacy/class_methods.rb +109 -0
  112. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -0
  113. data/lib/solargraph/parser/legacy/node_chainer.rb +118 -0
  114. data/lib/solargraph/parser/legacy/node_methods.rb +311 -0
  115. data/lib/solargraph/parser/legacy/node_processors.rb +54 -0
  116. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -0
  117. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -0
  118. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -0
  119. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +22 -0
  120. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -0
  121. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -0
  122. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -0
  123. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -0
  124. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -0
  125. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -0
  126. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -0
  127. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -0
  128. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -0
  129. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -0
  130. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -0
  131. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -0
  132. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -0
  133. data/lib/solargraph/parser/node_methods.rb +43 -0
  134. data/lib/solargraph/parser/node_processor.rb +43 -0
  135. data/lib/solargraph/parser/node_processor/base.rb +80 -0
  136. data/lib/solargraph/parser/region.rb +66 -0
  137. data/lib/solargraph/parser/rubyvm.rb +40 -0
  138. data/lib/solargraph/parser/rubyvm/class_methods.rb +150 -0
  139. data/lib/solargraph/parser/rubyvm/node_chainer.rb +135 -0
  140. data/lib/solargraph/parser/rubyvm/node_methods.rb +301 -0
  141. data/lib/solargraph/parser/rubyvm/node_processors.rb +62 -0
  142. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -0
  143. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +86 -0
  144. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -0
  145. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +22 -0
  146. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -0
  147. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -0
  148. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +64 -0
  149. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -0
  150. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -0
  151. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -0
  152. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -0
  153. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -0
  154. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -0
  155. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -0
  156. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -0
  157. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -0
  158. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -0
  159. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -0
  160. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -0
  161. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -0
  162. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -0
  163. data/lib/solargraph/parser/snippet.rb +13 -0
  164. data/lib/solargraph/pin.rb +36 -0
  165. data/lib/solargraph/pin/base.rb +296 -0
  166. data/lib/solargraph/pin/base_variable.rb +84 -0
  167. data/lib/solargraph/pin/block.rb +62 -0
  168. data/lib/solargraph/pin/class_variable.rb +8 -0
  169. data/lib/solargraph/pin/closure.rb +37 -0
  170. data/lib/solargraph/pin/common.rb +70 -0
  171. data/lib/solargraph/pin/constant.rb +43 -0
  172. data/lib/solargraph/pin/conversions.rb +96 -0
  173. data/lib/solargraph/pin/documenting.rb +105 -0
  174. data/lib/solargraph/pin/duck_method.rb +16 -0
  175. data/lib/solargraph/pin/global_variable.rb +8 -0
  176. data/lib/solargraph/pin/instance_variable.rb +30 -0
  177. data/lib/solargraph/pin/keyword.rb +15 -0
  178. data/lib/solargraph/pin/keyword_param.rb +8 -0
  179. data/lib/solargraph/pin/local_variable.rb +21 -0
  180. data/lib/solargraph/pin/localized.rb +43 -0
  181. data/lib/solargraph/pin/method.rb +245 -0
  182. data/lib/solargraph/pin/method_alias.rb +31 -0
  183. data/lib/solargraph/pin/namespace.rb +85 -0
  184. data/lib/solargraph/pin/parameter.rb +206 -0
  185. data/lib/solargraph/pin/proxy_type.rb +29 -0
  186. data/lib/solargraph/pin/reference.rb +14 -0
  187. data/lib/solargraph/pin/reference/extend.rb +10 -0
  188. data/lib/solargraph/pin/reference/include.rb +10 -0
  189. data/lib/solargraph/pin/reference/override.rb +29 -0
  190. data/lib/solargraph/pin/reference/prepend.rb +10 -0
  191. data/lib/solargraph/pin/reference/require.rb +14 -0
  192. data/lib/solargraph/pin/reference/superclass.rb +10 -0
  193. data/lib/solargraph/pin/singleton.rb +11 -0
  194. data/lib/solargraph/pin/symbol.rb +47 -0
  195. data/lib/solargraph/position.rb +100 -0
  196. data/lib/solargraph/range.rb +95 -0
  197. data/lib/solargraph/server_methods.rb +16 -0
  198. data/lib/solargraph/shell.rb +222 -0
  199. data/lib/solargraph/source.rb +537 -0
  200. data/lib/solargraph/source/chain.rb +154 -0
  201. data/lib/solargraph/source/chain/block_variable.rb +13 -0
  202. data/lib/solargraph/source/chain/call.rb +203 -0
  203. data/lib/solargraph/source/chain/class_variable.rb +13 -0
  204. data/lib/solargraph/source/chain/constant.rb +75 -0
  205. data/lib/solargraph/source/chain/global_variable.rb +13 -0
  206. data/lib/solargraph/source/chain/head.rb +35 -0
  207. data/lib/solargraph/source/chain/instance_variable.rb +13 -0
  208. data/lib/solargraph/source/chain/link.rb +67 -0
  209. data/lib/solargraph/source/chain/literal.rb +23 -0
  210. data/lib/solargraph/source/chain/or.rb +23 -0
  211. data/lib/solargraph/source/chain/variable.rb +13 -0
  212. data/lib/solargraph/source/chain/z_super.rb +30 -0
  213. data/lib/solargraph/source/change.rb +79 -0
  214. data/lib/solargraph/source/cursor.rb +164 -0
  215. data/lib/solargraph/source/encoding_fixes.rb +23 -0
  216. data/lib/solargraph/source/source_chainer.rb +190 -0
  217. data/lib/solargraph/source/updater.rb +54 -0
  218. data/lib/solargraph/source_map.rb +188 -0
  219. data/lib/solargraph/source_map/clip.rb +224 -0
  220. data/lib/solargraph/source_map/completion.rb +23 -0
  221. data/lib/solargraph/source_map/mapper.rb +215 -0
  222. data/lib/solargraph/type_checker.rb +503 -0
  223. data/lib/solargraph/type_checker/checks.rb +99 -0
  224. data/lib/solargraph/type_checker/param_def.rb +35 -0
  225. data/lib/solargraph/type_checker/problem.rb +32 -0
  226. data/lib/solargraph/type_checker/rules.rb +57 -0
  227. data/lib/solargraph/version.rb +5 -0
  228. data/lib/solargraph/views/_method.erb +62 -0
  229. data/lib/solargraph/views/_name_type_tag.erb +10 -0
  230. data/lib/solargraph/views/_namespace.erb +24 -0
  231. data/lib/solargraph/views/document.erb +23 -0
  232. data/lib/solargraph/views/environment.erb +58 -0
  233. data/lib/solargraph/views/layout.erb +44 -0
  234. data/lib/solargraph/views/search.erb +11 -0
  235. data/lib/solargraph/workspace.rb +209 -0
  236. data/lib/solargraph/workspace/config.rb +230 -0
  237. data/lib/solargraph/yard_map.rb +435 -0
  238. data/lib/solargraph/yard_map/cache.rb +19 -0
  239. data/lib/solargraph/yard_map/core_docs.rb +170 -0
  240. data/lib/solargraph/yard_map/core_fills.rb +185 -0
  241. data/lib/solargraph/yard_map/core_gen.rb +76 -0
  242. data/lib/solargraph/yard_map/helpers.rb +16 -0
  243. data/lib/solargraph/yard_map/mapper.rb +77 -0
  244. data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -0
  245. data/lib/solargraph/yard_map/mapper/to_method.rb +78 -0
  246. data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -0
  247. data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -0
  248. data/lib/solargraph/yard_map/stdlib_fills.rb +43 -0
  249. data/lib/solargraph/yard_map/to_method.rb +79 -0
  250. data/lib/yard-solargraph.rb +30 -0
  251. data/yardoc/2.2.2.tar.gz +0 -0
  252. metadata +564 -0
@@ -0,0 +1,27 @@
1
+ require 'bundler'
2
+ require 'shellwords'
3
+
4
+ module Solargraph
5
+ class ApiMap
6
+ module BundlerMethods
7
+ module_function
8
+
9
+ # @param directory [String]
10
+ # @return [Hash]
11
+ def require_from_bundle directory
12
+ @require_from_bundle ||= begin
13
+ Solargraph.logger.info "Loading gems for bundler/require"
14
+ Documentor.specs_from_bundle(directory)
15
+ rescue BundleNotFoundError => e
16
+ Solargraph.logger.warn e.message
17
+ {}
18
+ end
19
+ end
20
+
21
+ # @return [void]
22
+ def reset_require_from_bundle
23
+ @require_from_bundle = nil
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class ApiMap
5
+ class Cache
6
+ def initialize
7
+ @methods = {}
8
+ @constants = {}
9
+ @qualified_namespaces = {}
10
+ @receiver_definitions = {}
11
+ end
12
+
13
+ # @return [Array<Pin::Method>]
14
+ def get_methods fqns, scope, visibility, deep
15
+ @methods[[fqns, scope, visibility.sort, deep]]
16
+ end
17
+
18
+ def set_methods fqns, scope, visibility, deep, value
19
+ @methods[[fqns, scope, visibility.sort, deep]] = value
20
+ end
21
+
22
+ # @return [Array<Pin::Base>]
23
+ def get_constants namespace, context
24
+ @constants[[namespace, context]]
25
+ end
26
+
27
+ def set_constants namespace, context, value
28
+ @constants[[namespace, context]] = value
29
+ end
30
+
31
+ # @return [String]
32
+ def get_qualified_namespace name, context
33
+ @qualified_namespaces[[name, context]]
34
+ end
35
+
36
+ def set_qualified_namespace name, context, value
37
+ @qualified_namespaces[[name, context]] = value
38
+ end
39
+
40
+ def receiver_defined? path
41
+ @receiver_definitions.key? path
42
+ end
43
+
44
+ # @return [Pin::Method]
45
+ def get_receiver_definition path
46
+ @receiver_definitions[path]
47
+ end
48
+
49
+ def set_receiver_definition path, pin
50
+ @receiver_definitions[path] = pin
51
+ end
52
+
53
+ # @return [void]
54
+ def clear
55
+ @methods.clear
56
+ @constants.clear
57
+ @qualified_namespaces.clear
58
+ @receiver_definitions.clear
59
+ end
60
+
61
+ # @return [Boolean]
62
+ def empty?
63
+ @methods.empty? &&
64
+ @constants.empty? &&
65
+ @qualified_namespaces.empty? &&
66
+ @receiver_definitions.empty?
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class ApiMap
5
+ module SourceToYard
6
+
7
+ # Get the YARD CodeObject at the specified path.
8
+ #
9
+ # @param path [String]
10
+ # @return [YARD::CodeObjects::Base]
11
+ def code_object_at path
12
+ code_object_map[path]
13
+ end
14
+
15
+ # @return [Array<String>]
16
+ def code_object_paths
17
+ code_object_map.keys
18
+ end
19
+
20
+ # @param store [ApiMap::Store] ApiMap pin store
21
+ # @return [void]
22
+ def rake_yard store
23
+ YARD::Registry.clear
24
+ code_object_map.clear
25
+ store.namespace_pins.each do |pin|
26
+ next if pin.path.nil? || pin.path.empty?
27
+ if pin.code_object
28
+ code_object_map[pin.path] ||= pin.code_object
29
+ next
30
+ end
31
+ if pin.type == :class
32
+ code_object_map[pin.path] ||= YARD::CodeObjects::ClassObject.new(root_code_object, pin.path) { |obj|
33
+ next if pin.location.nil? || pin.location.filename.nil?
34
+ obj.add_file(pin.location.filename, pin.location.range.start.line, !pin.comments.empty?)
35
+ }
36
+ else
37
+ code_object_map[pin.path] ||= YARD::CodeObjects::ModuleObject.new(root_code_object, pin.path) { |obj|
38
+ next if pin.location.nil? || pin.location.filename.nil?
39
+ obj.add_file(pin.location.filename, pin.location.range.start.line, !pin.comments.empty?)
40
+ }
41
+ end
42
+ code_object_map[pin.path].docstring = pin.docstring
43
+ store.get_includes(pin.path).each do |ref|
44
+ code_object_map[pin.path].instance_mixins.push code_object_map[ref] unless code_object_map[ref].nil? or code_object_map[pin.path].nil?
45
+ end
46
+ store.get_extends(pin.path).each do |ref|
47
+ code_object_map[pin.path].instance_mixins.push code_object_map[ref] unless code_object_map[ref].nil? or code_object_map[pin.path].nil?
48
+ code_object_map[pin.path].class_mixins.push code_object_map[ref] unless code_object_map[ref].nil? or code_object_map[pin.path].nil?
49
+ end
50
+ end
51
+ store.method_pins.each do |pin|
52
+ if pin.code_object
53
+ code_object_map[pin.path] ||= pin.code_object
54
+ next
55
+ end
56
+ code_object_map[pin.path] ||= YARD::CodeObjects::MethodObject.new(code_object_at(pin.namespace), pin.name, pin.scope) { |obj|
57
+ next if pin.location.nil? || pin.location.filename.nil?
58
+ obj.add_file pin.location.filename, pin.location.range.start.line
59
+ }
60
+ code_object_map[pin.path].docstring = pin.docstring
61
+ code_object_map[pin.path].visibility = pin.visibility || :public
62
+ code_object_map[pin.path].parameters = pin.parameters.map do |p|
63
+ [p.name, p.asgn_code]
64
+ end
65
+ end
66
+ end
67
+
68
+ private
69
+
70
+ # @return [Hash{String => YARD::CodeObjects::Base}]
71
+ def code_object_map
72
+ @code_object_map ||= {}
73
+ end
74
+
75
+ # @return [YARD::CodeObjects::RootObject]
76
+ def root_code_object
77
+ @root_code_object ||= YARD::CodeObjects::RootObject.new(nil, 'root')
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,256 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ module Solargraph
6
+ class ApiMap
7
+ class Store
8
+ # @return [Array<Solargraph::Pin::Base>]
9
+ attr_reader :pins
10
+
11
+ # @param pins [Array<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 [Array<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 [Array<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 [Array<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 [Array<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 [Array<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 [Array<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 [Array<Solargraph::Pin::Base>]
101
+ def namespace_pins
102
+ pins_by_class(Solargraph::Pin::Namespace)
103
+ end
104
+
105
+ # @return [Array<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 [Array<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 [Array<Solargraph::Pin::Base>]
146
+ def pins_by_class klass
147
+ @pin_select_cache[klass] ||= @pin_class_hash.select { |key, _| key <= klass }.values.flatten
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 [Array<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 [Array<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).transform_values(&:to_a)
220
+ @path_pin_hash = set.classify(&:path).transform_values(&:to_a)
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
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ # An aggregation of a workspace and additional sources to be cataloged in an
5
+ # ApiMap.
6
+ #
7
+ class Bench
8
+ # @return [Workspace]
9
+ attr_reader :workspace
10
+
11
+ # @return [Array<Source>]
12
+ attr_reader :opened
13
+
14
+ # @return [Array<Pin::Base>]
15
+ attr_reader :pins
16
+
17
+ # @param workspace [Workspace]
18
+ # @param opened [Array<Source>]
19
+ def initialize workspace: Workspace.new, opened: [], pins: []
20
+ @workspace = workspace
21
+ @opened = opened
22
+ @pins = pins
23
+ end
24
+
25
+ # @return [Array<Source>]
26
+ def sources
27
+ @sources ||= (opened + workspace.sources).uniq(&:filename)
28
+ end
29
+ end
30
+ end