solargraph 0.46.0 → 0.54.5

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 (279) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/plugins.yml +40 -0
  4. data/.github/workflows/rspec.yml +37 -41
  5. data/.github/workflows/typecheck.yml +34 -0
  6. data/.gitignore +9 -9
  7. data/.rspec +2 -2
  8. data/.yardopts +2 -2
  9. data/CHANGELOG.md +1338 -1115
  10. data/Gemfile +0 -0
  11. data/LICENSE +1 -1
  12. data/README.md +131 -128
  13. data/Rakefile +0 -0
  14. data/SPONSORS.md +10 -18
  15. data/bin/solargraph +0 -0
  16. data/lib/solargraph/api_map/cache.rb +109 -70
  17. data/lib/solargraph/api_map/index.rb +167 -0
  18. data/lib/solargraph/api_map/source_to_yard.rb +88 -81
  19. data/lib/solargraph/api_map/store.rb +260 -256
  20. data/lib/solargraph/api_map.rb +870 -686
  21. data/lib/solargraph/bench.rb +44 -27
  22. data/lib/solargraph/cache.rb +77 -0
  23. data/lib/solargraph/complex_type/type_methods.rb +217 -130
  24. data/lib/solargraph/complex_type/unique_type.rb +386 -75
  25. data/lib/solargraph/complex_type.rb +394 -221
  26. data/lib/solargraph/convention/base.rb +33 -33
  27. data/lib/solargraph/convention/gemfile.rb +15 -15
  28. data/lib/solargraph/convention/gemspec.rb +22 -22
  29. data/lib/solargraph/convention/rakefile.rb +17 -0
  30. data/lib/solargraph/convention.rb +47 -47
  31. data/lib/solargraph/converters/dd.rb +17 -12
  32. data/lib/solargraph/converters/dl.rb +15 -12
  33. data/lib/solargraph/converters/dt.rb +15 -12
  34. data/lib/solargraph/converters/misc.rb +1 -1
  35. data/lib/solargraph/diagnostics/base.rb +29 -29
  36. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  37. data/lib/solargraph/diagnostics/rubocop.rb +113 -98
  38. data/lib/solargraph/diagnostics/rubocop_helpers.rb +66 -63
  39. data/lib/solargraph/diagnostics/severities.rb +15 -15
  40. data/lib/solargraph/diagnostics/type_check.rb +55 -54
  41. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  42. data/lib/solargraph/diagnostics.rb +55 -55
  43. data/lib/solargraph/doc_map.rb +188 -0
  44. data/lib/solargraph/environ.rb +45 -45
  45. data/lib/solargraph/equality.rb +33 -0
  46. data/lib/solargraph/gem_pins.rb +72 -0
  47. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
  48. data/lib/solargraph/language_server/error_codes.rb +20 -20
  49. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  50. data/lib/solargraph/language_server/host/dispatch.rb +128 -111
  51. data/lib/solargraph/language_server/host/message_worker.rb +106 -59
  52. data/lib/solargraph/language_server/host/sources.rb +99 -156
  53. data/lib/solargraph/language_server/host.rb +861 -865
  54. data/lib/solargraph/language_server/message/base.rb +96 -89
  55. data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
  56. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  57. data/lib/solargraph/language_server/message/client.rb +11 -11
  58. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -58
  59. data/lib/solargraph/language_server/message/completion_item.rb +11 -11
  60. data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
  61. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +112 -100
  62. data/lib/solargraph/language_server/message/extended/document.rb +20 -20
  63. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  64. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -23
  65. data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
  66. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  67. data/lib/solargraph/language_server/message/extended.rb +21 -21
  68. data/lib/solargraph/language_server/message/initialize.rb +191 -162
  69. data/lib/solargraph/language_server/message/initialized.rb +28 -27
  70. data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
  71. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
  72. data/lib/solargraph/language_server/message/shutdown.rb +13 -13
  73. data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
  74. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
  75. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -59
  76. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
  77. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
  78. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
  79. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
  80. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
  81. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  82. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -23
  83. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
  84. data/lib/solargraph/language_server/message/text_document/formatting.rb +131 -126
  85. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -54
  86. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
  87. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  88. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  89. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  90. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -29
  91. data/lib/solargraph/language_server/message/text_document/type_definition.rb +24 -0
  92. data/lib/solargraph/language_server/message/text_document.rb +28 -28
  93. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -30
  94. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -33
  95. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
  96. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  97. data/lib/solargraph/language_server/message/workspace.rb +14 -14
  98. data/lib/solargraph/language_server/message.rb +94 -93
  99. data/lib/solargraph/language_server/message_types.rb +14 -14
  100. data/lib/solargraph/language_server/progress.rb +135 -0
  101. data/lib/solargraph/language_server/request.rb +24 -24
  102. data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
  103. data/lib/solargraph/language_server/transport/adapter.rb +68 -53
  104. data/lib/solargraph/language_server/transport/data_reader.rb +74 -72
  105. data/lib/solargraph/language_server/transport.rb +13 -13
  106. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  107. data/lib/solargraph/language_server.rb +20 -19
  108. data/lib/solargraph/library.rb +663 -546
  109. data/lib/solargraph/location.rb +58 -37
  110. data/lib/solargraph/logging.rb +27 -27
  111. data/lib/solargraph/page.rb +89 -83
  112. data/lib/solargraph/parser/comment_ripper.rb +56 -52
  113. data/lib/solargraph/parser/node_methods.rb +83 -43
  114. data/lib/solargraph/parser/node_processor/base.rb +87 -77
  115. data/lib/solargraph/parser/node_processor.rb +45 -43
  116. data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +153 -135
  117. data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +18 -16
  118. data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +164 -148
  119. data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
  120. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +23 -23
  121. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +57 -0
  122. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +15 -15
  123. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +43 -42
  124. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +35 -25
  125. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +23 -23
  126. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/def_node.rb +50 -63
  127. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +36 -36
  128. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +23 -23
  129. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +38 -38
  130. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +28 -28
  131. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +53 -0
  132. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +39 -39
  133. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +16 -16
  134. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +36 -36
  135. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +42 -0
  136. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +259 -257
  137. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sym_node.rb +18 -18
  138. data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
  139. data/lib/solargraph/parser/parser_gem.rb +12 -0
  140. data/lib/solargraph/parser/region.rb +66 -66
  141. data/lib/solargraph/parser/snippet.rb +15 -13
  142. data/lib/solargraph/parser.rb +22 -26
  143. data/lib/solargraph/pin/base.rb +378 -296
  144. data/lib/solargraph/pin/base_variable.rb +118 -84
  145. data/lib/solargraph/pin/block.rb +101 -72
  146. data/lib/solargraph/pin/callable.rb +147 -0
  147. data/lib/solargraph/pin/class_variable.rb +8 -8
  148. data/lib/solargraph/pin/closure.rb +57 -37
  149. data/lib/solargraph/pin/common.rb +70 -70
  150. data/lib/solargraph/pin/constant.rb +43 -43
  151. data/lib/solargraph/pin/conversions.rb +123 -96
  152. data/lib/solargraph/pin/delegated_method.rb +101 -0
  153. data/lib/solargraph/pin/documenting.rb +98 -105
  154. data/lib/solargraph/pin/duck_method.rb +16 -16
  155. data/lib/solargraph/pin/global_variable.rb +8 -8
  156. data/lib/solargraph/pin/instance_variable.rb +34 -30
  157. data/lib/solargraph/pin/keyword.rb +15 -15
  158. data/lib/solargraph/pin/keyword_param.rb +8 -8
  159. data/lib/solargraph/pin/local_variable.rb +67 -55
  160. data/lib/solargraph/pin/method.rb +527 -245
  161. data/lib/solargraph/pin/method_alias.rb +31 -31
  162. data/lib/solargraph/pin/namespace.rb +107 -91
  163. data/lib/solargraph/pin/parameter.rb +212 -201
  164. data/lib/solargraph/pin/proxy_type.rb +29 -29
  165. data/lib/solargraph/pin/reference/extend.rb +10 -10
  166. data/lib/solargraph/pin/reference/include.rb +10 -10
  167. data/lib/solargraph/pin/reference/override.rb +29 -29
  168. data/lib/solargraph/pin/reference/prepend.rb +10 -10
  169. data/lib/solargraph/pin/reference/require.rb +14 -14
  170. data/lib/solargraph/pin/reference/superclass.rb +10 -10
  171. data/lib/solargraph/pin/reference.rb +22 -14
  172. data/lib/solargraph/pin/search.rb +56 -56
  173. data/lib/solargraph/pin/signature.rb +17 -0
  174. data/lib/solargraph/pin/singleton.rb +11 -11
  175. data/lib/solargraph/pin/symbol.rb +47 -47
  176. data/lib/solargraph/pin.rb +41 -37
  177. data/lib/solargraph/position.rb +107 -100
  178. data/lib/solargraph/range.rb +98 -95
  179. data/lib/solargraph/rbs_map/conversions.rb +646 -0
  180. data/lib/solargraph/rbs_map/core_fills.rb +50 -0
  181. data/lib/solargraph/rbs_map/core_map.rb +28 -0
  182. data/lib/solargraph/rbs_map/stdlib_map.rb +33 -0
  183. data/lib/solargraph/rbs_map.rb +93 -0
  184. data/lib/solargraph/server_methods.rb +16 -16
  185. data/lib/solargraph/shell.rb +269 -226
  186. data/lib/solargraph/source/chain/array.rb +33 -0
  187. data/lib/solargraph/source/chain/block_symbol.rb +13 -0
  188. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  189. data/lib/solargraph/source/chain/call.rb +303 -204
  190. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  191. data/lib/solargraph/source/chain/constant.rb +89 -75
  192. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  193. data/lib/solargraph/source/chain/hash.rb +33 -28
  194. data/lib/solargraph/source/chain/head.rb +19 -19
  195. data/lib/solargraph/source/chain/if.rb +28 -0
  196. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  197. data/lib/solargraph/source/chain/link.rb +98 -71
  198. data/lib/solargraph/source/chain/literal.rb +28 -23
  199. data/lib/solargraph/source/chain/or.rb +23 -23
  200. data/lib/solargraph/source/chain/q_call.rb +11 -11
  201. data/lib/solargraph/source/chain/variable.rb +13 -13
  202. data/lib/solargraph/source/chain/z_super.rb +30 -30
  203. data/lib/solargraph/source/chain.rb +252 -164
  204. data/lib/solargraph/source/change.rb +82 -79
  205. data/lib/solargraph/source/cursor.rb +167 -164
  206. data/lib/solargraph/source/source_chainer.rb +194 -191
  207. data/lib/solargraph/source/updater.rb +55 -54
  208. data/lib/solargraph/source.rb +495 -522
  209. data/lib/solargraph/source_map/clip.rb +232 -224
  210. data/lib/solargraph/source_map/completion.rb +23 -23
  211. data/lib/solargraph/source_map/data.rb +30 -0
  212. data/lib/solargraph/source_map/mapper.rb +255 -212
  213. data/lib/solargraph/source_map.rb +217 -180
  214. data/lib/solargraph/type_checker/checks.rb +120 -99
  215. data/lib/solargraph/type_checker/param_def.rb +35 -35
  216. data/lib/solargraph/type_checker/problem.rb +32 -32
  217. data/lib/solargraph/type_checker/rules.rb +62 -57
  218. data/lib/solargraph/type_checker.rb +672 -543
  219. data/lib/solargraph/version.rb +5 -5
  220. data/lib/solargraph/views/environment.erb +56 -58
  221. data/lib/solargraph/workspace/config.rb +239 -231
  222. data/lib/solargraph/workspace.rb +239 -215
  223. data/lib/solargraph/yard_map/cache.rb +25 -19
  224. data/lib/solargraph/yard_map/helpers.rb +16 -16
  225. data/lib/solargraph/yard_map/mapper/to_constant.rb +26 -25
  226. data/lib/solargraph/yard_map/mapper/to_method.rb +94 -78
  227. data/lib/solargraph/yard_map/mapper/to_namespace.rb +28 -27
  228. data/lib/solargraph/yard_map/mapper.rb +78 -77
  229. data/lib/solargraph/yard_map/to_method.rb +86 -79
  230. data/lib/solargraph/yard_map.rb +18 -460
  231. data/lib/solargraph/yard_tags.rb +20 -0
  232. data/lib/solargraph/yardoc.rb +52 -0
  233. data/lib/solargraph.rb +72 -69
  234. data/solargraph.gemspec +21 -10
  235. metadata +184 -115
  236. data/.travis.yml +0 -19
  237. data/lib/solargraph/api_map/bundler_methods.rb +0 -22
  238. data/lib/solargraph/compat.rb +0 -37
  239. data/lib/solargraph/convention/rspec.rb +0 -30
  240. data/lib/solargraph/documentor.rb +0 -76
  241. data/lib/solargraph/language_server/host/cataloger.rb +0 -56
  242. data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
  243. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
  244. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -35
  245. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
  246. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +0 -63
  247. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +0 -21
  248. data/lib/solargraph/parser/legacy/node_processors.rb +0 -54
  249. data/lib/solargraph/parser/legacy.rb +0 -12
  250. data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -144
  251. data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
  252. data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -315
  253. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
  254. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
  255. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -22
  256. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
  257. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -57
  258. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
  259. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
  260. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
  261. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
  262. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
  263. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
  264. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
  265. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
  266. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -45
  267. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -21
  268. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
  269. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -277
  270. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +0 -18
  271. data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -63
  272. data/lib/solargraph/parser/rubyvm.rb +0 -40
  273. data/lib/solargraph/yard_map/core_docs.rb +0 -170
  274. data/lib/solargraph/yard_map/core_fills.rb +0 -208
  275. data/lib/solargraph/yard_map/core_gen.rb +0 -76
  276. data/lib/solargraph/yard_map/rdoc_to_yard.rb +0 -140
  277. data/lib/solargraph/yard_map/stdlib_fills.rb +0 -43
  278. data/lib/yard-solargraph.rb +0 -33
  279. data/yardoc/2.2.2.tar.gz +0 -0
