rbs 4.1.0-java

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 (569) hide show
  1. checksums.yaml +7 -0
  2. data/.clang-format +75 -0
  3. data/.clangd +2 -0
  4. data/.dockerignore +37 -0
  5. data/.github/dependabot.yml +24 -0
  6. data/.github/workflows/bundle-update.yml +63 -0
  7. data/.github/workflows/c-check.yml +66 -0
  8. data/.github/workflows/comments.yml +37 -0
  9. data/.github/workflows/dependabot.yml +30 -0
  10. data/.github/workflows/jruby.yml +79 -0
  11. data/.github/workflows/milestone.yml +91 -0
  12. data/.github/workflows/ruby.yml +158 -0
  13. data/.github/workflows/rust.yml +186 -0
  14. data/.github/workflows/truffleruby.yml +54 -0
  15. data/.github/workflows/typecheck.yml +39 -0
  16. data/.github/workflows/wasm.yml +55 -0
  17. data/.github/workflows/windows.yml +49 -0
  18. data/.gitignore +39 -0
  19. data/.rubocop.yml +72 -0
  20. data/BSDL +22 -0
  21. data/CHANGELOG.md +2380 -0
  22. data/COPYING +56 -0
  23. data/Dockerfile.jruby +53 -0
  24. data/README.md +240 -0
  25. data/Rakefile +856 -0
  26. data/Steepfile +55 -0
  27. data/config.yml +913 -0
  28. data/core/array.rbs +4205 -0
  29. data/core/basic_object.rbs +376 -0
  30. data/core/binding.rbs +148 -0
  31. data/core/builtin.rbs +278 -0
  32. data/core/class.rbs +223 -0
  33. data/core/comparable.rbs +192 -0
  34. data/core/complex.rbs +812 -0
  35. data/core/constants.rbs +96 -0
  36. data/core/data.rbs +415 -0
  37. data/core/dir.rbs +993 -0
  38. data/core/encoding.rbs +1368 -0
  39. data/core/enumerable.rbs +2506 -0
  40. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  41. data/core/enumerator/product.rbs +92 -0
  42. data/core/enumerator.rbs +705 -0
  43. data/core/env.rbs +6 -0
  44. data/core/errno.rbs +682 -0
  45. data/core/errors.rbs +789 -0
  46. data/core/exception.rbs +485 -0
  47. data/core/false_class.rbs +82 -0
  48. data/core/fiber.rbs +570 -0
  49. data/core/fiber_error.rbs +11 -0
  50. data/core/file.rbs +2045 -0
  51. data/core/file_constants.rbs +463 -0
  52. data/core/file_stat.rbs +534 -0
  53. data/core/file_test.rbs +331 -0
  54. data/core/float.rbs +1292 -0
  55. data/core/gc.rbs +788 -0
  56. data/core/global_variables.rbs +184 -0
  57. data/core/hash.rbs +2183 -0
  58. data/core/integer.rbs +1374 -0
  59. data/core/io/buffer.rbs +995 -0
  60. data/core/io/wait.rbs +48 -0
  61. data/core/io.rbs +3472 -0
  62. data/core/kernel.rbs +3172 -0
  63. data/core/marshal.rbs +207 -0
  64. data/core/match_data.rbs +637 -0
  65. data/core/math.rbs +770 -0
  66. data/core/method.rbs +422 -0
  67. data/core/module.rbs +1856 -0
  68. data/core/nil_class.rbs +210 -0
  69. data/core/numeric.rbs +832 -0
  70. data/core/object.rbs +108 -0
  71. data/core/object_space/weak_key_map.rbs +166 -0
  72. data/core/object_space.rbs +197 -0
  73. data/core/pathname.rbs +1312 -0
  74. data/core/proc.rbs +905 -0
  75. data/core/process.rbs +2316 -0
  76. data/core/ractor.rbs +914 -0
  77. data/core/random.rbs +255 -0
  78. data/core/range.rbs +1209 -0
  79. data/core/rational.rbs +502 -0
  80. data/core/rb_config.rbs +88 -0
  81. data/core/rbs/ops.rbs +154 -0
  82. data/core/rbs/unnamed/argf.rbs +1236 -0
  83. data/core/rbs/unnamed/env_class.rbs +1214 -0
  84. data/core/rbs/unnamed/main_class.rbs +123 -0
  85. data/core/rbs/unnamed/random.rbs +186 -0
  86. data/core/refinement.rbs +59 -0
  87. data/core/regexp.rbs +1974 -0
  88. data/core/ruby.rbs +53 -0
  89. data/core/ruby_vm.rbs +809 -0
  90. data/core/rubygems/basic_specification.rbs +6 -0
  91. data/core/rubygems/config_file.rbs +38 -0
  92. data/core/rubygems/dependency_installer.rbs +6 -0
  93. data/core/rubygems/errors.rbs +112 -0
  94. data/core/rubygems/installer.rbs +15 -0
  95. data/core/rubygems/path_support.rbs +6 -0
  96. data/core/rubygems/platform.rbs +7 -0
  97. data/core/rubygems/request_set.rbs +49 -0
  98. data/core/rubygems/requirement.rbs +138 -0
  99. data/core/rubygems/rubygems.rbs +1108 -0
  100. data/core/rubygems/source_list.rbs +15 -0
  101. data/core/rubygems/specification.rbs +31 -0
  102. data/core/rubygems/stream_ui.rbs +5 -0
  103. data/core/rubygems/uninstaller.rbs +10 -0
  104. data/core/rubygems/version.rbs +133 -0
  105. data/core/set.rbs +751 -0
  106. data/core/signal.rbs +110 -0
  107. data/core/string.rbs +5532 -0
  108. data/core/struct.rbs +668 -0
  109. data/core/symbol.rbs +482 -0
  110. data/core/thread.rbs +1821 -0
  111. data/core/thread_group.rbs +79 -0
  112. data/core/time.rbs +1793 -0
  113. data/core/trace_point.rbs +483 -0
  114. data/core/true_class.rbs +98 -0
  115. data/core/unbound_method.rbs +337 -0
  116. data/core/warning.rbs +87 -0
  117. data/docs/CONTRIBUTING.md +107 -0
  118. data/docs/aliases.md +79 -0
  119. data/docs/architecture.md +110 -0
  120. data/docs/collection.md +192 -0
  121. data/docs/config.md +171 -0
  122. data/docs/data_and_struct.md +86 -0
  123. data/docs/encoding.md +56 -0
  124. data/docs/gem.md +56 -0
  125. data/docs/inline.md +634 -0
  126. data/docs/rbs_by_example.md +309 -0
  127. data/docs/release.md +69 -0
  128. data/docs/repo.md +125 -0
  129. data/docs/rust.md +96 -0
  130. data/docs/sigs.md +167 -0
  131. data/docs/stdlib.md +147 -0
  132. data/docs/syntax.md +940 -0
  133. data/docs/tools.md +17 -0
  134. data/docs/type_fingerprint.md +21 -0
  135. data/docs/wasm_serialization.md +80 -0
  136. data/exe/rbs +7 -0
  137. data/ext/rbs_extension/ast_translation.c +1855 -0
  138. data/ext/rbs_extension/ast_translation.h +41 -0
  139. data/ext/rbs_extension/class_constants.c +187 -0
  140. data/ext/rbs_extension/class_constants.h +104 -0
  141. data/ext/rbs_extension/compat.h +10 -0
  142. data/ext/rbs_extension/extconf.rb +40 -0
  143. data/ext/rbs_extension/legacy_location.c +299 -0
  144. data/ext/rbs_extension/legacy_location.h +82 -0
  145. data/ext/rbs_extension/main.c +613 -0
  146. data/ext/rbs_extension/rbs_extension.h +16 -0
  147. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  148. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  149. data/goodcheck.yml +91 -0
  150. data/include/rbs/ast.h +1047 -0
  151. data/include/rbs/defines.h +99 -0
  152. data/include/rbs/lexer.h +207 -0
  153. data/include/rbs/location.h +40 -0
  154. data/include/rbs/parser.h +153 -0
  155. data/include/rbs/serialize.h +39 -0
  156. data/include/rbs/string.h +47 -0
  157. data/include/rbs/util/rbs_allocator.h +59 -0
  158. data/include/rbs/util/rbs_assert.h +20 -0
  159. data/include/rbs/util/rbs_buffer.h +83 -0
  160. data/include/rbs/util/rbs_constant_pool.h +155 -0
  161. data/include/rbs/util/rbs_encoding.h +282 -0
  162. data/include/rbs/util/rbs_unescape.h +24 -0
  163. data/include/rbs.h +14 -0
  164. data/lib/rbs/ancestor_graph.rb +92 -0
  165. data/lib/rbs/annotate/annotations.rb +199 -0
  166. data/lib/rbs/annotate/formatter.rb +82 -0
  167. data/lib/rbs/annotate/rdoc_annotator.rb +398 -0
  168. data/lib/rbs/annotate/rdoc_source.rb +131 -0
  169. data/lib/rbs/annotate.rb +8 -0
  170. data/lib/rbs/ast/annotation.rb +29 -0
  171. data/lib/rbs/ast/comment.rb +29 -0
  172. data/lib/rbs/ast/declarations.rb +472 -0
  173. data/lib/rbs/ast/directives.rb +49 -0
  174. data/lib/rbs/ast/members.rb +451 -0
  175. data/lib/rbs/ast/ruby/annotations.rb +451 -0
  176. data/lib/rbs/ast/ruby/comment_block.rb +247 -0
  177. data/lib/rbs/ast/ruby/declarations.rb +291 -0
  178. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  179. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  180. data/lib/rbs/ast/ruby/members.rb +762 -0
  181. data/lib/rbs/ast/type_param.rb +235 -0
  182. data/lib/rbs/ast/visitor.rb +137 -0
  183. data/lib/rbs/buffer.rb +189 -0
  184. data/lib/rbs/builtin_names.rb +58 -0
  185. data/lib/rbs/cli/colored_io.rb +48 -0
  186. data/lib/rbs/cli/diff.rb +84 -0
  187. data/lib/rbs/cli/validate.rb +294 -0
  188. data/lib/rbs/cli.rb +1253 -0
  189. data/lib/rbs/collection/cleaner.rb +38 -0
  190. data/lib/rbs/collection/config/lockfile.rb +92 -0
  191. data/lib/rbs/collection/config/lockfile_generator.rb +269 -0
  192. data/lib/rbs/collection/config.rb +81 -0
  193. data/lib/rbs/collection/installer.rb +32 -0
  194. data/lib/rbs/collection/sources/base.rb +14 -0
  195. data/lib/rbs/collection/sources/git.rb +265 -0
  196. data/lib/rbs/collection/sources/local.rb +81 -0
  197. data/lib/rbs/collection/sources/rubygems.rb +48 -0
  198. data/lib/rbs/collection/sources/stdlib.rb +50 -0
  199. data/lib/rbs/collection/sources.rb +38 -0
  200. data/lib/rbs/collection.rb +16 -0
  201. data/lib/rbs/constant.rb +28 -0
  202. data/lib/rbs/definition.rb +415 -0
  203. data/lib/rbs/definition_builder/ancestor_builder.rb +678 -0
  204. data/lib/rbs/definition_builder/method_builder.rb +295 -0
  205. data/lib/rbs/definition_builder.rb +1054 -0
  206. data/lib/rbs/diff.rb +131 -0
  207. data/lib/rbs/environment/class_entry.rb +69 -0
  208. data/lib/rbs/environment/module_entry.rb +66 -0
  209. data/lib/rbs/environment/use_map.rb +77 -0
  210. data/lib/rbs/environment.rb +1028 -0
  211. data/lib/rbs/environment_loader.rb +167 -0
  212. data/lib/rbs/environment_walker.rb +155 -0
  213. data/lib/rbs/errors.rb +634 -0
  214. data/lib/rbs/factory.rb +18 -0
  215. data/lib/rbs/file_finder.rb +28 -0
  216. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  217. data/lib/rbs/inline_parser.rb +568 -0
  218. data/lib/rbs/location_aux.rb +170 -0
  219. data/lib/rbs/locator.rb +247 -0
  220. data/lib/rbs/method_type.rb +145 -0
  221. data/lib/rbs/namespace.rb +154 -0
  222. data/lib/rbs/parser/lex_result.rb +15 -0
  223. data/lib/rbs/parser/token.rb +23 -0
  224. data/lib/rbs/parser_aux.rb +144 -0
  225. data/lib/rbs/prototype/helpers.rb +197 -0
  226. data/lib/rbs/prototype/node_usage.rb +99 -0
  227. data/lib/rbs/prototype/rb.rb +816 -0
  228. data/lib/rbs/prototype/rbi.rb +793 -0
  229. data/lib/rbs/prototype/runtime/helpers.rb +59 -0
  230. data/lib/rbs/prototype/runtime/reflection.rb +19 -0
  231. data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
  232. data/lib/rbs/prototype/runtime.rb +680 -0
  233. data/lib/rbs/repository.rb +127 -0
  234. data/lib/rbs/resolver/constant_resolver.rb +219 -0
  235. data/lib/rbs/resolver/type_name_resolver.rb +167 -0
  236. data/lib/rbs/rewriter.rb +70 -0
  237. data/lib/rbs/sorter.rb +198 -0
  238. data/lib/rbs/source.rb +99 -0
  239. data/lib/rbs/substitution.rb +83 -0
  240. data/lib/rbs/subtractor.rb +204 -0
  241. data/lib/rbs/test/errors.rb +80 -0
  242. data/lib/rbs/test/guaranteed.rb +30 -0
  243. data/lib/rbs/test/hook.rb +212 -0
  244. data/lib/rbs/test/observer.rb +19 -0
  245. data/lib/rbs/test/setup.rb +84 -0
  246. data/lib/rbs/test/setup_helper.rb +50 -0
  247. data/lib/rbs/test/tester.rb +167 -0
  248. data/lib/rbs/test/type_check.rb +457 -0
  249. data/lib/rbs/test.rb +112 -0
  250. data/lib/rbs/type_alias_dependency.rb +100 -0
  251. data/lib/rbs/type_alias_regularity.rb +126 -0
  252. data/lib/rbs/type_name.rb +122 -0
  253. data/lib/rbs/types.rb +1604 -0
  254. data/lib/rbs/unit_test/convertibles.rb +177 -0
  255. data/lib/rbs/unit_test/spy.rb +138 -0
  256. data/lib/rbs/unit_test/type_assertions.rb +383 -0
  257. data/lib/rbs/unit_test/with_aliases.rb +145 -0
  258. data/lib/rbs/unit_test.rb +6 -0
  259. data/lib/rbs/validator.rb +186 -0
  260. data/lib/rbs/variance_calculator.rb +189 -0
  261. data/lib/rbs/vendorer.rb +71 -0
  262. data/lib/rbs/version.rb +5 -0
  263. data/lib/rbs/wasm/deserializer.rb +213 -0
  264. data/lib/rbs/wasm/location.rb +61 -0
  265. data/lib/rbs/wasm/parser.rb +137 -0
  266. data/lib/rbs/wasm/rbs_parser.wasm +0 -0
  267. data/lib/rbs/wasm/runtime.rb +196 -0
  268. data/lib/rbs/wasm/serialization_schema.rb +110 -0
  269. data/lib/rbs/writer.rb +424 -0
  270. data/lib/rbs.rb +117 -0
  271. data/lib/rbs_jars.rb +39 -0
  272. data/lib/rdoc/discover.rb +20 -0
  273. data/lib/rdoc_plugin/parser.rb +168 -0
  274. data/rbs.gemspec +81 -0
  275. data/schema/annotation.json +14 -0
  276. data/schema/comment.json +26 -0
  277. data/schema/decls.json +326 -0
  278. data/schema/function.json +87 -0
  279. data/schema/location.json +56 -0
  280. data/schema/members.json +266 -0
  281. data/schema/methodType.json +50 -0
  282. data/schema/typeParam.json +52 -0
  283. data/schema/types.json +317 -0
  284. data/sig/ancestor_builder.rbs +163 -0
  285. data/sig/ancestor_graph.rbs +60 -0
  286. data/sig/annotate/annotations.rbs +102 -0
  287. data/sig/annotate/formatter.rbs +24 -0
  288. data/sig/annotate/rdoc_annotater.rbs +85 -0
  289. data/sig/annotate/rdoc_source.rbs +32 -0
  290. data/sig/annotation.rbs +27 -0
  291. data/sig/ast/ruby/annotations.rbs +470 -0
  292. data/sig/ast/ruby/comment_block.rbs +127 -0
  293. data/sig/ast/ruby/declarations.rbs +158 -0
  294. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  295. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  296. data/sig/ast/ruby/members.rbs +198 -0
  297. data/sig/buffer.rbs +108 -0
  298. data/sig/builtin_names.rbs +44 -0
  299. data/sig/cli/colored_io.rbs +15 -0
  300. data/sig/cli/diff.rbs +15 -0
  301. data/sig/cli/validate.rbs +47 -0
  302. data/sig/cli.rbs +89 -0
  303. data/sig/collection/cleaner.rbs +13 -0
  304. data/sig/collection/config/lockfile.rbs +74 -0
  305. data/sig/collection/config/lockfile_generator.rbs +68 -0
  306. data/sig/collection/config.rbs +46 -0
  307. data/sig/collection/installer.rbs +17 -0
  308. data/sig/collection/sources.rbs +214 -0
  309. data/sig/collection.rbs +4 -0
  310. data/sig/comment.rbs +26 -0
  311. data/sig/constant.rbs +21 -0
  312. data/sig/declarations.rbs +274 -0
  313. data/sig/definition.rbs +232 -0
  314. data/sig/definition_builder.rbs +181 -0
  315. data/sig/diff.rbs +28 -0
  316. data/sig/directives.rbs +77 -0
  317. data/sig/environment/class_entry.rbs +50 -0
  318. data/sig/environment/module_entry.rbs +50 -0
  319. data/sig/environment.rbs +286 -0
  320. data/sig/environment_loader.rbs +111 -0
  321. data/sig/environment_walker.rbs +65 -0
  322. data/sig/errors.rbs +408 -0
  323. data/sig/factory.rbs +5 -0
  324. data/sig/file_finder.rbs +28 -0
  325. data/sig/inline_parser/comment_association.rbs +71 -0
  326. data/sig/inline_parser.rbs +126 -0
  327. data/sig/location.rbs +135 -0
  328. data/sig/locator.rbs +56 -0
  329. data/sig/manifest.yaml +5 -0
  330. data/sig/members.rbs +258 -0
  331. data/sig/method_builder.rbs +89 -0
  332. data/sig/method_types.rbs +58 -0
  333. data/sig/namespace.rbs +161 -0
  334. data/sig/parser.rbs +164 -0
  335. data/sig/prototype/helpers.rbs +29 -0
  336. data/sig/prototype/node_usage.rbs +20 -0
  337. data/sig/prototype/rb.rbs +96 -0
  338. data/sig/prototype/rbi.rbs +104 -0
  339. data/sig/prototype/runtime.rbs +182 -0
  340. data/sig/rbs.rbs +21 -0
  341. data/sig/rdoc/rbs.rbs +67 -0
  342. data/sig/repository.rbs +85 -0
  343. data/sig/resolver/constant_resolver.rbs +92 -0
  344. data/sig/resolver/context.rbs +34 -0
  345. data/sig/resolver/type_name_resolver.rbs +61 -0
  346. data/sig/rewriter.rbs +45 -0
  347. data/sig/shims/bundler.rbs +38 -0
  348. data/sig/shims/enumerable.rbs +5 -0
  349. data/sig/shims/rubygems.rbs +19 -0
  350. data/sig/sorter.rbs +41 -0
  351. data/sig/source.rbs +48 -0
  352. data/sig/substitution.rbs +48 -0
  353. data/sig/subtractor.rbs +37 -0
  354. data/sig/test/errors.rbs +52 -0
  355. data/sig/test/guranteed.rbs +9 -0
  356. data/sig/test/type_check.rbs +19 -0
  357. data/sig/test.rbs +82 -0
  358. data/sig/type_alias_dependency.rbs +53 -0
  359. data/sig/type_alias_regularity.rbs +98 -0
  360. data/sig/type_param.rbs +115 -0
  361. data/sig/typename.rbs +89 -0
  362. data/sig/types.rbs +578 -0
  363. data/sig/unit_test/convertibles.rbs +154 -0
  364. data/sig/unit_test/spy.rbs +22 -0
  365. data/sig/unit_test/type_assertions.rbs +211 -0
  366. data/sig/unit_test/with_aliases.rbs +136 -0
  367. data/sig/use_map.rbs +35 -0
  368. data/sig/util.rbs +9 -0
  369. data/sig/validator.rbs +63 -0
  370. data/sig/variance_calculator.rbs +87 -0
  371. data/sig/vendorer.rbs +51 -0
  372. data/sig/version.rbs +3 -0
  373. data/sig/visitor.rbs +47 -0
  374. data/sig/wasm/deserializer.rbs +66 -0
  375. data/sig/wasm/serialization_schema.rbs +13 -0
  376. data/sig/writer.rbs +127 -0
  377. data/src/ast.c +1628 -0
  378. data/src/lexer.c +3221 -0
  379. data/src/lexer.re +155 -0
  380. data/src/lexstate.c +221 -0
  381. data/src/location.c +31 -0
  382. data/src/parser.c +4255 -0
  383. data/src/serialize.c +958 -0
  384. data/src/string.c +41 -0
  385. data/src/util/rbs_allocator.c +171 -0
  386. data/src/util/rbs_assert.c +19 -0
  387. data/src/util/rbs_buffer.c +54 -0
  388. data/src/util/rbs_constant_pool.c +268 -0
  389. data/src/util/rbs_encoding.c +21308 -0
  390. data/src/util/rbs_unescape.c +167 -0
  391. data/stdlib/abbrev/0/abbrev.rbs +66 -0
  392. data/stdlib/abbrev/0/array.rbs +26 -0
  393. data/stdlib/base64/0/base64.rbs +355 -0
  394. data/stdlib/benchmark/0/benchmark.rbs +452 -0
  395. data/stdlib/bigdecimal/0/big_decimal.rbs +1647 -0
  396. data/stdlib/bigdecimal-math/0/big_math.rbs +280 -0
  397. data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
  398. data/stdlib/cgi/0/core.rbs +911 -0
  399. data/stdlib/cgi/0/manifest.yaml +4 -0
  400. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  401. data/stdlib/coverage/0/coverage.rbs +266 -0
  402. data/stdlib/csv/0/csv.rbs +3776 -0
  403. data/stdlib/csv/0/manifest.yaml +3 -0
  404. data/stdlib/date/0/date.rbs +1598 -0
  405. data/stdlib/date/0/date_time.rbs +617 -0
  406. data/stdlib/date/0/time.rbs +26 -0
  407. data/stdlib/dbm/0/dbm.rbs +421 -0
  408. data/stdlib/delegate/0/delegator.rbs +188 -0
  409. data/stdlib/delegate/0/kernel.rbs +47 -0
  410. data/stdlib/delegate/0/simple_delegator.rbs +96 -0
  411. data/stdlib/did_you_mean/0/did_you_mean.rbs +344 -0
  412. data/stdlib/digest/0/digest.rbs +693 -0
  413. data/stdlib/erb/0/erb.rbs +933 -0
  414. data/stdlib/etc/0/etc.rbs +884 -0
  415. data/stdlib/fileutils/0/fileutils.rbs +1753 -0
  416. data/stdlib/find/0/find.rbs +49 -0
  417. data/stdlib/forwardable/0/forwardable.rbs +271 -0
  418. data/stdlib/io-console/0/io-console.rbs +414 -0
  419. data/stdlib/ipaddr/0/ipaddr.rbs +431 -0
  420. data/stdlib/json/0/json.rbs +1963 -0
  421. data/stdlib/kconv/0/kconv.rbs +166 -0
  422. data/stdlib/logger/0/formatter.rbs +45 -0
  423. data/stdlib/logger/0/log_device.rbs +100 -0
  424. data/stdlib/logger/0/logger.rbs +796 -0
  425. data/stdlib/logger/0/manifest.yaml +2 -0
  426. data/stdlib/logger/0/period.rbs +17 -0
  427. data/stdlib/logger/0/severity.rbs +34 -0
  428. data/stdlib/minitest/0/kernel.rbs +42 -0
  429. data/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
  430. data/stdlib/minitest/0/minitest/assertion.rbs +17 -0
  431. data/stdlib/minitest/0/minitest/assertions.rbs +590 -0
  432. data/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
  433. data/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
  434. data/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
  435. data/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
  436. data/stdlib/minitest/0/minitest/compress.rbs +13 -0
  437. data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
  438. data/stdlib/minitest/0/minitest/expectation.rbs +2 -0
  439. data/stdlib/minitest/0/minitest/expectations.rbs +21 -0
  440. data/stdlib/minitest/0/minitest/guard.rbs +64 -0
  441. data/stdlib/minitest/0/minitest/mock.rbs +64 -0
  442. data/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
  443. data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
  444. data/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
  445. data/stdlib/minitest/0/minitest/parallel.rbs +2 -0
  446. data/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
  447. data/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
  448. data/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
  449. data/stdlib/minitest/0/minitest/reportable.rbs +53 -0
  450. data/stdlib/minitest/0/minitest/reporter.rbs +5 -0
  451. data/stdlib/minitest/0/minitest/result.rbs +28 -0
  452. data/stdlib/minitest/0/minitest/runnable.rbs +163 -0
  453. data/stdlib/minitest/0/minitest/skip.rbs +6 -0
  454. data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
  455. data/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
  456. data/stdlib/minitest/0/minitest/spec.rbs +11 -0
  457. data/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
  458. data/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
  459. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
  460. data/stdlib/minitest/0/minitest/test.rbs +69 -0
  461. data/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
  462. data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
  463. data/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
  464. data/stdlib/minitest/0/minitest/unit.rbs +4 -0
  465. data/stdlib/minitest/0/minitest.rbs +115 -0
  466. data/stdlib/monitor/0/monitor.rbs +363 -0
  467. data/stdlib/mutex_m/0/mutex_m.rbs +104 -0
  468. data/stdlib/net-http/0/manifest.yaml +3 -0
  469. data/stdlib/net-http/0/net-http.rbs +5580 -0
  470. data/stdlib/net-protocol/0/manifest.yaml +2 -0
  471. data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
  472. data/stdlib/net-smtp/0/manifest.yaml +2 -0
  473. data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
  474. data/stdlib/nkf/0/nkf.rbs +402 -0
  475. data/stdlib/objspace/0/objspace.rbs +470 -0
  476. data/stdlib/observable/0/observable.rbs +217 -0
  477. data/stdlib/open-uri/0/manifest.yaml +4 -0
  478. data/stdlib/open-uri/0/open-uri.rbs +433 -0
  479. data/stdlib/open3/0/open3.rbs +606 -0
  480. data/stdlib/openssl/0/manifest.yaml +3 -0
  481. data/stdlib/openssl/0/openssl.rbs +12237 -0
  482. data/stdlib/optparse/0/optparse.rbs +1734 -0
  483. data/stdlib/pathname/0/pathname.rbs +36 -0
  484. data/stdlib/pp/0/manifest.yaml +2 -0
  485. data/stdlib/pp/0/pp.rbs +301 -0
  486. data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
  487. data/stdlib/pstore/0/pstore.rbs +608 -0
  488. data/stdlib/psych/0/core_ext.rbs +12 -0
  489. data/stdlib/psych/0/dbm.rbs +237 -0
  490. data/stdlib/psych/0/manifest.yaml +3 -0
  491. data/stdlib/psych/0/psych.rbs +455 -0
  492. data/stdlib/psych/0/store.rbs +57 -0
  493. data/stdlib/pty/0/pty.rbs +240 -0
  494. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  495. data/stdlib/rdoc/0/code_object.rbs +52 -0
  496. data/stdlib/rdoc/0/comment.rbs +61 -0
  497. data/stdlib/rdoc/0/context.rbs +153 -0
  498. data/stdlib/rdoc/0/markup.rbs +117 -0
  499. data/stdlib/rdoc/0/options.rbs +76 -0
  500. data/stdlib/rdoc/0/parser.rbs +56 -0
  501. data/stdlib/rdoc/0/rdoc.rbs +393 -0
  502. data/stdlib/rdoc/0/ri.rbs +17 -0
  503. data/stdlib/rdoc/0/store.rbs +48 -0
  504. data/stdlib/rdoc/0/top_level.rbs +97 -0
  505. data/stdlib/resolv/0/manifest.yaml +3 -0
  506. data/stdlib/resolv/0/resolv.rbs +1787 -0
  507. data/stdlib/ripper/0/ripper.rbs +1654 -0
  508. data/stdlib/securerandom/0/manifest.yaml +2 -0
  509. data/stdlib/securerandom/0/securerandom.rbs +49 -0
  510. data/stdlib/shellwords/0/shellwords.rbs +229 -0
  511. data/stdlib/singleton/0/singleton.rbs +134 -0
  512. data/stdlib/socket/0/addrinfo.rbs +666 -0
  513. data/stdlib/socket/0/basic_socket.rbs +590 -0
  514. data/stdlib/socket/0/constants.rbs +2295 -0
  515. data/stdlib/socket/0/ip_socket.rbs +94 -0
  516. data/stdlib/socket/0/socket.rbs +4170 -0
  517. data/stdlib/socket/0/socket_error.rbs +5 -0
  518. data/stdlib/socket/0/tcp_server.rbs +192 -0
  519. data/stdlib/socket/0/tcp_socket.rbs +87 -0
  520. data/stdlib/socket/0/udp_socket.rbs +133 -0
  521. data/stdlib/socket/0/unix_server.rbs +169 -0
  522. data/stdlib/socket/0/unix_socket.rbs +172 -0
  523. data/stdlib/stringio/0/stringio.rbs +1681 -0
  524. data/stdlib/strscan/0/string_scanner.rbs +1648 -0
  525. data/stdlib/tempfile/0/manifest.yaml +3 -0
  526. data/stdlib/tempfile/0/tempfile.rbs +483 -0
  527. data/stdlib/time/0/time.rbs +434 -0
  528. data/stdlib/timeout/0/timeout.rbs +132 -0
  529. data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
  530. data/stdlib/tsort/0/cyclic.rbs +8 -0
  531. data/stdlib/tsort/0/interfaces.rbs +20 -0
  532. data/stdlib/tsort/0/tsort.rbs +410 -0
  533. data/stdlib/uri/0/common.rbs +621 -0
  534. data/stdlib/uri/0/file.rbs +118 -0
  535. data/stdlib/uri/0/ftp.rbs +13 -0
  536. data/stdlib/uri/0/generic.rbs +1111 -0
  537. data/stdlib/uri/0/http.rbs +104 -0
  538. data/stdlib/uri/0/https.rbs +14 -0
  539. data/stdlib/uri/0/ldap.rbs +230 -0
  540. data/stdlib/uri/0/ldaps.rbs +14 -0
  541. data/stdlib/uri/0/mailto.rbs +92 -0
  542. data/stdlib/uri/0/rfc2396_parser.rbs +189 -0
  543. data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
  544. data/stdlib/uri/0/ws.rbs +13 -0
  545. data/stdlib/uri/0/wss.rbs +9 -0
  546. data/stdlib/yaml/0/manifest.yaml +2 -0
  547. data/stdlib/yaml/0/yaml.rbs +1 -0
  548. data/stdlib/zlib/0/buf_error.rbs +10 -0
  549. data/stdlib/zlib/0/data_error.rbs +10 -0
  550. data/stdlib/zlib/0/deflate.rbs +211 -0
  551. data/stdlib/zlib/0/error.rbs +20 -0
  552. data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
  553. data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
  554. data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
  555. data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
  556. data/stdlib/zlib/0/gzip_file.rbs +156 -0
  557. data/stdlib/zlib/0/gzip_reader.rbs +293 -0
  558. data/stdlib/zlib/0/gzip_writer.rbs +168 -0
  559. data/stdlib/zlib/0/inflate.rbs +180 -0
  560. data/stdlib/zlib/0/mem_error.rbs +10 -0
  561. data/stdlib/zlib/0/need_dict.rbs +13 -0
  562. data/stdlib/zlib/0/stream_end.rbs +11 -0
  563. data/stdlib/zlib/0/stream_error.rbs +11 -0
  564. data/stdlib/zlib/0/version_error.rbs +11 -0
  565. data/stdlib/zlib/0/zlib.rbs +449 -0
  566. data/stdlib/zlib/0/zstream.rbs +200 -0
  567. data/wasm/README.md +60 -0
  568. data/wasm/rbs_wasm.c +423 -0
  569. metadata +671 -0
