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,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class GlobalVariable < Link
7
+ def resolve api_map, name_pin, locals
8
+ api_map.get_global_variable_pins.select{|p| p.name == word}
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ # Chain::Head is a link for ambiguous words, e.g.; `String` can refer to
7
+ # either a class (`String`) or a function (`Kernel#String`).
8
+ #
9
+ # @note Chain::Head is only intended to handle `self` and `super`.
10
+ class Head < Link
11
+ def resolve api_map, name_pin, locals
12
+ return [Pin::ProxyType.anonymous(name_pin.binder)] if word == 'self'
13
+ # return super_pins(api_map, name_pin) if word == 'super'
14
+ []
15
+ end
16
+
17
+ # @todo This is temporary. Chain heads need to handle arguments to
18
+ # `super`.
19
+ # def arguments
20
+ # []
21
+ # end
22
+
23
+ private
24
+
25
+ # # @param api_map [ApiMap]
26
+ # # @param name_pin [Pin::Base]
27
+ # # @return [Array<Pin::Base>]
28
+ # def super_pins api_map, name_pin
29
+ # pins = api_map.get_method_stack(name_pin.namespace, name_pin.name, scope: name_pin.scope)
30
+ # pins.reject{|p| p.path == name_pin.path}
31
+ # end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class InstanceVariable < Link
7
+ def resolve api_map, name_pin, locals
8
+ api_map.get_instance_variable_pins(name_pin.binder.namespace, name_pin.binder.scope).select{|p| p.name == word}
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class Link
7
+ # @return [String]
8
+ attr_reader :word
9
+
10
+ attr_accessor :last_context
11
+
12
+ def initialize word = '<undefined>'
13
+ @word = word
14
+ end
15
+
16
+ def undefined?
17
+ word == '<undefined>'
18
+ end
19
+
20
+ def constant?
21
+ is_a?(Chain::Constant)
22
+ end
23
+
24
+ # @param api_map [ApiMap]
25
+ # @param name_pin [Pin::Base]
26
+ # @param locals [Array<Pin::Base>]
27
+ # @return [Array<Pin::Base>]
28
+ def resolve api_map, name_pin, locals
29
+ []
30
+ end
31
+
32
+ def head?
33
+ @head ||= false
34
+ end
35
+
36
+ def == other
37
+ self.class == other.class and word == other.word
38
+ end
39
+
40
+ # Make a copy of this link marked as the head of a chain
41
+ #
42
+ # @return [self]
43
+ def clone_head
44
+ clone.mark_head(true)
45
+ end
46
+
47
+ # Make a copy of this link unmarked as the head of a chain
48
+ #
49
+ # @return [self]
50
+ def clone_body
51
+ clone.mark_head(false)
52
+ end
53
+
54
+ protected
55
+
56
+ # Mark whether this link is the head of a chain
57
+ #
58
+ # @param bool [Boolean]
59
+ # @return [self]
60
+ def mark_head bool
61
+ @head = bool
62
+ self
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class Literal < Link
7
+ def word
8
+ @word ||= "<#{@type}>"
9
+ end
10
+
11
+ # @param type [String]
12
+ def initialize type
13
+ @type = type
14
+ @complex_type = ComplexType.try_parse(type)
15
+ end
16
+
17
+ def resolve api_map, name_pin, locals
18
+ [Pin::ProxyType.anonymous(@complex_type)]
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class Or < Link
7
+ def word
8
+ '<or>'
9
+ end
10
+
11
+ # @param type [String]
12
+ def initialize links
13
+ @links = links
14
+ end
15
+
16
+ def resolve api_map, name_pin, locals
17
+ types = @links.map { |link| link.infer(api_map, name_pin, locals) }
18
+ [Solargraph::Pin::ProxyType.anonymous(Solargraph::ComplexType.try_parse(types.map(&:tag).uniq.join(', ')))]
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class Variable < Link
7
+ def resolve api_map, name_pin, locals
8
+ api_map.get_instance_variable_pins(name_pin.context.namespace, name_pin.context.scope).select{|p| p.name == word}
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,184 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class ZSuper < Call
7
+ # @return [String]
8
+ attr_reader :word
9
+
10
+ # @return [Array<Chain>]
11
+ attr_reader :arguments
12
+
13
+ # @param word [String]
14
+ # @param arguments [Array<Chain>]
15
+ # @param with_block [Boolean] True if the chain is inside a block
16
+ # @param head [Boolean] True if the call is the start of its chain
17
+ def initialize word, with_block = false
18
+ super(word, [], with_block)
19
+ end
20
+
21
+ def with_block?
22
+ @with_block
23
+ end
24
+
25
+ # @param api_map [ApiMap]
26
+ # @param name_pin [Pin::Base]
27
+ # @param locals [Array<Pin::Base>]
28
+ def resolve api_map, name_pin, locals
29
+ return super_pins(api_map, name_pin)
30
+ end
31
+
32
+ private
33
+
34
+ # @param pins [Array<Pin::Base>]
35
+ # @param api_map [ApiMap]
36
+ # @param context [ComplexType]
37
+ # @param locals [Pin::LocalVariable]
38
+ # @return [Array<Pin::Base>]
39
+ def inferred_pins pins, api_map, context, locals
40
+ result = pins.map do |p|
41
+ overloads = p.docstring.tags(:overload)
42
+ # next p if overloads.empty?
43
+ type = ComplexType::UNDEFINED
44
+ # @param [YARD::Tags::OverloadTag]
45
+ overloads.each do |ol|
46
+ next unless arguments_match(arguments, ol.parameters)
47
+ next if ol.parameters.last && ol.parameters.last.first.start_with?('&') && ol.parameters.last.last.nil? && !with_block?
48
+ match = true
49
+ arguments.each_with_index do |arg, idx|
50
+ achain = arguments[idx]
51
+ next if achain.nil?
52
+ param = ol.parameters[idx]
53
+ if param.nil?
54
+ match = false unless ol.parameters.last && ol.parameters.last.first.start_with?('*')
55
+ break
56
+ end
57
+ par = ol.tags(:param).select { |pp| pp.name == param.first }.first
58
+ next if par.nil? || par.types.nil? || par.types.empty?
59
+ atype = achain.infer(api_map, Pin::ProxyType.anonymous(context), locals)
60
+ other = ComplexType.try_parse(*par.types)
61
+ # @todo Weak type comparison
62
+ unless atype.tag == other.tag || api_map.super_and_sub?(other.tag, atype.tag)
63
+ match = false
64
+ break
65
+ end
66
+ end
67
+ if match
68
+ type = extra_return_type(ol, context)
69
+ type = ComplexType.try_parse(*ol.tag(:return).types).self_to(context.to_s).qualify(api_map, context.namespace) if ol.has_tag?(:return) && ol.tag(:return).types && !ol.tag(:return).types.empty? && (type.nil? || type.undefined?)
70
+ type ||= ComplexType::UNDEFINED
71
+ end
72
+ break if type.defined?
73
+ end
74
+ next p.proxy(type) if type.defined?
75
+ type = extra_return_type(p.docstring, context)
76
+ if type
77
+ next Solargraph::Pin::Method.new(
78
+ location: p.location,
79
+ closure: p.closure,
80
+ name: p.name,
81
+ comments: "@return [#{context.subtypes.first.to_s}]",
82
+ scope: p.scope,
83
+ visibility: p.visibility,
84
+ parameters: p.parameters,
85
+ node: p.node
86
+ )
87
+ end
88
+ if p.is_a?(Pin::Method) && !p.macros.empty?
89
+ result = process_macro(p, api_map, context, locals)
90
+ next result unless result.return_type.undefined?
91
+ elsif !p.directives.empty?
92
+ result = process_directive(p, api_map, context, locals)
93
+ next result unless result.return_type.undefined?
94
+ end
95
+ p
96
+ end
97
+ result.map do |pin|
98
+ next pin if pin.return_type.undefined?
99
+ selfy = pin.return_type.self_to(context.tag)
100
+ selfy == pin.return_type ? pin : pin.proxy(selfy)
101
+ end
102
+ end
103
+
104
+ # @param pin [Pin::Method]
105
+ # @param api_map [ApiMap]
106
+ # @param context [ComplexType]
107
+ # @param locals [Pin::Base]
108
+ # @return [Pin::Base]
109
+ def process_macro pin, api_map, context, locals
110
+ pin.macros.each do |macro|
111
+ result = inner_process_macro(pin, macro, api_map, context, locals)
112
+ return result unless result.return_type.undefined?
113
+ end
114
+ Pin::ProxyType.anonymous(ComplexType::UNDEFINED)
115
+ end
116
+
117
+ # @param pin [Pin::Method]
118
+ # @param api_map [ApiMap]
119
+ # @param context [ComplexType]
120
+ # @param locals [Pin::Base]
121
+ # @return [Pin::ProxyType]
122
+ def process_directive pin, api_map, context, locals
123
+ pin.directives.each do |dir|
124
+ macro = api_map.named_macro(dir.tag.name)
125
+ next if macro.nil?
126
+ result = inner_process_macro(pin, macro, api_map, context, locals)
127
+ return result unless result.return_type.undefined?
128
+ end
129
+ Pin::ProxyType.anonymous ComplexType::UNDEFINED
130
+ end
131
+
132
+ # @param pin [Pin]
133
+ # @param macro [YARD::Tags::MacroDirective]
134
+ # @param api_map [ApiMap]
135
+ # @param context [ComplexType]
136
+ # @param locals [Array<Pin::Base>]
137
+ # @return [Pin::ProxyType]
138
+ def inner_process_macro pin, macro, api_map, context, locals
139
+ vals = arguments.map{ |c| Pin::ProxyType.anonymous(c.infer(api_map, pin, locals)) }
140
+ txt = macro.tag.text.clone
141
+ if txt.empty? && macro.tag.name
142
+ named = api_map.named_macro(macro.tag.name)
143
+ txt = named.tag.text.clone if named
144
+ end
145
+ i = 1
146
+ vals.each do |v|
147
+ txt.gsub!(/\$#{i}/, v.context.namespace)
148
+ i += 1
149
+ end
150
+ docstring = Solargraph::Source.parse_docstring(txt).to_docstring
151
+ tag = docstring.tag(:return)
152
+ unless tag.nil? || tag.types.nil?
153
+ return Pin::ProxyType.anonymous(ComplexType.try_parse(*tag.types))
154
+ end
155
+ Pin::ProxyType.anonymous(ComplexType::UNDEFINED)
156
+ end
157
+
158
+ # @param docstring [YARD::Docstring]
159
+ # @param context [ComplexType]
160
+ # @return [ComplexType]
161
+ def extra_return_type docstring, context
162
+ if docstring.has_tag?(:return_single_parameter) && context.subtypes.one?
163
+ return context.subtypes.first
164
+ elsif docstring.has_tag?(:return_value_parameter) && context.value_types.one?
165
+ return context.value_types.first
166
+ end
167
+ nil
168
+ end
169
+
170
+ # @param arguments [Array<Chain>]
171
+ # @param parameters [Array<String>]
172
+ # @return [Boolean]
173
+ def arguments_match arguments, parameters
174
+ argcount = arguments.length
175
+ # argcount -= 1 if !arguments.empty? && arguments.last.links.first.word.start_with?('&')
176
+ parcount = parameters.length
177
+ parcount -= 1 if !parameters.empty? && parameters.last.first.start_with?('&')
178
+ return false if argcount < parcount && !(argcount == parcount - 1 && parameters.last.first.start_with?('*'))
179
+ true
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ # A change to be applied to text.
6
+ #
7
+ class Change
8
+ include EncodingFixes
9
+
10
+ # @return [Range]
11
+ attr_reader :range
12
+
13
+ # @return [String]
14
+ attr_reader :new_text
15
+
16
+ # @param range [Range] The starting and ending positions of the change.
17
+ # If nil, the original text will be overwritten.
18
+ # @param new_text [String] The text to be changed.
19
+ def initialize range, new_text
20
+ @range = range
21
+ @new_text = new_text
22
+ end
23
+
24
+ # Write the change to the specified text.
25
+ #
26
+ # @param text [String] The text to be changed.
27
+ # @param nullable [Boolean] If true, minor changes that could generate
28
+ # syntax errors will be repaired.
29
+ # @return [String] The updated text.
30
+ def write text, nullable = false
31
+ if nullable and !range.nil? and new_text.match(/[\.\[\{\(@\$:]$/)
32
+ [':', '@'].each do |dupable|
33
+ next unless new_text == dupable
34
+ offset = Position.to_offset(text, range.start)
35
+ if text[offset - 1] == dupable
36
+ p = Position.from_offset(text, offset - 1)
37
+ r = Change.new(Range.new(p, range.start), ' ')
38
+ text = r.write(text)
39
+ end
40
+ break
41
+ end
42
+ commit text, "#{new_text[0..-2]} "
43
+ elsif range.nil?
44
+ new_text
45
+ else
46
+ commit text, new_text
47
+ end
48
+ end
49
+
50
+ # Repair an update by replacing the new text with similarly formatted
51
+ # whitespace.
52
+ #
53
+ # @param text [String] The text to be changed.
54
+ # @return [String] The updated text.
55
+ def repair text
56
+ fixed = new_text.gsub(/[^\s]/, ' ')
57
+ if range.nil?
58
+ fixed
59
+ else
60
+ result = commit text, fixed
61
+ off = Position.to_offset(text, range.start)
62
+ match = result[0, off].match(/[\.:]+\z/)
63
+ if match
64
+ result = result[0, off].sub(/#{match[0]}\z/, ' ' * match[0].length) + result[off..-1]
65
+ end
66
+ result
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def commit text, insert
73
+ start_offset = Position.to_offset(text, range.start)
74
+ end_offset = Position.to_offset(text, range.ending)
75
+ (start_offset == 0 ? '' : text[0..start_offset-1].to_s) + normalize(insert) + text[end_offset..-1].to_s
76
+ end
77
+ end
78
+ end
79
+ end