rbs-relaxed 3.9.0.1

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 (484) hide show
  1. checksums.yaml +7 -0
  2. data/.github/dependabot.yml +22 -0
  3. data/.github/workflows/comments.yml +35 -0
  4. data/.github/workflows/dependabot.yml +30 -0
  5. data/.github/workflows/ruby.yml +82 -0
  6. data/.github/workflows/typecheck.yml +38 -0
  7. data/.github/workflows/windows.yml +43 -0
  8. data/.gitignore +23 -0
  9. data/.rubocop.yml +68 -0
  10. data/BSDL +22 -0
  11. data/CHANGELOG.md +1868 -0
  12. data/COPYING +56 -0
  13. data/README.md +203 -0
  14. data/Rakefile +417 -0
  15. data/Steepfile +44 -0
  16. data/config.yml +313 -0
  17. data/core/array.rbs +4062 -0
  18. data/core/basic_object.rbs +375 -0
  19. data/core/binding.rbs +150 -0
  20. data/core/builtin.rbs +277 -0
  21. data/core/class.rbs +220 -0
  22. data/core/comparable.rbs +171 -0
  23. data/core/complex.rbs +786 -0
  24. data/core/constants.rbs +96 -0
  25. data/core/data.rbs +415 -0
  26. data/core/dir.rbs +981 -0
  27. data/core/encoding.rbs +1371 -0
  28. data/core/enumerable.rbs +2405 -0
  29. data/core/enumerator/product.rbs +92 -0
  30. data/core/enumerator.rbs +630 -0
  31. data/core/env.rbs +6 -0
  32. data/core/errno.rbs +673 -0
  33. data/core/errors.rbs +760 -0
  34. data/core/exception.rbs +485 -0
  35. data/core/false_class.rbs +82 -0
  36. data/core/fiber.rbs +550 -0
  37. data/core/fiber_error.rbs +11 -0
  38. data/core/file.rbs +2936 -0
  39. data/core/file_test.rbs +331 -0
  40. data/core/float.rbs +1151 -0
  41. data/core/gc.rbs +644 -0
  42. data/core/global_variables.rbs +184 -0
  43. data/core/hash.rbs +1861 -0
  44. data/core/integer.rbs +1413 -0
  45. data/core/io/buffer.rbs +984 -0
  46. data/core/io/wait.rbs +70 -0
  47. data/core/io.rbs +3406 -0
  48. data/core/kernel.rbs +3096 -0
  49. data/core/marshal.rbs +207 -0
  50. data/core/match_data.rbs +635 -0
  51. data/core/math.rbs +729 -0
  52. data/core/method.rbs +386 -0
  53. data/core/module.rbs +1704 -0
  54. data/core/nil_class.rbs +209 -0
  55. data/core/numeric.rbs +818 -0
  56. data/core/object.rbs +110 -0
  57. data/core/object_space/weak_key_map.rbs +166 -0
  58. data/core/object_space.rbs +190 -0
  59. data/core/proc.rbs +868 -0
  60. data/core/process.rbs +2296 -0
  61. data/core/ractor.rbs +1068 -0
  62. data/core/random.rbs +237 -0
  63. data/core/range.rbs +1107 -0
  64. data/core/rational.rbs +531 -0
  65. data/core/rb_config.rbs +88 -0
  66. data/core/rbs/unnamed/argf.rbs +1229 -0
  67. data/core/rbs/unnamed/env_class.rbs +1209 -0
  68. data/core/rbs/unnamed/random.rbs +293 -0
  69. data/core/refinement.rbs +59 -0
  70. data/core/regexp.rbs +1930 -0
  71. data/core/ruby_vm.rbs +765 -0
  72. data/core/rubygems/basic_specification.rbs +6 -0
  73. data/core/rubygems/config_file.rbs +38 -0
  74. data/core/rubygems/dependency_installer.rbs +6 -0
  75. data/core/rubygems/errors.rbs +176 -0
  76. data/core/rubygems/installer.rbs +15 -0
  77. data/core/rubygems/path_support.rbs +6 -0
  78. data/core/rubygems/platform.rbs +7 -0
  79. data/core/rubygems/request_set.rbs +49 -0
  80. data/core/rubygems/requirement.rbs +148 -0
  81. data/core/rubygems/rubygems.rbs +1171 -0
  82. data/core/rubygems/source_list.rbs +15 -0
  83. data/core/rubygems/specification.rbs +23 -0
  84. data/core/rubygems/stream_ui.rbs +5 -0
  85. data/core/rubygems/uninstaller.rbs +10 -0
  86. data/core/rubygems/version.rbs +294 -0
  87. data/core/set.rbs +621 -0
  88. data/core/signal.rbs +100 -0
  89. data/core/string.rbs +3583 -0
  90. data/core/struct.rbs +667 -0
  91. data/core/symbol.rbs +475 -0
  92. data/core/thread.rbs +1765 -0
  93. data/core/thread_group.rbs +79 -0
  94. data/core/time.rbs +1762 -0
  95. data/core/trace_point.rbs +477 -0
  96. data/core/true_class.rbs +98 -0
  97. data/core/unbound_method.rbs +329 -0
  98. data/core/warning.rbs +87 -0
  99. data/docs/CONTRIBUTING.md +106 -0
  100. data/docs/architecture.md +110 -0
  101. data/docs/collection.md +192 -0
  102. data/docs/data_and_struct.md +86 -0
  103. data/docs/gem.md +57 -0
  104. data/docs/rbs_by_example.md +309 -0
  105. data/docs/repo.md +125 -0
  106. data/docs/sigs.md +167 -0
  107. data/docs/stdlib.md +147 -0
  108. data/docs/syntax.md +910 -0
  109. data/docs/tools.md +17 -0
  110. data/exe/rbs +7 -0
  111. data/ext/rbs_extension/extconf.rb +15 -0
  112. data/ext/rbs_extension/lexer.c +2728 -0
  113. data/ext/rbs_extension/lexer.h +179 -0
  114. data/ext/rbs_extension/lexer.re +147 -0
  115. data/ext/rbs_extension/lexstate.c +175 -0
  116. data/ext/rbs_extension/location.c +325 -0
  117. data/ext/rbs_extension/location.h +85 -0
  118. data/ext/rbs_extension/main.c +33 -0
  119. data/ext/rbs_extension/parser.c +2973 -0
  120. data/ext/rbs_extension/parser.h +18 -0
  121. data/ext/rbs_extension/parserstate.c +397 -0
  122. data/ext/rbs_extension/parserstate.h +163 -0
  123. data/ext/rbs_extension/rbs_extension.h +31 -0
  124. data/ext/rbs_extension/unescape.c +32 -0
  125. data/goodcheck.yml +91 -0
  126. data/include/rbs/constants.h +82 -0
  127. data/include/rbs/ruby_objs.h +72 -0
  128. data/include/rbs/util/rbs_constant_pool.h +219 -0
  129. data/include/rbs.h +7 -0
  130. data/lib/rbs/ancestor_graph.rb +92 -0
  131. data/lib/rbs/annotate/annotations.rb +199 -0
  132. data/lib/rbs/annotate/formatter.rb +92 -0
  133. data/lib/rbs/annotate/rdoc_annotator.rb +400 -0
  134. data/lib/rbs/annotate/rdoc_source.rb +131 -0
  135. data/lib/rbs/annotate.rb +8 -0
  136. data/lib/rbs/ast/annotation.rb +29 -0
  137. data/lib/rbs/ast/comment.rb +29 -0
  138. data/lib/rbs/ast/declarations.rb +467 -0
  139. data/lib/rbs/ast/directives.rb +49 -0
  140. data/lib/rbs/ast/members.rb +451 -0
  141. data/lib/rbs/ast/type_param.rb +225 -0
  142. data/lib/rbs/ast/visitor.rb +137 -0
  143. data/lib/rbs/buffer.rb +67 -0
  144. data/lib/rbs/builtin_names.rb +58 -0
  145. data/lib/rbs/cli/colored_io.rb +48 -0
  146. data/lib/rbs/cli/diff.rb +83 -0
  147. data/lib/rbs/cli/validate.rb +357 -0
  148. data/lib/rbs/cli.rb +1223 -0
  149. data/lib/rbs/collection/cleaner.rb +38 -0
  150. data/lib/rbs/collection/config/lockfile.rb +92 -0
  151. data/lib/rbs/collection/config/lockfile_generator.rb +218 -0
  152. data/lib/rbs/collection/config.rb +81 -0
  153. data/lib/rbs/collection/installer.rb +32 -0
  154. data/lib/rbs/collection/sources/base.rb +14 -0
  155. data/lib/rbs/collection/sources/git.rb +258 -0
  156. data/lib/rbs/collection/sources/local.rb +81 -0
  157. data/lib/rbs/collection/sources/rubygems.rb +48 -0
  158. data/lib/rbs/collection/sources/stdlib.rb +50 -0
  159. data/lib/rbs/collection/sources.rb +38 -0
  160. data/lib/rbs/collection.rb +16 -0
  161. data/lib/rbs/constant.rb +28 -0
  162. data/lib/rbs/definition.rb +401 -0
  163. data/lib/rbs/definition_builder/ancestor_builder.rb +620 -0
  164. data/lib/rbs/definition_builder/method_builder.rb +254 -0
  165. data/lib/rbs/definition_builder.rb +845 -0
  166. data/lib/rbs/diff.rb +125 -0
  167. data/lib/rbs/environment/use_map.rb +77 -0
  168. data/lib/rbs/environment.rb +829 -0
  169. data/lib/rbs/environment_loader.rb +173 -0
  170. data/lib/rbs/environment_walker.rb +155 -0
  171. data/lib/rbs/errors.rb +645 -0
  172. data/lib/rbs/factory.rb +18 -0
  173. data/lib/rbs/file_finder.rb +28 -0
  174. data/lib/rbs/location_aux.rb +138 -0
  175. data/lib/rbs/locator.rb +243 -0
  176. data/lib/rbs/method_type.rb +143 -0
  177. data/lib/rbs/namespace.rb +125 -0
  178. data/lib/rbs/parser/lex_result.rb +15 -0
  179. data/lib/rbs/parser/token.rb +23 -0
  180. data/lib/rbs/parser_aux.rb +114 -0
  181. data/lib/rbs/prototype/helpers.rb +140 -0
  182. data/lib/rbs/prototype/node_usage.rb +99 -0
  183. data/lib/rbs/prototype/rb.rb +840 -0
  184. data/lib/rbs/prototype/rbi.rb +641 -0
  185. data/lib/rbs/prototype/runtime/helpers.rb +59 -0
  186. data/lib/rbs/prototype/runtime/reflection.rb +19 -0
  187. data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
  188. data/lib/rbs/prototype/runtime.rb +667 -0
  189. data/lib/rbs/repository.rb +127 -0
  190. data/lib/rbs/resolver/constant_resolver.rb +219 -0
  191. data/lib/rbs/resolver/type_name_resolver.rb +91 -0
  192. data/lib/rbs/sorter.rb +198 -0
  193. data/lib/rbs/substitution.rb +83 -0
  194. data/lib/rbs/subtractor.rb +201 -0
  195. data/lib/rbs/test/errors.rb +80 -0
  196. data/lib/rbs/test/guaranteed.rb +30 -0
  197. data/lib/rbs/test/hook.rb +212 -0
  198. data/lib/rbs/test/observer.rb +19 -0
  199. data/lib/rbs/test/setup.rb +84 -0
  200. data/lib/rbs/test/setup_helper.rb +50 -0
  201. data/lib/rbs/test/tester.rb +167 -0
  202. data/lib/rbs/test/type_check.rb +435 -0
  203. data/lib/rbs/test.rb +112 -0
  204. data/lib/rbs/type_alias_dependency.rb +100 -0
  205. data/lib/rbs/type_alias_regularity.rb +126 -0
  206. data/lib/rbs/type_name.rb +109 -0
  207. data/lib/rbs/types.rb +1596 -0
  208. data/lib/rbs/unit_test/convertibles.rb +176 -0
  209. data/lib/rbs/unit_test/spy.rb +138 -0
  210. data/lib/rbs/unit_test/type_assertions.rb +347 -0
  211. data/lib/rbs/unit_test/with_aliases.rb +143 -0
  212. data/lib/rbs/unit_test.rb +6 -0
  213. data/lib/rbs/validator.rb +186 -0
  214. data/lib/rbs/variance_calculator.rb +189 -0
  215. data/lib/rbs/vendorer.rb +71 -0
  216. data/lib/rbs/version.rb +5 -0
  217. data/lib/rbs/writer.rb +424 -0
  218. data/lib/rbs.rb +94 -0
  219. data/lib/rdoc/discover.rb +20 -0
  220. data/lib/rdoc_plugin/parser.rb +163 -0
  221. data/rbs-relaxed.gemspec +48 -0
  222. data/schema/annotation.json +14 -0
  223. data/schema/comment.json +26 -0
  224. data/schema/decls.json +326 -0
  225. data/schema/function.json +87 -0
  226. data/schema/location.json +56 -0
  227. data/schema/members.json +266 -0
  228. data/schema/methodType.json +50 -0
  229. data/schema/typeParam.json +36 -0
  230. data/schema/types.json +317 -0
  231. data/sig/ancestor_builder.rbs +163 -0
  232. data/sig/ancestor_graph.rbs +60 -0
  233. data/sig/annotate/annotations.rbs +102 -0
  234. data/sig/annotate/formatter.rbs +24 -0
  235. data/sig/annotate/rdoc_annotater.rbs +82 -0
  236. data/sig/annotate/rdoc_source.rbs +30 -0
  237. data/sig/annotation.rbs +27 -0
  238. data/sig/buffer.rbs +32 -0
  239. data/sig/builtin_names.rbs +44 -0
  240. data/sig/cli/colored_io.rbs +15 -0
  241. data/sig/cli/diff.rbs +21 -0
  242. data/sig/cli/validate.rbs +43 -0
  243. data/sig/cli.rbs +87 -0
  244. data/sig/collection/cleaner.rbs +13 -0
  245. data/sig/collection/config/lockfile.rbs +74 -0
  246. data/sig/collection/config/lockfile_generator.rbs +66 -0
  247. data/sig/collection/config.rbs +46 -0
  248. data/sig/collection/installer.rbs +17 -0
  249. data/sig/collection/sources.rbs +214 -0
  250. data/sig/collection.rbs +4 -0
  251. data/sig/comment.rbs +26 -0
  252. data/sig/constant.rbs +21 -0
  253. data/sig/declarations.rbs +267 -0
  254. data/sig/definition.rbs +173 -0
  255. data/sig/definition_builder.rbs +165 -0
  256. data/sig/diff.rbs +28 -0
  257. data/sig/directives.rbs +77 -0
  258. data/sig/environment.rbs +279 -0
  259. data/sig/environment_loader.rbs +111 -0
  260. data/sig/environment_walker.rbs +65 -0
  261. data/sig/errors.rbs +405 -0
  262. data/sig/factory.rbs +5 -0
  263. data/sig/file_finder.rbs +28 -0
  264. data/sig/location.rbs +110 -0
  265. data/sig/locator.rbs +58 -0
  266. data/sig/manifest.yaml +7 -0
  267. data/sig/members.rbs +258 -0
  268. data/sig/method_builder.rbs +84 -0
  269. data/sig/method_types.rbs +58 -0
  270. data/sig/namespace.rbs +146 -0
  271. data/sig/parser.rbs +100 -0
  272. data/sig/prototype/helpers.rbs +27 -0
  273. data/sig/prototype/node_usage.rbs +20 -0
  274. data/sig/prototype/rb.rbs +96 -0
  275. data/sig/prototype/rbi.rbs +75 -0
  276. data/sig/prototype/runtime.rbs +182 -0
  277. data/sig/rbs.rbs +21 -0
  278. data/sig/rdoc/rbs.rbs +67 -0
  279. data/sig/repository.rbs +85 -0
  280. data/sig/resolver/constant_resolver.rbs +92 -0
  281. data/sig/resolver/context.rbs +34 -0
  282. data/sig/resolver/type_name_resolver.rbs +35 -0
  283. data/sig/shims/bundler.rbs +38 -0
  284. data/sig/shims/enumerable.rbs +5 -0
  285. data/sig/shims/rubygems.rbs +19 -0
  286. data/sig/sorter.rbs +41 -0
  287. data/sig/substitution.rbs +48 -0
  288. data/sig/subtractor.rbs +37 -0
  289. data/sig/test/errors.rbs +52 -0
  290. data/sig/test/guranteed.rbs +9 -0
  291. data/sig/test/type_check.rbs +19 -0
  292. data/sig/test.rbs +82 -0
  293. data/sig/type_alias_dependency.rbs +53 -0
  294. data/sig/type_alias_regularity.rbs +98 -0
  295. data/sig/type_param.rbs +110 -0
  296. data/sig/typename.rbs +79 -0
  297. data/sig/types.rbs +579 -0
  298. data/sig/unit_test/convertibles.rbs +154 -0
  299. data/sig/unit_test/spy.rbs +30 -0
  300. data/sig/unit_test/type_assertions.rbs +196 -0
  301. data/sig/unit_test/with_aliases.rbs +136 -0
  302. data/sig/use_map.rbs +35 -0
  303. data/sig/util.rbs +9 -0
  304. data/sig/validator.rbs +63 -0
  305. data/sig/variance_calculator.rbs +87 -0
  306. data/sig/vendorer.rbs +51 -0
  307. data/sig/version.rbs +3 -0
  308. data/sig/visitor.rbs +47 -0
  309. data/sig/writer.rbs +127 -0
  310. data/src/constants.c +153 -0
  311. data/src/ruby_objs.c +795 -0
  312. data/src/util/rbs_constant_pool.c +342 -0
  313. data/stdlib/abbrev/0/abbrev.rbs +66 -0
  314. data/stdlib/abbrev/0/array.rbs +26 -0
  315. data/stdlib/base64/0/base64.rbs +355 -0
  316. data/stdlib/benchmark/0/benchmark.rbs +452 -0
  317. data/stdlib/bigdecimal/0/big_decimal.rbs +1629 -0
  318. data/stdlib/bigdecimal-math/0/big_math.rbs +119 -0
  319. data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
  320. data/stdlib/cgi/0/core.rbs +1285 -0
  321. data/stdlib/cgi/0/manifest.yaml +3 -0
  322. data/stdlib/coverage/0/coverage.rbs +263 -0
  323. data/stdlib/csv/0/csv.rbs +3776 -0
  324. data/stdlib/csv/0/manifest.yaml +3 -0
  325. data/stdlib/date/0/date.rbs +1585 -0
  326. data/stdlib/date/0/date_time.rbs +616 -0
  327. data/stdlib/date/0/time.rbs +26 -0
  328. data/stdlib/dbm/0/dbm.rbs +421 -0
  329. data/stdlib/delegate/0/delegator.rbs +184 -0
  330. data/stdlib/delegate/0/kernel.rbs +47 -0
  331. data/stdlib/delegate/0/simple_delegator.rbs +96 -0
  332. data/stdlib/did_you_mean/0/did_you_mean.rbs +343 -0
  333. data/stdlib/digest/0/digest.rbs +577 -0
  334. data/stdlib/erb/0/erb.rbs +532 -0
  335. data/stdlib/etc/0/etc.rbs +865 -0
  336. data/stdlib/fileutils/0/fileutils.rbs +1734 -0
  337. data/stdlib/find/0/find.rbs +49 -0
  338. data/stdlib/forwardable/0/forwardable.rbs +268 -0
  339. data/stdlib/io-console/0/io-console.rbs +414 -0
  340. data/stdlib/ipaddr/0/ipaddr.rbs +428 -0
  341. data/stdlib/json/0/json.rbs +1916 -0
  342. data/stdlib/kconv/0/kconv.rbs +166 -0
  343. data/stdlib/logger/0/formatter.rbs +45 -0
  344. data/stdlib/logger/0/log_device.rbs +100 -0
  345. data/stdlib/logger/0/logger.rbs +796 -0
  346. data/stdlib/logger/0/manifest.yaml +2 -0
  347. data/stdlib/logger/0/period.rbs +17 -0
  348. data/stdlib/logger/0/severity.rbs +34 -0
  349. data/stdlib/minitest/0/kernel.rbs +42 -0
  350. data/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
  351. data/stdlib/minitest/0/minitest/assertion.rbs +17 -0
  352. data/stdlib/minitest/0/minitest/assertions.rbs +590 -0
  353. data/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
  354. data/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
  355. data/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
  356. data/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
  357. data/stdlib/minitest/0/minitest/compress.rbs +13 -0
  358. data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
  359. data/stdlib/minitest/0/minitest/expectation.rbs +2 -0
  360. data/stdlib/minitest/0/minitest/expectations.rbs +21 -0
  361. data/stdlib/minitest/0/minitest/guard.rbs +64 -0
  362. data/stdlib/minitest/0/minitest/mock.rbs +64 -0
  363. data/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
  364. data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
  365. data/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
  366. data/stdlib/minitest/0/minitest/parallel.rbs +2 -0
  367. data/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
  368. data/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
  369. data/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
  370. data/stdlib/minitest/0/minitest/reportable.rbs +53 -0
  371. data/stdlib/minitest/0/minitest/reporter.rbs +5 -0
  372. data/stdlib/minitest/0/minitest/result.rbs +28 -0
  373. data/stdlib/minitest/0/minitest/runnable.rbs +163 -0
  374. data/stdlib/minitest/0/minitest/skip.rbs +6 -0
  375. data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
  376. data/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
  377. data/stdlib/minitest/0/minitest/spec.rbs +11 -0
  378. data/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
  379. data/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
  380. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
  381. data/stdlib/minitest/0/minitest/test.rbs +69 -0
  382. data/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
  383. data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
  384. data/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
  385. data/stdlib/minitest/0/minitest/unit.rbs +4 -0
  386. data/stdlib/minitest/0/minitest.rbs +115 -0
  387. data/stdlib/monitor/0/monitor.rbs +363 -0
  388. data/stdlib/mutex_m/0/mutex_m.rbs +104 -0
  389. data/stdlib/net-http/0/manifest.yaml +3 -0
  390. data/stdlib/net-http/0/net-http.rbs +5552 -0
  391. data/stdlib/net-protocol/0/manifest.yaml +2 -0
  392. data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
  393. data/stdlib/net-smtp/0/manifest.yaml +2 -0
  394. data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
  395. data/stdlib/nkf/0/nkf.rbs +402 -0
  396. data/stdlib/objspace/0/objspace.rbs +487 -0
  397. data/stdlib/observable/0/observable.rbs +217 -0
  398. data/stdlib/open-uri/0/manifest.yaml +4 -0
  399. data/stdlib/open-uri/0/open-uri.rbs +393 -0
  400. data/stdlib/open3/0/open3.rbs +147 -0
  401. data/stdlib/openssl/0/manifest.yaml +3 -0
  402. data/stdlib/openssl/0/openssl.rbs +12113 -0
  403. data/stdlib/optparse/0/optparse.rbs +1725 -0
  404. data/stdlib/pathname/0/pathname.rbs +1406 -0
  405. data/stdlib/pp/0/manifest.yaml +2 -0
  406. data/stdlib/pp/0/pp.rbs +300 -0
  407. data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
  408. data/stdlib/pstore/0/pstore.rbs +603 -0
  409. data/stdlib/psych/0/core_ext.rbs +12 -0
  410. data/stdlib/psych/0/dbm.rbs +237 -0
  411. data/stdlib/psych/0/manifest.yaml +3 -0
  412. data/stdlib/psych/0/psych.rbs +402 -0
  413. data/stdlib/psych/0/store.rbs +59 -0
  414. data/stdlib/pty/0/pty.rbs +237 -0
  415. data/stdlib/rdoc/0/code_object.rbs +51 -0
  416. data/stdlib/rdoc/0/comment.rbs +59 -0
  417. data/stdlib/rdoc/0/context.rbs +153 -0
  418. data/stdlib/rdoc/0/markup.rbs +117 -0
  419. data/stdlib/rdoc/0/parser.rbs +56 -0
  420. data/stdlib/rdoc/0/rdoc.rbs +391 -0
  421. data/stdlib/rdoc/0/ri.rbs +17 -0
  422. data/stdlib/rdoc/0/store.rbs +48 -0
  423. data/stdlib/rdoc/0/top_level.rbs +97 -0
  424. data/stdlib/resolv/0/manifest.yaml +3 -0
  425. data/stdlib/resolv/0/resolv.rbs +1830 -0
  426. data/stdlib/ripper/0/ripper.rbs +1648 -0
  427. data/stdlib/securerandom/0/securerandom.rbs +62 -0
  428. data/stdlib/shellwords/0/shellwords.rbs +229 -0
  429. data/stdlib/singleton/0/singleton.rbs +131 -0
  430. data/stdlib/socket/0/addrinfo.rbs +666 -0
  431. data/stdlib/socket/0/basic_socket.rbs +590 -0
  432. data/stdlib/socket/0/constants.rbs +2295 -0
  433. data/stdlib/socket/0/ip_socket.rbs +92 -0
  434. data/stdlib/socket/0/socket.rbs +4157 -0
  435. data/stdlib/socket/0/socket_error.rbs +5 -0
  436. data/stdlib/socket/0/tcp_server.rbs +192 -0
  437. data/stdlib/socket/0/tcp_socket.rbs +79 -0
  438. data/stdlib/socket/0/udp_socket.rbs +133 -0
  439. data/stdlib/socket/0/unix_server.rbs +169 -0
  440. data/stdlib/socket/0/unix_socket.rbs +172 -0
  441. data/stdlib/stringio/0/stringio.rbs +567 -0
  442. data/stdlib/strscan/0/string_scanner.rbs +1627 -0
  443. data/stdlib/tempfile/0/tempfile.rbs +479 -0
  444. data/stdlib/time/0/time.rbs +432 -0
  445. data/stdlib/timeout/0/timeout.rbs +81 -0
  446. data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
  447. data/stdlib/tsort/0/cyclic.rbs +5 -0
  448. data/stdlib/tsort/0/interfaces.rbs +20 -0
  449. data/stdlib/tsort/0/tsort.rbs +409 -0
  450. data/stdlib/uri/0/common.rbs +582 -0
  451. data/stdlib/uri/0/file.rbs +118 -0
  452. data/stdlib/uri/0/ftp.rbs +13 -0
  453. data/stdlib/uri/0/generic.rbs +1108 -0
  454. data/stdlib/uri/0/http.rbs +104 -0
  455. data/stdlib/uri/0/https.rbs +14 -0
  456. data/stdlib/uri/0/ldap.rbs +230 -0
  457. data/stdlib/uri/0/ldaps.rbs +14 -0
  458. data/stdlib/uri/0/mailto.rbs +92 -0
  459. data/stdlib/uri/0/rfc2396_parser.rbs +189 -0
  460. data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
  461. data/stdlib/uri/0/ws.rbs +13 -0
  462. data/stdlib/uri/0/wss.rbs +9 -0
  463. data/stdlib/yaml/0/manifest.yaml +2 -0
  464. data/stdlib/yaml/0/yaml.rbs +1 -0
  465. data/stdlib/zlib/0/buf_error.rbs +10 -0
  466. data/stdlib/zlib/0/data_error.rbs +10 -0
  467. data/stdlib/zlib/0/deflate.rbs +210 -0
  468. data/stdlib/zlib/0/error.rbs +20 -0
  469. data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
  470. data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
  471. data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
  472. data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
  473. data/stdlib/zlib/0/gzip_file.rbs +156 -0
  474. data/stdlib/zlib/0/gzip_reader.rbs +293 -0
  475. data/stdlib/zlib/0/gzip_writer.rbs +166 -0
  476. data/stdlib/zlib/0/inflate.rbs +180 -0
  477. data/stdlib/zlib/0/mem_error.rbs +10 -0
  478. data/stdlib/zlib/0/need_dict.rbs +13 -0
  479. data/stdlib/zlib/0/stream_end.rbs +11 -0
  480. data/stdlib/zlib/0/stream_error.rbs +11 -0
  481. data/stdlib/zlib/0/version_error.rbs +11 -0
  482. data/stdlib/zlib/0/zlib.rbs +449 -0
  483. data/stdlib/zlib/0/zstream.rbs +200 -0
  484. metadata +532 -0
