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,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class GlobalVariable < BaseVariable
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class InstanceVariable < BaseVariable
6
+ def binder
7
+ closure.binder
8
+ end
9
+
10
+ def scope
11
+ closure.binder.scope
12
+ end
13
+
14
+ def context
15
+ @context ||= begin
16
+ result = super
17
+ if scope == :class
18
+ ComplexType.parse("Class<#{result.namespace}>")
19
+ else
20
+ ComplexType.parse("#{result.namespace}")
21
+ end
22
+ end
23
+ end
24
+
25
+ def nearly? other
26
+ super && binder == other.binder
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Keyword < Base
6
+ def initialize name
7
+ super(name: name)
8
+ end
9
+
10
+ def name
11
+ @name
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class KeywordParam < Symbol
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class LocalVariable < BaseVariable
6
+ include Localized
7
+
8
+ def initialize assignment: nil, presence: nil, **splat
9
+ super(**splat)
10
+ @assignment = assignment
11
+ @presence = presence
12
+ end
13
+
14
+ def try_merge! pin
15
+ return false unless super
16
+ @presence = pin.presence
17
+ true
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ module Localized
6
+ # @return [Range]
7
+ attr_reader :presence
8
+
9
+ # @param other [Pin::Base] The caller's block
10
+ # @param position [Position, Array(Integer, Integer)] The caller's position
11
+ # @return [Boolean]
12
+ def visible_from?(other, position)
13
+ position = Position.normalize(position)
14
+ other.filename == filename &&
15
+ match_tags(other.full_context.tag, full_context.tag) &&
16
+ (other == closure ||
17
+ (closure.location.range.contain?(other.location.range.start) && closure.location.range.contain?(other.location.range.ending))
18
+ ) &&
19
+ presence.contain?(position)
20
+ end
21
+
22
+ # @param other_loc [Location]
23
+ def visible_at?(other_loc)
24
+ return false if location.filename != other_loc.filename
25
+ presence.include?(other_loc.range.start)
26
+ end
27
+
28
+ private
29
+
30
+ # @param tag1 [String]
31
+ # @param tag2 [String]
32
+ # @return [Boolean]
33
+ def match_tags tag1, tag2
34
+ # @todo This is an unfortunate hack made necessary by a discrepancy in
35
+ # how tags indicate the root namespace. The long-term solution is to
36
+ # standardize it, whether it's `Class<>`, an empty string, or
37
+ # something else.
38
+ tag1 == tag2 ||
39
+ (['', 'Class<>'].include?(tag1) && ['', 'Class<>'].include?(tag2))
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,245 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ # The base class for method and attribute pins.
6
+ #
7
+ class Method < Closure
8
+ include Solargraph::Parser::NodeMethods
9
+
10
+ # @return [Array<Pin::Parameter>]
11
+ attr_reader :parameters
12
+
13
+ # @return [::Symbol] :public, :private, or :protected
14
+ attr_reader :visibility
15
+
16
+ # @return [Parser::AST::Node]
17
+ attr_reader :node
18
+
19
+ # @param visibility [::Symbol] :public, :protected, or :private
20
+ # @param explicit [Boolean]
21
+ def initialize visibility: :public, explicit: true, parameters: [], node: nil, attribute: false, **splat
22
+ super(**splat)
23
+ @visibility = visibility
24
+ @explicit = explicit
25
+ @parameters = parameters
26
+ @node = node
27
+ @attribute = attribute
28
+ end
29
+
30
+ # @return [Array<String>]
31
+ def parameter_names
32
+ @parameter_names ||= parameters.map(&:name)
33
+ end
34
+
35
+ def completion_item_kind
36
+ attribute? ? Solargraph::LanguageServer::CompletionItemKinds::PROPERTY : Solargraph::LanguageServer::CompletionItemKinds::METHOD
37
+ end
38
+
39
+ def symbol_kind
40
+ attribute? ? Solargraph::LanguageServer::SymbolKinds::PROPERTY : LanguageServer::SymbolKinds::METHOD
41
+ end
42
+
43
+ def return_type
44
+ @return_type ||= generate_complex_type
45
+ end
46
+
47
+ def path
48
+ @path ||= "#{namespace}#{(scope == :instance ? '#' : '.')}#{name}"
49
+ end
50
+
51
+ def typify api_map
52
+ decl = super
53
+ return decl unless decl.undefined?
54
+ type = see_reference(api_map) || typify_from_super(api_map)
55
+ return type.qualify(api_map, namespace) unless type.nil?
56
+ name.end_with?('?') ? ComplexType::BOOLEAN : ComplexType::UNDEFINED
57
+ end
58
+
59
+ def documentation
60
+ if @documentation.nil?
61
+ @documentation ||= super || ''
62
+ param_tags = docstring.tags(:param)
63
+ unless param_tags.nil? or param_tags.empty?
64
+ @documentation += "\n\n" unless @documentation.empty?
65
+ @documentation += "Params:\n"
66
+ lines = []
67
+ param_tags.each do |p|
68
+ l = "* #{p.name}"
69
+ l += " [#{escape_brackets(p.types.join(', '))}]" unless p.types.nil? or p.types.empty?
70
+ l += " #{p.text}"
71
+ lines.push l
72
+ end
73
+ @documentation += lines.join("\n")
74
+ end
75
+ return_tags = docstring.tags(:return)
76
+ unless return_tags.empty?
77
+ @documentation += "\n\n" unless @documentation.empty?
78
+ @documentation += "Returns:\n"
79
+ lines = []
80
+ return_tags.each do |r|
81
+ l = "*"
82
+ l += " [#{escape_brackets(r.types.join(', '))}]" unless r.types.nil? or r.types.empty?
83
+ l += " #{r.text}"
84
+ lines.push l
85
+ end
86
+ @documentation += lines.join("\n")
87
+ end
88
+ @documentation += "\n\n" unless @documentation.empty?
89
+ @documentation += "Visibility: #{visibility}"
90
+ end
91
+ @documentation.to_s
92
+ end
93
+
94
+ def explicit?
95
+ @explicit
96
+ end
97
+
98
+ def attribute?
99
+ @attribute
100
+ end
101
+
102
+ def nearly? other
103
+ return false unless super
104
+ parameters == other.parameters and
105
+ scope == other.scope and
106
+ visibility == other.visibility
107
+ end
108
+
109
+ def probe api_map
110
+ attribute? ? infer_from_iv(api_map) : infer_from_return_nodes(api_map)
111
+ end
112
+
113
+ def try_merge! pin
114
+ return false unless super
115
+ @node = pin.node
116
+ true
117
+ end
118
+
119
+ # @return [Array<Pin::Method>]
120
+ def overloads
121
+ @overloads ||= docstring.tags(:overload).map do |tag|
122
+ Solargraph::Pin::Method.new(
123
+ name: name,
124
+ closure: self,
125
+ # args: tag.parameters.map(&:first),
126
+ parameters: tag.parameters.map do |src|
127
+ Pin::Parameter.new(
128
+ location: location,
129
+ closure: self,
130
+ comments: tag.docstring.all.to_s,
131
+ name: src.first,
132
+ presence: location ? location.range : nil,
133
+ decl: :arg
134
+ )
135
+ end,
136
+ comments: tag.docstring.all.to_s
137
+ )
138
+ end
139
+ end
140
+
141
+ private
142
+
143
+ # @return [ComplexType]
144
+ def generate_complex_type
145
+ tags = docstring.tags(:return).map(&:types).flatten.reject(&:nil?)
146
+ return ComplexType::UNDEFINED if tags.empty?
147
+ ComplexType.try_parse *tags
148
+ end
149
+
150
+ # @param api_map [ApiMap]
151
+ # @return [ComplexType, nil]
152
+ def see_reference api_map
153
+ docstring.ref_tags.each do |ref|
154
+ next unless ref.tag_name == 'return' && ref.owner
155
+ result = resolve_reference(ref.owner.to_s, api_map)
156
+ return result unless result.nil?
157
+ end
158
+ match = comments.match(/^[ \t]*\(see (.*)\)/m)
159
+ return nil if match.nil?
160
+ resolve_reference match[1], api_map
161
+ end
162
+
163
+ # @param api_map [ApiMap]
164
+ # @return [ComplexType, nil]
165
+ def typify_from_super api_map
166
+ stack = api_map.get_method_stack(namespace, name, scope: scope).reject { |pin| pin.path == path }
167
+ return nil if stack.empty?
168
+ stack.each do |pin|
169
+ return pin.return_type unless pin.return_type.undefined?
170
+ end
171
+ nil
172
+ end
173
+
174
+ # @param ref [String]
175
+ # @param api_map [ApiMap]
176
+ # @return [ComplexType]
177
+ def resolve_reference ref, api_map
178
+ parts = ref.split(/[\.#]/)
179
+ if parts.first.empty? || parts.one?
180
+ path = "#{namespace}#{ref}"
181
+ else
182
+ fqns = api_map.qualify(parts.first, namespace)
183
+ return ComplexType::UNDEFINED if fqns.nil?
184
+ path = fqns + ref[parts.first.length] + parts.last
185
+ end
186
+ pins = api_map.get_path_pins(path)
187
+ pins.each do |pin|
188
+ type = pin.typify(api_map)
189
+ return type unless type.undefined?
190
+ end
191
+ nil
192
+ end
193
+
194
+ # @return [Parser::AST::Node, nil]
195
+ def method_body_node
196
+ return nil if node.nil?
197
+ return node.children[1].children.last if node.type == :DEFN
198
+ return node.children[2].children.last if node.type == :DEFS
199
+ return node.children[2] if node.type == :def || node.type == :DEFS
200
+ return node.children[3] if node.type == :defs
201
+ nil
202
+ end
203
+
204
+ # @param api_map [ApiMap]
205
+ # @return [ComplexType]
206
+ def infer_from_return_nodes api_map
207
+ return ComplexType::UNDEFINED if node.nil?
208
+ result = []
209
+ has_nil = false
210
+ return ComplexType::NIL if method_body_node.nil?
211
+ returns_from(method_body_node).each do |n|
212
+ if n.nil? || [:NIL, :nil].include?(n.type)
213
+ has_nil = true
214
+ next
215
+ end
216
+ rng = Range.from_node(n)
217
+ next unless rng
218
+ clip = api_map.clip_at(
219
+ location.filename,
220
+ rng.ending
221
+ )
222
+ chain = Solargraph::Parser.chain(n, location.filename)
223
+ type = chain.infer(api_map, self, clip.locals)
224
+ result.push type unless type.undefined?
225
+ end
226
+ result.push ComplexType::NIL if has_nil
227
+ return ComplexType::UNDEFINED if result.empty?
228
+ ComplexType.try_parse(*result.map(&:tag).uniq)
229
+ end
230
+
231
+ def infer_from_iv api_map
232
+ types = []
233
+ varname = "@#{name.gsub(/=$/, '')}"
234
+ pins = api_map.get_instance_variable_pins(binder.namespace, binder.scope).select { |iv| iv.name == varname }
235
+ pins.each do |pin|
236
+ type = pin.typify(api_map)
237
+ type = pin.probe(api_map) if type.undefined?
238
+ types.push type if type.defined?
239
+ end
240
+ return ComplexType::UNDEFINED if types.empty?
241
+ ComplexType.try_parse(*types.map(&:tag).uniq)
242
+ end
243
+ end
244
+ end
245
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ # Use this class to track method aliases for later remapping. Common
6
+ # examples that defer mapping are aliases for superclass methods or
7
+ # methods from included modules.
8
+ #
9
+ class MethodAlias < Method
10
+ # @return [::Symbol]
11
+ attr_reader :scope
12
+
13
+ # @return [String]
14
+ attr_reader :original
15
+
16
+ def initialize scope: :instance, original: nil, **splat
17
+ super(**splat)
18
+ @scope = scope
19
+ @original = original
20
+ end
21
+
22
+ def visibility
23
+ :public
24
+ end
25
+
26
+ def path
27
+ @path ||= namespace + (scope == :instance ? '#' : '.') + name
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Namespace < Closure
6
+ # @return [::Symbol] :public or :private
7
+ attr_reader :visibility
8
+
9
+ # @return [::Symbol] :class or :module
10
+ attr_reader :type
11
+
12
+ # @param type [Symbol] :class or :module
13
+ # @param visibility [Symbol] :public or :private
14
+ # @param gates [Array<String>]
15
+ def initialize type: :class, visibility: :public, gates: [''], **splat
16
+ # super(location, namespace, name, comments)
17
+ super(**splat)
18
+ @type = type
19
+ @visibility = visibility
20
+ if name.start_with?('::')
21
+ @name = name[2..-1]
22
+ @closure = Solargraph::Pin::ROOT_PIN
23
+ end
24
+ @open_gates = gates
25
+ if @open_gates.one? && @open_gates.first.empty? && @name.include?('::')
26
+ # In this case, a chained namespace was opened (e.g., Foo::Bar)
27
+ # but Foo does not exist.
28
+ parts = @name.split('::')
29
+ @name = parts.pop
30
+ @closure = Pin::Namespace.new(name: parts.join('::'), gates: [parts.join('::')])
31
+ @context = nil
32
+ end
33
+ end
34
+
35
+ def namespace
36
+ context.namespace
37
+ end
38
+
39
+ def full_context
40
+ @full_context ||= ComplexType.try_parse("#{type.to_s.capitalize}<#{path}>")
41
+ end
42
+
43
+ def binder
44
+ full_context
45
+ end
46
+
47
+ def scope
48
+ context.scope
49
+ end
50
+
51
+ def completion_item_kind
52
+ (type == :class ? LanguageServer::CompletionItemKinds::CLASS : LanguageServer::CompletionItemKinds::MODULE)
53
+ end
54
+
55
+ # @return [Integer]
56
+ def symbol_kind
57
+ (type == :class ? LanguageServer::SymbolKinds::CLASS : LanguageServer::SymbolKinds::MODULE)
58
+ end
59
+
60
+ def path
61
+ @path ||= (namespace.empty? ? '' : "#{namespace}::") + name
62
+ end
63
+
64
+ def return_type
65
+ @return_type ||= ComplexType.try_parse( (type == :class ? 'Class' : 'Module') + "<#{path}>" )
66
+ end
67
+
68
+ def domains
69
+ @domains ||= []
70
+ end
71
+
72
+ def typify api_map
73
+ return_type
74
+ end
75
+
76
+ def gates
77
+ @gates ||= if path.empty?
78
+ @open_gates
79
+ else
80
+ [path] + @open_gates
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end