@@ -1,204 +1,303 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class Call < Link
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, arguments = [], with_block = false
18
- @word = word
19
- @arguments = arguments
20
- @with_block = with_block
21
- end
22
-
23
- def with_block?
24
- @with_block
25
- end
26
-
27
- # @param api_map [ApiMap]
28
- # @param name_pin [Pin::Base]
29
- # @param locals [Array<Pin::Base>]
30
- def resolve api_map, name_pin, locals
31
- return super_pins(api_map, name_pin) if word == 'super'
32
- found = if head?
33
- locals.select { |p| p.name == word }
34
- else
35
- []
36
- end
37
- return inferred_pins(found, api_map, name_pin.context, locals) unless found.empty?
38
- pins = api_map.get_method_stack(name_pin.binder.namespace, word, scope: name_pin.binder.scope)
39
- return [] if pins.empty?
40
- inferred_pins(pins, api_map, name_pin.context, locals)
41
- end
42
-
43
- private
44
-
45
- # @param pins [Array<Pin::Base>]
46
- # @param api_map [ApiMap]
47
- # @param context [ComplexType]
48
- # @param locals [Pin::LocalVariable]
49
- # @return [Array<Pin::Base>]
50
- def inferred_pins pins, api_map, context, locals
51
- result = pins.map do |p|
52
- overloads = p.docstring.tags(:overload)
53
- # next p if overloads.empty?
54
- type = ComplexType::UNDEFINED
55
- # @param [YARD::Tags::OverloadTag]
56
- overloads.each do |ol|
57
- next unless arguments_match(arguments, ol.parameters)
58
- next if ol.parameters.last && ol.parameters.last.first.start_with?('&') && ol.parameters.last.last.nil? && !with_block?
59
- match = true
60
- arguments.each_with_index do |arg, idx|
61
- achain = arguments[idx]
62
- next if achain.nil?
63
- param = ol.parameters[idx]
64
- if param.nil?
65
- match = false unless ol.parameters.last && ol.parameters.last.first.start_with?('*')
66
- break
67
- end
68
- par = ol.tags(:param).select { |pp| pp.name == param.first }.first
69
- next if par.nil? || par.types.nil? || par.types.empty?
70
- atype = achain.infer(api_map, Pin::ProxyType.anonymous(context), locals)
71
- other = ComplexType.try_parse(*par.types)
72
- # @todo Weak type comparison
73
- unless atype.tag == other.tag || api_map.super_and_sub?(other.tag, atype.tag)
74
- match = false
75
- break
76
- end
77
- end
78
- if match
79
- type = extra_return_type(ol, context)
80
- break if type
81
- 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?)
82
- type ||= ComplexType::UNDEFINED
83
- end
84
- break if type.defined?
85
- end
86
- next p.proxy(type) if type.defined?
87
- type = extra_return_type(p.docstring, context)
88
- if type
89
- next Solargraph::Pin::Method.new(
90
- location: p.location,
91
- closure: p.closure,
92
- name: p.name,
93
- comments: "@return [#{context.subtypes.first.to_s}]",
94
- scope: p.scope,
95
- visibility: p.visibility,
96
- parameters: p.parameters,
97
- node: p.node
98
- )
99
- end
100
- if p.is_a?(Pin::Method) && !p.macros.empty?
101
- result = process_macro(p, api_map, context, locals)
102
- next result unless result.return_type.undefined?
103
- elsif !p.directives.empty?
104
- result = process_directive(p, api_map, context, locals)
105
- next result unless result.return_type.undefined?
106
- end
107
- p
108
- end
109
- result.map do |pin|
110
- next pin if pin.return_type.undefined?
111
- selfy = pin.return_type.self_to(context.tag)
112
- selfy == pin.return_type ? pin : pin.proxy(selfy)
113
- end
114
- end
115
-
116
- # @param pin [Pin::Method]
117
- # @param api_map [ApiMap]
118
- # @param context [ComplexType]
119
- # @param locals [Pin::Base]
120
- # @return [Pin::Base]
121
- def process_macro pin, api_map, context, locals
122
- pin.macros.each do |macro|
123
- result = inner_process_macro(pin, macro, api_map, context, locals)
124
- return result unless result.return_type.undefined?
125
- end
126
- Pin::ProxyType.anonymous(ComplexType::UNDEFINED)
127
- end
128
-
129
- # @param pin [Pin::Method]
130
- # @param api_map [ApiMap]
131
- # @param context [ComplexType]
132
- # @param locals [Pin::Base]
133
- # @return [Pin::ProxyType]
134
- def process_directive pin, api_map, context, locals
135
- pin.directives.each do |dir|
136
- macro = api_map.named_macro(dir.tag.name)
137
- next if macro.nil?
138
- result = inner_process_macro(pin, macro, api_map, context, locals)
139
- return result unless result.return_type.undefined?
140
- end
141
- Pin::ProxyType.anonymous ComplexType::UNDEFINED
142
- end
143
-
144
- # @param pin [Pin]
145
- # @param macro [YARD::Tags::MacroDirective]
146
- # @param api_map [ApiMap]
147
- # @param context [ComplexType]
148
- # @param locals [Array<Pin::Base>]
149
- # @return [Pin::ProxyType]
150
- def inner_process_macro pin, macro, api_map, context, locals
151
- vals = arguments.map{ |c| Pin::ProxyType.anonymous(c.infer(api_map, pin, locals)) }
152
- txt = macro.tag.text.clone
153
- if txt.empty? && macro.tag.name
154
- named = api_map.named_macro(macro.tag.name)
155
- txt = named.tag.text.clone if named
156
- end
157
- i = 1
158
- vals.each do |v|
159
- txt.gsub!(/\$#{i}/, v.context.namespace)
160
- i += 1
161
- end
162
- docstring = Solargraph::Source.parse_docstring(txt).to_docstring
163
- tag = docstring.tag(:return)
164
- unless tag.nil? || tag.types.nil?
165
- return Pin::ProxyType.anonymous(ComplexType.try_parse(*tag.types))
166
- end
167
- Pin::ProxyType.anonymous(ComplexType::UNDEFINED)
168
- end
169
-
170
- # @param docstring [YARD::Docstring]
171
- # @param context [ComplexType]
172
- # @return [ComplexType]
173
- def extra_return_type docstring, context
174
- if docstring.has_tag?(:return_single_parameter) #&& context.subtypes.one?
175
- return context.subtypes.first || ComplexType::UNDEFINED
176
- elsif docstring.has_tag?(:return_value_parameter) && context.value_types.one?
177
- return context.value_types.first
178
- end
179
- nil
180
- end
181
-
182
- # @param arguments [Array<Chain>]
183
- # @param parameters [Array<String>]
184
- # @return [Boolean]
185
- def arguments_match arguments, parameters
186
- argcount = arguments.length
187
- # argcount -= 1 if !arguments.empty? && arguments.last.links.first.word.start_with?('&')
188
- parcount = parameters.length
189
- parcount -= 1 if !parameters.empty? && parameters.last.first.start_with?('&')
190
- return false if argcount < parcount && !(argcount == parcount - 1 && parameters.last.first.start_with?('*'))
191
- true
192
- end
193
-
194
- # @param api_map [ApiMap]
195
- # @param name_pin [Pin::Base]
196
- # @return [Array<Pin::Base>]
197
- def super_pins api_map, name_pin
198
- pins = api_map.get_method_stack(name_pin.namespace, name_pin.name, scope: name_pin.scope)
199
- pins.reject{|p| p.path == name_pin.path}
200
- end
201
- end
202
- end
203
- end
204
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class Call < Chain::Link
7
+ include Solargraph::Parser::NodeMethods
8
+
9
+ # @return [String]
10
+ attr_reader :word
11
+
12
+ # @return [::Array<Chain>]
13
+ attr_reader :arguments
14
+
15
+ # @return [Chain, nil]
16
+ attr_reader :block
17
+
18
+ # @param word [String]
19
+ # @param arguments [::Array<Chain>]
20
+ # @param block [Chain, nil]
21
+ def initialize word, arguments = [], block = nil
22
+ @word = word
23
+ @arguments = arguments
24
+ @block = block
25
+ fix_block_pass
26
+ end
27
+
28
+ # @sg-ignore Fix "Not enough arguments to Module#protected"
29
+ protected def equality_fields
30
+ super + [arguments, block]
31
+ end
32
+
33
+ def with_block?
34
+ !!@block
35
+ end
36
+
37
+ # @param api_map [ApiMap]
38
+ # @param name_pin [Pin::Closure] name_pin.binder should give us the object on which 'word' will be invoked
39
+ # @param locals [::Array<Pin::LocalVariable>]
40
+ def resolve api_map, name_pin, locals
41
+ return super_pins(api_map, name_pin) if word == 'super'
42
+ return yield_pins(api_map, name_pin) if word == 'yield'
43
+ found = if head?
44
+ locals.select { |p| p.name == word }
45
+ else
46
+ []
47
+ end
48
+ return inferred_pins(found, api_map, name_pin, locals) unless found.empty?
49
+ pins = name_pin.binder.each_unique_type.flat_map do |context|
50
+ ns = context.namespace == '' ? '' : context.namespace_type.tag
51
+ api_map.get_method_stack(ns, word, scope: context.scope)
52
+ end
53
+ return [] if pins.empty?
54
+ inferred_pins(pins, api_map, name_pin, locals)
55
+ end
56
+
57
+ private
58
+
59
+ # @param pins [::Enumerable<Pin::Method>]
60
+ # @param api_map [ApiMap]
61
+ # @param name_pin [Pin::Base]
62
+ # @param locals [::Array<Solargraph::Pin::LocalVariable, Solargraph::Pin::Parameter>]
63
+ # @return [::Array<Pin::Base>]
64
+ def inferred_pins pins, api_map, name_pin, locals
65
+ result = pins.map do |p|
66
+ next p unless p.is_a?(Pin::Method)
67
+ overloads = p.signatures
68
+ # next p if overloads.empty?
69
+ type = ComplexType::UNDEFINED
70
+ # start with overloads that require blocks; if we are
71
+ # passing a block, we want to find a signature that will
72
+ # use it. If we didn't pass a block, the logic below will
73
+ # reject it regardless
74
+
75
+ sorted_overloads = overloads.sort { |ol| ol.block? ? -1 : 1 }
76
+ new_signature_pin = nil
77
+ sorted_overloads.each do |ol|
78
+ next unless ol.arity_matches?(arguments, with_block?)
79
+ match = true
80
+
81
+ atypes = []
82
+ arguments.each_with_index do |arg, idx|
83
+ param = ol.parameters[idx]
84
+ if param.nil?
85
+ match = ol.parameters.any?(&:restarg?)
86
+ break
87
+ end
88
+ atype = atypes[idx] ||= arg.infer(api_map, Pin::ProxyType.anonymous(name_pin.context), locals)
89
+ # make sure we get types from up the method
90
+ # inheritance chain if we don't have them on this pin
91
+ ptype = param.typify api_map
92
+ # @todo Weak type comparison
93
+ # unless atype.tag == param.return_type.tag || api_map.super_and_sub?(param.return_type.tag, atype.tag)
94
+ unless ptype.undefined? || atype.name == ptype.name || ptype.any? { |current_ptype| api_map.super_and_sub?(current_ptype.name, atype.name) } || ptype.generic? || param.restarg?
95
+ match = false
96
+ break
97
+ end
98
+ end
99
+ if match
100
+ if ol.block && with_block?
101
+ block_atypes = ol.block.parameters.map(&:return_type)
102
+ if block.links.map(&:class) == [BlockSymbol]
103
+ # like the bar in foo(&:bar)
104
+ blocktype = block_symbol_call_type(api_map, name_pin.context, block_atypes, locals)
105
+ else
106
+ blocktype = block_call_type(api_map, name_pin, locals)
107
+ end
108
+ end
109
+ new_signature_pin = ol.resolve_generics_from_context_until_complete(ol.generics, atypes, nil, nil, blocktype)
110
+ new_return_type = new_signature_pin.return_type
111
+ type = with_params(new_return_type.self_to_type(name_pin.context), name_pin.context).qualify(api_map, name_pin.context.namespace) if new_return_type.defined?
112
+ type ||= ComplexType::UNDEFINED
113
+ end
114
+ break if type.defined?
115
+ end
116
+ p = p.with_single_signature(new_signature_pin) unless new_signature_pin.nil?
117
+ next p.proxy(type) if type.defined?
118
+ if !p.macros.empty?
119
+ result = process_macro(p, api_map, name_pin.context, locals)
120
+ next result unless result.return_type.undefined?
121
+ elsif !p.directives.empty?
122
+ result = process_directive(p, api_map, name_pin.context, locals)
123
+ next result unless result.return_type.undefined?
124
+ end
125
+ p
126
+ end
127
+ result.map do |pin|
128
+ if pin.path == 'Class#new' && name_pin.context.tag != 'Class'
129
+ reduced_context = name_pin.context.reduce_class_type
130
+ pin.proxy(reduced_context)
131
+ else
132
+ next pin if pin.return_type.undefined?
133
+ selfy = pin.return_type.self_to_type(name_pin.context)
134
+ selfy == pin.return_type ? pin : pin.proxy(selfy)
135
+ end
136
+ end
137
+ end
138
+
139
+ # @param pin [Pin::Base]
140
+ # @param api_map [ApiMap]
141
+ # @param context [ComplexType]
142
+ # @param locals [::Array<Solargraph::Pin::LocalVariable, Solargraph::Pin::Parameter>]
143
+ # @return [Pin::Base]
144
+ def process_macro pin, api_map, context, locals
145
+ pin.macros.each do |macro|
146
+ # @todo 'Wrong argument type for
147
+ # Solargraph::Source::Chain::Call#inner_process_macro:
148
+ # macro expected YARD::Tags::MacroDirective, received
149
+ # generic<Elem>' is because we lose 'rooted' information
150
+ # in the 'Chain::Array' class internally, leaving
151
+ # ::Array#each shadowed when it shouldn't be.
152
+ result = inner_process_macro(pin, macro, api_map, context, locals)
153
+ return result unless result.return_type.undefined?
154
+ end
155
+ Pin::ProxyType.anonymous(ComplexType::UNDEFINED)
156
+ end
157
+
158
+ # @param pin [Pin::Method]
159
+ # @param api_map [ApiMap]
160
+ # @param context [ComplexType]
161
+ # @param locals [::Array<Solargraph::Pin::LocalVariable, Solargraph::Pin::Parameter>]
162
+ # @return [Pin::ProxyType]
163
+ def process_directive pin, api_map, context, locals
164
+ pin.directives.each do |dir|
165
+ macro = api_map.named_macro(dir.tag.name)
166
+ next if macro.nil?
167
+ result = inner_process_macro(pin, macro, api_map, context, locals)
168
+ return result unless result.return_type.undefined?
169
+ end
170
+ Pin::ProxyType.anonymous ComplexType::UNDEFINED
171
+ end
172
+
173
+ # @param pin [Pin::Base]
174
+ # @param macro [YARD::Tags::MacroDirective]
175
+ # @param api_map [ApiMap]
176
+ # @param context [ComplexType]
177
+ # @param locals [::Array<Pin::LocalVariable, Pin::Parameter>]
178
+ # @return [Pin::ProxyType]
179
+ def inner_process_macro pin, macro, api_map, context, locals
180
+ vals = arguments.map{ |c| Pin::ProxyType.anonymous(c.infer(api_map, pin, locals)) }
181
+ txt = macro.tag.text.clone
182
+ if txt.empty? && macro.tag.name
183
+ named = api_map.named_macro(macro.tag.name)
184
+ txt = named.tag.text.clone if named
185
+ end
186
+ i = 1
187
+ vals.each do |v|
188
+ txt.gsub!(/\$#{i}/, v.context.namespace)
189
+ i += 1
190
+ end
191
+ docstring = Solargraph::Source.parse_docstring(txt).to_docstring
192
+ tag = docstring.tag(:return)
193
+ unless tag.nil? || tag.types.nil?
194
+ return Pin::ProxyType.anonymous(ComplexType.try_parse(*tag.types))
195
+ end
196
+ Pin::ProxyType.anonymous(ComplexType::UNDEFINED)
197
+ end
198
+
199
+ # @param docstring [YARD::Docstring]
200
+ # @param context [ComplexType]
201
+ # @return [ComplexType, nil]
202
+ def extra_return_type docstring, context
203
+ if docstring.has_tag?('return_single_parameter') #&& context.subtypes.one?
204
+ return context.subtypes.first || ComplexType::UNDEFINED
205
+ elsif docstring.has_tag?('return_value_parameter') && context.value_types.one?
206
+ return context.value_types.first
207
+ end
208
+ nil
209
+ end
210
+
211
+ # @param name_pin [Pin::Base]
212
+ # @return [Pin::Method, nil]
213
+ def find_method_pin(name_pin)
214
+ method_pin = name_pin
215
+ until method_pin.is_a?(Pin::Method)
216
+ method_pin = method_pin.closure
217
+ return if method_pin.nil?
218
+ end
219
+ method_pin
220
+ end
221
+
222
+ # @param api_map [ApiMap]
223
+ # @param name_pin [Pin::Base]
224
+ # @return [::Array<Pin::Base>]
225
+ def super_pins api_map, name_pin
226
+ method_pin = find_method_pin(name_pin)
227
+ return [] if method_pin.nil?
228
+ pins = api_map.get_method_stack(method_pin.namespace, method_pin.name, scope: method_pin.context.scope)
229
+ pins.reject{|p| p.path == name_pin.path}
230
+ end
231
+
232
+ # @param api_map [ApiMap]
233
+ # @param name_pin [Pin::Base]
234
+ # @return [::Array<Pin::Base>]
235
+ def yield_pins api_map, name_pin
236
+ method_pin = find_method_pin(name_pin)
237
+ return [] unless method_pin
238
+
239
+ method_pin.signatures.map(&:block).compact.map do |signature_pin|
240
+ return_type = signature_pin.return_type.qualify(api_map, name_pin.namespace)
241
+ signature_pin.proxy(return_type)
242
+ end
243
+ end
244
+
245
+ # @param type [ComplexType]
246
+ # @param context [ComplexType]
247
+ # @return [ComplexType]
248
+ def with_params type, context
249
+ return type unless type.to_s.include?('$')
250
+ ComplexType.try_parse(type.to_s.gsub('$', context.value_types.map(&:rooted_tag).join(', ')).gsub('<>', ''))
251
+ end
252
+
253
+ # @return [void]
254
+ def fix_block_pass
255
+ argument = @arguments.last&.links&.first
256
+ @block = @arguments.pop if argument.is_a?(BlockSymbol) || argument.is_a?(BlockVariable)
257
+ end
258
+
259
+ # @param api_map [ApiMap]
260
+ # @param context [ComplexType]
261
+ # @param block_parameter_types [::Array<ComplexType>]
262
+ # @param locals [::Array<Pin::LocalVariable>]
263
+ # @return [ComplexType, nil]
264
+ def block_symbol_call_type(api_map, context, block_parameter_types, locals)
265
+ # Ruby's shorthand for sending the passed in method name
266
+ # to the first yield parameter with no arguments
267
+ block_symbol_name = block.links.first.word
268
+ block_symbol_call_path = "#{block_parameter_types.first}##{block_symbol_name}"
269
+ callee = api_map.get_path_pins(block_symbol_call_path).first
270
+ return_type = callee&.return_type
271
+ # @todo: Figure out why we get unresolved generics at
272
+ # this point and need to assume method return types
273
+ # based on the generic type
274
+ return_type ||= api_map.get_path_pins("#{context.subtypes.first}##{block.links.first.word}").first&.return_type
275
+ return_type || ComplexType::UNDEFINED
276
+ end
277
+
278
+ # @param api_map [ApiMap]
279
+ # @return [Pin::Block, nil]
280
+ def find_block_pin(api_map)
281
+ node_location = Solargraph::Location.from_node(block.node)
282
+ return if node_location.nil?
283
+ block_pins = api_map.get_block_pins
284
+ block_pins.find { |pin| pin.location.contain?(node_location) }
285
+ end
286
+
287
+ # @param api_map [ApiMap]
288
+ # @param name_pin [Pin::Base]
289
+ # @param block_parameter_types [::Array<ComplexType>]
290
+ # @param locals [::Array<Pin::LocalVariable>]
291
+ # @return [ComplexType, nil]
292
+ def block_call_type(api_map, name_pin, locals)
293
+ return nil unless with_block?
294
+
295
+ block_context_pin = name_pin
296
+ block_pin = find_block_pin(api_map)
297
+ block_context_pin = block_pin.closure if block_pin
298
+ block.infer(api_map, block_context_pin, locals)
299
+ end
300
+ end
301
+ end
302
+ end
303
+ end
@@ -1,13 +1,13 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class ClassVariable < Link
7
- def resolve api_map, name_pin, locals
8
- api_map.get_class_variable_pins(name_pin.context.namespace).select{|p| p.name == word}
9
- end
10
- end
11
- end
12
- end
13
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class ClassVariable < Link
7
+ def resolve api_map, name_pin, locals
8
+ api_map.get_class_variable_pins(name_pin.context.namespace).select{|p| p.name == word}
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end