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,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module Rubyvm
6
+ module NodeProcessors
7
+ class SymNode < Parser::NodeProcessor::Base
8
+ def process
9
+ pins.push Solargraph::Pin::Symbol.new(
10
+ get_node_location(node),
11
+ ":#{node.children[0]}"
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ module Solargraph
2
+ module Parser
3
+ class Snippet
4
+ attr_reader :range
5
+ attr_reader :text
6
+
7
+ def initialize range, text
8
+ @range = range
9
+ @text = text
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yard'
4
+
5
+ module Solargraph
6
+ # The namespace for pins used in maps.
7
+ #
8
+ module Pin
9
+ autoload :Common, 'solargraph/pin/common'
10
+ autoload :Conversions, 'solargraph/pin/conversions'
11
+ autoload :Base, 'solargraph/pin/base'
12
+ autoload :Method, 'solargraph/pin/method'
13
+ autoload :MethodAlias, 'solargraph/pin/method_alias'
14
+ autoload :BaseVariable, 'solargraph/pin/base_variable'
15
+ autoload :InstanceVariable, 'solargraph/pin/instance_variable'
16
+ autoload :ClassVariable, 'solargraph/pin/class_variable'
17
+ autoload :LocalVariable, 'solargraph/pin/local_variable'
18
+ autoload :GlobalVariable, 'solargraph/pin/global_variable'
19
+ autoload :Constant, 'solargraph/pin/constant'
20
+ autoload :Symbol, 'solargraph/pin/symbol'
21
+ autoload :Closure, 'solargraph/pin/closure'
22
+ autoload :Namespace, 'solargraph/pin/namespace'
23
+ autoload :Keyword, 'solargraph/pin/keyword'
24
+ autoload :Parameter, 'solargraph/pin/parameter'
25
+ autoload :Reference, 'solargraph/pin/reference'
26
+ autoload :Documenting, 'solargraph/pin/documenting'
27
+ autoload :Block, 'solargraph/pin/block'
28
+ autoload :Localized, 'solargraph/pin/localized'
29
+ autoload :ProxyType, 'solargraph/pin/proxy_type'
30
+ autoload :DuckMethod, 'solargraph/pin/duck_method'
31
+ autoload :Singleton, 'solargraph/pin/singleton'
32
+ autoload :KeywordParam, 'solargraph/pin/keyword_param'
33
+
34
+ ROOT_PIN = Pin::Namespace.new(type: :class, name: '', closure: nil)
35
+ end
36
+ end
@@ -0,0 +1,296 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ # The base class for map pins.
6
+ #
7
+ class Base
8
+ include Common
9
+ include Conversions
10
+ include Documenting
11
+
12
+ # @return [YARD::CodeObjects::Base]
13
+ attr_reader :code_object
14
+
15
+ # @return [Solargraph::Location]
16
+ attr_reader :location
17
+
18
+ # @return [String]
19
+ attr_reader :name
20
+
21
+ # @return [String]
22
+ attr_reader :path
23
+
24
+ # @param location [Solargraph::Location]
25
+ # @param kind [Integer]
26
+ # @param closure [Solargraph::Pin::Closure]
27
+ # @param name [String]
28
+ # @param comments [String]
29
+ def initialize location: nil, closure: nil, name: '', comments: ''
30
+ @location = location
31
+ @closure = closure
32
+ @name = name
33
+ @comments = comments
34
+ end
35
+
36
+ # @return [String]
37
+ def comments
38
+ @comments ||= ''
39
+ end
40
+
41
+ # @return [String, nil]
42
+ def filename
43
+ return nil if location.nil?
44
+ location.filename
45
+ end
46
+
47
+ # @return [Integer]
48
+ def completion_item_kind
49
+ LanguageServer::CompletionItemKinds::KEYWORD
50
+ end
51
+
52
+ # @return [Integer, nil]
53
+ def symbol_kind
54
+ nil
55
+ end
56
+
57
+ def to_s
58
+ name.to_s
59
+ end
60
+
61
+ # @return [Boolean]
62
+ def variable?
63
+ false
64
+ end
65
+
66
+ # Pin equality is determined using the #nearly? method and also
67
+ # requiring both pins to have the same location.
68
+ #
69
+ def == other
70
+ return false unless nearly? other
71
+ comments == other.comments and location == other.location
72
+ end
73
+
74
+ # True if the specified pin is a near match to this one. A near match
75
+ # indicates that the pins contain mostly the same data. Any differences
76
+ # between them should not have an impact on the API surface.
77
+ #
78
+ # @param other [Solargraph::Pin::Base, Object]
79
+ # @return [Boolean]
80
+ def nearly? other
81
+ self.class == other.class &&
82
+ name == other.name &&
83
+ (closure == other.closure || (closure && closure.nearly?(other.closure))) &&
84
+ (comments == other.comments ||
85
+ (((maybe_directives? == false && other.maybe_directives? == false) || compare_directives(directives, other.directives)) &&
86
+ compare_docstring_tags(docstring, other.docstring))
87
+ )
88
+ end
89
+
90
+ # The pin's return type.
91
+ #
92
+ # @return [ComplexType]
93
+ def return_type
94
+ @return_type ||= ComplexType::UNDEFINED
95
+ end
96
+
97
+ # @return [YARD::Docstring]
98
+ def docstring
99
+ parse_comments unless defined?(@docstring)
100
+ @docstring ||= Solargraph::Source.parse_docstring('').to_docstring
101
+ end
102
+
103
+ # @return [Array<YARD::Tags::Directive>]
104
+ def directives
105
+ parse_comments unless defined?(@directives)
106
+ @directives
107
+ end
108
+
109
+ # @return [Array<YARD::Tags::MacroDirective>]
110
+ def macros
111
+ @macros ||= collect_macros
112
+ end
113
+
114
+ # Perform a quick check to see if this pin possibly includes YARD
115
+ # directives. This method does not require parsing the comments.
116
+ #
117
+ # After the comments have been parsed, this method will return false if
118
+ # no directives were found, regardless of whether it previously appeared
119
+ # possible.
120
+ #
121
+ # @return [Boolean]
122
+ def maybe_directives?
123
+ return !@directives.empty? if defined?(@directives)
124
+ @maybe_directives ||= comments.include?('@!')
125
+ end
126
+
127
+ # @return [Boolean]
128
+ def deprecated?
129
+ @deprecated ||= docstring.has_tag?('deprecated')
130
+ end
131
+
132
+ # Get a fully qualified type from the pin's return type.
133
+ #
134
+ # The relative type is determined from YARD documentation (@return,
135
+ # @param, @type, etc.) and its namespaces are fully qualified using the
136
+ # provided ApiMap.
137
+ #
138
+ # @param api_map [ApiMap]
139
+ # @return [ComplexType]
140
+ def typify api_map
141
+ return_type.qualify(api_map, namespace)
142
+ end
143
+
144
+ # Infer the pin's return type via static code analysis.
145
+ #
146
+ # @param api_map [ApiMap]
147
+ # @return [ComplexType]
148
+ def probe api_map
149
+ typify api_map
150
+ end
151
+
152
+ # @deprecated Use #typify and/or #probe instead
153
+ # @param api_map [ApiMap]
154
+ # @return [ComplexType]
155
+ def infer api_map
156
+ Solargraph::Logging.logger.warn "WARNING: Pin #infer methods are deprecated. Use #typify or #probe instead."
157
+ type = typify(api_map)
158
+ return type unless type.undefined?
159
+ probe api_map
160
+ end
161
+
162
+ # Try to merge data from another pin. Merges are only possible if the
163
+ # pins are near matches (see the #nearly? method). The changes should
164
+ # not have any side effects on the API surface.
165
+ #
166
+ # @param pin [Pin::Base] The pin to merge into this one
167
+ # @return [Boolean] True if the pins were merged
168
+ def try_merge! pin
169
+ return false unless nearly?(pin)
170
+ @location = pin.location
171
+ @closure = pin.closure
172
+ return true if comments == pin.comments
173
+ @comments = pin.comments
174
+ @docstring = pin.docstring
175
+ @return_type = pin.return_type
176
+ @documentation = nil
177
+ @deprecated = nil
178
+ reset_conversions
179
+ true
180
+ end
181
+
182
+ def proxied?
183
+ @proxied ||= false
184
+ end
185
+
186
+ def probed?
187
+ @probed ||= false
188
+ end
189
+
190
+ # @param api_map [ApiMap]
191
+ # @return [self]
192
+ def realize api_map
193
+ return self if return_type.defined?
194
+ type = typify(api_map)
195
+ return proxy(type) if type.defined?
196
+ type = probe(api_map)
197
+ return self if type.undefined?
198
+ result = proxy(type)
199
+ result.probed = true
200
+ result
201
+ end
202
+
203
+ # Return a proxy for this pin with the specified return type. Other than
204
+ # the return type and the #proxied? setting, the proxy should be a clone
205
+ # of the original.
206
+ #
207
+ # @param return_type [ComplexType]
208
+ # @return [self]
209
+ def proxy return_type
210
+ result = dup
211
+ result.return_type = return_type
212
+ result.proxied = true
213
+ result
214
+ end
215
+
216
+ def identity
217
+ @identity ||= "#{closure.context.namespace}|#{name}"
218
+ end
219
+
220
+ def inspect
221
+ "#<#{self.class} at #{self.location.inspect}>"
222
+ end
223
+
224
+ protected
225
+
226
+ # @return [Boolean]
227
+ attr_writer :probed
228
+
229
+ # @return [Boolean]
230
+ attr_writer :proxied
231
+
232
+ # @return [ComplexType]
233
+ attr_writer :return_type
234
+
235
+ private
236
+
237
+ # @return [void]
238
+ def parse_comments
239
+ # HACK: Avoid a NoMethodError on nil with empty overload tags
240
+ if comments.nil? || comments.empty? || comments.strip.end_with?('@overload')
241
+ @docstring = nil
242
+ @directives = []
243
+ else
244
+ # HACK: Pass a dummy code object to the parser for plugins that
245
+ # expect it not to be nil
246
+ parse = Solargraph::Source.parse_docstring(comments)
247
+ @docstring = parse.to_docstring
248
+ @directives = parse.directives
249
+ end
250
+ end
251
+
252
+ # True if two docstrings have the same tags, regardless of any other
253
+ # differences.
254
+ #
255
+ # @param d1 [YARD::Docstring]
256
+ # @param d2 [YARD::Docstring]
257
+ # @return [Boolean]
258
+ def compare_docstring_tags d1, d2
259
+ return false if d1.tags.length != d2.tags.length
260
+ d1.tags.each_index do |i|
261
+ return false unless compare_tags(d1.tags[i], d2.tags[i])
262
+ end
263
+ true
264
+ end
265
+
266
+ # @param dir1 [Array<YARD::Tags::Directive>]
267
+ # @param dir2 [Array<YARD::Tags::Directive>]
268
+ # @return [Boolean]
269
+ def compare_directives dir1, dir2
270
+ return false if dir1.length != dir2.length
271
+ dir1.each_index do |i|
272
+ return false unless compare_tags(dir1[i].tag, dir2[i].tag)
273
+ end
274
+ true
275
+ end
276
+
277
+ # @param tag1 [YARD::Tags::Tag]
278
+ # @param tag2 [YARD::Tags::Tag]
279
+ # @return [Boolean]
280
+ def compare_tags tag1, tag2
281
+ tag1.class == tag2.class &&
282
+ tag1.tag_name == tag2.tag_name &&
283
+ tag1.text == tag2.text &&
284
+ tag1.name == tag2.name &&
285
+ tag1.types == tag2.types
286
+ end
287
+
288
+ # @return [Array<YARD::Tags::Handlers::Directive>]
289
+ def collect_macros
290
+ return [] unless maybe_directives?
291
+ parse = Solargraph::Source.parse_docstring(comments)
292
+ parse.directives.select{ |d| d.tag.tag_name == 'macro' }
293
+ end
294
+ end
295
+ end
296
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class BaseVariable < Base
6
+ include Solargraph::Parser::NodeMethods
7
+ # include Solargraph::Source::NodeMethods
8
+
9
+ # @return [Parser::AST::Node, nil]
10
+ attr_reader :assignment
11
+
12
+ # @param assignment [Parser::AST::Node, nil]
13
+ def initialize assignment: nil, **splat
14
+ super(**splat)
15
+ @assignment = assignment
16
+ end
17
+
18
+ def completion_item_kind
19
+ Solargraph::LanguageServer::CompletionItemKinds::VARIABLE
20
+ end
21
+
22
+ # @return [Integer]
23
+ def symbol_kind
24
+ Solargraph::LanguageServer::SymbolKinds::VARIABLE
25
+ end
26
+
27
+ def return_type
28
+ @return_type ||= generate_complex_type
29
+ end
30
+
31
+ def nil_assignment?
32
+ return_type.nil?
33
+ end
34
+
35
+ def variable?
36
+ true
37
+ end
38
+
39
+ def probe api_map
40
+ return ComplexType::UNDEFINED if @assignment.nil?
41
+ types = []
42
+ returns_from(@assignment).each do |node|
43
+ # Nil nodes may not have a location
44
+ if node.nil? || node.type == :NIL || node.type == :nil
45
+ types.push ComplexType::NIL
46
+ else
47
+ rng = Range.from_node(node)
48
+ next if rng.nil?
49
+ pos = rng.ending
50
+ clip = api_map.clip_at(location.filename, pos)
51
+ # Use the return node for inference. The clip might infer from the
52
+ # first node in a method call instead of the entire call.
53
+ chain = Parser.chain(node, nil, clip.in_block?)
54
+ result = chain.infer(api_map, closure, clip.locals)
55
+ types.push result unless result.undefined?
56
+ end
57
+ end
58
+ return ComplexType::UNDEFINED if types.empty?
59
+ ComplexType.try_parse(*types.map(&:tag))
60
+ end
61
+
62
+ def == other
63
+ return false unless super
64
+ assignment == other.assignment
65
+ end
66
+
67
+ def try_merge! pin
68
+ return false unless super
69
+ @assignment = pin.assignment
70
+ @return_type = pin.return_type
71
+ true
72
+ end
73
+
74
+ private
75
+
76
+ # @return [ComplexType]
77
+ def generate_complex_type
78
+ tag = docstring.tag(:type)
79
+ return ComplexType.try_parse(*tag.types) unless tag.nil? || tag.types.nil? || tag.types.empty?
80
+ ComplexType.new
81
+ end
82
+ end
83
+ end
84
+ end