rbs 4.1.0.pre.2-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 (574) hide show
  1. checksums.yaml +7 -0
  2. data/.clang-format +75 -0
  3. data/.clangd +2 -0
  4. data/.github/dependabot.yml +24 -0
  5. data/.github/workflows/bundle-update.yml +63 -0
  6. data/.github/workflows/c-check.yml +61 -0
  7. data/.github/workflows/comments.yml +37 -0
  8. data/.github/workflows/dependabot.yml +30 -0
  9. data/.github/workflows/jruby.yml +67 -0
  10. data/.github/workflows/milestone.yml +83 -0
  11. data/.github/workflows/ruby.yml +158 -0
  12. data/.github/workflows/rust.yml +184 -0
  13. data/.github/workflows/truffleruby.yml +54 -0
  14. data/.github/workflows/typecheck.yml +39 -0
  15. data/.github/workflows/wasm.yml +53 -0
  16. data/.github/workflows/windows.yml +49 -0
  17. data/.gitignore +38 -0
  18. data/.rubocop.yml +72 -0
  19. data/BSDL +22 -0
  20. data/CHANGELOG.md +2292 -0
  21. data/COPYING +56 -0
  22. data/README.md +240 -0
  23. data/Rakefile +869 -0
  24. data/Steepfile +53 -0
  25. data/config.yml +913 -0
  26. data/core/array.rbs +4142 -0
  27. data/core/basic_object.rbs +376 -0
  28. data/core/binding.rbs +148 -0
  29. data/core/builtin.rbs +278 -0
  30. data/core/class.rbs +223 -0
  31. data/core/comparable.rbs +192 -0
  32. data/core/complex.rbs +812 -0
  33. data/core/constants.rbs +96 -0
  34. data/core/data.rbs +415 -0
  35. data/core/dir.rbs +993 -0
  36. data/core/encoding.rbs +1368 -0
  37. data/core/enumerable.rbs +2506 -0
  38. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  39. data/core/enumerator/product.rbs +92 -0
  40. data/core/enumerator.rbs +705 -0
  41. data/core/env.rbs +6 -0
  42. data/core/errno.rbs +682 -0
  43. data/core/errors.rbs +789 -0
  44. data/core/exception.rbs +485 -0
  45. data/core/false_class.rbs +82 -0
  46. data/core/fiber.rbs +570 -0
  47. data/core/fiber_error.rbs +11 -0
  48. data/core/file.rbs +2045 -0
  49. data/core/file_constants.rbs +463 -0
  50. data/core/file_stat.rbs +534 -0
  51. data/core/file_test.rbs +331 -0
  52. data/core/float.rbs +1316 -0
  53. data/core/gc.rbs +788 -0
  54. data/core/global_variables.rbs +184 -0
  55. data/core/hash.rbs +2183 -0
  56. data/core/integer.rbs +1374 -0
  57. data/core/io/buffer.rbs +995 -0
  58. data/core/io/wait.rbs +48 -0
  59. data/core/io.rbs +3472 -0
  60. data/core/kernel.rbs +3172 -0
  61. data/core/marshal.rbs +207 -0
  62. data/core/match_data.rbs +637 -0
  63. data/core/math.rbs +770 -0
  64. data/core/method.rbs +422 -0
  65. data/core/module.rbs +1856 -0
  66. data/core/nil_class.rbs +210 -0
  67. data/core/numeric.rbs +832 -0
  68. data/core/object.rbs +108 -0
  69. data/core/object_space/weak_key_map.rbs +166 -0
  70. data/core/object_space.rbs +197 -0
  71. data/core/pathname.rbs +1322 -0
  72. data/core/proc.rbs +905 -0
  73. data/core/process.rbs +2316 -0
  74. data/core/ractor.rbs +924 -0
  75. data/core/random.rbs +255 -0
  76. data/core/range.rbs +1209 -0
  77. data/core/rational.rbs +502 -0
  78. data/core/rb_config.rbs +88 -0
  79. data/core/rbs/ops.rbs +154 -0
  80. data/core/rbs/unnamed/argf.rbs +1236 -0
  81. data/core/rbs/unnamed/env_class.rbs +1214 -0
  82. data/core/rbs/unnamed/main_class.rbs +123 -0
  83. data/core/rbs/unnamed/random.rbs +186 -0
  84. data/core/refinement.rbs +59 -0
  85. data/core/regexp.rbs +1974 -0
  86. data/core/ruby.rbs +53 -0
  87. data/core/ruby_vm.rbs +809 -0
  88. data/core/rubygems/basic_specification.rbs +6 -0
  89. data/core/rubygems/config_file.rbs +38 -0
  90. data/core/rubygems/dependency_installer.rbs +6 -0
  91. data/core/rubygems/errors.rbs +109 -0
  92. data/core/rubygems/installer.rbs +15 -0
  93. data/core/rubygems/path_support.rbs +6 -0
  94. data/core/rubygems/platform.rbs +7 -0
  95. data/core/rubygems/request_set.rbs +49 -0
  96. data/core/rubygems/requirement.rbs +148 -0
  97. data/core/rubygems/rubygems.rbs +1105 -0
  98. data/core/rubygems/source_list.rbs +15 -0
  99. data/core/rubygems/specification.rbs +23 -0
  100. data/core/rubygems/stream_ui.rbs +5 -0
  101. data/core/rubygems/uninstaller.rbs +10 -0
  102. data/core/rubygems/version.rbs +293 -0
  103. data/core/set.rbs +751 -0
  104. data/core/signal.rbs +110 -0
  105. data/core/string.rbs +5532 -0
  106. data/core/struct.rbs +668 -0
  107. data/core/symbol.rbs +482 -0
  108. data/core/thread.rbs +1826 -0
  109. data/core/thread_group.rbs +79 -0
  110. data/core/time.rbs +1793 -0
  111. data/core/trace_point.rbs +483 -0
  112. data/core/true_class.rbs +98 -0
  113. data/core/unbound_method.rbs +337 -0
  114. data/core/warning.rbs +87 -0
  115. data/docs/CONTRIBUTING.md +107 -0
  116. data/docs/aliases.md +79 -0
  117. data/docs/architecture.md +110 -0
  118. data/docs/collection.md +192 -0
  119. data/docs/config.md +171 -0
  120. data/docs/data_and_struct.md +86 -0
  121. data/docs/encoding.md +56 -0
  122. data/docs/gem.md +56 -0
  123. data/docs/inline.md +634 -0
  124. data/docs/rbs_by_example.md +309 -0
  125. data/docs/repo.md +125 -0
  126. data/docs/rust.md +96 -0
  127. data/docs/sigs.md +167 -0
  128. data/docs/stdlib.md +147 -0
  129. data/docs/syntax.md +940 -0
  130. data/docs/tools.md +17 -0
  131. data/docs/type_fingerprint.md +21 -0
  132. data/docs/wasm_serialization.md +80 -0
  133. data/exe/rbs +7 -0
  134. data/ext/rbs_extension/ast_translation.c +1855 -0
  135. data/ext/rbs_extension/ast_translation.h +41 -0
  136. data/ext/rbs_extension/class_constants.c +187 -0
  137. data/ext/rbs_extension/class_constants.h +104 -0
  138. data/ext/rbs_extension/compat.h +10 -0
  139. data/ext/rbs_extension/extconf.rb +40 -0
  140. data/ext/rbs_extension/legacy_location.c +294 -0
  141. data/ext/rbs_extension/legacy_location.h +82 -0
  142. data/ext/rbs_extension/main.c +613 -0
  143. data/ext/rbs_extension/rbs_extension.h +16 -0
  144. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  145. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  146. data/goodcheck.yml +91 -0
  147. data/include/rbs/ast.h +1047 -0
  148. data/include/rbs/defines.h +99 -0
  149. data/include/rbs/lexer.h +207 -0
  150. data/include/rbs/location.h +40 -0
  151. data/include/rbs/parser.h +153 -0
  152. data/include/rbs/serialize.h +39 -0
  153. data/include/rbs/string.h +47 -0
  154. data/include/rbs/util/rbs_allocator.h +59 -0
  155. data/include/rbs/util/rbs_assert.h +20 -0
  156. data/include/rbs/util/rbs_buffer.h +83 -0
  157. data/include/rbs/util/rbs_constant_pool.h +155 -0
  158. data/include/rbs/util/rbs_encoding.h +282 -0
  159. data/include/rbs/util/rbs_unescape.h +24 -0
  160. data/include/rbs.h +14 -0
  161. data/lib/rbs/ancestor_graph.rb +92 -0
  162. data/lib/rbs/annotate/annotations.rb +199 -0
  163. data/lib/rbs/annotate/formatter.rb +82 -0
  164. data/lib/rbs/annotate/rdoc_annotator.rb +398 -0
  165. data/lib/rbs/annotate/rdoc_source.rb +131 -0
  166. data/lib/rbs/annotate.rb +8 -0
  167. data/lib/rbs/ast/annotation.rb +29 -0
  168. data/lib/rbs/ast/comment.rb +29 -0
  169. data/lib/rbs/ast/declarations.rb +472 -0
  170. data/lib/rbs/ast/directives.rb +49 -0
  171. data/lib/rbs/ast/members.rb +451 -0
  172. data/lib/rbs/ast/ruby/annotations.rb +451 -0
  173. data/lib/rbs/ast/ruby/comment_block.rb +247 -0
  174. data/lib/rbs/ast/ruby/declarations.rb +291 -0
  175. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  176. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  177. data/lib/rbs/ast/ruby/members.rb +762 -0
  178. data/lib/rbs/ast/type_param.rb +235 -0
  179. data/lib/rbs/ast/visitor.rb +137 -0
  180. data/lib/rbs/buffer.rb +189 -0
  181. data/lib/rbs/builtin_names.rb +58 -0
  182. data/lib/rbs/cli/colored_io.rb +48 -0
  183. data/lib/rbs/cli/diff.rb +84 -0
  184. data/lib/rbs/cli/validate.rb +294 -0
  185. data/lib/rbs/cli.rb +1253 -0
  186. data/lib/rbs/collection/cleaner.rb +38 -0
  187. data/lib/rbs/collection/config/lockfile.rb +92 -0
  188. data/lib/rbs/collection/config/lockfile_generator.rb +269 -0
  189. data/lib/rbs/collection/config.rb +81 -0
  190. data/lib/rbs/collection/installer.rb +32 -0
  191. data/lib/rbs/collection/sources/base.rb +14 -0
  192. data/lib/rbs/collection/sources/git.rb +265 -0
  193. data/lib/rbs/collection/sources/local.rb +81 -0
  194. data/lib/rbs/collection/sources/rubygems.rb +48 -0
  195. data/lib/rbs/collection/sources/stdlib.rb +50 -0
  196. data/lib/rbs/collection/sources.rb +38 -0
  197. data/lib/rbs/collection.rb +16 -0
  198. data/lib/rbs/constant.rb +28 -0
  199. data/lib/rbs/definition.rb +415 -0
  200. data/lib/rbs/definition_builder/ancestor_builder.rb +678 -0
  201. data/lib/rbs/definition_builder/method_builder.rb +295 -0
  202. data/lib/rbs/definition_builder.rb +1054 -0
  203. data/lib/rbs/diff.rb +131 -0
  204. data/lib/rbs/environment/class_entry.rb +69 -0
  205. data/lib/rbs/environment/module_entry.rb +66 -0
  206. data/lib/rbs/environment/use_map.rb +77 -0
  207. data/lib/rbs/environment.rb +1028 -0
  208. data/lib/rbs/environment_loader.rb +167 -0
  209. data/lib/rbs/environment_walker.rb +155 -0
  210. data/lib/rbs/errors.rb +634 -0
  211. data/lib/rbs/factory.rb +18 -0
  212. data/lib/rbs/file_finder.rb +28 -0
  213. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  214. data/lib/rbs/inline_parser.rb +568 -0
  215. data/lib/rbs/location_aux.rb +170 -0
  216. data/lib/rbs/locator.rb +247 -0
  217. data/lib/rbs/method_type.rb +145 -0
  218. data/lib/rbs/namespace.rb +154 -0
  219. data/lib/rbs/parser/lex_result.rb +15 -0
  220. data/lib/rbs/parser/token.rb +23 -0
  221. data/lib/rbs/parser_aux.rb +142 -0
  222. data/lib/rbs/prototype/helpers.rb +197 -0
  223. data/lib/rbs/prototype/node_usage.rb +99 -0
  224. data/lib/rbs/prototype/rb.rb +816 -0
  225. data/lib/rbs/prototype/rbi.rb +625 -0
  226. data/lib/rbs/prototype/runtime/helpers.rb +59 -0
  227. data/lib/rbs/prototype/runtime/reflection.rb +19 -0
  228. data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
  229. data/lib/rbs/prototype/runtime.rb +680 -0
  230. data/lib/rbs/repository.rb +127 -0
  231. data/lib/rbs/resolver/constant_resolver.rb +219 -0
  232. data/lib/rbs/resolver/type_name_resolver.rb +167 -0
  233. data/lib/rbs/rewriter.rb +70 -0
  234. data/lib/rbs/sorter.rb +198 -0
  235. data/lib/rbs/source.rb +99 -0
  236. data/lib/rbs/substitution.rb +83 -0
  237. data/lib/rbs/subtractor.rb +204 -0
  238. data/lib/rbs/test/errors.rb +80 -0
  239. data/lib/rbs/test/guaranteed.rb +30 -0
  240. data/lib/rbs/test/hook.rb +212 -0
  241. data/lib/rbs/test/observer.rb +19 -0
  242. data/lib/rbs/test/setup.rb +84 -0
  243. data/lib/rbs/test/setup_helper.rb +50 -0
  244. data/lib/rbs/test/tester.rb +167 -0
  245. data/lib/rbs/test/type_check.rb +457 -0
  246. data/lib/rbs/test.rb +112 -0
  247. data/lib/rbs/type_alias_dependency.rb +100 -0
  248. data/lib/rbs/type_alias_regularity.rb +126 -0
  249. data/lib/rbs/type_name.rb +122 -0
  250. data/lib/rbs/types.rb +1604 -0
  251. data/lib/rbs/unit_test/convertibles.rb +177 -0
  252. data/lib/rbs/unit_test/spy.rb +138 -0
  253. data/lib/rbs/unit_test/type_assertions.rb +383 -0
  254. data/lib/rbs/unit_test/with_aliases.rb +145 -0
  255. data/lib/rbs/unit_test.rb +6 -0
  256. data/lib/rbs/validator.rb +186 -0
  257. data/lib/rbs/variance_calculator.rb +189 -0
  258. data/lib/rbs/vendorer.rb +71 -0
  259. data/lib/rbs/version.rb +5 -0
  260. data/lib/rbs/wasm/deserializer.rb +213 -0
  261. data/lib/rbs/wasm/jars/asm-analysis.jar +0 -0
  262. data/lib/rbs/wasm/jars/asm-commons.jar +0 -0
  263. data/lib/rbs/wasm/jars/asm-tree.jar +0 -0
  264. data/lib/rbs/wasm/jars/asm-util.jar +0 -0
  265. data/lib/rbs/wasm/jars/asm.jar +0 -0
  266. data/lib/rbs/wasm/jars/compiler.jar +0 -0
  267. data/lib/rbs/wasm/jars/log.jar +0 -0
  268. data/lib/rbs/wasm/jars/runtime.jar +0 -0
  269. data/lib/rbs/wasm/jars/wasi.jar +0 -0
  270. data/lib/rbs/wasm/jars/wasm.jar +0 -0
  271. data/lib/rbs/wasm/location.rb +61 -0
  272. data/lib/rbs/wasm/parser.rb +137 -0
  273. data/lib/rbs/wasm/rbs_parser.wasm +0 -0
  274. data/lib/rbs/wasm/runtime.rb +217 -0
  275. data/lib/rbs/wasm/serialization_schema.rb +110 -0
  276. data/lib/rbs/writer.rb +424 -0
  277. data/lib/rbs.rb +117 -0
  278. data/lib/rdoc/discover.rb +20 -0
  279. data/lib/rdoc_plugin/parser.rb +163 -0
  280. data/rbs.gemspec +68 -0
  281. data/schema/annotation.json +14 -0
  282. data/schema/comment.json +26 -0
  283. data/schema/decls.json +326 -0
  284. data/schema/function.json +87 -0
  285. data/schema/location.json +56 -0
  286. data/schema/members.json +266 -0
  287. data/schema/methodType.json +50 -0
  288. data/schema/typeParam.json +52 -0
  289. data/schema/types.json +317 -0
  290. data/sig/ancestor_builder.rbs +163 -0
  291. data/sig/ancestor_graph.rbs +60 -0
  292. data/sig/annotate/annotations.rbs +102 -0
  293. data/sig/annotate/formatter.rbs +24 -0
  294. data/sig/annotate/rdoc_annotater.rbs +85 -0
  295. data/sig/annotate/rdoc_source.rbs +32 -0
  296. data/sig/annotation.rbs +27 -0
  297. data/sig/ast/ruby/annotations.rbs +470 -0
  298. data/sig/ast/ruby/comment_block.rbs +127 -0
  299. data/sig/ast/ruby/declarations.rbs +158 -0
  300. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  301. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  302. data/sig/ast/ruby/members.rbs +198 -0
  303. data/sig/buffer.rbs +108 -0
  304. data/sig/builtin_names.rbs +44 -0
  305. data/sig/cli/colored_io.rbs +15 -0
  306. data/sig/cli/diff.rbs +15 -0
  307. data/sig/cli/validate.rbs +47 -0
  308. data/sig/cli.rbs +89 -0
  309. data/sig/collection/cleaner.rbs +13 -0
  310. data/sig/collection/config/lockfile.rbs +74 -0
  311. data/sig/collection/config/lockfile_generator.rbs +68 -0
  312. data/sig/collection/config.rbs +46 -0
  313. data/sig/collection/installer.rbs +17 -0
  314. data/sig/collection/sources.rbs +214 -0
  315. data/sig/collection.rbs +4 -0
  316. data/sig/comment.rbs +26 -0
  317. data/sig/constant.rbs +21 -0
  318. data/sig/declarations.rbs +274 -0
  319. data/sig/definition.rbs +232 -0
  320. data/sig/definition_builder.rbs +181 -0
  321. data/sig/diff.rbs +28 -0
  322. data/sig/directives.rbs +77 -0
  323. data/sig/environment/class_entry.rbs +50 -0
  324. data/sig/environment/module_entry.rbs +50 -0
  325. data/sig/environment.rbs +286 -0
  326. data/sig/environment_loader.rbs +111 -0
  327. data/sig/environment_walker.rbs +65 -0
  328. data/sig/errors.rbs +408 -0
  329. data/sig/factory.rbs +5 -0
  330. data/sig/file_finder.rbs +28 -0
  331. data/sig/inline_parser/comment_association.rbs +71 -0
  332. data/sig/inline_parser.rbs +126 -0
  333. data/sig/location.rbs +135 -0
  334. data/sig/locator.rbs +56 -0
  335. data/sig/manifest.yaml +5 -0
  336. data/sig/members.rbs +258 -0
  337. data/sig/method_builder.rbs +89 -0
  338. data/sig/method_types.rbs +58 -0
  339. data/sig/namespace.rbs +161 -0
  340. data/sig/parser.rbs +164 -0
  341. data/sig/prototype/helpers.rbs +29 -0
  342. data/sig/prototype/node_usage.rbs +20 -0
  343. data/sig/prototype/rb.rbs +96 -0
  344. data/sig/prototype/rbi.rbs +75 -0
  345. data/sig/prototype/runtime.rbs +182 -0
  346. data/sig/rbs.rbs +21 -0
  347. data/sig/rdoc/rbs.rbs +67 -0
  348. data/sig/repository.rbs +85 -0
  349. data/sig/resolver/constant_resolver.rbs +92 -0
  350. data/sig/resolver/context.rbs +34 -0
  351. data/sig/resolver/type_name_resolver.rbs +61 -0
  352. data/sig/rewriter.rbs +45 -0
  353. data/sig/shims/bundler.rbs +38 -0
  354. data/sig/shims/enumerable.rbs +5 -0
  355. data/sig/shims/rubygems.rbs +19 -0
  356. data/sig/sorter.rbs +41 -0
  357. data/sig/source.rbs +48 -0
  358. data/sig/substitution.rbs +48 -0
  359. data/sig/subtractor.rbs +37 -0
  360. data/sig/test/errors.rbs +52 -0
  361. data/sig/test/guranteed.rbs +9 -0
  362. data/sig/test/type_check.rbs +19 -0
  363. data/sig/test.rbs +82 -0
  364. data/sig/type_alias_dependency.rbs +53 -0
  365. data/sig/type_alias_regularity.rbs +98 -0
  366. data/sig/type_param.rbs +115 -0
  367. data/sig/typename.rbs +89 -0
  368. data/sig/types.rbs +578 -0
  369. data/sig/unit_test/convertibles.rbs +154 -0
  370. data/sig/unit_test/spy.rbs +22 -0
  371. data/sig/unit_test/type_assertions.rbs +211 -0
  372. data/sig/unit_test/with_aliases.rbs +136 -0
  373. data/sig/use_map.rbs +35 -0
  374. data/sig/util.rbs +9 -0
  375. data/sig/validator.rbs +63 -0
  376. data/sig/variance_calculator.rbs +87 -0
  377. data/sig/vendorer.rbs +51 -0
  378. data/sig/version.rbs +3 -0
  379. data/sig/visitor.rbs +47 -0
  380. data/sig/wasm/deserializer.rbs +66 -0
  381. data/sig/wasm/serialization_schema.rbs +13 -0
  382. data/sig/writer.rbs +127 -0
  383. data/src/ast.c +1628 -0
  384. data/src/lexer.c +3217 -0
  385. data/src/lexer.re +155 -0
  386. data/src/lexstate.c +217 -0
  387. data/src/location.c +31 -0
  388. data/src/parser.c +4255 -0
  389. data/src/serialize.c +958 -0
  390. data/src/string.c +41 -0
  391. data/src/util/rbs_allocator.c +162 -0
  392. data/src/util/rbs_assert.c +19 -0
  393. data/src/util/rbs_buffer.c +54 -0
  394. data/src/util/rbs_constant_pool.c +268 -0
  395. data/src/util/rbs_encoding.c +21308 -0
  396. data/src/util/rbs_unescape.c +167 -0
  397. data/stdlib/abbrev/0/abbrev.rbs +66 -0
  398. data/stdlib/abbrev/0/array.rbs +26 -0
  399. data/stdlib/base64/0/base64.rbs +355 -0
  400. data/stdlib/benchmark/0/benchmark.rbs +452 -0
  401. data/stdlib/bigdecimal/0/big_decimal.rbs +1647 -0
  402. data/stdlib/bigdecimal-math/0/big_math.rbs +280 -0
  403. data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
  404. data/stdlib/cgi/0/core.rbs +911 -0
  405. data/stdlib/cgi/0/manifest.yaml +4 -0
  406. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  407. data/stdlib/coverage/0/coverage.rbs +266 -0
  408. data/stdlib/csv/0/csv.rbs +3776 -0
  409. data/stdlib/csv/0/manifest.yaml +3 -0
  410. data/stdlib/date/0/date.rbs +1598 -0
  411. data/stdlib/date/0/date_time.rbs +617 -0
  412. data/stdlib/date/0/time.rbs +26 -0
  413. data/stdlib/dbm/0/dbm.rbs +421 -0
  414. data/stdlib/delegate/0/delegator.rbs +187 -0
  415. data/stdlib/delegate/0/kernel.rbs +47 -0
  416. data/stdlib/delegate/0/simple_delegator.rbs +96 -0
  417. data/stdlib/did_you_mean/0/did_you_mean.rbs +344 -0
  418. data/stdlib/digest/0/digest.rbs +687 -0
  419. data/stdlib/erb/0/erb.rbs +933 -0
  420. data/stdlib/etc/0/etc.rbs +884 -0
  421. data/stdlib/fileutils/0/fileutils.rbs +1753 -0
  422. data/stdlib/find/0/find.rbs +49 -0
  423. data/stdlib/forwardable/0/forwardable.rbs +271 -0
  424. data/stdlib/io-console/0/io-console.rbs +414 -0
  425. data/stdlib/ipaddr/0/ipaddr.rbs +436 -0
  426. data/stdlib/json/0/json.rbs +1963 -0
  427. data/stdlib/kconv/0/kconv.rbs +166 -0
  428. data/stdlib/logger/0/formatter.rbs +45 -0
  429. data/stdlib/logger/0/log_device.rbs +100 -0
  430. data/stdlib/logger/0/logger.rbs +796 -0
  431. data/stdlib/logger/0/manifest.yaml +2 -0
  432. data/stdlib/logger/0/period.rbs +17 -0
  433. data/stdlib/logger/0/severity.rbs +34 -0
  434. data/stdlib/minitest/0/kernel.rbs +42 -0
  435. data/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
  436. data/stdlib/minitest/0/minitest/assertion.rbs +17 -0
  437. data/stdlib/minitest/0/minitest/assertions.rbs +590 -0
  438. data/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
  439. data/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
  440. data/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
  441. data/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
  442. data/stdlib/minitest/0/minitest/compress.rbs +13 -0
  443. data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
  444. data/stdlib/minitest/0/minitest/expectation.rbs +2 -0
  445. data/stdlib/minitest/0/minitest/expectations.rbs +21 -0
  446. data/stdlib/minitest/0/minitest/guard.rbs +64 -0
  447. data/stdlib/minitest/0/minitest/mock.rbs +64 -0
  448. data/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
  449. data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
  450. data/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
  451. data/stdlib/minitest/0/minitest/parallel.rbs +2 -0
  452. data/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
  453. data/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
  454. data/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
  455. data/stdlib/minitest/0/minitest/reportable.rbs +53 -0
  456. data/stdlib/minitest/0/minitest/reporter.rbs +5 -0
  457. data/stdlib/minitest/0/minitest/result.rbs +28 -0
  458. data/stdlib/minitest/0/minitest/runnable.rbs +163 -0
  459. data/stdlib/minitest/0/minitest/skip.rbs +6 -0
  460. data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
  461. data/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
  462. data/stdlib/minitest/0/minitest/spec.rbs +11 -0
  463. data/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
  464. data/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
  465. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
  466. data/stdlib/minitest/0/minitest/test.rbs +69 -0
  467. data/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
  468. data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
  469. data/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
  470. data/stdlib/minitest/0/minitest/unit.rbs +4 -0
  471. data/stdlib/minitest/0/minitest.rbs +115 -0
  472. data/stdlib/monitor/0/monitor.rbs +363 -0
  473. data/stdlib/mutex_m/0/mutex_m.rbs +104 -0
  474. data/stdlib/net-http/0/manifest.yaml +3 -0
  475. data/stdlib/net-http/0/net-http.rbs +5580 -0
  476. data/stdlib/net-protocol/0/manifest.yaml +2 -0
  477. data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
  478. data/stdlib/net-smtp/0/manifest.yaml +2 -0
  479. data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
  480. data/stdlib/nkf/0/nkf.rbs +402 -0
  481. data/stdlib/objspace/0/objspace.rbs +470 -0
  482. data/stdlib/observable/0/observable.rbs +217 -0
  483. data/stdlib/open-uri/0/manifest.yaml +4 -0
  484. data/stdlib/open-uri/0/open-uri.rbs +433 -0
  485. data/stdlib/open3/0/open3.rbs +606 -0
  486. data/stdlib/openssl/0/manifest.yaml +3 -0
  487. data/stdlib/openssl/0/openssl.rbs +12231 -0
  488. data/stdlib/optparse/0/optparse.rbs +1734 -0
  489. data/stdlib/pathname/0/pathname.rbs +36 -0
  490. data/stdlib/pp/0/manifest.yaml +2 -0
  491. data/stdlib/pp/0/pp.rbs +301 -0
  492. data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
  493. data/stdlib/pstore/0/pstore.rbs +608 -0
  494. data/stdlib/psych/0/core_ext.rbs +12 -0
  495. data/stdlib/psych/0/dbm.rbs +237 -0
  496. data/stdlib/psych/0/manifest.yaml +3 -0
  497. data/stdlib/psych/0/psych.rbs +455 -0
  498. data/stdlib/psych/0/store.rbs +57 -0
  499. data/stdlib/pty/0/pty.rbs +240 -0
  500. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  501. data/stdlib/rdoc/0/code_object.rbs +52 -0
  502. data/stdlib/rdoc/0/comment.rbs +61 -0
  503. data/stdlib/rdoc/0/context.rbs +153 -0
  504. data/stdlib/rdoc/0/markup.rbs +117 -0
  505. data/stdlib/rdoc/0/options.rbs +76 -0
  506. data/stdlib/rdoc/0/parser.rbs +56 -0
  507. data/stdlib/rdoc/0/rdoc.rbs +393 -0
  508. data/stdlib/rdoc/0/ri.rbs +17 -0
  509. data/stdlib/rdoc/0/store.rbs +48 -0
  510. data/stdlib/rdoc/0/top_level.rbs +97 -0
  511. data/stdlib/resolv/0/manifest.yaml +3 -0
  512. data/stdlib/resolv/0/resolv.rbs +1787 -0
  513. data/stdlib/ripper/0/ripper.rbs +1654 -0
  514. data/stdlib/securerandom/0/manifest.yaml +2 -0
  515. data/stdlib/securerandom/0/securerandom.rbs +49 -0
  516. data/stdlib/shellwords/0/shellwords.rbs +229 -0
  517. data/stdlib/singleton/0/singleton.rbs +134 -0
  518. data/stdlib/socket/0/addrinfo.rbs +666 -0
  519. data/stdlib/socket/0/basic_socket.rbs +590 -0
  520. data/stdlib/socket/0/constants.rbs +2295 -0
  521. data/stdlib/socket/0/ip_socket.rbs +94 -0
  522. data/stdlib/socket/0/socket.rbs +4170 -0
  523. data/stdlib/socket/0/socket_error.rbs +5 -0
  524. data/stdlib/socket/0/tcp_server.rbs +192 -0
  525. data/stdlib/socket/0/tcp_socket.rbs +87 -0
  526. data/stdlib/socket/0/udp_socket.rbs +133 -0
  527. data/stdlib/socket/0/unix_server.rbs +169 -0
  528. data/stdlib/socket/0/unix_socket.rbs +172 -0
  529. data/stdlib/stringio/0/stringio.rbs +1681 -0
  530. data/stdlib/strscan/0/string_scanner.rbs +1648 -0
  531. data/stdlib/tempfile/0/tempfile.rbs +483 -0
  532. data/stdlib/time/0/time.rbs +434 -0
  533. data/stdlib/timeout/0/timeout.rbs +137 -0
  534. data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
  535. data/stdlib/tsort/0/cyclic.rbs +8 -0
  536. data/stdlib/tsort/0/interfaces.rbs +20 -0
  537. data/stdlib/tsort/0/tsort.rbs +410 -0
  538. data/stdlib/uri/0/common.rbs +621 -0
  539. data/stdlib/uri/0/file.rbs +118 -0
  540. data/stdlib/uri/0/ftp.rbs +13 -0
  541. data/stdlib/uri/0/generic.rbs +1116 -0
  542. data/stdlib/uri/0/http.rbs +104 -0
  543. data/stdlib/uri/0/https.rbs +14 -0
  544. data/stdlib/uri/0/ldap.rbs +230 -0
  545. data/stdlib/uri/0/ldaps.rbs +14 -0
  546. data/stdlib/uri/0/mailto.rbs +92 -0
  547. data/stdlib/uri/0/rfc2396_parser.rbs +189 -0
  548. data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
  549. data/stdlib/uri/0/ws.rbs +13 -0
  550. data/stdlib/uri/0/wss.rbs +9 -0
  551. data/stdlib/yaml/0/manifest.yaml +2 -0
  552. data/stdlib/yaml/0/yaml.rbs +1 -0
  553. data/stdlib/zlib/0/buf_error.rbs +10 -0
  554. data/stdlib/zlib/0/data_error.rbs +10 -0
  555. data/stdlib/zlib/0/deflate.rbs +211 -0
  556. data/stdlib/zlib/0/error.rbs +20 -0
  557. data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
  558. data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
  559. data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
  560. data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
  561. data/stdlib/zlib/0/gzip_file.rbs +156 -0
  562. data/stdlib/zlib/0/gzip_reader.rbs +293 -0
  563. data/stdlib/zlib/0/gzip_writer.rbs +168 -0
  564. data/stdlib/zlib/0/inflate.rbs +180 -0
  565. data/stdlib/zlib/0/mem_error.rbs +10 -0
  566. data/stdlib/zlib/0/need_dict.rbs +13 -0
  567. data/stdlib/zlib/0/stream_end.rbs +11 -0
  568. data/stdlib/zlib/0/stream_error.rbs +11 -0
  569. data/stdlib/zlib/0/version_error.rbs +11 -0
  570. data/stdlib/zlib/0/zlib.rbs +449 -0
  571. data/stdlib/zlib/0/zstream.rbs +201 -0
  572. data/wasm/README.md +59 -0
  573. data/wasm/rbs_wasm.c +411 -0
  574. metadata +660 -0
