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
data/Rakefile ADDED
@@ -0,0 +1,869 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+ require "rbconfig"
4
+ require 'rake/extensiontask'
5
+
6
+ $LOAD_PATH << File.join(__dir__, "test")
7
+
8
+ ruby = ENV["RUBY"] || RbConfig.ruby
9
+ rbs = File.join(__dir__, "exe/rbs")
10
+ bin = File.join(__dir__, "bin")
11
+
12
+ Rake::ExtensionTask.new("rbs_extension")
13
+
14
+ compile_task = Rake::Task[:compile]
15
+
16
+ task :setup_extconf_compile_commands_json do
17
+ ENV["COMPILE_COMMANDS_JSON"] = "1"
18
+ end
19
+
20
+ compile_task.prerequisites.unshift(:setup_extconf_compile_commands_json)
21
+
22
+ test_config = lambda do |t|
23
+ t.libs << "test"
24
+ t.libs << "lib"
25
+ t.test_files = FileList["test/**/*_test.rb"].reject do |path|
26
+ path =~ %r{test/stdlib/}
27
+ end
28
+ if defined?(RubyMemcheck)
29
+ if t.is_a?(RubyMemcheck::TestTask)
30
+ t.verbose = true
31
+ t.options = '-v'
32
+ end
33
+ end
34
+ end
35
+
36
+ if RUBY_ENGINE == "jruby"
37
+ # JRuby runs the parser in WebAssembly instead of the C extension, so there is
38
+ # nothing to compile. The wasm runtime must be assembled first with
39
+ # `rake wasm:jruby_setup` (which needs CRuby + the WASI SDK).
40
+ Rake::TestTask.new(:test, &test_config)
41
+ else
42
+ Rake::TestTask.new(test: :compile, &test_config)
43
+ end
44
+
45
+ multitask :default => [:test, :stdlib_test, :typecheck_test, :rubocop, :validate, :test_doc]
46
+
47
+ task :lexer do
48
+ sh "re2c -W --no-generation-date -o src/lexer.c src/lexer.re"
49
+ sh "clang-format -i -style=file src/lexer.c"
50
+ end
51
+
52
+ task :confirm_lexer => :lexer do
53
+ puts "Testing if lexer.c is updated with respect to lexer.re"
54
+ sh "git diff --exit-code src/lexer.c"
55
+ end
56
+
57
+ task :confirm_templates => :templates do
58
+ puts "Testing if generated code under include and src is updated with respect to templates"
59
+ sh "git diff --exit-code -- include src"
60
+ end
61
+
62
+ # Task to format C code using clang-format
63
+ namespace :format do
64
+ dirs = ["src", "ext", "include"]
65
+
66
+ # Find all C source and header files
67
+ files = `find #{dirs.join(" ")} -type f \\( -name "*.c" -o -name "*.h" \\)`.split("\n")
68
+
69
+ desc "Format C source files using clang-format"
70
+ task :c do
71
+ puts "Formatting C files..."
72
+
73
+ # Check if clang-format is installed
74
+ unless system("which clang-format > /dev/null 2>&1")
75
+ abort "Error: clang-format not found. Please install clang-format first."
76
+ end
77
+
78
+ if files.empty?
79
+ puts "No C files found to format"
80
+ next
81
+ end
82
+
83
+ puts "Found #{files.length} files to format (excluding generated files)"
84
+
85
+ exit_status = 0
86
+ files.each do |file|
87
+ puts "Formatting #{file}"
88
+ unless system("clang-format -i -style=file #{file}")
89
+ puts "❌ Error formatting #{file}"
90
+ exit_status = 1
91
+ end
92
+ end
93
+
94
+ exit exit_status unless exit_status == 0
95
+ puts "✅ All files formatted successfully"
96
+ end
97
+
98
+ desc "Check if C source files are properly formatted"
99
+ task :c_check do
100
+ puts "Checking C file formatting..."
101
+
102
+ # Check if clang-format is installed
103
+ unless system("which clang-format > /dev/null 2>&1")
104
+ abort "Error: clang-format not found. Please install clang-format first."
105
+ end
106
+
107
+ if files.empty?
108
+ puts "No C files found to check"
109
+ next
110
+ end
111
+
112
+ puts "Found #{files.length} files to check (excluding generated files)"
113
+
114
+ needs_format = false
115
+ files.each do |file|
116
+ formatted = `clang-format -style=file #{file}`
117
+ original = File.read(file)
118
+
119
+ if formatted != original
120
+ puts "❌ #{file} needs formatting"
121
+ puts "Diff:"
122
+ # Save formatted version to temp file and run diff
123
+ temp_file = "#{file}.formatted"
124
+ File.write(temp_file, formatted)
125
+ system("diff -u #{file} #{temp_file}")
126
+ File.unlink(temp_file)
127
+ needs_format = true
128
+ end
129
+ end
130
+
131
+ if needs_format
132
+ warn "Some files need formatting. Run 'rake format:c' to format them."
133
+ exit 1
134
+ else
135
+ puts "✅ All files are properly formatted"
136
+ end
137
+ end
138
+ end
139
+
140
+ rule ".c" => ".re" do |t|
141
+ puts "⚠️⚠️⚠️ #{t.name} is older than #{t.source}. You may need to run `rake lexer` ⚠️⚠️⚠️"
142
+ end
143
+
144
+ rule %r{^src/(.*)\.c} => 'templates/%X.c.erb' do |t|
145
+ puts "⚠️⚠️⚠️ #{t.name} is older than #{t.source}. You may need to run `rake templates` ⚠️⚠️⚠️"
146
+ end
147
+ rule %r{^include/(.*)\.c} => 'templates/%X.c.erb' do |t|
148
+ puts "⚠️⚠️⚠️ #{t.name} is older than #{t.source}. You may need to run `rake templates` ⚠️⚠️⚠️"
149
+ end
150
+
151
+ task :annotate do
152
+ sh "bin/generate_docs.sh"
153
+ end
154
+
155
+ task :confirm_annotation do
156
+ puts "Testing if RBS docs are updated with respect to RDoc"
157
+ sh "git diff --exit-code core stdlib"
158
+ end
159
+
160
+ task :templates do
161
+ sh "#{ruby} templates/template.rb ext/rbs_extension/ast_translation.h"
162
+ sh "#{ruby} templates/template.rb ext/rbs_extension/ast_translation.c"
163
+
164
+ sh "#{ruby} templates/template.rb ext/rbs_extension/class_constants.h"
165
+ sh "#{ruby} templates/template.rb ext/rbs_extension/class_constants.c"
166
+
167
+ sh "#{ruby} templates/template.rb include/rbs/ast.h"
168
+ sh "#{ruby} templates/template.rb src/ast.c"
169
+
170
+ sh "#{ruby} templates/template.rb include/rbs/serialize.h"
171
+ sh "#{ruby} templates/template.rb src/serialize.c"
172
+ sh "#{ruby} templates/template.rb lib/rbs/wasm/serialization_schema.rb"
173
+
174
+ # Format the generated files
175
+ Rake::Task["format:c"].invoke
176
+ end
177
+
178
+ task :compile => "ext/rbs_extension/class_constants.h"
179
+ task :compile => "ext/rbs_extension/class_constants.c"
180
+ task :compile => "src/lexer.c"
181
+
182
+ task :test_doc do
183
+ files = Dir.chdir(File.expand_path('..', __FILE__)) do
184
+ `git ls-files -z`.split("\x0").select do |file| Pathname(file).extname == ".md" end
185
+ end
186
+
187
+ sh "#{ruby} #{__dir__}/bin/run_in_md.rb #{files.join(" ")}"
188
+ end
189
+
190
+ task :validate => :compile do
191
+ require 'yaml'
192
+
193
+ sh "#{ruby} #{rbs} validate"
194
+
195
+ libs = FileList["stdlib/*"].map {|path| File.basename(path).to_s }
196
+
197
+ # Skip RBS validation because Ruby CI runs without rubygems
198
+ case skip_rbs_validation = ENV["SKIP_RBS_VALIDATION"]
199
+ when nil
200
+ begin
201
+ Gem::Specification.find_by_name("rbs")
202
+ libs << "rbs"
203
+ rescue Gem::MissingSpecError
204
+ STDERR.puts "🚨🚨🚨🚨 Skipping `rbs` gem because it's not found"
205
+ end
206
+ when "true"
207
+ # Skip
208
+ else
209
+ STDERR.puts "🚨🚨🚨🚨 SKIP_RBS_VALIDATION is expected to be `true` or unset, given `#{skip_rbs_validation}` 🚨🚨🚨🚨"
210
+ libs << "rbs"
211
+ end
212
+
213
+ libs.delete("bigdecimal-math") or raise
214
+ libs.delete("bigdecimal") or raise
215
+
216
+ libs.each do |lib|
217
+ args = ["-r", lib]
218
+
219
+ if lib == "rbs"
220
+ args << "-r" << "prism"
221
+ args << "-r" << "logger"
222
+ end
223
+
224
+ sh "#{ruby} #{rbs} #{args.join(' ')} validate"
225
+ end
226
+ end
227
+
228
+ FileList["test/stdlib/**/*_test.rb"].each do |test|
229
+ task test => :compile do
230
+ sh "#{ruby} -Ilib #{bin}/test_runner.rb #{test}"
231
+ end
232
+ end
233
+
234
+ task :stdlib_test => :compile do
235
+ test_files = FileList["test/stdlib/**/*_test.rb"].reject do |path|
236
+ path =~ %r{Ractor} || path =~ %r{Encoding} || path =~ %r{CGI-escape_test}
237
+ end
238
+
239
+ if ENV["RANDOMIZE_STDLIB_TEST_ORDER"] == "true"
240
+ test_files.shuffle!
241
+ end
242
+
243
+ sh "#{ruby} -Ilib #{bin}/test_runner.rb #{test_files.join(' ')}"
244
+ # TODO: Ractor tests need to be run in a separate process
245
+ sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/CGI-escape_test.rb"
246
+ sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/Ractor_test.rb"
247
+ sh "#{ruby} -Ilib #{bin}/test_runner.rb test/stdlib/Encoding_test.rb"
248
+ end
249
+
250
+ task :typecheck_test => :compile do
251
+ FileList["test/typecheck/*"].each do |test|
252
+ Dir.chdir(test) do
253
+ expectations = File.join(test, "steep_expectations.yml")
254
+ if File.exist?(expectations)
255
+ sh "steep check --with_expectations"
256
+ else
257
+ sh "steep check"
258
+ end
259
+ end
260
+ end
261
+ end
262
+
263
+ task :raap => :compile do
264
+ sh "ruby test/raap/core.rb"
265
+ sh "ruby test/raap/digest.rb"
266
+ sh "ruby test/raap/openssl.rb"
267
+ end
268
+
269
+ task :rubocop do
270
+ format = if ENV["CI"]
271
+ "github"
272
+ else
273
+ "progress"
274
+ end
275
+
276
+ sh "rubocop --parallel --format #{format}"
277
+ end
278
+
279
+ namespace :generate do
280
+ desc "Generate a test file for a stdlib class signatures"
281
+ task :stdlib_test, [:class] do |_task, args|
282
+ klass = args.fetch(:class) do
283
+ raise "Class name is necessary. e.g. rake 'generate:stdlib_test[String]'"
284
+ end
285
+
286
+ require "erb"
287
+ require "rbs"
288
+
289
+ class TestTarget
290
+ def initialize(klass)
291
+ @type_name = RBS::Namespace.parse(klass).to_type_name
292
+ end
293
+
294
+ def path
295
+ Pathname(ENV['RBS_GENERATE_TEST_PATH'] || "test/stdlib/#{file_name}_test.rb")
296
+ end
297
+
298
+ def file_name
299
+ @type_name.to_s.gsub(/\A::/, '').gsub(/::/, '_')
300
+ end
301
+
302
+ def to_s
303
+ @type_name.to_s
304
+ end
305
+
306
+ def absolute_type_name
307
+ @absolute_type_name ||= @type_name.absolute!
308
+ end
309
+ end
310
+
311
+ target = TestTarget.new(klass)
312
+ path = target.path
313
+ raise "#{path} already exists!" if path.exist?
314
+
315
+ class TestTemplateBuilder
316
+ attr_reader :target, :env
317
+
318
+ def initialize(target)
319
+ @target = target
320
+
321
+ loader = RBS::EnvironmentLoader.new
322
+ Dir['stdlib/*'].each do |lib|
323
+ next if lib.end_with?('builtin')
324
+
325
+ loader.add(library: File.basename(lib))
326
+ end
327
+ @env = RBS::Environment.from_loader(loader).resolve_type_names
328
+ end
329
+
330
+ def call
331
+ ERB.new(<<~ERB, trim_mode: "-").result(binding)
332
+ require_relative "test_helper"
333
+
334
+ <%- unless class_methods.empty? -%>
335
+ class <%= target %>SingletonTest < Test::Unit::TestCase
336
+ include TestHelper
337
+
338
+ # library "logger", "securerandom" # Declare library signatures to load
339
+ testing "singleton(::<%= target %>)"
340
+
341
+ <%- class_methods.each do |method_name, definition| -%>
342
+ def test_<%= test_name_for(method_name) %>
343
+ <%- definition.method_types.each do |method_type| -%>
344
+ assert_send_type "<%= method_type %>",
345
+ <%= target %>, :<%= method_name %>
346
+ <%- end -%>
347
+ end
348
+
349
+ <%- end -%>
350
+ end
351
+ <%- end -%>
352
+
353
+ <%- unless instance_methods.empty? -%>
354
+ class <%= target %>Test < Test::Unit::TestCase
355
+ include TestHelper
356
+
357
+ # library "logger", "securerandom" # Declare library signatures to load
358
+ testing "::<%= target %>"
359
+
360
+ <%- instance_methods.each do |method_name, definition| -%>
361
+ def test_<%= test_name_for(method_name) %>
362
+ <%- definition.method_types.each do |method_type| -%>
363
+ assert_send_type "<%= method_type %>",
364
+ <%= target %>.new, :<%= method_name %>
365
+ <%- end -%>
366
+ end
367
+
368
+ <%- end -%>
369
+ end
370
+ <%- end -%>
371
+ ERB
372
+ end
373
+
374
+ private
375
+
376
+ def test_name_for(method_name)
377
+ {
378
+ :== => 'double_equal',
379
+ :!= => 'not_equal',
380
+ :=== => 'triple_equal',
381
+ :[] => 'square_bracket',
382
+ :[]= => 'square_bracket_assign',
383
+ :> => 'greater_than',
384
+ :< => 'less_than',
385
+ :>= => 'greater_than_equal_to',
386
+ :<= => 'less_than_equal_to',
387
+ :<=> => 'spaceship',
388
+ :+ => 'plus',
389
+ :- => 'minus',
390
+ :* => 'multiply',
391
+ :/ => 'divide',
392
+ :** => 'power',
393
+ :% => 'modulus',
394
+ :& => 'and',
395
+ :| => 'or',
396
+ :^ => 'xor',
397
+ :>> => 'right_shift',
398
+ :<< => 'left_shift',
399
+ :=~ => 'pattern_match',
400
+ :!~ => 'does_not_match',
401
+ :~ => 'tilde'
402
+ }.fetch(method_name, method_name)
403
+ end
404
+
405
+ def class_methods
406
+ @class_methods ||= RBS::DefinitionBuilder.new(env: env).build_singleton(target.absolute_type_name).methods.select {|_, definition|
407
+ definition.implemented_in == target.absolute_type_name
408
+ }
409
+ end
410
+
411
+ def instance_methods
412
+ @instance_methods ||= RBS::DefinitionBuilder.new(env: env).build_instance(target.absolute_type_name).methods.select {|_, definition|
413
+ definition.implemented_in == target.absolute_type_name
414
+ }
415
+ end
416
+ end
417
+
418
+ path.write TestTemplateBuilder.new(target).call
419
+
420
+ puts "Created: #{path}"
421
+ end
422
+ end
423
+
424
+ task :test_generate_stdlib do
425
+ sh "RBS_GENERATE_TEST_PATH=/tmp/Array_test.rb rake 'generate:stdlib_test[Array]'"
426
+ sh "ruby -c /tmp/Array_test.rb"
427
+ sh "RBS_GENERATE_TEST_PATH=/tmp/Thread_Mutex_test.rb rake 'generate:stdlib_test[Thread::Mutex]'"
428
+ sh "ruby -c /tmp/Thread_Mutex_test.rb"
429
+ end
430
+
431
+ Rake::Task[:release].enhance do
432
+ Rake::Task[:"release:note"].invoke
433
+ end
434
+
435
+ namespace :release do
436
+ desc "Explain the post-release steps automatically"
437
+ task :note do
438
+ version = Gem::Version.new(RBS::VERSION)
439
+ major, minor, patch, *_ = RBS::VERSION.split(".")
440
+ major = major.to_i
441
+ minor = minor.to_i
442
+ patch = patch.to_i
443
+
444
+ puts "🎉🎉🎉🎉 Congratulations for **#{version}** release! 🎉🎉🎉🎉"
445
+ puts
446
+ puts "There are a few things left to complete the release. 💪"
447
+ puts
448
+
449
+ if patch == 0 || version.prerelease?
450
+ puts "* [ ] Update release note: https://github.com/ruby/rbs/wiki/Release-Note-#{major}.#{minor}"
451
+ end
452
+
453
+ if patch == 0 && !version.prerelease?
454
+ puts "* [ ] Delete `RBS XYZ is the latest version of...` from release note: https://github.com/ruby/rbs/wiki/Release-Note-#{major}.#{minor}"
455
+ end
456
+
457
+ puts "* [ ] Publish a release at GitHub"
458
+ puts "* [ ] Make some announcements on Twitter/Mustdon/Slack/???"
459
+
460
+ puts
461
+ puts
462
+
463
+ puts "✏️ Making a draft release on GitHub..."
464
+
465
+ content = File.read(File.join(__dir__, "CHANGELOG.md"))
466
+ changelog = content.scan(/^## \d.*?(?=^## \d)/m)[0]
467
+ changelog = changelog.sub(/^.*\n^.*\n/, "").rstrip
468
+
469
+ notes = <<NOTES
470
+ [Release note](https://github.com/ruby/rbs/wiki/Release-Note-#{major}.#{minor})
471
+
472
+ #{changelog}
473
+ NOTES
474
+
475
+ command = [
476
+ "gh",
477
+ "release",
478
+ "create",
479
+ "--draft",
480
+ "v#{RBS::VERSION}",
481
+ "--title=#{RBS::VERSION}",
482
+ "--notes=#{notes}"
483
+ ]
484
+
485
+ if version.prerelease?
486
+ command << "--prerelease"
487
+ end
488
+
489
+ require "open3"
490
+ output, status = Open3.capture2(*command)
491
+ if status.success?
492
+ puts " >> Done! Open #{output.chomp} and publish the release!"
493
+ end
494
+ end
495
+ end
496
+
497
+
498
+ desc "Generate changelog template from GH pull requests"
499
+ task :changelog do
500
+ major, minor, patch, _pre = RBS::VERSION.split(".", 4)
501
+ major = major.to_i
502
+ minor = minor.to_i
503
+ patch = patch.to_i
504
+
505
+ if patch == 0
506
+ milestone = "RBS #{major}.#{minor}"
507
+ else
508
+ milestone = "RBS #{major}.#{minor}.x"
509
+ end
510
+
511
+ puts "🔍 Finding pull requests that is associated to milestone `#{milestone}`..."
512
+
513
+ command = [
514
+ "gh",
515
+ "pr",
516
+ "list",
517
+ "--limit=10000",
518
+ "--json",
519
+ "url,title,number",
520
+ "--search" ,
521
+ "milestone:\"#{milestone}\" is:merged sort:updated-desc -label:Released"
522
+ ]
523
+
524
+ require "open3"
525
+ output, status = Open3.capture2(*command)
526
+ raise status.inspect unless status.success?
527
+
528
+ require "json"
529
+ json = JSON.parse(output, symbolize_names: true)
530
+
531
+ unless json.empty?
532
+ puts
533
+ json.each do |line|
534
+ puts "* #{line[:title]} ([##{line[:number]}](#{line[:url]}))"
535
+ end
536
+ else
537
+ puts " (🤑 There is no *unreleased* pull request associated to the milestone.)"
538
+ end
539
+ end
540
+
541
+ desc "Compile extension without C23 extensions"
542
+ task :compile_c99 do
543
+ ENV["TEST_NO_C23"] = "true"
544
+ Rake::Task[:"compile"].invoke
545
+ ensure
546
+ ENV.delete("TEST_NO_C23")
547
+ end
548
+
549
+ task :prepare_bench do
550
+ ENV.delete("DEBUG")
551
+ Rake::Task[:"clobber"].invoke
552
+ Rake::Task[:"templates"].invoke
553
+ Rake::Task[:"compile"].invoke
554
+ end
555
+
556
+ task :prepare_profiling do
557
+ ENV["DEBUG"] = "1"
558
+ Rake::Task[:"clobber"].invoke
559
+ Rake::Task[:"templates"].invoke
560
+ Rake::Task[:"compile"].invoke
561
+ end
562
+
563
+ namespace :wasm do
564
+ WASM_DIR = File.expand_path("wasm", __dir__)
565
+ WASM_OUTPUT = File.join(WASM_DIR, "rbs_parser.wasm")
566
+
567
+ # The parser under src/ is plain, self-contained C with no dependency on the
568
+ # Ruby C API, so it can be compiled to WebAssembly as-is. The only extra
569
+ # translation unit is the entry-point shim under wasm/.
570
+ def wasm_source_files
571
+ Dir.glob(File.join(__dir__, "src/**/*.c")).sort + [File.join(WASM_DIR, "rbs_wasm.c")]
572
+ end
573
+
574
+ # Locate the clang shipped with the WASI SDK.
575
+ #
576
+ # The system clang can target wasm32, but the WASI SDK additionally provides
577
+ # the wasi-libc sysroot and the wasm32 compiler-rt builtins that the link
578
+ # step needs, so we require it explicitly.
579
+ def wasi_clang
580
+ sdk = ENV["WASI_SDK_PATH"]
581
+ if sdk.nil? || sdk.empty?
582
+ raise <<~MSG
583
+ WASI_SDK_PATH is not set.
584
+
585
+ Install the WASI SDK from https://github.com/WebAssembly/wasi-sdk/releases
586
+ and point WASI_SDK_PATH at the extracted directory, for example:
587
+
588
+ export WASI_SDK_PATH=/opt/wasi-sdk
589
+ rake wasm:build
590
+ MSG
591
+ end
592
+
593
+ clang = File.join(sdk, "bin", "clang")
594
+ raise "clang not found at #{clang} (is WASI_SDK_PATH correct?)" unless File.executable?(clang)
595
+
596
+ clang
597
+ end
598
+
599
+ desc "Build the RBS parser as a WebAssembly module (requires WASI_SDK_PATH)"
600
+ task :build do
601
+ mkdir_p WASM_DIR
602
+ sh wasi_clang,
603
+ "--target=wasm32-wasip1",
604
+ # No `main`; the host calls `_initialize` and then the exported functions.
605
+ "-mexec-model=reactor",
606
+ "-std=gnu11",
607
+ "-O2",
608
+ "-Wno-unused-parameter",
609
+ "-I#{File.join(__dir__, "include")}",
610
+ "-o", WASM_OUTPUT,
611
+ *wasm_source_files
612
+ puts "Built #{WASM_OUTPUT}"
613
+ end
614
+
615
+ desc "Build and smoke-test the WebAssembly module (requires wasmtime)"
616
+ task :check => :build do
617
+ wasmtime = ENV["WASMTIME"] || "wasmtime"
618
+
619
+ # `rbs_wasm_selftest` parses a small fixed signature and returns 1 on
620
+ # success. `--invoke` prints the return value to stdout.
621
+ output = IO.popen([wasmtime, "run", "--invoke", "rbs_wasm_selftest", WASM_OUTPUT], err: File::NULL, &:read).to_s.strip
622
+
623
+ if output == "1"
624
+ puts "WebAssembly selftest passed."
625
+ else
626
+ raise "WebAssembly selftest failed: rbs_wasm_selftest returned #{output.inspect} (expected \"1\")"
627
+ end
628
+ end
629
+
630
+ # Where the runtime looks for the module and jars by default (see
631
+ # RBS::WASM::Runtime). These are build artifacts, bundled into the JRuby gem.
632
+ JRUBY_WASM_DIR = File.expand_path("lib/rbs/wasm", __dir__)
633
+ CHICORY_VERSION = ENV.fetch("CHICORY_VERSION", "1.7.5")
634
+ # `compiler` is Chicory's AOT compiler (wasm -> JVM bytecode); the asm* jars
635
+ # are the ow2 ASM libraries it depends on. Keep ASM_VERSION in sync with what
636
+ # the pinned Chicory release declares.
637
+ CHICORY_JARS = %w[wasm runtime log wasi compiler].freeze
638
+ ASM_VERSION = ENV.fetch("ASM_VERSION", "9.9.1")
639
+ ASM_JARS = %w[asm asm-tree asm-util asm-commons asm-analysis].freeze
640
+
641
+ desc "Download the Chicory and ASM jars the JRuby runtime needs into lib/rbs/wasm/jars"
642
+ task :vendor_jars do
643
+ require "open-uri"
644
+ require "fileutils"
645
+
646
+ jars_dir = File.join(JRUBY_WASM_DIR, "jars")
647
+ FileUtils.mkdir_p(jars_dir)
648
+
649
+ downloads = CHICORY_JARS.map { |name| ["#{name}.jar", "https://repo1.maven.org/maven2/com/dylibso/chicory/#{name}/#{CHICORY_VERSION}/#{name}-#{CHICORY_VERSION}.jar"] }
650
+ downloads += ASM_JARS.map { |name| ["#{name}.jar", "https://repo1.maven.org/maven2/org/ow2/asm/#{name}/#{ASM_VERSION}/#{name}-#{ASM_VERSION}.jar"] }
651
+
652
+ downloads.each do |filename, url|
653
+ puts "Downloading #{url}"
654
+ URI.open(url) { |io| File.binwrite(File.join(jars_dir, filename), io.read) } # steep:ignore
655
+ end
656
+
657
+ puts "Vendored Chicory #{CHICORY_VERSION} + ASM #{ASM_VERSION} into #{jars_dir}"
658
+ end
659
+
660
+ desc "Assemble everything the JRuby gem needs: the .wasm and the Chicory jars"
661
+ task :jruby_setup => [:build, :vendor_jars] do
662
+ cp WASM_OUTPUT, File.join(JRUBY_WASM_DIR, "rbs_parser.wasm")
663
+ puts "JRuby runtime is ready under #{JRUBY_WASM_DIR}"
664
+ end
665
+ end
666
+
667
+ namespace :rust do
668
+ namespace :rbs do
669
+ RUST_DIR = File.expand_path("rust", __dir__)
670
+ RBS_VERSION_FILE = File.join(RUST_DIR, "rbs_version")
671
+
672
+ VENDOR_TARGETS = {
673
+ "ruby-rbs-sys" => %w[include src],
674
+ "ruby-rbs" => %w[config.yml],
675
+ }
676
+
677
+ desc "Sync vendored RBS source from the pinned version"
678
+ task :sync do
679
+ unless File.exist?(RBS_VERSION_FILE)
680
+ raise "#{RBS_VERSION_FILE} not found. Run `rake rust:rbs:pin[VERSION]` first."
681
+ end
682
+
683
+ version = File.read(RBS_VERSION_FILE).strip
684
+ raise "#{RBS_VERSION_FILE} is empty" if version.empty?
685
+
686
+ puts "Syncing vendor/rbs/ from #{version}..."
687
+
688
+ VENDOR_TARGETS.each do |crate, entries|
689
+ vendor_dir = File.join(RUST_DIR, crate, "vendor", "rbs")
690
+
691
+ puts " Copying files for #{crate}:"
692
+ chmod_R "u+w", vendor_dir, verbose: false if File.exist?(vendor_dir)
693
+ rm_rf vendor_dir, verbose: false
694
+ mkdir_p vendor_dir, verbose: false
695
+
696
+ entries.each do |entry|
697
+ target = File.join(vendor_dir, entry)
698
+
699
+ # Extract the entry from the pinned git tag using git archive
700
+ IO.popen(["git", "archive", "--format=tar", version, "--", entry], "rb") do |tar|
701
+ IO.popen(["tar", "xf", "-", "-C", vendor_dir], "wb") do |extract|
702
+ IO.copy_stream(tar, extract)
703
+ end
704
+ end
705
+
706
+ raise "Failed to extract #{entry} from #{version}" unless File.exist?(target)
707
+ puts " #{entry}"
708
+ end
709
+
710
+ # Make files read-only to prevent accidental edits
711
+ chmod_R "a-w", vendor_dir, verbose: false
712
+ end
713
+
714
+ puts "📦 Synced vendor/rbs/ from #{version} (read-only)"
715
+ end
716
+
717
+ desc "Pin a specific RBS version for Rust crates (e.g., rake rust:rbs:pin[v4.0.3])"
718
+ task :pin, [:version] do |_t, args|
719
+ version = args[:version] or raise "Usage: rake rust:rbs:pin[VERSION]"
720
+
721
+ # Verify the tag exists
722
+ unless system("git", "rev-parse", "--verify", "#{version}^{commit}", out: File::NULL, err: File::NULL)
723
+ raise "Tag #{version} not found"
724
+ end
725
+
726
+ File.write(RBS_VERSION_FILE, "#{version}\n")
727
+ puts "📌 Pinned RBS version to #{version}"
728
+
729
+ Rake::Task["rust:rbs:sync"].invoke
730
+ end
731
+
732
+ desc "Create symlinks from vendor/rbs/ to the repository root (for development/CI)"
733
+ task :symlink do
734
+ VENDOR_TARGETS.each do |crate, entries|
735
+ vendor_dir = File.join(RUST_DIR, crate, "vendor", "rbs")
736
+
737
+ puts "Setting up symlinks for #{crate}..."
738
+ entries.each do |entry|
739
+ puts " #{entry} -> repository root"
740
+ end
741
+
742
+ chmod_R "u+w", vendor_dir, verbose: false if File.exist?(vendor_dir)
743
+ rm_rf vendor_dir, verbose: false
744
+ mkdir_p vendor_dir, verbose: false
745
+
746
+ entries.each do |entry|
747
+ ln_s File.join("..", "..", "..", "..", entry), File.join(vendor_dir, entry), verbose: false
748
+ end
749
+ end
750
+
751
+ puts "🔗 Symlinked vendor/rbs/ to repository root"
752
+ end
753
+ end
754
+
755
+ namespace :publish do
756
+ def self.prepare_publish_branch(crate_name)
757
+ dry_run = ENV["RBS_RUST_PUBLISH_DRY_RUN"]
758
+
759
+ version_file = File.join(RUST_DIR, "rbs_version")
760
+
761
+ unless File.exist?(version_file)
762
+ raise "#{version_file} not found. Run `rake rust:rbs:pin[VERSION]` first."
763
+ end
764
+
765
+ rbs_version = File.read(version_file).strip
766
+ raise "#{version_file} is empty" if rbs_version.empty?
767
+
768
+ crate_version = File.read(File.join(RUST_DIR, crate_name, "Cargo.toml"))[/^version\s*=\s*"(.+)"/, 1]
769
+ release_branch = "rust/release-#{crate_name}-#{Time.now.strftime('%Y%m%d%H%M%S')}"
770
+
771
+ puts "=" * 60
772
+ puts "Rust crate publish: #{crate_name}#{dry_run ? " (DRY RUN)" : ""}"
773
+ puts "=" * 60
774
+ puts " RBS source version: #{rbs_version}"
775
+ puts " #{crate_name}: #{crate_version} (tag: #{crate_name}-v#{crate_version})"
776
+ puts " Release branch: #{release_branch}"
777
+ puts "=" * 60
778
+
779
+ # Check that vendor dirs contain real files, not symlinks
780
+ entries = VENDOR_TARGETS.fetch(crate_name)
781
+ entries.each do |entry|
782
+ path = File.join(RUST_DIR, crate_name, "vendor", "rbs", entry)
783
+ if File.symlink?(path)
784
+ raise "#{path} is a symlink. Run `rake rust:rbs:sync` first."
785
+ end
786
+ unless File.exist?(path)
787
+ raise "#{path} does not exist. Run `rake rust:rbs:sync` first."
788
+ end
789
+ end
790
+
791
+ # Ensure working tree is clean before publishing
792
+ unless `git status --porcelain`.strip.empty?
793
+ raise "💢 Working tree is dirty. Please commit or stash your changes before publishing."
794
+ end
795
+
796
+ # Create a release branch with vendor files committed
797
+ original_branch = `git rev-parse --abbrev-ref HEAD`.strip
798
+
799
+ sh "git", "checkout", "-b", release_branch, verbose: false
800
+ vendor_path = File.join("rust", crate_name, "vendor", "rbs")
801
+ sh "git", "add", "-f", vendor_path, verbose: false
802
+ sh "git", "commit", "-m", "Publish #{crate_name} (RBS #{rbs_version})", verbose: false
803
+
804
+ [dry_run, crate_version, original_branch]
805
+ end
806
+
807
+ desc "Publish ruby-rbs-sys crate to crates.io (set RBS_RUST_PUBLISH_DRY_RUN=1 for dry-run only)"
808
+ task :"ruby-rbs-sys" do
809
+ crate_name = "ruby-rbs-sys"
810
+ dry_run, crate_version, original_branch = prepare_publish_branch(crate_name)
811
+
812
+ begin
813
+ puts "🔰 Dry-run publishing..."
814
+
815
+ Dir.chdir(File.join(RUST_DIR, crate_name)) do
816
+ sh "cargo", "publish", "--dry-run"
817
+ end
818
+
819
+ puts "✅ Dry-run succeeded!"
820
+
821
+ unless dry_run
822
+ puts "💪 Publishing #{crate_name} for real..."
823
+
824
+ Dir.chdir(File.join(RUST_DIR, crate_name)) do
825
+ sh "cargo", "publish"
826
+ end
827
+
828
+ sh "git", "tag", "#{crate_name}-v#{crate_version}"
829
+ sh "git", "push", "origin", "#{crate_name}-v#{crate_version}"
830
+
831
+ puts "🎉 Published #{crate_name} successfully!"
832
+ end
833
+ ensure
834
+ sh "git", "checkout", original_branch, verbose: false
835
+ end
836
+ end
837
+
838
+ desc "Publish ruby-rbs crate to crates.io (set RBS_RUST_PUBLISH_DRY_RUN=1 for dry-run only)"
839
+ task :"ruby-rbs" do
840
+ crate_name = "ruby-rbs"
841
+ dry_run, crate_version, original_branch = prepare_publish_branch(crate_name)
842
+
843
+ begin
844
+ puts "🔰 Dry-run publishing..."
845
+
846
+ Dir.chdir(File.join(RUST_DIR, crate_name)) do
847
+ sh "cargo", "publish", "--dry-run", "--no-verify"
848
+ end
849
+
850
+ puts "✅ Dry-run succeeded!"
851
+
852
+ unless dry_run
853
+ puts "💪 Publishing #{crate_name} for real..."
854
+
855
+ Dir.chdir(File.join(RUST_DIR, crate_name)) do
856
+ sh "cargo", "publish"
857
+ end
858
+
859
+ sh "git", "tag", "#{crate_name}-v#{crate_version}"
860
+ sh "git", "push", "origin", "#{crate_name}-v#{crate_version}"
861
+
862
+ puts "🎉 Published #{crate_name} successfully!"
863
+ end
864
+ ensure
865
+ sh "git", "checkout", original_branch, verbose: false
866
+ end
867
+ end
868
+ end
869
+ end