solargraph 0.39.7

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/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +28 -0
  5. data/.yardopts +2 -0
  6. data/Gemfile +7 -0
  7. data/LICENSE +21 -0
  8. data/README.md +104 -0
  9. data/Rakefile +14 -0
  10. data/SPONSORS.md +9 -0
  11. data/bin/solargraph +5 -0
  12. data/lib/.rubocop.yml +21 -0
  13. data/lib/solargraph.rb +66 -0
  14. data/lib/solargraph/api_map.rb +745 -0
  15. data/lib/solargraph/api_map/bundler_methods.rb +27 -0
  16. data/lib/solargraph/api_map/cache.rb +66 -0
  17. data/lib/solargraph/api_map/source_to_yard.rb +81 -0
  18. data/lib/solargraph/api_map/store.rb +267 -0
  19. data/lib/solargraph/bundle.rb +26 -0
  20. data/lib/solargraph/complex_type.rb +213 -0
  21. data/lib/solargraph/complex_type/type_methods.rb +127 -0
  22. data/lib/solargraph/complex_type/unique_type.rb +75 -0
  23. data/lib/solargraph/convention.rb +38 -0
  24. data/lib/solargraph/convention/base.rb +25 -0
  25. data/lib/solargraph/convention/gemfile.rb +18 -0
  26. data/lib/solargraph/convention/gemspec.rb +25 -0
  27. data/lib/solargraph/convention/rspec.rb +24 -0
  28. data/lib/solargraph/converters/dd.rb +12 -0
  29. data/lib/solargraph/converters/dl.rb +12 -0
  30. data/lib/solargraph/converters/dt.rb +12 -0
  31. data/lib/solargraph/converters/misc.rb +1 -0
  32. data/lib/solargraph/core_fills.rb +159 -0
  33. data/lib/solargraph/diagnostics.rb +55 -0
  34. data/lib/solargraph/diagnostics/base.rb +29 -0
  35. data/lib/solargraph/diagnostics/require_not_found.rb +37 -0
  36. data/lib/solargraph/diagnostics/rubocop.rb +90 -0
  37. data/lib/solargraph/diagnostics/rubocop_helpers.rb +64 -0
  38. data/lib/solargraph/diagnostics/severities.rb +15 -0
  39. data/lib/solargraph/diagnostics/type_check.rb +54 -0
  40. data/lib/solargraph/diagnostics/update_errors.rb +41 -0
  41. data/lib/solargraph/documentor.rb +76 -0
  42. data/lib/solargraph/environ.rb +40 -0
  43. data/lib/solargraph/language_server.rb +19 -0
  44. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -0
  45. data/lib/solargraph/language_server/error_codes.rb +20 -0
  46. data/lib/solargraph/language_server/host.rb +741 -0
  47. data/lib/solargraph/language_server/host/cataloger.rb +56 -0
  48. data/lib/solargraph/language_server/host/diagnoser.rb +81 -0
  49. data/lib/solargraph/language_server/host/dispatch.rb +112 -0
  50. data/lib/solargraph/language_server/host/sources.rb +156 -0
  51. data/lib/solargraph/language_server/message.rb +92 -0
  52. data/lib/solargraph/language_server/message/base.rb +85 -0
  53. data/lib/solargraph/language_server/message/cancel_request.rb +13 -0
  54. data/lib/solargraph/language_server/message/client.rb +11 -0
  55. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -0
  56. data/lib/solargraph/language_server/message/completion_item.rb +11 -0
  57. data/lib/solargraph/language_server/message/completion_item/resolve.rb +57 -0
  58. data/lib/solargraph/language_server/message/exit_notification.rb +13 -0
  59. data/lib/solargraph/language_server/message/extended.rb +21 -0
  60. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +95 -0
  61. data/lib/solargraph/language_server/message/extended/document.rb +20 -0
  62. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -0
  63. data/lib/solargraph/language_server/message/extended/download_core.rb +23 -0
  64. data/lib/solargraph/language_server/message/extended/environment.rb +25 -0
  65. data/lib/solargraph/language_server/message/extended/search.rb +20 -0
  66. data/lib/solargraph/language_server/message/initialize.rb +153 -0
  67. data/lib/solargraph/language_server/message/initialized.rb +26 -0
  68. data/lib/solargraph/language_server/message/method_not_found.rb +16 -0
  69. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -0
  70. data/lib/solargraph/language_server/message/shutdown.rb +13 -0
  71. data/lib/solargraph/language_server/message/text_document.rb +28 -0
  72. data/lib/solargraph/language_server/message/text_document/base.rb +19 -0
  73. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -0
  74. data/lib/solargraph/language_server/message/text_document/completion.rb +57 -0
  75. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -0
  76. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -0
  77. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -0
  78. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -0
  79. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -0
  80. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -0
  81. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -0
  82. data/lib/solargraph/language_server/message/text_document/formatting.rb +78 -0
  83. data/lib/solargraph/language_server/message/text_document/hover.rb +44 -0
  84. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -0
  85. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -0
  86. data/lib/solargraph/language_server/message/text_document/references.rb +16 -0
  87. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -0
  88. data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -0
  89. data/lib/solargraph/language_server/message/workspace.rb +14 -0
  90. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +29 -0
  91. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -0
  92. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -0
  93. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -0
  94. data/lib/solargraph/language_server/message_types.rb +14 -0
  95. data/lib/solargraph/language_server/request.rb +24 -0
  96. data/lib/solargraph/language_server/symbol_kinds.rb +36 -0
  97. data/lib/solargraph/language_server/transport.rb +13 -0
  98. data/lib/solargraph/language_server/transport/adapter.rb +56 -0
  99. data/lib/solargraph/language_server/transport/data_reader.rb +72 -0
  100. data/lib/solargraph/language_server/uri_helpers.rb +49 -0
  101. data/lib/solargraph/library.rb +414 -0
  102. data/lib/solargraph/location.rb +37 -0
  103. data/lib/solargraph/logging.rb +27 -0
  104. data/lib/solargraph/page.rb +83 -0
  105. data/lib/solargraph/parser.rb +26 -0
  106. data/lib/solargraph/parser/comment_ripper.rb +52 -0
  107. data/lib/solargraph/parser/legacy.rb +12 -0
  108. data/lib/solargraph/parser/legacy/class_methods.rb +109 -0
  109. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -0
  110. data/lib/solargraph/parser/legacy/node_chainer.rb +118 -0
  111. data/lib/solargraph/parser/legacy/node_methods.rb +300 -0
  112. data/lib/solargraph/parser/legacy/node_processors.rb +54 -0
  113. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -0
  114. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -0
  115. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -0
  116. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +22 -0
  117. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -0
  118. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -0
  119. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -0
  120. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -0
  121. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -0
  122. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -0
  123. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -0
  124. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -0
  125. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -0
  126. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -0
  127. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -0
  128. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +234 -0
  129. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -0
  130. data/lib/solargraph/parser/node_methods.rb +43 -0
  131. data/lib/solargraph/parser/node_processor.rb +43 -0
  132. data/lib/solargraph/parser/node_processor/base.rb +77 -0
  133. data/lib/solargraph/parser/region.rb +66 -0
  134. data/lib/solargraph/parser/rubyvm.rb +40 -0
  135. data/lib/solargraph/parser/rubyvm/class_methods.rb +150 -0
  136. data/lib/solargraph/parser/rubyvm/node_chainer.rb +135 -0
  137. data/lib/solargraph/parser/rubyvm/node_methods.rb +284 -0
  138. data/lib/solargraph/parser/rubyvm/node_processors.rb +61 -0
  139. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -0
  140. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +62 -0
  141. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -0
  142. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +22 -0
  143. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -0
  144. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -0
  145. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +64 -0
  146. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -0
  147. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -0
  148. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -0
  149. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -0
  150. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -0
  151. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -0
  152. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -0
  153. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +31 -0
  154. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -0
  155. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -0
  156. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -0
  157. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -0
  158. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +255 -0
  159. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -0
  160. data/lib/solargraph/parser/snippet.rb +13 -0
  161. data/lib/solargraph/pin.rb +39 -0
  162. data/lib/solargraph/pin/attribute.rb +49 -0
  163. data/lib/solargraph/pin/base.rb +296 -0
  164. data/lib/solargraph/pin/base_method.rb +141 -0
  165. data/lib/solargraph/pin/base_variable.rb +84 -0
  166. data/lib/solargraph/pin/block.rb +48 -0
  167. data/lib/solargraph/pin/class_variable.rb +8 -0
  168. data/lib/solargraph/pin/closure.rb +37 -0
  169. data/lib/solargraph/pin/common.rb +70 -0
  170. data/lib/solargraph/pin/constant.rb +43 -0
  171. data/lib/solargraph/pin/conversions.rb +97 -0
  172. data/lib/solargraph/pin/documenting.rb +110 -0
  173. data/lib/solargraph/pin/duck_method.rb +16 -0
  174. data/lib/solargraph/pin/global_variable.rb +8 -0
  175. data/lib/solargraph/pin/instance_variable.rb +30 -0
  176. data/lib/solargraph/pin/keyword.rb +15 -0
  177. data/lib/solargraph/pin/keyword_param.rb +8 -0
  178. data/lib/solargraph/pin/local_variable.rb +21 -0
  179. data/lib/solargraph/pin/localized.rb +43 -0
  180. data/lib/solargraph/pin/method.rb +111 -0
  181. data/lib/solargraph/pin/method_alias.rb +31 -0
  182. data/lib/solargraph/pin/namespace.rb +85 -0
  183. data/lib/solargraph/pin/parameter.rb +206 -0
  184. data/lib/solargraph/pin/proxy_type.rb +29 -0
  185. data/lib/solargraph/pin/reference.rb +14 -0
  186. data/lib/solargraph/pin/reference/extend.rb +10 -0
  187. data/lib/solargraph/pin/reference/include.rb +10 -0
  188. data/lib/solargraph/pin/reference/override.rb +29 -0
  189. data/lib/solargraph/pin/reference/prepend.rb +10 -0
  190. data/lib/solargraph/pin/reference/require.rb +14 -0
  191. data/lib/solargraph/pin/reference/superclass.rb +10 -0
  192. data/lib/solargraph/pin/singleton.rb +11 -0
  193. data/lib/solargraph/pin/symbol.rb +47 -0
  194. data/lib/solargraph/pin/yard_pin.rb +12 -0
  195. data/lib/solargraph/pin/yard_pin/constant.rb +25 -0
  196. data/lib/solargraph/pin/yard_pin/method.rb +65 -0
  197. data/lib/solargraph/pin/yard_pin/namespace.rb +27 -0
  198. data/lib/solargraph/pin/yard_pin/yard_mixin.rb +26 -0
  199. data/lib/solargraph/position.rb +112 -0
  200. data/lib/solargraph/range.rb +95 -0
  201. data/lib/solargraph/server_methods.rb +16 -0
  202. data/lib/solargraph/shell.rb +221 -0
  203. data/lib/solargraph/source.rb +533 -0
  204. data/lib/solargraph/source/chain.rb +172 -0
  205. data/lib/solargraph/source/chain/block_variable.rb +13 -0
  206. data/lib/solargraph/source/chain/call.rb +203 -0
  207. data/lib/solargraph/source/chain/class_variable.rb +13 -0
  208. data/lib/solargraph/source/chain/constant.rb +75 -0
  209. data/lib/solargraph/source/chain/global_variable.rb +13 -0
  210. data/lib/solargraph/source/chain/head.rb +35 -0
  211. data/lib/solargraph/source/chain/instance_variable.rb +13 -0
  212. data/lib/solargraph/source/chain/link.rb +67 -0
  213. data/lib/solargraph/source/chain/literal.rb +23 -0
  214. data/lib/solargraph/source/chain/or.rb +23 -0
  215. data/lib/solargraph/source/chain/variable.rb +13 -0
  216. data/lib/solargraph/source/chain/z_super.rb +184 -0
  217. data/lib/solargraph/source/change.rb +79 -0
  218. data/lib/solargraph/source/cursor.rb +164 -0
  219. data/lib/solargraph/source/encoding_fixes.rb +23 -0
  220. data/lib/solargraph/source/source_chainer.rb +189 -0
  221. data/lib/solargraph/source/updater.rb +54 -0
  222. data/lib/solargraph/source_map.rb +170 -0
  223. data/lib/solargraph/source_map/clip.rb +190 -0
  224. data/lib/solargraph/source_map/completion.rb +23 -0
  225. data/lib/solargraph/source_map/mapper.rb +199 -0
  226. data/lib/solargraph/stdlib_fills.rb +32 -0
  227. data/lib/solargraph/type_checker.rb +498 -0
  228. data/lib/solargraph/type_checker/checks.rb +95 -0
  229. data/lib/solargraph/type_checker/param_def.rb +35 -0
  230. data/lib/solargraph/type_checker/problem.rb +32 -0
  231. data/lib/solargraph/type_checker/rules.rb +53 -0
  232. data/lib/solargraph/version.rb +5 -0
  233. data/lib/solargraph/views/_method.erb +62 -0
  234. data/lib/solargraph/views/_name_type_tag.erb +10 -0
  235. data/lib/solargraph/views/_namespace.erb +24 -0
  236. data/lib/solargraph/views/document.erb +23 -0
  237. data/lib/solargraph/views/environment.erb +58 -0
  238. data/lib/solargraph/views/layout.erb +44 -0
  239. data/lib/solargraph/views/search.erb +11 -0
  240. data/lib/solargraph/workspace.rb +209 -0
  241. data/lib/solargraph/workspace/config.rb +215 -0
  242. data/lib/solargraph/yard_map.rb +420 -0
  243. data/lib/solargraph/yard_map/cache.rb +19 -0
  244. data/lib/solargraph/yard_map/core_docs.rb +170 -0
  245. data/lib/solargraph/yard_map/core_gen.rb +76 -0
  246. data/lib/solargraph/yard_map/mapper.rb +71 -0
  247. data/lib/solargraph/yard_map/rdoc_to_yard.rb +136 -0
  248. data/lib/yard-solargraph.rb +30 -0
  249. data/solargraph.gemspec +41 -0
  250. data/travis-bundler.rb +11 -0
  251. data/yardoc/2.2.2.tar.gz +0 -0
  252. metadata +575 -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,66 @@
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
+ def get_methods fqns, scope, visibility, deep
14
+ @methods[[fqns, scope, visibility.sort, deep]]
15
+ end
16
+
17
+ def set_methods fqns, scope, visibility, deep, value
18
+ @methods[[fqns, scope, visibility.sort, deep]] = value
19
+ end
20
+
21
+ def get_constants namespace, context
22
+ @constants[[namespace, context]]
23
+ end
24
+
25
+ def set_constants namespace, context, value
26
+ @constants[[namespace, context]] = value
27
+ end
28
+
29
+ def get_qualified_namespace name, context
30
+ @qualified_namespaces[[name, context]]
31
+ end
32
+
33
+ def set_qualified_namespace name, context, value
34
+ @qualified_namespaces[[name, context]] = value
35
+ end
36
+
37
+ def receiver_defined? path
38
+ @receiver_definitions.key? path
39
+ end
40
+
41
+ def get_receiver_definition path
42
+ @receiver_definitions[path]
43
+ end
44
+
45
+ def set_receiver_definition path, pin
46
+ @receiver_definitions[path] = pin
47
+ end
48
+
49
+ # @return [void]
50
+ def clear
51
+ @methods.clear
52
+ @constants.clear
53
+ @qualified_namespaces.clear
54
+ @receiver_definitions.clear
55
+ end
56
+
57
+ # @return [Boolean]
58
+ def empty?
59
+ @methods.empty? &&
60
+ @constants.empty? &&
61
+ @qualified_namespaces.empty? &&
62
+ @receiver_definitions.empty?
63
+ end
64
+ end
65
+ end
66
+ 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,267 @@
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::BaseMethod) && 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
+ @namespace_pins ||= []
103
+ end
104
+
105
+ # @return [Array<Solargraph::Pin::Base>]
106
+ def method_pins
107
+ @method_pins ||= []
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
+ @block_pins ||= []
137
+ end
138
+
139
+ def inspect
140
+ # Avoid insane dumps in specs
141
+ to_s
142
+ end
143
+
144
+ private
145
+
146
+ # @param fqns [String]
147
+ # @return [Array<Solargraph::Pin::Namespace>]
148
+ def fqns_pins fqns
149
+ return [] if fqns.nil?
150
+ if fqns.include?('::')
151
+ parts = fqns.split('::')
152
+ name = parts.pop
153
+ base = parts.join('::')
154
+ else
155
+ base = ''
156
+ name = fqns
157
+ end
158
+ fqns_pins_map[[base, name]]
159
+ end
160
+
161
+ def fqns_pins_map
162
+ @fqns_pins_map ||= Hash.new do |h, (base, name)|
163
+ value = namespace_children(base).select { |pin| pin.name == name && pin.is_a?(Pin::Namespace) }
164
+ h[[base, name]] = value
165
+ end
166
+ end
167
+
168
+ # @return [Array<Solargraph::Pin::Symbol>]
169
+ def symbols
170
+ @symbols ||= []
171
+ end
172
+
173
+ def superclass_references
174
+ @superclass_references ||= {}
175
+ end
176
+
177
+ def include_references
178
+ @include_references ||= {}
179
+ end
180
+
181
+ def prepend_references
182
+ @prepend_references ||= {}
183
+ end
184
+
185
+ def extend_references
186
+ @extend_references ||= {}
187
+ end
188
+
189
+ # @param name [String]
190
+ # @return [Array<Solargraph::Pin::Base>]
191
+ def namespace_children name
192
+ namespace_map[name] || []
193
+ end
194
+
195
+ # @return [Hash]
196
+ def namespace_map
197
+ @namespace_map ||= {}
198
+ end
199
+
200
+ def all_instance_variables
201
+ @all_instance_variables ||= []
202
+ end
203
+
204
+ def path_pin_hash
205
+ @path_pin_hash ||= {}
206
+ end
207
+
208
+ # @return [void]
209
+ def index
210
+ namespace_map.clear
211
+ namespaces.clear
212
+ namespace_pins.clear
213
+ method_pins.clear
214
+ symbols.clear
215
+ block_pins.clear
216
+ all_instance_variables.clear
217
+ path_pin_hash.clear
218
+ namespace_map[''] = []
219
+ override_pins = []
220
+ pins.each do |pin|
221
+ namespace_map[pin.namespace] ||= []
222
+ namespace_map[pin.namespace].push pin
223
+ namespaces.add pin.path if pin.is_a?(Pin::Namespace) && !pin.path.empty?
224
+ namespace_pins.push pin if pin.is_a?(Pin::Namespace)
225
+ method_pins.push pin if pin.is_a?(Pin::BaseMethod)
226
+ symbols.push pin if pin.is_a?(Pin::Symbol)
227
+ if pin.is_a?(Pin::Reference::Include)
228
+ include_references[pin.namespace] ||= []
229
+ include_references[pin.namespace].push pin.name
230
+ elsif pin.is_a?(Pin::Reference::Prepend)
231
+ prepend_references[pin.namespace] ||= []
232
+ prepend_references[pin.namespace].push pin.name
233
+ elsif pin.is_a?(Pin::Reference::Extend)
234
+ extend_references[pin.namespace] ||= []
235
+ extend_references[pin.namespace].push pin.name
236
+ elsif pin.is_a?(Pin::Reference::Superclass)
237
+ superclass_references[pin.namespace] ||= []
238
+ superclass_references[pin.namespace].push pin.name
239
+ elsif pin.is_a?(Pin::Block)
240
+ block_pins.push pin
241
+ elsif pin.is_a?(Pin::InstanceVariable)
242
+ all_instance_variables.push pin
243
+ elsif pin.is_a?(Pin::Reference::Override)
244
+ override_pins.push pin
245
+ end
246
+ if pin.path
247
+ path_pin_hash[pin.path] ||= []
248
+ path_pin_hash[pin.path].push pin
249
+ end
250
+ end
251
+ override_pins.each do |ovr|
252
+ pin = get_path_pins(ovr.name).first
253
+ next if pin.nil?
254
+ (ovr.tags.map(&:tag_name) + ovr.delete).uniq.each do |tag|
255
+ pin.docstring.delete_tags tag.to_sym
256
+ end
257
+ ovr.tags.each do |tag|
258
+ pin.docstring.add_tag(tag)
259
+ end
260
+ end
261
+ # @todo This is probably not the best place for these overrides
262
+ superclass_references['Integer'] = ['Numeric']
263
+ superclass_references['Float'] = ['Numeric']
264
+ end
265
+ end
266
+ end
267
+ end
@@ -0,0 +1,26 @@
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 Bundle
8
+ # @return [Workspace]
9
+ attr_reader :workspace
10
+
11
+ # @return [Array<Source>]
12
+ attr_reader :opened
13
+
14
+ # @param workspace [Workspace]
15
+ # @param opened [Array<Source>]
16
+ def initialize workspace: Workspace.new, opened: []
17
+ @workspace = workspace
18
+ @opened = opened
19
+ end
20
+
21
+ # @return [Array<Source>]
22
+ def sources
23
+ @sources ||= (opened + workspace.sources).uniq(&:filename)
24
+ end
25
+ end
26
+ end