@@ -0,0 +1,816 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module Prototype
5
+ class RB
6
+ include Helpers
7
+
8
+ class Context < Struct.new(:module_function, :singleton, :namespace, :in_def, keyword_init: true)
9
+ # @implements Context
10
+
11
+ def self.initial(namespace: Namespace.root)
12
+ self.new(module_function: false, singleton: false, namespace: namespace, in_def: false)
13
+ end
14
+
15
+ def method_kind
16
+ if singleton
17
+ :singleton
18
+ elsif module_function
19
+ :singleton_instance
20
+ else
21
+ :instance
22
+ end
23
+ end
24
+
25
+ def attribute_kind
26
+ if singleton
27
+ :singleton
28
+ else
29
+ :instance
30
+ end
31
+ end
32
+
33
+ def enter_namespace(namespace)
34
+ Context.initial(namespace: self.namespace + namespace)
35
+ end
36
+
37
+ def update(module_function: self.module_function, singleton: self.singleton, in_def: self.in_def)
38
+ Context.new(module_function: module_function, singleton: singleton, namespace: namespace, in_def: in_def)
39
+ end
40
+ end
41
+
42
+ attr_reader :source_decls
43
+ attr_reader :toplevel_members
44
+
45
+ def initialize
46
+ @source_decls = []
47
+ end
48
+
49
+ def decls
50
+ # @type var decls: Array[AST::Declarations::t]
51
+ decls = []
52
+
53
+ # @type var top_decls: Array[AST::Declarations::t]
54
+ # @type var top_members: Array[AST::Members::t]
55
+ top_decls, top_members = _ = source_decls.partition {|decl| decl.is_a?(AST::Declarations::Base) }
56
+
57
+ decls.push(*top_decls)
58
+
59
+ unless top_members.empty?
60
+ top = AST::Declarations::Class.new(
61
+ name: TypeName.new(name: :Object, namespace: Namespace.empty),
62
+ super_class: nil,
63
+ members: top_members,
64
+ annotations: [],
65
+ comment: nil,
66
+ location: nil,
67
+ type_params: []
68
+ )
69
+ decls << top
70
+ end
71
+
72
+ decls
73
+ end
74
+
75
+ def parse(string)
76
+ # @type var comments: Hash[Integer, AST::Comment]
77
+ comments = parse_comments(string, include_trailing: false)
78
+
79
+ process RubyVM::AbstractSyntaxTree.parse(string), decls: source_decls, comments: comments, context: Context.initial
80
+ end
81
+
82
+ def process(node, decls:, comments:, context:)
83
+ case node.type
84
+ when :CLASS
85
+ class_name, super_class_node, *class_body = node.children
86
+ super_class_name = const_to_name(super_class_node, context: context)
87
+ super_class =
88
+ if super_class_name
89
+ AST::Declarations::Class::Super.new(name: super_class_name, args: [], location: nil)
90
+ else
91
+ # Give up detect super class e.g. `class Foo < Struct.new(:bar)`
92
+ nil
93
+ end
94
+ kls = AST::Declarations::Class.new(
95
+ name: const_to_name!(class_name),
96
+ super_class: super_class,
97
+ type_params: [],
98
+ members: [],
99
+ annotations: [],
100
+ location: nil,
101
+ comment: comments[node.first_lineno - 1]
102
+ )
103
+
104
+ decls.push kls
105
+
106
+ new_ctx = context.enter_namespace(kls.name.to_namespace)
107
+ each_node class_body do |child|
108
+ process child, decls: kls.members, comments: comments, context: new_ctx
109
+ end
110
+ remove_unnecessary_accessibility_methods! kls.members
111
+ sort_members! kls.members
112
+
113
+ when :MODULE
114
+ module_name, *module_body = node.children
115
+
116
+ mod = AST::Declarations::Module.new(
117
+ name: const_to_name!(module_name),
118
+ type_params: [],
119
+ self_types: [],
120
+ members: [],
121
+ annotations: [],
122
+ location: nil,
123
+ comment: comments[node.first_lineno - 1]
124
+ )
125
+
126
+ decls.push mod
127
+
128
+ new_ctx = context.enter_namespace(mod.name.to_namespace)
129
+ each_node module_body do |child|
130
+ process child, decls: mod.members, comments: comments, context: new_ctx
131
+ end
132
+ remove_unnecessary_accessibility_methods! mod.members
133
+ sort_members! mod.members
134
+
135
+ when :SCLASS
136
+ this, body = node.children
137
+
138
+ if this.type != :SELF
139
+ RBS.logger.warn "`class <<` syntax with not-self may be compiled to incorrect code: #{this}"
140
+ end
141
+
142
+ accessibility = current_accessibility(decls)
143
+
144
+ ctx = Context.initial.tap { |ctx| ctx.singleton = true }
145
+ process_children(body, decls: decls, comments: comments, context: ctx)
146
+
147
+ decls << accessibility
148
+
149
+ when :DEFN, :DEFS
150
+ # @type var kind: Context::method_kind
151
+
152
+ if node.type == :DEFN
153
+ def_name, def_body = node.children
154
+ kind = context.method_kind
155
+ else
156
+ _, def_name, def_body = node.children
157
+ kind = :singleton
158
+ end
159
+
160
+ types = [
161
+ MethodType.new(
162
+ type_params: [],
163
+ type: function_type_from_body(def_body, def_name),
164
+ block: block_from_body(def_body),
165
+ location: nil
166
+ )
167
+ ]
168
+
169
+ member = AST::Members::MethodDefinition.new(
170
+ name: def_name,
171
+ location: nil,
172
+ annotations: [],
173
+ overloads: types.map {|type| AST::Members::MethodDefinition::Overload.new(annotations: [], method_type: type )},
174
+ kind: kind,
175
+ comment: comments[node.first_lineno - 1],
176
+ overloading: false,
177
+ visibility: nil
178
+ )
179
+
180
+ decls.push member unless decls.include?(member)
181
+
182
+ new_ctx = context.update(singleton: kind == :singleton, in_def: true)
183
+ each_node def_body.children do |child|
184
+ process child, decls: decls, comments: comments, context: new_ctx
185
+ end
186
+
187
+ when :ALIAS
188
+ new_name, old_name = node.children.map { |c| literal_to_symbol(c) }
189
+ member = AST::Members::Alias.new(
190
+ new_name: new_name,
191
+ old_name: old_name,
192
+ kind: context.singleton ? :singleton : :instance,
193
+ annotations: [],
194
+ location: nil,
195
+ comment: comments[node.first_lineno - 1],
196
+ )
197
+ decls.push member unless decls.include?(member)
198
+
199
+ when :FCALL, :VCALL
200
+ # Inside method definition cannot reach here.
201
+ args = node.children[1]&.children || []
202
+
203
+ case node.children[0]
204
+ when :include
205
+ args.each do |arg|
206
+ if (name = const_to_name(arg, context: context))
207
+ klass = context.singleton ? AST::Members::Extend : AST::Members::Include
208
+ decls << klass.new(
209
+ name: name,
210
+ args: [],
211
+ annotations: [],
212
+ location: nil,
213
+ comment: comments[node.first_lineno - 1]
214
+ )
215
+ end
216
+ end
217
+ when :prepend
218
+ args.each do |arg|
219
+ if (name = const_to_name(arg, context: context))
220
+ decls << AST::Members::Prepend.new(
221
+ name: name,
222
+ args: [],
223
+ annotations: [],
224
+ location: nil,
225
+ comment: comments[node.first_lineno - 1]
226
+ )
227
+ end
228
+ end
229
+ when :extend
230
+ args.each do |arg|
231
+ if (name = const_to_name(arg, context: context))
232
+ decls << AST::Members::Extend.new(
233
+ name: name,
234
+ args: [],
235
+ annotations: [],
236
+ location: nil,
237
+ comment: comments[node.first_lineno - 1]
238
+ )
239
+ end
240
+ end
241
+ when :attr_reader
242
+ args.each do |arg|
243
+ if arg && (name = literal_to_symbol(arg))
244
+ decls << AST::Members::AttrReader.new(
245
+ name: name,
246
+ ivar_name: nil,
247
+ type: Types::Bases::Any.new(location: nil),
248
+ kind: context.attribute_kind,
249
+ location: nil,
250
+ comment: comments[node.first_lineno - 1],
251
+ annotations: []
252
+ )
253
+ end
254
+ end
255
+ when :attr_accessor
256
+ args.each do |arg|
257
+ if arg && (name = literal_to_symbol(arg))
258
+ decls << AST::Members::AttrAccessor.new(
259
+ name: name,
260
+ ivar_name: nil,
261
+ type: Types::Bases::Any.new(location: nil),
262
+ kind: context.attribute_kind,
263
+ location: nil,
264
+ comment: comments[node.first_lineno - 1],
265
+ annotations: []
266
+ )
267
+ end
268
+ end
269
+ when :attr_writer
270
+ args.each do |arg|
271
+ if arg && (name = literal_to_symbol(arg))
272
+ decls << AST::Members::AttrWriter.new(
273
+ name: name,
274
+ ivar_name: nil,
275
+ type: Types::Bases::Any.new(location: nil),
276
+ kind: context.attribute_kind,
277
+ location: nil,
278
+ comment: comments[node.first_lineno - 1],
279
+ annotations: []
280
+ )
281
+ end
282
+ end
283
+ when :alias_method
284
+ if args[0] && args[1] && (new_name = literal_to_symbol(args[0])) && (old_name = literal_to_symbol(args[1]))
285
+ decls << AST::Members::Alias.new(
286
+ new_name: new_name,
287
+ old_name: old_name,
288
+ kind: context.singleton ? :singleton : :instance,
289
+ annotations: [],
290
+ location: nil,
291
+ comment: comments[node.first_lineno - 1],
292
+ )
293
+ end
294
+ when :module_function
295
+ if args.empty?
296
+ context.module_function = true
297
+ else
298
+ module_func_context = context.update(module_function: true)
299
+ args.each do |arg|
300
+ if arg && (name = literal_to_symbol(arg))
301
+ if (i, defn = find_def_index_by_name(decls, name))
302
+ if defn.is_a?(AST::Members::MethodDefinition)
303
+ decls[i] = defn.update(kind: :singleton_instance)
304
+ end
305
+ end
306
+ elsif arg
307
+ process arg, decls: decls, comments: comments, context: module_func_context
308
+ end
309
+ end
310
+ end
311
+ when :public, :private
312
+ accessibility = __send__(node.children[0])
313
+ if args.empty?
314
+ decls << accessibility
315
+ else
316
+ args.each do |arg|
317
+ if arg && (name = literal_to_symbol(arg))
318
+ if (i, _ = find_def_index_by_name(decls, name))
319
+ current = current_accessibility(decls, i)
320
+ if current != accessibility
321
+ decls.insert(i + 1, current)
322
+ decls.insert(i, accessibility)
323
+ end
324
+ end
325
+ end
326
+ end
327
+
328
+ # For `private def foo` syntax
329
+ current = current_accessibility(decls)
330
+ decls << accessibility
331
+ process_children(node, decls: decls, comments: comments, context: context)
332
+ decls << current
333
+ end
334
+ else
335
+ process_children(node, decls: decls, comments: comments, context: context)
336
+ end
337
+
338
+ when :ITER
339
+ # ignore
340
+
341
+ when :CDECL
342
+ const_name = case
343
+ when node.children[0].is_a?(Symbol)
344
+ TypeName.new(name: node.children[0], namespace: Namespace.empty)
345
+ else
346
+ const_to_name!(node.children[0], context: context)
347
+ end
348
+
349
+ value_node = node.children.last
350
+ type = if value_node.nil? || value_node.type == :SELF
351
+ # Give up type prediction when node is MASGN or SELF.
352
+ Types::Bases::Any.new(location: nil)
353
+ else
354
+ literal_to_type(value_node)
355
+ end
356
+ decls << AST::Declarations::Constant.new(
357
+ name: const_name,
358
+ type: type,
359
+ location: nil,
360
+ comment: comments[node.first_lineno - 1],
361
+ annotations: []
362
+ )
363
+
364
+ when :IASGN
365
+ case [context.singleton, context.in_def]
366
+ when [true, true], [false, false]
367
+ member = AST::Members::ClassInstanceVariable.new(
368
+ name: node.children.first,
369
+ type: Types::Bases::Any.new(location: nil),
370
+ location: nil,
371
+ comment: comments[node.first_lineno - 1]
372
+ )
373
+ when [false, true]
374
+ member = AST::Members::InstanceVariable.new(
375
+ name: node.children.first,
376
+ type: Types::Bases::Any.new(location: nil),
377
+ location: nil,
378
+ comment: comments[node.first_lineno - 1]
379
+ )
380
+ when [true, false]
381
+ # The variable is for the singleton class of the class object.
382
+ # RBS does not have a way to represent it. So we ignore it.
383
+ else
384
+ raise 'unreachable'
385
+ end
386
+
387
+ decls.push member if member && !decls.include?(member)
388
+
389
+ when :CVASGN
390
+ member = AST::Members::ClassVariable.new(
391
+ name: node.children.first,
392
+ type: Types::Bases::Any.new(location: nil),
393
+ location: nil,
394
+ comment: comments[node.first_lineno - 1]
395
+ )
396
+ decls.push member unless decls.include?(member)
397
+ else
398
+ process_children(node, decls: decls, comments: comments, context: context)
399
+ end
400
+ end
401
+
402
+ def process_children(node, decls:, comments:, context:)
403
+ each_child node do |child|
404
+ process child, decls: decls, comments: comments, context: context
405
+ end
406
+ end
407
+
408
+ def const_to_name!(node, context: nil)
409
+ case node.type
410
+ when :CONST
411
+ TypeName.new(name: node.children[0], namespace: Namespace.empty)
412
+ when :COLON2
413
+ if node.children[0]
414
+ namespace = const_to_name!(node.children[0], context: context).to_namespace
415
+ else
416
+ namespace = Namespace.empty
417
+ end
418
+
419
+ TypeName.new(name: node.children[1], namespace: namespace)
420
+ when :COLON3
421
+ TypeName.new(name: node.children[0], namespace: Namespace.root)
422
+ when :SELF
423
+ raise if context.nil?
424
+
425
+ context.namespace.to_type_name
426
+ else
427
+ raise
428
+ end
429
+ end
430
+
431
+ def const_to_name(node, context:)
432
+ if node
433
+ case node.type
434
+ when :SELF
435
+ context.namespace.to_type_name
436
+ when :CONST, :COLON2, :COLON3
437
+ const_to_name!(node) rescue nil
438
+ end
439
+ end
440
+ end
441
+
442
+ def literal_to_symbol(node)
443
+ case node.type
444
+ when :SYM
445
+ node.children[0]
446
+ when :LIT
447
+ node.children[0] if node.children[0].is_a?(Symbol)
448
+ when :STR
449
+ node.children[0].to_sym
450
+ end
451
+ end
452
+
453
+ def function_type_from_body(node, def_name)
454
+ table_node, args_node, *_ = node.children
455
+
456
+ pre_num, _pre_init, opt, _first_post, post_num, _post_init, rest, kw, kwrest, _block = args_from_node(args_node)
457
+
458
+ return_type = if def_name == :initialize
459
+ Types::Bases::Void.new(location: nil)
460
+ else
461
+ function_return_type_from_body(node)
462
+ end
463
+
464
+ fun = Types::Function.empty(return_type)
465
+
466
+ table_node.take(pre_num).each do |name|
467
+ fun.required_positionals << Types::Function::Param.new(name: name, type: untyped)
468
+ end
469
+
470
+ while opt&.type == :OPT_ARG
471
+ lvasgn, opt = opt.children
472
+ name = lvasgn.children[0]
473
+ fun.optional_positionals << Types::Function::Param.new(
474
+ name: name,
475
+ type: param_type(lvasgn.children[1])
476
+ )
477
+ end
478
+
479
+ if rest
480
+ rest_name = rest == :* ? nil : rest # `def f(...)` syntax has `*` name
481
+ fun = fun.update(rest_positionals: Types::Function::Param.new(name: rest_name, type: untyped))
482
+ end
483
+
484
+ table_node.drop(fun.required_positionals.size + fun.optional_positionals.size + (fun.rest_positionals ? 1 : 0)).take(post_num).each do |name|
485
+ fun.trailing_positionals << Types::Function::Param.new(name: name, type: untyped)
486
+ end
487
+
488
+ while kw
489
+ lvasgn, kw = kw.children
490
+ name, value = lvasgn.children
491
+
492
+ case value
493
+ when nil, :NODE_SPECIAL_REQUIRED_KEYWORD
494
+ fun.required_keywords[name] = Types::Function::Param.new(name: nil, type: untyped)
495
+ when RubyVM::AbstractSyntaxTree::Node
496
+ fun.optional_keywords[name] = Types::Function::Param.new(name: nil, type: param_type(value))
497
+ else
498
+ raise "Unexpected keyword arg value: #{value}"
499
+ end
500
+ end
501
+
502
+ if kwrest && kwrest.children.any?
503
+ kwrest_name = kwrest.children[0] #: Symbol?
504
+ kwrest_name = nil if kwrest_name == :** # `def f(...)` syntax has `**` name
505
+ fun = fun.update(rest_keywords: Types::Function::Param.new(name: kwrest_name, type: untyped))
506
+ end
507
+
508
+ fun
509
+ end
510
+
511
+ def function_return_type_from_body(node)
512
+ body = node.children[2]
513
+ body_type(body)
514
+ end
515
+
516
+ def body_type(node)
517
+ return Types::Bases::Nil.new(location: nil) unless node
518
+
519
+ case node.type
520
+ when :IF, :UNLESS
521
+ if_unless_type(node)
522
+ when :BLOCK
523
+ block_type(node)
524
+ else
525
+ literal_to_type(node)
526
+ end
527
+ end
528
+
529
+ def if_unless_type(node)
530
+ raise unless node.type == :IF || node.type == :UNLESS
531
+
532
+ _exp_node, true_node, false_node = node.children
533
+ types_to_union_type([body_type(true_node), body_type(false_node)])
534
+ end
535
+
536
+ def block_type(node)
537
+ raise unless node.type == :BLOCK
538
+
539
+ return_stmts = any_node?(node) do |n|
540
+ n.type == :RETURN
541
+ end&.map do |return_node|
542
+ returned_value = return_node.children[0]
543
+ returned_value ? literal_to_type(returned_value) : Types::Bases::Nil.new(location: nil)
544
+ end || []
545
+ last_node = node.children.last
546
+ last_evaluated = last_node ? literal_to_type(last_node) : Types::Bases::Nil.new(location: nil)
547
+ types_to_union_type([*return_stmts, last_evaluated])
548
+ end
549
+
550
+ def literal_to_type(node)
551
+ case node.type
552
+ when :STR
553
+ lit = node.children[0]
554
+ if lit.ascii_only?
555
+ Types::Literal.new(literal: lit, location: nil)
556
+ else
557
+ BuiltinNames::String.instance_type
558
+ end
559
+ when :DSTR, :XSTR
560
+ BuiltinNames::String.instance_type
561
+ when :SYM
562
+ lit = node.children[0]
563
+ if lit.to_s.ascii_only?
564
+ Types::Literal.new(literal: lit, location: nil)
565
+ else
566
+ BuiltinNames::Symbol.instance_type
567
+ end
568
+ when :DSYM
569
+ BuiltinNames::Symbol.instance_type
570
+ when :DREGX, :REGX
571
+ BuiltinNames::Regexp.instance_type
572
+ when :TRUE
573
+ Types::Literal.new(literal: true, location: nil)
574
+ when :FALSE
575
+ Types::Literal.new(literal: false, location: nil)
576
+ when :NIL
577
+ Types::Bases::Nil.new(location: nil)
578
+ when :INTEGER
579
+ Types::Literal.new(literal: node.children[0], location: nil)
580
+ when :FLOAT
581
+ BuiltinNames::Float.instance_type
582
+ when :RATIONAL, :IMAGINARY
583
+ lit = node.children[0]
584
+ type_name = TypeName.new(name: lit.class.name.to_sym, namespace: Namespace.root)
585
+ Types::ClassInstance.new(name: type_name, args: [], location: nil)
586
+ when :LIT
587
+ lit = node.children[0]
588
+ case lit
589
+ when Symbol
590
+ if lit.to_s.ascii_only?
591
+ Types::Literal.new(literal: lit, location: nil)
592
+ else
593
+ BuiltinNames::Symbol.instance_type
594
+ end
595
+ when Integer
596
+ Types::Literal.new(literal: lit, location: nil)
597
+ when String
598
+ # For Ruby <=3.3 which generates `LIT` node for string literals inside Hash literal.
599
+ # "a" => STR node
600
+ # { "a" => nil } => LIT node
601
+ Types::Literal.new(literal: lit, location: nil)
602
+ else
603
+ type_name = TypeName.new(name: lit.class.name.to_sym, namespace: Namespace.root)
604
+ Types::ClassInstance.new(name: type_name, args: [], location: nil)
605
+ end
606
+ when :ZLIST, :ZARRAY
607
+ BuiltinNames::Array.instance_type(untyped)
608
+ when :LIST, :ARRAY
609
+ elem_types = node.children.compact.map { |e| literal_to_type(e) }
610
+ t = types_to_union_type(elem_types)
611
+ BuiltinNames::Array.instance_type(t)
612
+ when :DOT2, :DOT3
613
+ types = node.children.map { |c| literal_to_type(c) }
614
+ type = range_element_type(types)
615
+ BuiltinNames::Range.instance_type(type)
616
+ when :HASH
617
+ list = node.children[0]
618
+ if list
619
+ children = list.children
620
+ children.pop
621
+ else
622
+ children = [] #: Array[untyped]
623
+ end
624
+
625
+ key_types = [] #: Array[Types::t]
626
+ value_types = [] #: Array[Types::t]
627
+ children.each_slice(2) do |k, v|
628
+ if k
629
+ key_types << literal_to_type(k)
630
+ value_types << literal_to_type(v)
631
+ else
632
+ key_types << untyped
633
+ value_types << untyped
634
+ end
635
+ end
636
+
637
+ if !key_types.empty? && key_types.all? { |t| t.is_a?(Types::Literal) }
638
+ fields = key_types.map {|t|
639
+ t.is_a?(Types::Literal) or raise
640
+ t.literal
641
+ }.zip(value_types).to_h #: Hash[Types::Literal::literal, Types::t]
642
+ Types::Record.new(fields: fields, location: nil)
643
+ else
644
+ key_type = types_to_union_type(key_types)
645
+ value_type = types_to_union_type(value_types)
646
+ BuiltinNames::Hash.instance_type(key_type, value_type)
647
+ end
648
+ when :SELF
649
+ Types::Bases::Self.new(location: nil)
650
+ when :CALL
651
+ receiver, method_name, * = node.children
652
+ case method_name
653
+ when :freeze, :tap, :itself, :dup, :clone, :taint, :untaint, :extend
654
+ literal_to_type(receiver)
655
+ else
656
+ untyped
657
+ end
658
+ else
659
+ untyped
660
+ end
661
+ end
662
+
663
+ def types_to_union_type(types)
664
+ return untyped if types.empty?
665
+
666
+ uniq = types.uniq
667
+ if uniq.size == 1
668
+ return uniq.first || raise
669
+ end
670
+
671
+ Types::Union.new(types: uniq, location: nil)
672
+ end
673
+
674
+ def range_element_type(types)
675
+ types = types.reject { |t| t == untyped }
676
+ return untyped if types.empty?
677
+
678
+ types = types.map do |t|
679
+ if t.is_a?(Types::Literal)
680
+ type_name = TypeName.new(name: t.literal.class.name&.to_sym || raise, namespace: Namespace.root)
681
+ Types::ClassInstance.new(name: type_name, args: [], location: nil)
682
+ else
683
+ t
684
+ end
685
+ end.uniq
686
+
687
+ if types.size == 1
688
+ types.first or raise
689
+ else
690
+ untyped
691
+ end
692
+ end
693
+
694
+ def param_type(node, default: Types::Bases::Any.new(location: nil))
695
+ case node.type
696
+ when :INTEGER
697
+ BuiltinNames::Integer.instance_type
698
+ when :FLOAT
699
+ BuiltinNames::Float.instance_type
700
+ when :RATIONAL
701
+ Types::ClassInstance.new(name: TypeName.parse("::Rational"), args: [], location: nil)
702
+ when :IMAGINARY
703
+ Types::ClassInstance.new(name: TypeName.parse("::Complex"), args: [], location: nil)
704
+ when :LIT
705
+ case node.children[0]
706
+ when Symbol
707
+ BuiltinNames::Symbol.instance_type
708
+ when Integer
709
+ BuiltinNames::Integer.instance_type
710
+ when Float
711
+ BuiltinNames::Float.instance_type
712
+ else
713
+ default
714
+ end
715
+ when :SYM
716
+ BuiltinNames::Symbol.instance_type
717
+ when :STR, :DSTR
718
+ BuiltinNames::String.instance_type
719
+ when :NIL
720
+ # This type is technical non-sense, but may help practically.
721
+ Types::Optional.new(
722
+ type: Types::Bases::Any.new(location: nil),
723
+ location: nil
724
+ )
725
+ when :TRUE, :FALSE
726
+ Types::Bases::Bool.new(location: nil)
727
+ when :ARRAY, :LIST
728
+ BuiltinNames::Array.instance_type(default)
729
+ when :HASH
730
+ BuiltinNames::Hash.instance_type(default, default)
731
+ else
732
+ default
733
+ end
734
+ end
735
+
736
+ # backward compatible
737
+ alias node_type param_type
738
+
739
+ def private
740
+ @private ||= AST::Members::Private.new(location: nil)
741
+ end
742
+
743
+ def public
744
+ @public ||= AST::Members::Public.new(location: nil)
745
+ end
746
+
747
+ def current_accessibility(decls, index = decls.size)
748
+ slice = decls.slice(0, index) or raise
749
+ idx = slice.rindex { |decl| decl == private || decl == public }
750
+ if idx
751
+ _ = decls[idx]
752
+ else
753
+ public
754
+ end
755
+ end
756
+
757
+ def remove_unnecessary_accessibility_methods!(decls)
758
+ # @type var current: decl
759
+ current = public
760
+ idx = 0
761
+
762
+ loop do
763
+ decl = decls[idx] or break
764
+ if current == decl
765
+ decls.delete_at(idx)
766
+ next
767
+ end
768
+
769
+ if 0 < idx && is_accessibility?(decls[idx - 1]) && is_accessibility?(decl)
770
+ decls.delete_at(idx - 1)
771
+ idx -= 1
772
+ current = current_accessibility(decls, idx)
773
+ next
774
+ end
775
+
776
+ current = decl if is_accessibility?(decl)
777
+ idx += 1
778
+ end
779
+
780
+ decls.pop while decls.last && is_accessibility?(decls.last || raise)
781
+ end
782
+
783
+ def is_accessibility?(decl)
784
+ decl == public || decl == private
785
+ end
786
+
787
+ def find_def_index_by_name(decls, name)
788
+ index = decls.find_index do |decl|
789
+ case decl
790
+ when AST::Members::MethodDefinition, AST::Members::AttrReader
791
+ decl.name == name
792
+ when AST::Members::AttrWriter
793
+ :"#{decl.name}=" == name
794
+ end
795
+ end
796
+
797
+ if index
798
+ [
799
+ index,
800
+ _ = decls[index]
801
+ ]
802
+ end
803
+ end
804
+
805
+ def sort_members!(decls)
806
+ i = 0
807
+ orders = {
808
+ AST::Members::ClassVariable => -3,
809
+ AST::Members::ClassInstanceVariable => -2,
810
+ AST::Members::InstanceVariable => -1,
811
+ } #: Hash[Class, Integer]
812
+ decls.sort_by! { |decl| [orders.fetch(decl.class, 0), i += 1] }
813
+ end
814
+ end
815
+ end
816
+ end