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,84 +1,118 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class BaseVariable < Base
6
- include Solargraph::Parser::NodeMethods
7
- # include Solargraph::Source::NodeMethods
8
-
9
- # @return [Parser::AST::Node, nil]
10
- attr_reader :assignment
11
-
12
- # @param assignment [Parser::AST::Node, nil]
13
- def initialize assignment: nil, **splat
14
- super(**splat)
15
- @assignment = assignment
16
- end
17
-
18
- def completion_item_kind
19
- Solargraph::LanguageServer::CompletionItemKinds::VARIABLE
20
- end
21
-
22
- # @return [Integer]
23
- def symbol_kind
24
- Solargraph::LanguageServer::SymbolKinds::VARIABLE
25
- end
26
-
27
- def return_type
28
- @return_type ||= generate_complex_type
29
- end
30
-
31
- def nil_assignment?
32
- return_type.nil?
33
- end
34
-
35
- def variable?
36
- true
37
- end
38
-
39
- def probe api_map
40
- return ComplexType::UNDEFINED if @assignment.nil?
41
- types = []
42
- returns_from(@assignment).each do |node|
43
- # Nil nodes may not have a location
44
- if node.nil? || node.type == :NIL || node.type == :nil
45
- types.push ComplexType::NIL
46
- else
47
- rng = Range.from_node(node)
48
- next if rng.nil?
49
- pos = rng.ending
50
- clip = api_map.clip_at(location.filename, pos)
51
- # Use the return node for inference. The clip might infer from the
52
- # first node in a method call instead of the entire call.
53
- chain = Parser.chain(node, nil, clip.in_block?)
54
- result = chain.infer(api_map, closure, clip.locals)
55
- types.push result unless result.undefined?
56
- end
57
- end
58
- return ComplexType::UNDEFINED if types.empty?
59
- ComplexType.try_parse(*types.map(&:tag))
60
- end
61
-
62
- def == other
63
- return false unless super
64
- assignment == other.assignment
65
- end
66
-
67
- def try_merge! pin
68
- return false unless super
69
- @assignment = pin.assignment
70
- @return_type = pin.return_type
71
- true
72
- end
73
-
74
- private
75
-
76
- # @return [ComplexType]
77
- def generate_complex_type
78
- tag = docstring.tag(:type)
79
- return ComplexType.try_parse(*tag.types) unless tag.nil? || tag.types.nil? || tag.types.empty?
80
- ComplexType.new
81
- end
82
- end
83
- end
84
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class BaseVariable < Base
6
+ include Solargraph::Parser::NodeMethods
7
+ # include Solargraph::Source::NodeMethods
8
+
9
+ # @return [Parser::AST::Node, nil]
10
+ attr_reader :assignment
11
+
12
+ attr_accessor :mass_assignment
13
+
14
+ # @param assignment [Parser::AST::Node, nil]
15
+ def initialize assignment: nil, **splat
16
+ super(**splat)
17
+ @assignment = assignment
18
+ # @type [nil, ::Array(Parser::AST::Node, Integer)]
19
+ @mass_assignment = nil
20
+ end
21
+
22
+ def completion_item_kind
23
+ Solargraph::LanguageServer::CompletionItemKinds::VARIABLE
24
+ end
25
+
26
+ # @return [Integer]
27
+ def symbol_kind
28
+ Solargraph::LanguageServer::SymbolKinds::VARIABLE
29
+ end
30
+
31
+ def return_type
32
+ @return_type ||= generate_complex_type
33
+ end
34
+
35
+ def nil_assignment?
36
+ return_type.nil?
37
+ end
38
+
39
+ def variable?
40
+ true
41
+ end
42
+
43
+ # @param parent_node [Parser::AST::Node]
44
+ # @param api_map [ApiMap]
45
+ # @return [::Array<ComplexType>]
46
+ def return_types_from_node(parent_node, api_map)
47
+ types = []
48
+ value_position_nodes_only(parent_node).each do |node|
49
+ # Nil nodes may not have a location
50
+ if node.nil? || node.type == :NIL || node.type == :nil
51
+ types.push ComplexType::NIL
52
+ else
53
+ rng = Range.from_node(node)
54
+ next if rng.nil?
55
+ pos = rng.ending
56
+ clip = api_map.clip_at(location.filename, pos)
57
+ # Use the return node for inference. The clip might infer from the
58
+ # first node in a method call instead of the entire call.
59
+ chain = Parser.chain(node, nil, nil)
60
+ result = chain.infer(api_map, closure, clip.locals).self_to_type(closure.context)
61
+ types.push result unless result.undefined?
62
+ end
63
+ end
64
+ types
65
+ end
66
+
67
+ # @param api_map [ApiMap]
68
+ # @return [ComplexType]
69
+ def probe api_map
70
+ unless @assignment.nil?
71
+ types = return_types_from_node(@assignment, api_map)
72
+ return ComplexType.new(types.uniq) unless types.empty?
73
+ end
74
+
75
+ unless @mass_assignment.nil?
76
+ mass_node, index = @mass_assignment
77
+ types = return_types_from_node(mass_node, api_map)
78
+ types.map! do |type|
79
+ if type.tuple?
80
+ type.all_params[index]
81
+ elsif ['::Array', '::Set', '::Enumerable'].include?(type.rooted_name)
82
+ type.all_params.first
83
+ end
84
+ end.compact!
85
+ return ComplexType.new(types.uniq) unless types.empty?
86
+ end
87
+
88
+ ComplexType::UNDEFINED
89
+ end
90
+
91
+ def == other
92
+ return false unless super
93
+ assignment == other.assignment
94
+ end
95
+
96
+ # @param pin [self]
97
+ def try_merge! pin
98
+ return false unless super
99
+ @assignment = pin.assignment
100
+ @return_type = pin.return_type
101
+ true
102
+ end
103
+
104
+ def type_desc
105
+ "#{super} = #{assignment&.type.inspect}"
106
+ end
107
+
108
+ private
109
+
110
+ # @return [ComplexType]
111
+ def generate_complex_type
112
+ tag = docstring.tag(:type)
113
+ return ComplexType.try_parse(*tag.types) unless tag.nil? || tag.types.nil? || tag.types.empty?
114
+ ComplexType.new
115
+ end
116
+ end
117
+ end
118
+ end
@@ -1,72 +1,101 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class Block < Closure
6
- # The signature of the method that receives this block.
7
- #
8
- # @return [Parser::AST::Node]
9
- attr_reader :receiver
10
-
11
- def initialize receiver: nil, args: [], context: nil, **splat
12
- super(**splat)
13
- @receiver = receiver
14
- @context = context
15
- @parameters = args
16
- end
17
-
18
- # @param api_map [ApiMap]
19
- # @return [void]
20
- def rebind api_map
21
- @binder ||= binder_or_nil(api_map)
22
- end
23
-
24
- def binder
25
- @binder || closure.binder
26
- end
27
-
28
- # @return [Array<String>]
29
- def parameters
30
- @parameters ||= []
31
- end
32
-
33
- # @return [Array<String>]
34
- def parameter_names
35
- @parameter_names ||= parameters.map(&:name)
36
- end
37
-
38
- private
39
-
40
- # @param api_map [ApiMap]
41
- # @return [ComplexType, nil]
42
- def binder_or_nil api_map
43
- return nil unless receiver
44
- word = receiver.children.find { |c| c.is_a?(::Symbol) }.to_s
45
- return nil unless api_map.rebindable_method_names.include?(word)
46
- chain = Parser.chain(receiver, location.filename)
47
- locals = api_map.source_map(location.filename).locals_at(location)
48
- links_last_word = chain.links.last.word
49
- if %w[instance_eval instance_exec class_eval class_exec module_eval module_exec].include?(links_last_word)
50
- return chain.base.infer(api_map, self, locals)
51
- end
52
- if 'define_method' == links_last_word and chain.define(api_map, self, locals).first&.path == 'Module#define_method' # change class type to instance type
53
- if chain.links.size > 1 # Class.define_method
54
- ty = chain.base.infer(api_map, self, locals)
55
- return Solargraph::ComplexType.parse(ty.namespace)
56
- else # define_method without self
57
- return Solargraph::ComplexType.parse(closure.binder.namespace)
58
- end
59
- end
60
- # other case without early return, read block yieldself tags
61
- receiver_pin = chain.define(api_map, self, locals).first
62
- if receiver_pin && receiver_pin.docstring
63
- ys = receiver_pin.docstring.tag(:yieldself)
64
- if ys && ys.types && !ys.types.empty?
65
- return ComplexType.try_parse(*ys.types).qualify(api_map, receiver_pin.context.namespace)
66
- end
67
- end
68
- nil
69
- end
70
- end
71
- end
72
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Block < Callable
6
+ # @return [Parser::AST::Node]
7
+ attr_reader :receiver
8
+
9
+ # @return [Parser::AST::Node]
10
+ attr_reader :node
11
+
12
+ # @param receiver [Parser::AST::Node, nil]
13
+ # @param node [Parser::AST::Node, nil]
14
+ # @param context [ComplexType, nil]
15
+ # @param args [::Array<Parameter>]
16
+ def initialize receiver: nil, args: [], context: nil, node: nil, **splat
17
+ super(**splat, parameters: args)
18
+ @receiver = receiver
19
+ @context = context
20
+ @return_type = ComplexType.parse('::Proc')
21
+ @node = node
22
+ end
23
+
24
+ # @param api_map [ApiMap]
25
+ # @return [void]
26
+ def rebind api_map
27
+ @rebind ||= maybe_rebind(api_map)
28
+ end
29
+
30
+ def binder
31
+ @rebind&.defined? ? @rebind : closure.binder
32
+ end
33
+
34
+ # @param yield_types [::Array<ComplexType>]
35
+ # @param parameters [::Array<Parameter>]
36
+ #
37
+ # @return [::Array<ComplexType>]
38
+ def destructure_yield_types(yield_types, parameters)
39
+ # yielding a tuple into a block will destructure the tuple
40
+ if yield_types.length == 1
41
+ yield_type = yield_types.first
42
+ return yield_type.all_params if yield_type.tuple? && yield_type.all_params.length == parameters.length
43
+ end
44
+ parameters.map.with_index { |_, idx| yield_types[idx] || ComplexType::UNDEFINED }
45
+ end
46
+
47
+ # @param api_map [ApiMap]
48
+ # @return [::Array<ComplexType>]
49
+ def typify_parameters(api_map)
50
+ chain = Parser.chain(receiver, filename, node)
51
+ clip = api_map.clip_at(location.filename, location.range.start)
52
+ locals = clip.locals - [self]
53
+ meths = chain.define(api_map, closure, locals)
54
+ # @todo Convert logic to use signatures
55
+ meths.each do |meth|
56
+ next if meth.block.nil?
57
+
58
+ yield_types = meth.block.parameters.map(&:return_type)
59
+ # 'arguments' is what the method says it will yield to the
60
+ # block; 'parameters' is what the block accepts
61
+ argument_types = destructure_yield_types(yield_types, parameters)
62
+ param_types = argument_types.each_with_index.map do |arg_type, idx|
63
+ param = parameters[idx]
64
+ param_type = chain.base.infer(api_map, param, locals)
65
+ unless arg_type.nil?
66
+ if arg_type.generic? && param_type.defined?
67
+ namespace_pin = api_map.get_namespace_pins(meth.namespace, closure.namespace).first
68
+ arg_type.resolve_generics(namespace_pin, param_type)
69
+ else
70
+ arg_type.self_to_type(chain.base.infer(api_map, self, locals)).qualify(api_map, meth.context.namespace)
71
+ end
72
+ end
73
+ end
74
+ return param_types if param_types.all?(&:defined?)
75
+ end
76
+ parameters.map { ComplexType::UNDEFINED }
77
+ end
78
+
79
+ private
80
+
81
+ # @param api_map [ApiMap]
82
+ # @return [ComplexType]
83
+ def maybe_rebind api_map
84
+ return ComplexType::UNDEFINED unless receiver
85
+
86
+ chain = Parser.chain(receiver, location.filename)
87
+ locals = api_map.source_map(location.filename).locals_at(location)
88
+ receiver_pin = chain.define(api_map, closure, locals).first
89
+ return ComplexType::UNDEFINED unless receiver_pin
90
+
91
+ types = receiver_pin.docstring.tag(:yieldreceiver)&.types
92
+ return ComplexType::UNDEFINED unless types&.any?
93
+
94
+ target = chain.base.infer(api_map, receiver_pin, locals)
95
+ target = full_context unless target.defined?
96
+
97
+ ComplexType.try_parse(*types).qualify(api_map, receiver_pin.context.namespace).self_to_type(target)
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Callable < Closure
6
+ # @return [Signature]
7
+ attr_reader :block
8
+
9
+ attr_reader :parameters
10
+
11
+ # @return [ComplexType, nil]
12
+ attr_reader :return_type
13
+
14
+ # @param block [Signature, nil]
15
+ # @param return_type [ComplexType, nil]
16
+ # @param parameters [::Array<Pin::Parameter>]
17
+ def initialize block: nil, return_type: nil, parameters: [], **splat
18
+ super(**splat)
19
+ @block = block
20
+ @return_type = return_type
21
+ @parameters = parameters
22
+ end
23
+
24
+ # @return [::Array<String>]
25
+ def parameter_names
26
+ @parameter_names ||= parameters.map(&:name)
27
+ end
28
+
29
+ # @param generics_to_resolve [Enumerable<String>]
30
+ # @param arg_types [Array<ComplexType>, nil]
31
+ # @param return_type_context [ComplexType, nil]
32
+ # @param yield_arg_types [Array<ComplexType>, nil]
33
+ # @param yield_return_type_context [ComplexType, nil]
34
+ # @param context [ComplexType, nil]
35
+ # @param resolved_generic_values [Hash{String => ComplexType}]
36
+ # @return [self]
37
+ def resolve_generics_from_context(generics_to_resolve,
38
+ arg_types = nil,
39
+ return_type_context = nil,
40
+ yield_arg_types = nil,
41
+ yield_return_type_context = nil,
42
+ resolved_generic_values: {})
43
+ callable = super(generics_to_resolve, return_type_context, resolved_generic_values: resolved_generic_values)
44
+ callable.parameters = callable.parameters.each_with_index.map do |param, i|
45
+ if arg_types.nil?
46
+ param.dup
47
+ else
48
+ param.resolve_generics_from_context(generics_to_resolve,
49
+ arg_types[i],
50
+ resolved_generic_values: resolved_generic_values)
51
+ end
52
+ end
53
+ callable.block = block.resolve_generics_from_context(generics_to_resolve,
54
+ yield_arg_types,
55
+ yield_return_type_context,
56
+ resolved_generic_values: resolved_generic_values) if callable.block?
57
+ callable
58
+ end
59
+
60
+ # @param generics_to_resolve [::Array<String>]
61
+ # @param arg_types [Array<ComplexType>, nil]
62
+ # @param return_type_context [ComplexType, nil]
63
+ # @param yield_arg_types [Array<ComplexType>, nil]
64
+ # @param yield_return_type_context [ComplexType, nil]
65
+ # @param context [ComplexType, nil]
66
+ # @param resolved_generic_values [Hash{String => ComplexType}]
67
+ # @return [self]
68
+ def resolve_generics_from_context_until_complete(generics_to_resolve,
69
+ arg_types = nil,
70
+ return_type_context = nil,
71
+ yield_arg_types = nil,
72
+ yield_return_type_context = nil,
73
+ resolved_generic_values: {})
74
+ # See
75
+ # https://github.com/soutaro/steep/tree/master/lib/steep/type_inference
76
+ # and
77
+ # https://github.com/sorbet/sorbet/blob/master/infer/inference.cc
78
+ # for other implementations
79
+
80
+ return self if generics_to_resolve.empty?
81
+
82
+ last_resolved_generic_values = resolved_generic_values.dup
83
+ new_pin = resolve_generics_from_context(generics_to_resolve,
84
+ arg_types,
85
+ return_type_context,
86
+ yield_arg_types,
87
+ yield_return_type_context,
88
+ resolved_generic_values: resolved_generic_values)
89
+ if last_resolved_generic_values == resolved_generic_values
90
+ # erase anything unresolved
91
+ return new_pin.erase_generics(self.generics)
92
+ end
93
+ new_pin.resolve_generics_from_context_until_complete(generics_to_resolve,
94
+ arg_types,
95
+ return_type_context,
96
+ yield_arg_types,
97
+ yield_return_type_context,
98
+ resolved_generic_values: resolved_generic_values)
99
+ end
100
+
101
+ # @return [Array<String>]
102
+ # @yieldparam [ComplexType]
103
+ # @yieldreturn [ComplexType]
104
+ # @return [self]
105
+ def transform_types(&transform)
106
+ # @todo 'super' alone should work here I think, but doesn't typecheck at level typed
107
+ callable = super(&transform)
108
+ callable.block = block.transform_types(&transform) if block?
109
+ callable.parameters = parameters.map do |param|
110
+ param.transform_types(&transform)
111
+ end
112
+ callable
113
+ end
114
+
115
+ # @param arguments [::Array<Chain>]
116
+ # @param with_block [Boolean]
117
+ # @return [Boolean]
118
+ def arity_matches? arguments, with_block
119
+ argcount = arguments.length
120
+ parcount = mandatory_positional_param_count
121
+ parcount -= 1 if !parameters.empty? && parameters.last.block?
122
+ return false if block? && !with_block
123
+ return false if argcount < parcount && !(argcount == parcount - 1 && parameters.last.restarg?)
124
+ true
125
+ end
126
+
127
+ def mandatory_positional_param_count
128
+ parameters.count(&:arg?)
129
+ end
130
+
131
+ # @return [String]
132
+ def to_rbs
133
+ rbs_generics + '(' + parameters.map { |param| param.to_rbs }.join(', ') + ') ' + (block.nil? ? '' : '{ ' + block.to_rbs + ' } ') + '-> ' + return_type.to_rbs
134
+ end
135
+
136
+ def block?
137
+ !!@block
138
+ end
139
+
140
+ protected
141
+
142
+ attr_writer :block
143
+
144
+ attr_writer :parameters
145
+ end
146
+ end
147
+ end
@@ -1,8 +1,8 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class ClassVariable < BaseVariable
6
- end
7
- end
8
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class ClassVariable < BaseVariable
6
+ end
7
+ end
8
+ end
@@ -1,37 +1,57 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class Closure < Base
6
- # @return [::Symbol] :class or :instance
7
- attr_reader :scope
8
-
9
- def initialize scope: :class, **splat
10
- super(**splat)
11
- @scope = scope
12
- end
13
-
14
- def context
15
- @context ||= begin
16
- result = super
17
- if scope == :instance
18
- Solargraph::ComplexType.parse(result.namespace)
19
- else
20
- result
21
- end
22
- end
23
- end
24
-
25
- def binder
26
- @binder || context
27
- end
28
-
29
- # @return [Array<String>]
30
- def gates
31
- # @todo This check might not be necessary. There should always be a
32
- # root pin
33
- closure ? closure.gates : ['']
34
- end
35
- end
36
- end
37
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Closure < Base
6
+ # @return [::Symbol] :class or :instance
7
+ attr_reader :scope
8
+
9
+ # @param scope [::Symbol] :class or :instance
10
+ # @param generics [::Array<Pin::Parameter>, nil]
11
+ def initialize scope: :class, generics: nil, **splat
12
+ super(**splat)
13
+ @scope = scope
14
+ @generics = generics
15
+ end
16
+
17
+ def context
18
+ @context ||= begin
19
+ result = super
20
+ if scope == :instance
21
+ result.reduce_class_type
22
+ else
23
+ result
24
+ end
25
+ end
26
+ end
27
+
28
+ def binder
29
+ @binder || context
30
+ end
31
+
32
+ # @return [::Array<String>]
33
+ def gates
34
+ # @todo This check might not be necessary. There should always be a
35
+ # root pin
36
+ closure ? closure.gates : ['']
37
+ end
38
+
39
+ # @return [::Array<String>]
40
+ def generics
41
+ @generics ||= docstring.tags(:generic).map(&:name)
42
+ end
43
+
44
+ # @return [String]
45
+ def to_rbs
46
+ rbs_generics + return_type.to_rbs
47
+ end
48
+
49
+ # @return [String]
50
+ def rbs_generics
51
+ return '' if generics.empty?
52
+
53
+ '[' + generics.map { |gen| gen.to_s }.join(', ') + '] '
54
+ end
55
+ end
56
+ end
57
+ end