@@ -0,0 +1,793 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module Prototype
5
+ class RBI
6
+ include Helpers
7
+
8
+ attr_reader :decls
9
+ attr_reader :modules
10
+ attr_reader :last_sig
11
+
12
+ class Context
13
+ attr_accessor :singleton
14
+ attr_accessor :visibility
15
+
16
+ def initialize(singleton:, visibility:)
17
+ @singleton = singleton
18
+ @visibility = visibility
19
+ end
20
+ end
21
+
22
+ def initialize
23
+ @decls = []
24
+
25
+ @modules = []
26
+ @contexts = []
27
+ @emitted_visibility = {}
28
+ end
29
+
30
+ def parse(string)
31
+ comments = parse_comments(string, include_trailing: true)
32
+ process RubyVM::AbstractSyntaxTree.parse(string), comments: comments
33
+ end
34
+
35
+ def append_decl(decl)
36
+ if mod = current_module
37
+ mod.members << decl
38
+ else
39
+ decls << decl
40
+ end
41
+ end
42
+
43
+ def push_class(name, super_class, comment:)
44
+ class_decl = AST::Declarations::Class.new(
45
+ name: const_to_name(name),
46
+ super_class: super_class && AST::Declarations::Class::Super.new(name: const_to_name(super_class), args: [], location: nil),
47
+ type_params: [],
48
+ members: [],
49
+ annotations: [],
50
+ location: nil,
51
+ comment: comment
52
+ )
53
+
54
+ append_decl class_decl
55
+ modules << class_decl
56
+ @contexts << Context.new(singleton: false, visibility: :public)
57
+ @emitted_visibility[class_decl.object_id] = :public
58
+
59
+ yield
60
+ ensure
61
+ @contexts.pop
62
+ modules.pop
63
+ end
64
+
65
+ def push_module(name, comment:)
66
+ module_decl = AST::Declarations::Module.new(
67
+ name: const_to_name(name),
68
+ type_params: [],
69
+ members: [],
70
+ annotations: [],
71
+ location: nil,
72
+ self_types: [],
73
+ comment: comment
74
+ )
75
+
76
+ append_decl module_decl
77
+ modules << module_decl
78
+ @contexts << Context.new(singleton: false, visibility: :public)
79
+ @emitted_visibility[module_decl.object_id] = :public
80
+
81
+ yield
82
+ ensure
83
+ @contexts.pop
84
+ modules.pop
85
+ end
86
+
87
+ def current_module
88
+ modules.last
89
+ end
90
+
91
+ def current_module!
92
+ current_module or raise
93
+ end
94
+
95
+ def current_context
96
+ @contexts.last
97
+ end
98
+
99
+ def current_context!
100
+ current_context or raise
101
+ end
102
+
103
+ # Visibility of a member, given as `private def ...` in RBS
104
+ #
105
+ # Returns `nil` for members in a visibility _section_, which `sync_visibility` emits instead.
106
+ def member_visibility(context)
107
+ # RBS visibility sections don't apply to singleton members, so they need their own visibility.
108
+ if context.singleton && context.visibility != :public
109
+ :private
110
+ end
111
+ end
112
+
113
+ def sync_visibility(visibility)
114
+ # Visibility sections don't apply to singleton members in RBS.
115
+ return if current_context!.singleton
116
+
117
+ # RBS has no protected visibility. Private is the conservative fallback.
118
+ visibility = :private if visibility == :protected
119
+
120
+ mod = current_module!
121
+ return if @emitted_visibility[mod.object_id] == visibility
122
+
123
+ member = case visibility
124
+ when :public
125
+ AST::Members::Public.new(location: nil)
126
+ when :private
127
+ AST::Members::Private.new(location: nil)
128
+ else
129
+ raise "Unexpected visibility: #{visibility}"
130
+ end
131
+
132
+ mod.members << member
133
+ @emitted_visibility[mod.object_id] = visibility
134
+ end
135
+
136
+ def push_sig(node)
137
+ if last_sig = @last_sig
138
+ last_sig << node
139
+ else
140
+ @last_sig = [node]
141
+ end
142
+ end
143
+
144
+ def pop_sig
145
+ @last_sig.tap do
146
+ @last_sig = nil
147
+ end
148
+ end
149
+
150
+ def join_comments(nodes, comments)
151
+ cs = nodes.map {|node| comments[node.first_lineno - 1] }.compact
152
+ AST::Comment.new(string: cs.map(&:string).join("\n"), location: nil)
153
+ end
154
+
155
+ def process(node, outer: [], comments:)
156
+ case node.type
157
+ when :CLASS
158
+ comment = comments[node.first_lineno - 1]
159
+ push_class node.children[0], node.children[1], comment: comment do
160
+ process node.children[2], outer: outer + [node], comments: comments
161
+ end
162
+ when :MODULE
163
+ comment = comments[node.first_lineno - 1]
164
+ push_module node.children[0], comment: comment do
165
+ process node.children[1], outer: outer + [node], comments: comments
166
+ end
167
+ when :SCLASS
168
+ if node.children[0].type == :SELF
169
+ @contexts << Context.new(singleton: true, visibility: :public)
170
+ begin
171
+ process node.children[1], outer: outer + [node], comments: comments
172
+ ensure
173
+ @contexts.pop
174
+ end
175
+ end
176
+ when :FCALL
177
+ case node.children[0]
178
+ when :include
179
+ each_arg node.children[1] do |arg|
180
+ if arg.type == :CONST || arg.type == :COLON2 || arg.type == :COLON3
181
+ name = const_to_name(arg)
182
+ include_member = AST::Members::Include.new(
183
+ name: name,
184
+ args: [],
185
+ annotations: [],
186
+ location: nil,
187
+ comment: nil
188
+ )
189
+ current_module!.members << include_member
190
+ end
191
+ end
192
+ when :extend
193
+ each_arg node.children[1] do |arg|
194
+ if arg.type == :CONST || arg.type == :COLON2 || arg.type == :COLON3
195
+ name = const_to_name(arg)
196
+ unless ["T::Generic", "T::Helpers", "T::Sig"].include?(name.to_s.delete_prefix("::"))
197
+ member = AST::Members::Extend.new(
198
+ name: name,
199
+ args: [],
200
+ annotations: [],
201
+ location: nil,
202
+ comment: nil
203
+ )
204
+ current_module!.members << member
205
+ end
206
+ end
207
+ end
208
+ when :sig
209
+ out = outer.last or raise
210
+ push_sig out.children.last.children.last
211
+ when :attr_reader, :attr_writer, :attr_accessor
212
+ process_attribute node, comments: comments
213
+ when :private, :protected, :public
214
+ process_visibility node, outer: outer, comments: comments
215
+ when :alias_method
216
+ new, old = each_arg(node.children[1]).map {|x| x.children[0] }
217
+ current_module!.members << AST::Members::Alias.new(
218
+ new_name: new,
219
+ old_name: old,
220
+ location: nil,
221
+ annotations: [],
222
+ kind: current_context!.singleton ? :singleton : :instance,
223
+ comment: nil
224
+ )
225
+ end
226
+ when :VCALL
227
+ case node.children[0]
228
+ when :private, :protected, :public
229
+ current_context!.visibility = node.children[0]
230
+ end
231
+ when :DEFS
232
+ sigs = pop_sig
233
+
234
+ if sigs
235
+ comment = join_comments(sigs, comments)
236
+
237
+ args = node.children[2]
238
+ types = sigs.map {|sig| method_type(args, sig, variables: current_module!.type_params, overloads: sigs.size) }.compact
239
+
240
+ current_module!.members << AST::Members::MethodDefinition.new(
241
+ name: node.children[1],
242
+ location: nil,
243
+ annotations: [],
244
+ overloads: types.map {|type| AST::Members::MethodDefinition::Overload.new(annotations: [], method_type: type) },
245
+ kind: :singleton,
246
+ comment: comment,
247
+ overloading: false,
248
+ visibility: nil
249
+ )
250
+ end
251
+
252
+ when :DEFN
253
+ sigs = pop_sig
254
+
255
+ if sigs
256
+ context = current_context!
257
+ sync_visibility(context.visibility)
258
+ comment = join_comments(sigs, comments)
259
+
260
+ args = node.children[1]
261
+ types = sigs.map {|sig| method_type(args, sig, variables: current_module!.type_params, overloads: sigs.size) }.compact
262
+
263
+ current_module!.members << AST::Members::MethodDefinition.new(
264
+ name: node.children[0],
265
+ location: nil,
266
+ annotations: [],
267
+ overloads: types.map {|type| AST::Members::MethodDefinition::Overload.new(annotations: [], method_type: type) },
268
+ kind: context.singleton ? :singleton : :instance,
269
+ comment: comment,
270
+ overloading: false,
271
+ visibility: member_visibility(context)
272
+ )
273
+ end
274
+
275
+ when :CDECL
276
+ if (send = node.children.last) && send.type == :FCALL && send.children[0] == :type_member
277
+ unless each_arg(send.children[1]).any? {|node|
278
+ node.type == :HASH &&
279
+ each_arg(node.children[0]).each_slice(2).any? {|a, _| symbol_literal_node?(a) == :fixed }
280
+ }
281
+ # @type var variance: AST::TypeParam::variance?
282
+ if (a0 = each_arg(send.children[1]).to_a[0]) && (v = symbol_literal_node?(a0))
283
+ variance = case v
284
+ when :out
285
+ :covariant
286
+ when :in
287
+ :contravariant
288
+ end
289
+ end
290
+
291
+ current_module!.type_params << AST::TypeParam.new(
292
+ name: node.children[0],
293
+ variance: variance || :invariant,
294
+ location: nil,
295
+ upper_bound: nil,
296
+ lower_bound: nil,
297
+ default_type: nil
298
+ )
299
+ end
300
+ else
301
+ name = node.children[0].yield_self do |n|
302
+ n.is_a?(Symbol) ? TypeName.new(namespace: Namespace.empty, name: n) : const_to_name(n)
303
+ end
304
+ value_node = node.children.last
305
+ type = if value_node && value_node.type == :CALL && value_node.children[1] == :let
306
+ type_node = each_arg(value_node.children[2]).to_a[1]
307
+ type_of type_node, variables: current_module&.type_params || []
308
+ else
309
+ Types::Bases::Any.new(location: nil)
310
+ end
311
+ append_decl AST::Declarations::Constant.new(
312
+ name: name,
313
+ type: type,
314
+ location: nil,
315
+ comment: nil,
316
+ annotations: []
317
+ )
318
+ end
319
+ when :ALIAS
320
+ sync_visibility(current_context!.visibility)
321
+ current_module!.members << AST::Members::Alias.new(
322
+ new_name: node.children[0].children[0],
323
+ old_name: node.children[1].children[0],
324
+ location: nil,
325
+ annotations: [],
326
+ kind: current_context!.singleton ? :singleton : :instance,
327
+ comment: nil
328
+ )
329
+ else
330
+ each_child node do |child|
331
+ process child, outer: outer + [node], comments: comments
332
+ end
333
+ end
334
+ end
335
+
336
+ def process_visibility(node, outer:, comments:)
337
+ visibility = node.children[0]
338
+ args = each_arg(node.children[1]).to_a
339
+ context = current_context!
340
+
341
+ if args.empty?
342
+ context.visibility = visibility
343
+ else
344
+ previous_visibility = context.visibility
345
+ context.visibility = visibility
346
+
347
+ begin
348
+ args.each do |arg|
349
+ if arg.type == :DEFN || arg.type == :DEFS
350
+ process arg, outer: outer + [node], comments: comments
351
+ end
352
+ end
353
+ ensure
354
+ context.visibility = previous_visibility
355
+ end
356
+ end
357
+ end
358
+
359
+ def process_attribute(node, comments:)
360
+ sigs = pop_sig
361
+ kind = node.children[0]
362
+ context = current_context!
363
+ sync_visibility(context.visibility)
364
+
365
+ type = attribute_type(kind, sigs)
366
+ comment = join_comments(sigs, comments) if sigs
367
+ member_class = case kind
368
+ when :attr_reader
369
+ AST::Members::AttrReader
370
+ when :attr_writer
371
+ AST::Members::AttrWriter
372
+ when :attr_accessor
373
+ AST::Members::AttrAccessor
374
+ else
375
+ raise "Unexpected attribute kind: #{kind}"
376
+ end
377
+
378
+ each_arg node.children[1] do |arg|
379
+ if name = symbol_literal_node?(arg)
380
+ current_module!.members << member_class.new(
381
+ name: name,
382
+ type: type,
383
+ ivar_name: nil,
384
+ kind: context.singleton ? :singleton : :instance,
385
+ annotations: [],
386
+ location: nil,
387
+ comment: comment,
388
+ visibility: member_visibility(context)
389
+ )
390
+ end
391
+ end
392
+ end
393
+
394
+ def attribute_type(kind, sigs)
395
+ any = Types::Bases::Any.new(location: nil)
396
+ return any unless sigs
397
+
398
+ method_types = sigs.filter_map do |sig|
399
+ method_type(nil, sig, variables: current_module!.type_params, overloads: sigs.size)
400
+ end
401
+ function = method_types.last&.type
402
+ return any unless function.is_a?(Types::Function)
403
+
404
+ parameter_type = function.required_positionals.first&.type
405
+ return_type = function.return_type
406
+
407
+ case kind
408
+ when :attr_reader
409
+ return_type
410
+ when :attr_writer
411
+ parameter_type || return_type
412
+ when :attr_accessor
413
+ if return_type.is_a?(Types::Bases::Any) || return_type.is_a?(Types::Bases::Void)
414
+ parameter_type || any
415
+ else
416
+ return_type
417
+ end
418
+ else
419
+ any
420
+ end
421
+ end
422
+
423
+ def method_type(args_node, type_node, variables:, overloads:)
424
+ if type_node
425
+ if type_node.type == :CALL
426
+ method_type = method_type(args_node, type_node.children[0], variables: variables, overloads: overloads) or raise
427
+ else
428
+ method_type = MethodType.new(
429
+ type: Types::Function.empty(Types::Bases::Any.new(location: nil)),
430
+ block: nil,
431
+ location: nil,
432
+ type_params: []
433
+ )
434
+ end
435
+
436
+ name, args = case type_node.type
437
+ when :CALL
438
+ [
439
+ type_node.children[1],
440
+ type_node.children[2]
441
+ ]
442
+ when :FCALL, :VCALL
443
+ [
444
+ type_node.children[0],
445
+ type_node.children[1]
446
+ ]
447
+ end
448
+
449
+ case name
450
+ when :returns
451
+ return_type = each_arg(args).to_a[0]
452
+ method_type.update(type: method_type.type.with_return_type(type_of(return_type, variables: variables)))
453
+ when :params
454
+ if args_node
455
+ parse_params(args_node, args, method_type, variables: variables, overloads: overloads)
456
+ else
457
+ vars = (node_to_hash(each_arg(args).to_a[0]) || {}).transform_values {|value| type_of(value, variables: variables) }
458
+
459
+ required_positionals = vars.map do |name, type|
460
+ Types::Function::Param.new(name: name, type: type)
461
+ end
462
+
463
+ if method_type.type.is_a?(RBS::Types::Function)
464
+ method_type.update(type: method_type.type.update(required_positionals: required_positionals))
465
+ else
466
+ method_type
467
+ end
468
+ end
469
+ when :type_parameters
470
+ type_params = [] #: Array[AST::TypeParam]
471
+
472
+ each_arg args do |node|
473
+ if name = symbol_literal_node?(node)
474
+ type_params << AST::TypeParam.new(
475
+ name: name,
476
+ variance: :invariant,
477
+ upper_bound: nil,
478
+ lower_bound: nil,
479
+ location: nil,
480
+ default_type: nil
481
+ )
482
+ end
483
+ end
484
+
485
+ method_type.update(type_params: type_params)
486
+ when :void
487
+ method_type.update(type: method_type.type.with_return_type(Types::Bases::Void.new(location: nil)))
488
+ when :proc
489
+ method_type
490
+ else
491
+ method_type
492
+ end
493
+ end
494
+ end
495
+
496
+ def parse_params(args_node, args, method_type, variables:, overloads:)
497
+ vars = (node_to_hash(each_arg(args).to_a[0]) || {}).transform_values {|value| type_of(value, variables: variables) }
498
+
499
+ # @type var required_positionals: Array[Types::Function::Param]
500
+ required_positionals = []
501
+ # @type var optional_positionals: Array[Types::Function::Param]
502
+ optional_positionals = []
503
+ # @type var rest_positionals: Types::Function::Param?
504
+ rest_positionals = nil
505
+ # @type var trailing_positionals: Array[Types::Function::Param]
506
+ trailing_positionals = []
507
+ # @type var required_keywords: Hash[Symbol, Types::Function::Param]
508
+ required_keywords = {}
509
+ # @type var optional_keywords: Hash[Symbol, Types::Function::Param]
510
+ optional_keywords = {}
511
+ # @type var rest_keywords: Types::Function::Param?
512
+ rest_keywords = nil
513
+
514
+ var_names = args_node.children[0]
515
+ pre_num, _pre_init, opt, _first_post, post_num, _post_init, rest, kw, kwrest, block = args_node.children[1].children
516
+
517
+ pre_num.times.each do |i|
518
+ name = var_names[i]
519
+ type = vars[name] || Types::Bases::Any.new(location: nil)
520
+ required_positionals << Types::Function::Param.new(type: type, name: name)
521
+ end
522
+
523
+ index = pre_num
524
+ while opt
525
+ name = var_names[index]
526
+ if (type = vars[name])
527
+ optional_positionals << Types::Function::Param.new(type: type, name: name)
528
+ end
529
+ index += 1
530
+ opt = opt.children[1]
531
+ end
532
+
533
+ if rest
534
+ name = var_names[index]
535
+ if (type = vars[name])
536
+ rest_positionals = Types::Function::Param.new(type: type, name: name)
537
+ end
538
+ index += 1
539
+ end
540
+
541
+ post_num.times do |i|
542
+ name = var_names[i+index]
543
+ if (type = vars[name])
544
+ trailing_positionals << Types::Function::Param.new(type: type, name: name)
545
+ end
546
+ index += 1
547
+ end
548
+
549
+ while kw
550
+ name, value = kw.children[0].children
551
+ if (type = vars[name])
552
+ if value
553
+ optional_keywords[name] = Types::Function::Param.new(type: type, name: name)
554
+ else
555
+ required_keywords[name] = Types::Function::Param.new(type: type, name: name)
556
+ end
557
+ end
558
+
559
+ kw = kw.children[1]
560
+ end
561
+
562
+ if kwrest
563
+ name = kwrest.children[0]
564
+ if (type = vars[name])
565
+ rest_keywords = Types::Function::Param.new(type: type, name: name)
566
+ end
567
+ end
568
+
569
+ method_block = nil
570
+ if block
571
+ if (type = vars[block])
572
+ if type.is_a?(Types::Proc)
573
+ method_block = Types::Block.new(required: true, type: type.type, self_type: nil)
574
+ elsif type.is_a?(Types::Bases::Any)
575
+ method_block = Types::Block.new(
576
+ required: true,
577
+ type: Types::Function.empty(Types::Bases::Any.new(location: nil)),
578
+ self_type: nil
579
+ )
580
+ # Handle an optional block like `T.nilable(T.proc.void)`.
581
+ elsif type.is_a?(Types::Optional) && (proc_type = type.type).is_a?(Types::Proc)
582
+ method_block = Types::Block.new(required: false, type: proc_type.type, self_type: nil)
583
+ else
584
+ STDERR.puts "Unexpected block type: #{type}"
585
+ PP.pp args_node, STDERR
586
+ method_block = Types::Block.new(
587
+ required: true,
588
+ type: Types::Function.empty(Types::Bases::Any.new(location: nil)),
589
+ self_type: nil
590
+ )
591
+ end
592
+ else
593
+ if overloads == 1
594
+ method_block = Types::Block.new(
595
+ required: false,
596
+ type: Types::Function.empty(Types::Bases::Any.new(location: nil)),
597
+ self_type: nil
598
+ )
599
+ end
600
+ end
601
+ end
602
+
603
+ if method_type.type.is_a?(Types::Function)
604
+ method_type.update(
605
+ type: method_type.type.update(
606
+ required_positionals: required_positionals,
607
+ optional_positionals: optional_positionals,
608
+ rest_positionals: rest_positionals,
609
+ trailing_positionals: trailing_positionals,
610
+ required_keywords: required_keywords,
611
+ optional_keywords: optional_keywords,
612
+ rest_keywords: rest_keywords
613
+ ),
614
+ block: method_block
615
+ )
616
+ else
617
+ method_type
618
+ end
619
+ end
620
+
621
+ def type_of(type_node, variables:)
622
+ type = type_of0(type_node, variables: variables)
623
+
624
+ case
625
+ when type.is_a?(Types::ClassInstance) && type.name.name == BuiltinNames::BasicObject.name.name
626
+ Types::Bases::Any.new(location: nil)
627
+ when type.is_a?(Types::ClassInstance) && type.name.to_s.delete_prefix("::") == "T::Boolean"
628
+ Types::Bases::Bool.new(location: nil)
629
+ when type.is_a?(Types::ClassInstance) && type.name.to_s.delete_prefix("::") == "T::Class"
630
+ Types::Bases::Any.new(location: nil)
631
+ else
632
+ type
633
+ end
634
+ end
635
+
636
+ def type_of0(type_node, variables:)
637
+ case
638
+ when type_node.type == :CONST
639
+ if variables.include?(type_node.children[0])
640
+ Types::Variable.new(name: type_node.children[0], location: nil)
641
+ else
642
+ Types::ClassInstance.new(name: const_to_name(type_node), args: [], location: nil)
643
+ end
644
+ when type_node.type == :COLON2 || type_node.type == :COLON3
645
+ Types::ClassInstance.new(name: const_to_name(type_node), args: [], location: nil)
646
+ when call_node?(type_node, name: :[], receiver: -> (_) { true })
647
+ # The type_node represents a type application
648
+ receiver = type_node.children[0]
649
+ if [:CONST, :COLON2, :COLON3].include?(receiver.type) && const_to_name(receiver).to_s.delete_prefix("::") == "T::Class"
650
+ return Types::Bases::Any.new(location: nil)
651
+ end
652
+
653
+ type = type_of(type_node.children[0], variables: variables)
654
+ type.is_a?(Types::ClassInstance) or raise
655
+
656
+ each_arg(type_node.children[2]) do |arg|
657
+ type.args << type_of(arg, variables: variables)
658
+ end
659
+
660
+ type
661
+ when call_node?(type_node, name: :type_parameter)
662
+ name = each_arg(type_node.children[2]).to_a[0].children[0]
663
+ Types::Variable.new(name: name, location: nil)
664
+ when call_node?(type_node, name: :any)
665
+ types = each_arg(type_node.children[2]).to_a.map {|node| type_of(node, variables: variables) }
666
+ Types::Union.new(types: types, location: nil)
667
+ when call_node?(type_node, name: :all)
668
+ types = each_arg(type_node.children[2]).to_a.map {|node| type_of(node, variables: variables) }
669
+ Types::Intersection.new(types: types, location: nil)
670
+ when call_node?(type_node, name: :untyped)
671
+ Types::Bases::Any.new(location: nil)
672
+ when call_node?(type_node, name: :nilable)
673
+ type = type_of each_arg(type_node.children[2]).to_a[0], variables: variables
674
+ Types::Optional.new(type: type, location: nil)
675
+ when call_node?(type_node, name: :self_type)
676
+ Types::Bases::Self.new(location: nil)
677
+ when call_node?(type_node, name: :attached_class)
678
+ Types::Bases::Instance.new(location: nil)
679
+ when call_node?(type_node, name: :noreturn)
680
+ Types::Bases::Bottom.new(location: nil)
681
+ when call_node?(type_node, name: :class_of)
682
+ type = type_of each_arg(type_node.children[2]).to_a[0], variables: variables
683
+ case type
684
+ when Types::ClassInstance
685
+ Types::ClassSingleton.new(name: type.name, location: nil)
686
+ else
687
+ STDERR.puts "Unexpected type for `class_of`: #{type}"
688
+ Types::Bases::Any.new(location: nil)
689
+ end
690
+ when type_node.type == :ARRAY, type_node.type == :LIST
691
+ types = each_arg(type_node).map {|node| type_of(node, variables: variables) }
692
+ Types::Tuple.new(types: types, location: nil)
693
+ else
694
+ if proc_type?(type_node)
695
+ method_type = method_type(nil, type_node, variables: variables, overloads: 1) or raise
696
+ Types::Proc.new(type: method_type.type, block: nil, location: nil, self_type: nil)
697
+ else
698
+ STDERR.puts "Unexpected type_node:"
699
+ PP.pp type_node, STDERR
700
+ Types::Bases::Any.new(location: nil)
701
+ end
702
+ end
703
+ end
704
+
705
+ def proc_type?(type_node)
706
+ if call_node?(type_node, name: :proc)
707
+ true
708
+ else
709
+ type_node.type == :CALL && proc_type?(type_node.children[0])
710
+ end
711
+ end
712
+
713
+ def call_node?(node, name:, receiver: -> (node) { node.type == :CONST && node.children[0] == :T }, args: -> (node) { true })
714
+ node.type == :CALL && receiver[node.children[0]] && name == node.children[1] && args[node.children[2]]
715
+ end
716
+
717
+ def const_to_name(node)
718
+ case node.type
719
+ when :CONST
720
+ TypeName.new(name: node.children[0], namespace: Namespace.empty)
721
+ when :COLON2
722
+ if node.children[0]
723
+ namespace = const_to_name(node.children[0]).to_namespace
724
+ else
725
+ namespace = Namespace.empty
726
+ end
727
+
728
+ type_name = TypeName.new(name: node.children[1], namespace: namespace)
729
+
730
+ case type_name.to_s.delete_prefix("::")
731
+ when "T::Array"
732
+ BuiltinNames::Array.name
733
+ when "T::Hash"
734
+ BuiltinNames::Hash.name
735
+ when "T::Range"
736
+ BuiltinNames::Range.name
737
+ when "T::Enumerator"
738
+ BuiltinNames::Enumerator.name
739
+ when "T::Enumerable"
740
+ BuiltinNames::Enumerable.name
741
+ when "T::Set"
742
+ BuiltinNames::Set.name
743
+ else
744
+ type_name
745
+ end
746
+ when :COLON3
747
+ TypeName.new(name: node.children[0], namespace: Namespace.root)
748
+ else
749
+ raise "Unexpected node type: #{node.type}"
750
+ end
751
+ end
752
+
753
+ def each_arg(array, &block)
754
+ if block_given?
755
+ if array&.type == :ARRAY || array&.type == :LIST
756
+ array.children.each do |arg|
757
+ if arg
758
+ yield arg
759
+ end
760
+ end
761
+ end
762
+ else
763
+ enum_for :each_arg, array
764
+ end
765
+ end
766
+
767
+ def each_child(node)
768
+ node.children.each do |child|
769
+ if child.is_a?(RubyVM::AbstractSyntaxTree::Node)
770
+ yield child
771
+ end
772
+ end
773
+ end
774
+
775
+ def node_to_hash(node)
776
+ if node&.type == :HASH
777
+ # @type var hash: Hash[Symbol, untyped]
778
+ hash = {}
779
+
780
+ each_arg(node.children[0]).each_slice(2) do |var, type|
781
+ var or raise
782
+
783
+ if (name = symbol_literal_node?(var)) && type
784
+ hash[name] = type
785
+ end
786
+ end
787
+
788
+ hash
789
+ end
790
+ end
791
+ end
792
+ end
793
+ end