@@ -0,0 +1,167 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module Test
5
+ class Tester
6
+ attr_reader :env
7
+ attr_reader :targets
8
+ attr_reader :instance_testers
9
+ attr_reader :singleton_testers
10
+
11
+ def initialize(env:)
12
+ @env = env
13
+ @targets = []
14
+ @instance_testers = {}
15
+ @singleton_testers = {}
16
+ end
17
+
18
+ def factory
19
+ @factory ||= Factory.new
20
+ end
21
+
22
+ def builder
23
+ @builder ||= DefinitionBuilder.new(env: env)
24
+ end
25
+
26
+ def skip_method?(type_name, method)
27
+ if method.implemented_in == type_name
28
+ if method.annotations.any? {|a| a.string == "rbs:test:skip" }
29
+ :skip
30
+ else
31
+ false
32
+ end
33
+ else
34
+ if method.annotations.any? {|a| a.string == "rbs:test:target" }
35
+ false
36
+ else
37
+ :implemented_in
38
+ end
39
+ end
40
+ end
41
+
42
+ def install!(klass, sample_size:, unchecked_classes:)
43
+ RBS.logger.info { "Installing runtime type checker in #{klass}..." }
44
+
45
+ type_name = factory.type_name(klass.name).absolute!
46
+
47
+ builder.build_instance(type_name).tap do |definition|
48
+ instance_key = new_key(type_name, "InstanceChecker")
49
+ tester, set = instance_testers[klass] ||= [
50
+ MethodCallTester.new(klass, builder, definition, kind: :instance, sample_size: sample_size, unchecked_classes: unchecked_classes),
51
+ Set[]
52
+ ]
53
+ Observer.register(instance_key, tester)
54
+
55
+ definition.methods.each do |name, method|
56
+ if reason = skip_method?(type_name, method)
57
+ unless reason == :implemented_in
58
+ RBS.logger.info { "Skipping ##{name} because of `#{reason}`..." }
59
+ end
60
+ else
61
+ if !set.include?(name) && (
62
+ name == :initialize ||
63
+ klass.instance_methods(false).include?(name) ||
64
+ klass.private_instance_methods(false).include?(name))
65
+ RBS.logger.info { "Setting up method hook in ##{name}..." }
66
+ Hook.hook_instance_method klass, name, key: instance_key
67
+ set << name
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ builder.build_singleton(type_name).tap do |definition|
74
+ singleton_key = new_key(type_name, "SingletonChecker")
75
+ tester, set = singleton_testers[klass] ||= [
76
+ MethodCallTester.new(klass.singleton_class, builder, definition, kind: :singleton, sample_size: sample_size, unchecked_classes: unchecked_classes),
77
+ Set[]
78
+ ]
79
+ Observer.register(singleton_key, tester)
80
+
81
+ definition.methods.each do |name, method|
82
+ if reason = skip_method?(type_name, method)
83
+ unless reason == :implemented_in
84
+ RBS.logger.info { "Skipping .#{name} because of `#{reason}`..." }
85
+ end
86
+ else
87
+ if klass.methods(false).include?(name) && !set.include?(name)
88
+ RBS.logger.info { "Setting up method hook in .#{name}..." }
89
+ Hook.hook_singleton_method klass, name, key: singleton_key
90
+ set << name
91
+ end
92
+ end
93
+ end
94
+ end
95
+
96
+ targets << klass
97
+ end
98
+
99
+ def new_key(type_name, prefix)
100
+ "#{prefix}__#{type_name}__#{SecureRandom.hex(10)}"
101
+ end
102
+
103
+ class TypeError < Exception
104
+ attr_reader :errors
105
+
106
+ def initialize(errors)
107
+ @errors = errors
108
+
109
+ super "TypeError: #{errors.map {|e| Errors.to_string(e) }.join(", ")}"
110
+ end
111
+ end
112
+
113
+ class MethodCallTester
114
+ attr_reader :self_class
115
+ attr_reader :definition
116
+ attr_reader :builder
117
+ attr_reader :kind
118
+ attr_reader :sample_size
119
+ attr_reader :unchecked_classes
120
+
121
+ def initialize(self_class, builder, definition, kind:, sample_size:, unchecked_classes:)
122
+ @self_class = self_class
123
+ @definition = definition
124
+ @builder = builder
125
+ @kind = kind
126
+ @sample_size = sample_size
127
+ @unchecked_classes = unchecked_classes
128
+ end
129
+
130
+ def env
131
+ builder.env
132
+ end
133
+
134
+ def check
135
+ @check ||= TypeCheck.new(self_class: self_class, builder: builder, sample_size: sample_size, unchecked_classes: unchecked_classes)
136
+ end
137
+
138
+ def format_method_name(name)
139
+ case kind
140
+ when :instance
141
+ "##{name}"
142
+ when :singleton
143
+ ".#{name}"
144
+ end
145
+ end
146
+
147
+ def call(receiver, trace)
148
+ method_name = trace.method_name
149
+ method = definition.methods[method_name]
150
+ if method
151
+ RBS.logger.debug { "Type checking `#{self_class}#{format_method_name(method_name)}`..."}
152
+ errors = check.overloaded_call(method, method_name, trace, errors: [])
153
+
154
+ if errors.empty?
155
+ RBS.logger.debug { "No type error detected 👏" }
156
+ else
157
+ RBS.logger.debug { "Detected type error 🚨" }
158
+ raise TypeError.new(errors)
159
+ end
160
+ else
161
+ RBS.logger.error { "Type checking `#{self_class}#{method_name}` call but no method found in definition" }
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,435 @@
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
+ val.is_a?(TrueClass) || val.is_a?(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
+ unless args == type.args
268
+ type = Types::ClassInstance.new(name: type.name, args: args, location: type.location)
269
+ end
270
+ end
271
+
272
+ case
273
+ when klass == ::Array
274
+ Test.call(val, IS_AP, klass) && each_sample(val).all? {|v| value(v, type.args[0]) }
275
+ when klass == ::Hash
276
+ Test.call(val, IS_AP, klass) && each_sample(val.keys).all? do |key|
277
+ value(key, type.args[0]) && value(val[key], type.args[1])
278
+ end
279
+ when klass == ::Range
280
+ Test.call(val, IS_AP, klass) && value(val.begin, type.args[0]) && value(val.end, type.args[0])
281
+ when klass == ::Enumerator
282
+ if Test.call(val, IS_AP, klass)
283
+ case val.size
284
+ when Float::INFINITY
285
+ values = []
286
+ ret = self
287
+ val.lazy.take(10).each do |*args|
288
+ values << args
289
+ nil
290
+ end
291
+ else
292
+ values = []
293
+ ret = val.each do |*args|
294
+ values << args
295
+ nil
296
+ end
297
+ end
298
+
299
+ value_check = values.empty? || each_sample(values).all? do |v|
300
+ if v.size == 1
301
+ # Only one block argument.
302
+ value(v[0], type.args[0]) || value(v, type.args[0])
303
+ else
304
+ value(v, type.args[0])
305
+ end
306
+ end
307
+
308
+ return_check = if ret.equal?(self)
309
+ type.args[1].is_a?(Types::Bases::Bottom)
310
+ else
311
+ value(ret, type.args[1])
312
+ end
313
+
314
+ value_check && return_check
315
+ end
316
+ else
317
+ Test.call(val, IS_AP, klass)
318
+ end
319
+ when Types::ClassSingleton
320
+ klass = get_class(type.name) or return false
321
+ singleton_class = begin
322
+ klass.singleton_class
323
+ rescue TypeError
324
+ return false
325
+ end
326
+ val.is_a?(singleton_class)
327
+ when Types::Interface
328
+ if (definition = builder.build_interface(type.name.absolute!))
329
+ definition.methods.each.all? do |method_name, method|
330
+ next false unless Test.call(val, RESPOND_TOP, method_name)
331
+
332
+ meth = Test.call(val, METHOD, method_name)
333
+ method.defs.all? do |type_def|
334
+ type_def.member.overloads.all? do |overload|
335
+ callable_argument?(meth.parameters, overload.method_type)
336
+ end
337
+ end
338
+ end
339
+ end
340
+ when Types::Variable
341
+ true
342
+ when Types::Literal
343
+ type.literal == val
344
+ when Types::Union
345
+ type.types.any? {|type| value(val, type) }
346
+ when Types::Intersection
347
+ type.types.all? {|type| value(val, type) }
348
+ when Types::Optional
349
+ Test.call(val, IS_AP, ::NilClass) || value(val, type.type)
350
+ when Types::Alias
351
+ value(val, builder.expand_alias2(type.name.absolute!, type.args))
352
+ when Types::Tuple
353
+ Test.call(val, IS_AP, ::Array) &&
354
+ type.types.map.with_index {|ty, index| value(val[index], ty) }.all?
355
+ when Types::Record
356
+ Test::call(val, IS_AP, ::Hash) &&
357
+ type.fields.map {|key, type| value(val[key], type) }.all?
358
+ when Types::Proc
359
+ Test::call(val, IS_AP, ::Proc)
360
+ else
361
+ false
362
+ end
363
+ end
364
+
365
+ private
366
+
367
+ def callable_argument?(parameters, method_type)
368
+ fun = method_type.type
369
+ take_has_rest = !!parameters.find { |(op, _)| op == :rest }
370
+
371
+ return true if fun.is_a?(Types::UntypedFunction)
372
+
373
+ fun.required_positionals.each do
374
+ op, _ = parameters.first
375
+ return false if op.nil? || op == :keyreq || op == :key || op == :keyrest
376
+ parameters.shift if op == :req || op == :opt
377
+ end
378
+
379
+ fun.optional_positionals.each do
380
+ op, _ = parameters.first
381
+ return false if op.nil? || op == :req || op == :keyreq || op == :key || op == :keyrest
382
+ parameters.shift if op == :opt
383
+ end
384
+
385
+ if fun.rest_positionals
386
+ op, _ = parameters.shift
387
+ return false if op.nil? || op != :rest
388
+ end
389
+
390
+ fun.trailing_positionals.each do
391
+ op, _ = parameters.first
392
+ return false if !take_has_rest && (op.nil? || op == :keyreq || op == :key || op == :keyrest)
393
+ index = parameters.find_index { |(op, _)| op == :req }
394
+ parameters.delete_at(index) if index
395
+ end
396
+
397
+ if fun.has_keyword?
398
+ return false if !take_has_rest && parameters.empty?
399
+
400
+ fun.required_keywords.each do |name, _|
401
+ return false if !take_has_rest && parameters.empty?
402
+ index = parameters.find_index { |(op, n)| (op == :keyreq || op == :key) && n == name }
403
+ parameters.delete_at(index) if index
404
+ end
405
+
406
+ if !fun.optional_keywords.empty?
407
+ fun.optional_keywords.each do |name, _|
408
+ return false if !take_has_rest && parameters.empty?
409
+ index = parameters.find_index { |(op, n)| op == :key && n == name }
410
+ parameters.delete_at(index) if index
411
+ end
412
+ op, _ = parameters.first
413
+ return false if op == :req
414
+ end
415
+
416
+ if fun.rest_keywords
417
+ op, _ = parameters.first
418
+ return false if (!take_has_rest && op.nil?)
419
+ # f(a) allows (Integer, a: Integer)
420
+ return false if op == :req && fun.required_keywords.empty?
421
+ end
422
+
423
+ op, _ = parameters.first
424
+ return true if (op == :req || op == :opt) && parameters.length == 1
425
+ end
426
+
427
+ # rest required arguments
428
+ op, _ = parameters.first
429
+ return false if op == :req || op == :keyreq
430
+
431
+ true
432
+ end
433
+ end
434
+ end
435
+ 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