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,457 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module Test
5
+ class TypeCheck
6
+ attr_reader :self_class
7
+ attr_reader :builder
8
+ attr_reader :sample_size
9
+ attr_reader :unchecked_classes
10
+ attr_reader :instance_class
11
+ attr_reader :class_class
12
+
13
+ DEFAULT_SAMPLE_SIZE = 100
14
+
15
+ def initialize(self_class:, builder:, sample_size:, unchecked_classes:, instance_class: Object, class_class: Module)
16
+ @self_class = self_class
17
+ @instance_class = instance_class
18
+ @class_class = class_class
19
+ @builder = builder
20
+ @sample_size = sample_size
21
+ @unchecked_classes = unchecked_classes.uniq
22
+ end
23
+
24
+ def overloaded_call(method, method_name, call, errors:)
25
+ es = method.defs.map do |type_def|
26
+ es = method_call(method_name, type_def.type, call, errors: [], annotations: type_def.annotations)
27
+
28
+ if es.empty?
29
+ return errors
30
+ else
31
+ es
32
+ end
33
+ end
34
+
35
+ if es.size == 1
36
+ errors.push(*es[0])
37
+ else
38
+ error = Errors::UnresolvedOverloadingError.new(
39
+ klass: self_class,
40
+ method_name: method_name,
41
+ method_types: method.method_types
42
+ )
43
+ RBS.logger.warn do
44
+ tag = Errors.method_tag(error)
45
+ message = +"#{tag} UnresolvedOverloadingError "
46
+ message << method.method_types.zip(es).map do |method_type, es|
47
+ msg = +"method_type=`#{method_type}`"
48
+ details = es.map do |e|
49
+ "\"#{Errors.to_string(e).sub("#{tag} ", "") }\""
50
+ end.join(', ')
51
+ msg << " details=[#{details}]"
52
+ end.join(', ')
53
+ message
54
+ end
55
+ errors << error
56
+ end
57
+
58
+ errors
59
+ end
60
+
61
+ def method_call(method_name, method_type, call, errors:, annotations: [])
62
+ return errors if method_type.type.is_a?(Types::UntypedFunction)
63
+
64
+ args(method_name, method_type, method_type.type, call.method_call, errors, type_error: Errors::ArgumentTypeError, argument_error: Errors::ArgumentError)
65
+ self.return(method_name, method_type, method_type.type, call.method_call, errors, return_error: Errors::ReturnTypeError, annotations:)
66
+
67
+ if method_type.block
68
+ case
69
+ when !call.block_calls.empty?
70
+ call.block_calls.each do |block_call|
71
+ args(method_name, method_type, method_type.block.type, block_call, errors, type_error: Errors::BlockArgumentTypeError, argument_error: Errors::BlockArgumentError)
72
+ self.return(method_name, method_type, method_type.block.type, block_call, errors, return_error: Errors::BlockReturnTypeError)
73
+ end
74
+ when !call.block_given
75
+ # Block is not given
76
+ if method_type.block.required
77
+ errors << Errors::MissingBlockError.new(klass: self_class, method_name: method_name, method_type: method_type)
78
+ end
79
+ else
80
+ # Block is given, but not yielded
81
+ end
82
+ else
83
+ if call.block_given
84
+ errors << Errors::UnexpectedBlockError.new(klass: self_class, method_name: method_name, method_type: method_type)
85
+ end
86
+ end
87
+
88
+ errors
89
+ end
90
+
91
+ def args(method_name, method_type, fun, call, errors, type_error:, argument_error:)
92
+ test = zip_args(call.arguments, fun) do |val, param|
93
+ unless self.value(val, param.type)
94
+ errors << type_error.new(klass: self_class,
95
+ method_name: method_name,
96
+ method_type: method_type,
97
+ param: param,
98
+ value: val)
99
+ end
100
+ end
101
+
102
+ unless test
103
+ errors << argument_error.new(klass: self_class,
104
+ method_name: method_name,
105
+ method_type: method_type)
106
+ end
107
+ end
108
+
109
+ def return(method_name, method_type, fun, call, errors, return_error:, annotations: [])
110
+ if call.return?
111
+ return if Test.call(call.return_value, IS_AP, NilClass) && annotations.find { |a| a.string == "implicitly-returns-nil" }
112
+
113
+ unless value(call.return_value, fun.return_type)
114
+ errors << return_error.new(klass: self_class,
115
+ method_name: method_name,
116
+ method_type: method_type,
117
+ type: fun.return_type,
118
+ value: call.return_value)
119
+ end
120
+ end
121
+ end
122
+
123
+ def zip_keyword_args(hash, fun)
124
+ fun.required_keywords.each do |name, param|
125
+ if hash.key?(name)
126
+ yield(hash[name], param)
127
+ else
128
+ return false
129
+ end
130
+ end
131
+
132
+ fun.optional_keywords.each do |name, param|
133
+ if hash.key?(name)
134
+ yield(hash[name], param)
135
+ end
136
+ end
137
+
138
+ hash.each do |name, value|
139
+ next if fun.required_keywords.key?(name)
140
+ next if fun.optional_keywords.key?(name)
141
+
142
+ if fun.rest_keywords
143
+ yield value, fun.rest_keywords
144
+ else
145
+ return false
146
+ end
147
+ end
148
+
149
+ true
150
+ end
151
+
152
+ def keyword?(value)
153
+ Hash === value && value.each_key.all?(Symbol)
154
+ end
155
+
156
+ def zip_args(args, fun, &block)
157
+ return true if fun.is_a?(Types::UntypedFunction)
158
+
159
+ case
160
+ when args.empty?
161
+ if fun.required_positionals.empty? && fun.trailing_positionals.empty? && fun.required_keywords.empty?
162
+ true
163
+ else
164
+ false
165
+ end
166
+ when !fun.required_positionals.empty?
167
+ yield_self do
168
+ param, fun_ = fun.drop_head
169
+ yield(args.first, param)
170
+ zip_args(args.drop(1), fun_, &block)
171
+ end
172
+ when fun.has_keyword?
173
+ yield_self do
174
+ hash = args.last
175
+ if keyword?(hash)
176
+ zip_keyword_args(hash, fun, &block) &&
177
+ zip_args(args.take(args.size - 1),
178
+ fun.update(required_keywords: {}, optional_keywords: {}, rest_keywords: nil),
179
+ &block)
180
+ else
181
+ fun.required_keywords.empty? &&
182
+ zip_args(args,
183
+ fun.update(required_keywords: {}, optional_keywords: {}, rest_keywords: nil),
184
+ &block)
185
+ end
186
+ end
187
+ when !fun.trailing_positionals.empty?
188
+ yield_self do
189
+ param, fun_ = fun.drop_tail
190
+ yield(args.last, param)
191
+ zip_args(args.take(args.size - 1), fun_, &block)
192
+ end
193
+ when !fun.optional_positionals.empty?
194
+ yield_self do
195
+ param, fun_ = fun.drop_head
196
+ yield(args.first, param)
197
+ zip_args(args.drop(1), fun_, &block)
198
+ end
199
+ when fun.rest_positionals
200
+ yield_self do
201
+ yield(args.first, fun.rest_positionals)
202
+ zip_args(args.drop(1), fun, &block)
203
+ end
204
+ else
205
+ false
206
+ end
207
+ end
208
+
209
+ def each_sample(array, &block)
210
+ if block
211
+ if sample_size && array.size > sample_size
212
+ if sample_size > 0
213
+ size = array.size
214
+ sample_size.times do
215
+ yield array[rand(size)]
216
+ end
217
+ end
218
+ else
219
+ array.each(&block)
220
+ end
221
+ else
222
+ enum_for :each_sample, array
223
+ end
224
+ end
225
+
226
+ def get_class(type_name)
227
+ Object.const_get(type_name.to_s)
228
+ rescue NameError
229
+ nil
230
+ end
231
+
232
+ def is_double?(value)
233
+ unchecked_classes.any? { |unchecked_class| Test.call(value, IS_AP, Object.const_get(unchecked_class))}
234
+ rescue NameError
235
+ false
236
+ end
237
+
238
+ def value(val, type)
239
+ if is_double?(val)
240
+ RBS.logger.info("A double (#{val.inspect}) is detected!")
241
+ return true
242
+ end
243
+
244
+ case type
245
+ when Types::Bases::Any
246
+ true
247
+ when Types::Bases::Bool
248
+ Test.call(val, IS_AP, TrueClass) || Test.call(val, IS_AP, FalseClass)
249
+ when Types::Bases::Top
250
+ true
251
+ when Types::Bases::Bottom
252
+ false
253
+ when Types::Bases::Void
254
+ true
255
+ when Types::Bases::Self
256
+ Test.call(val, IS_AP, self_class)
257
+ when Types::Bases::Nil
258
+ Test.call(val, IS_AP, ::NilClass)
259
+ when Types::Bases::Class
260
+ Test.call(val, IS_AP, class_class)
261
+ when Types::Bases::Instance
262
+ Test.call(val, IS_AP, instance_class)
263
+ when Types::ClassInstance
264
+ klass = get_class(type.name) or return false
265
+ if params = builder.env.normalized_module_class_entry(type.name.absolute!)&.type_params
266
+ args = AST::TypeParam.normalize_args(params, type.args)
267
+ if args.size != params.size
268
+ return false
269
+ end
270
+ unless args == type.args
271
+ type = Types::ClassInstance.new(name: type.name, args: args, location: type.location)
272
+ end
273
+ end
274
+
275
+ case
276
+ when klass == ::Array
277
+ Test.call(val, IS_AP, klass) && each_sample(val).all? {|v| value(v, type.args[0]) }
278
+ when klass == ::Hash
279
+ Test.call(val, IS_AP, klass) && each_sample(val.keys).all? do |key|
280
+ value(key, type.args[0]) && value(val[key], type.args[1])
281
+ end
282
+ when klass == ::Range
283
+ Test.call(val, IS_AP, klass) && value(val.begin, type.args[0]) && value(val.end, type.args[0])
284
+ when klass == ::Enumerator
285
+ if Test.call(val, IS_AP, klass)
286
+ case val.size
287
+ when Float::INFINITY
288
+ values = []
289
+ ret = self
290
+ val.lazy.take(10).each do |*args|
291
+ values << args
292
+ nil
293
+ end
294
+ when nil
295
+ values = []
296
+ count = 10_000
297
+
298
+ ret = val.each do |*args|
299
+ count -= 1
300
+ values << args
301
+ break if count <= 0
302
+ end
303
+
304
+ if count == 0
305
+ ret = self
306
+ end
307
+ else
308
+ values = []
309
+ ret = val.each do |*args|
310
+ values << args
311
+ nil
312
+ end
313
+ end
314
+
315
+ value_check = values.empty? || each_sample(values).all? do |v|
316
+ if v.size == 1
317
+ # Only one block argument.
318
+ value(v[0], type.args[0]) || value(v, type.args[0])
319
+ else
320
+ value(v, type.args[0])
321
+ end
322
+ end
323
+
324
+ return_check = if ret.equal?(self)
325
+ type.args[1].is_a?(Types::Bases::Bottom)
326
+ else
327
+ value(ret, type.args[1])
328
+ end
329
+
330
+ value_check && return_check
331
+ end
332
+ else
333
+ Test.call(val, IS_AP, klass)
334
+ end
335
+ when Types::ClassSingleton
336
+ klass = get_class(type.name) or return false
337
+ singleton_class = begin
338
+ klass.singleton_class
339
+ rescue TypeError
340
+ return false
341
+ end
342
+ Test.call(val, IS_AP, singleton_class)
343
+ when Types::Interface
344
+ if (definition = builder.build_interface(type.name.absolute!))
345
+ definition.methods.each.all? do |method_name, method|
346
+ next false unless Test.call(val, RESPOND_TOP, method_name)
347
+
348
+ meth = Test.call(val, METHOD, method_name)
349
+ method.defs.all? do |type_def|
350
+ type_def.member.overloads.all? do |overload|
351
+ callable_argument?(meth.parameters, overload.method_type)
352
+ end
353
+ end
354
+ end
355
+ end
356
+ when Types::Variable
357
+ true
358
+ when Types::Literal
359
+ begin
360
+ type.literal == val
361
+ rescue NoMethodError
362
+ raise if defined?(val.==)
363
+ false
364
+ end
365
+ when Types::Union
366
+ type.types.any? {|type| value(val, type) }
367
+ when Types::Intersection
368
+ type.types.all? {|type| value(val, type) }
369
+ when Types::Optional
370
+ Test.call(val, IS_AP, ::NilClass) || value(val, type.type)
371
+ when Types::Alias
372
+ value(val, builder.expand_alias2(type.name.absolute!, type.args))
373
+ when Types::Tuple
374
+ Test.call(val, IS_AP, ::Array) &&
375
+ type.types.length == val.length &&
376
+ type.types.map.with_index {|ty, index| value(val[index], ty) }.all?
377
+ when Types::Record
378
+ Test::call(val, IS_AP, ::Hash) &&
379
+ type.fields.map {|key, type| value(val[key], type) }.all?
380
+ when Types::Proc
381
+ Test::call(val, IS_AP, ::Proc)
382
+ else
383
+ false
384
+ end
385
+ end
386
+
387
+ private
388
+
389
+ def callable_argument?(parameters, method_type)
390
+ fun = method_type.type
391
+ take_has_rest = !!parameters.find { |(op, _)| op == :rest }
392
+
393
+ return true if fun.is_a?(Types::UntypedFunction)
394
+
395
+ fun.required_positionals.each do
396
+ op, _ = parameters.first
397
+ return false if op.nil? || op == :keyreq || op == :key || op == :keyrest
398
+ parameters.shift if op == :req || op == :opt
399
+ end
400
+
401
+ fun.optional_positionals.each do
402
+ op, _ = parameters.first
403
+ return false if op.nil? || op == :req || op == :keyreq || op == :key || op == :keyrest
404
+ parameters.shift if op == :opt
405
+ end
406
+
407
+ if fun.rest_positionals
408
+ op, _ = parameters.shift
409
+ return false if op.nil? || op != :rest
410
+ end
411
+
412
+ fun.trailing_positionals.each do
413
+ op, _ = parameters.first
414
+ return false if !take_has_rest && (op.nil? || op == :keyreq || op == :key || op == :keyrest)
415
+ index = parameters.find_index { |(op, _)| op == :req }
416
+ parameters.delete_at(index) if index
417
+ end
418
+
419
+ if fun.has_keyword?
420
+ return false if !take_has_rest && parameters.empty?
421
+
422
+ fun.required_keywords.each do |name, _|
423
+ return false if !take_has_rest && parameters.empty?
424
+ index = parameters.find_index { |(op, n)| (op == :keyreq || op == :key) && n == name }
425
+ parameters.delete_at(index) if index
426
+ end
427
+
428
+ if !fun.optional_keywords.empty?
429
+ fun.optional_keywords.each do |name, _|
430
+ return false if !take_has_rest && parameters.empty?
431
+ index = parameters.find_index { |(op, n)| op == :key && n == name }
432
+ parameters.delete_at(index) if index
433
+ end
434
+ op, _ = parameters.first
435
+ return false if op == :req
436
+ end
437
+
438
+ if fun.rest_keywords
439
+ op, _ = parameters.first
440
+ return false if (!take_has_rest && op.nil?)
441
+ # f(a) allows (Integer, a: Integer)
442
+ return false if op == :req && fun.required_keywords.empty?
443
+ end
444
+
445
+ op, _ = parameters.first
446
+ return true if (op == :req || op == :opt) && parameters.length == 1
447
+ end
448
+
449
+ # rest required arguments
450
+ op, _ = parameters.first
451
+ return false if op == :req || op == :keyreq
452
+
453
+ true
454
+ end
455
+ end
456
+ end
457
+ end
data/lib/rbs/test.rb ADDED
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "securerandom"
4
+ require "rbs/test/guaranteed"
5
+ require "rbs/test/observer"
6
+ require "rbs/test/errors"
7
+ require "rbs/test/type_check"
8
+ require "rbs/test/tester"
9
+ require "rbs/test/hook"
10
+ require "rbs/test/setup_helper"
11
+
12
+ module RBS
13
+ module Test
14
+ IS_AP = Kernel.instance_method(:is_a?)
15
+ DEFINE_METHOD = Module.instance_method(:define_method)
16
+ INSTANCE_EVAL = BasicObject.instance_method(:instance_eval)
17
+ INSTANCE_EXEC = BasicObject.instance_method(:instance_exec)
18
+ METHOD = Kernel.instance_method(:method)
19
+ CLASS = Kernel.instance_method(:class)
20
+ SINGLETON_CLASS = Kernel.instance_method(:singleton_class)
21
+ PP = Kernel.instance_method(:pp)
22
+ INSPECT = Kernel.instance_method(:inspect)
23
+ METHODS = Kernel.instance_method(:methods)
24
+ RESPOND_TOP = Kernel.instance_method(:respond_to?)
25
+
26
+ class ArgumentsReturn
27
+ include Guaranteed::Inspect
28
+
29
+ attr_reader :arguments
30
+ attr_reader :exit_value
31
+ attr_reader :exit_type
32
+
33
+ def initialize(arguments:, exit_value:, exit_type:)
34
+ @arguments = arguments
35
+ @exit_value = exit_value
36
+ @exit_type = exit_type
37
+ end
38
+
39
+ def self.return(arguments:, value:)
40
+ new(arguments: arguments, exit_value: value, exit_type: :return)
41
+ end
42
+
43
+ def self.exception(arguments:, exception:)
44
+ new(arguments: arguments, exit_value: exception, exit_type: :exception)
45
+ end
46
+
47
+ def self.break(arguments:)
48
+ new(arguments: arguments, exit_value: nil, exit_type: :break)
49
+ end
50
+
51
+ def return_value
52
+ raise unless exit_type == :return
53
+ exit_value
54
+ end
55
+
56
+ def exception
57
+ raise unless exit_type == :exception
58
+ exit_value
59
+ end
60
+
61
+ def return?
62
+ exit_type == :return
63
+ end
64
+
65
+ def exception?
66
+ exit_type == :exception
67
+ end
68
+
69
+ def break?
70
+ exit_type == :break
71
+ end
72
+ end
73
+
74
+ CallTrace = Struct.new(:method_name, :method_call, :block_calls, :block_given, keyword_init: true)
75
+
76
+ class <<self
77
+ attr_accessor :suffix
78
+
79
+ def reset_suffix
80
+ self.suffix = "RBS_TEST_#{SecureRandom.hex(3)}"
81
+ end
82
+ end
83
+
84
+ reset_suffix
85
+
86
+ if ::UnboundMethod.instance_methods.include?(:bind_call)
87
+ def self.call(receiver, method, *args, &block)
88
+ __skip__ = method.bind_call(receiver, *args, &block)
89
+ end
90
+ else
91
+ def self.call(receiver, method, *args, &block)
92
+ __skip__ = method.bind(receiver).call(*args, &block)
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ unless ::Module.private_instance_methods.include?(:ruby2_keywords)
99
+ class Module
100
+ private
101
+ def ruby2_keywords(*)
102
+ end
103
+ end
104
+ end
105
+
106
+ unless ::Proc.instance_methods.include?(:ruby2_keywords)
107
+ class Proc
108
+ def ruby2_keywords
109
+ self
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ class TypeAliasDependency
5
+ attr_reader :env
6
+
7
+ # Direct dependencies corresponds to a directed graph
8
+ # with vertices as types and directions based on assignment of types
9
+ attr_reader :direct_dependencies
10
+ # A hash which stores the transitive closure
11
+ # of the directed graph
12
+ attr_reader :dependencies
13
+
14
+ def initialize(env:)
15
+ @env = env
16
+ end
17
+
18
+ # Check if an alias type definition is circular & prohibited
19
+ def circular_definition?(alias_name)
20
+ # Construct transitive closure, if not constructed already
21
+ transitive_closure() unless @dependencies
22
+
23
+ alias_name = env.normalize_type_name!(alias_name)
24
+ @dependencies[alias_name][alias_name]
25
+ end
26
+
27
+ def build_dependencies
28
+ return if @direct_dependencies
29
+
30
+ # Initialize hash(a directed graph)
31
+ @direct_dependencies = {}
32
+ # Initialize dependencies as an empty hash
33
+ @dependencies = {}
34
+ # Iterate over alias declarations inserted into environment
35
+ env.type_alias_decls.each do |name, entry|
36
+ # Construct a directed graph by recursively extracting type aliases
37
+ @direct_dependencies[name] = direct_dependency(entry.decl.type)
38
+ # Initialize dependencies with an empty hash
39
+ @dependencies[name] = {}
40
+ end
41
+ end
42
+
43
+ def transitive_closure
44
+ # Construct a graph of direct dependencies
45
+ build_dependencies()
46
+ # Construct transitive closure by using DFS(recursive technique)
47
+ @direct_dependencies.each_key do |name|
48
+ dependency(name, name)
49
+ end
50
+ end
51
+
52
+ def direct_dependencies_of(name)
53
+ name = env.normalize_type_name!(name)
54
+ @direct_dependencies[name]
55
+ end
56
+
57
+ def dependencies_of(name)
58
+ name = env.normalize_type_name!(name)
59
+ @dependencies[name].each_key.to_set
60
+ end
61
+
62
+ private
63
+
64
+ # Constructs directed graph recursively
65
+ def direct_dependency(type, result = Set[])
66
+ case type
67
+ when RBS::Types::Union, RBS::Types::Intersection, RBS::Types::Optional
68
+ # Iterate over nested types & extract type aliases recursively
69
+ type.each_type do |nested_type|
70
+ direct_dependency(nested_type, result)
71
+ end
72
+ when RBS::Types::Alias
73
+ # Append type name if the type is an alias
74
+ result << env.normalize_type_name(type.name)
75
+ end
76
+
77
+ result
78
+ end
79
+
80
+ # Recursive function to construct transitive closure
81
+ def dependency(start, vertex, nested = nil)
82
+ if (start == vertex)
83
+ if (@direct_dependencies[start].include?(vertex) || nested)
84
+ # Mark a vertex as connected to itself
85
+ # if it is connected as an edge || a path(traverse multiple edges)
86
+ @dependencies[start][vertex] = true
87
+ end
88
+ else
89
+ # Mark a pair of vertices as connected while recursively performing DFS
90
+ @dependencies[start][vertex] = true
91
+ end
92
+
93
+ # Iterate over the direct dependencies of the vertex
94
+ @direct_dependencies[vertex]&.each do |type_name|
95
+ # Invoke the function unless it is already checked
96
+ dependency(start, type_name, start == type_name) unless @dependencies[start][type_name]
97
+ end
98
+ end
99
+ end
100
+ end