rbs 4.1.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (569) hide show
  1. checksums.yaml +7 -0
  2. data/.clang-format +75 -0
  3. data/.clangd +2 -0
  4. data/.dockerignore +37 -0
  5. data/.github/dependabot.yml +24 -0
  6. data/.github/workflows/bundle-update.yml +63 -0
  7. data/.github/workflows/c-check.yml +66 -0
  8. data/.github/workflows/comments.yml +37 -0
  9. data/.github/workflows/dependabot.yml +30 -0
  10. data/.github/workflows/jruby.yml +79 -0
  11. data/.github/workflows/milestone.yml +91 -0
  12. data/.github/workflows/ruby.yml +158 -0
  13. data/.github/workflows/rust.yml +186 -0
  14. data/.github/workflows/truffleruby.yml +54 -0
  15. data/.github/workflows/typecheck.yml +39 -0
  16. data/.github/workflows/wasm.yml +55 -0
  17. data/.github/workflows/windows.yml +49 -0
  18. data/.gitignore +39 -0
  19. data/.rubocop.yml +72 -0
  20. data/BSDL +22 -0
  21. data/CHANGELOG.md +2380 -0
  22. data/COPYING +56 -0
  23. data/Dockerfile.jruby +53 -0
  24. data/README.md +240 -0
  25. data/Rakefile +856 -0
  26. data/Steepfile +55 -0
  27. data/config.yml +913 -0
  28. data/core/array.rbs +4205 -0
  29. data/core/basic_object.rbs +376 -0
  30. data/core/binding.rbs +148 -0
  31. data/core/builtin.rbs +278 -0
  32. data/core/class.rbs +223 -0
  33. data/core/comparable.rbs +192 -0
  34. data/core/complex.rbs +812 -0
  35. data/core/constants.rbs +96 -0
  36. data/core/data.rbs +415 -0
  37. data/core/dir.rbs +993 -0
  38. data/core/encoding.rbs +1368 -0
  39. data/core/enumerable.rbs +2506 -0
  40. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  41. data/core/enumerator/product.rbs +92 -0
  42. data/core/enumerator.rbs +705 -0
  43. data/core/env.rbs +6 -0
  44. data/core/errno.rbs +682 -0
  45. data/core/errors.rbs +789 -0
  46. data/core/exception.rbs +485 -0
  47. data/core/false_class.rbs +82 -0
  48. data/core/fiber.rbs +570 -0
  49. data/core/fiber_error.rbs +11 -0
  50. data/core/file.rbs +2045 -0
  51. data/core/file_constants.rbs +463 -0
  52. data/core/file_stat.rbs +534 -0
  53. data/core/file_test.rbs +331 -0
  54. data/core/float.rbs +1292 -0
  55. data/core/gc.rbs +788 -0
  56. data/core/global_variables.rbs +184 -0
  57. data/core/hash.rbs +2183 -0
  58. data/core/integer.rbs +1374 -0
  59. data/core/io/buffer.rbs +995 -0
  60. data/core/io/wait.rbs +48 -0
  61. data/core/io.rbs +3472 -0
  62. data/core/kernel.rbs +3172 -0
  63. data/core/marshal.rbs +207 -0
  64. data/core/match_data.rbs +637 -0
  65. data/core/math.rbs +770 -0
  66. data/core/method.rbs +422 -0
  67. data/core/module.rbs +1856 -0
  68. data/core/nil_class.rbs +210 -0
  69. data/core/numeric.rbs +832 -0
  70. data/core/object.rbs +108 -0
  71. data/core/object_space/weak_key_map.rbs +166 -0
  72. data/core/object_space.rbs +197 -0
  73. data/core/pathname.rbs +1312 -0
  74. data/core/proc.rbs +905 -0
  75. data/core/process.rbs +2316 -0
  76. data/core/ractor.rbs +914 -0
  77. data/core/random.rbs +255 -0
  78. data/core/range.rbs +1209 -0
  79. data/core/rational.rbs +502 -0
  80. data/core/rb_config.rbs +88 -0
  81. data/core/rbs/ops.rbs +154 -0
  82. data/core/rbs/unnamed/argf.rbs +1236 -0
  83. data/core/rbs/unnamed/env_class.rbs +1214 -0
  84. data/core/rbs/unnamed/main_class.rbs +123 -0
  85. data/core/rbs/unnamed/random.rbs +186 -0
  86. data/core/refinement.rbs +59 -0
  87. data/core/regexp.rbs +1974 -0
  88. data/core/ruby.rbs +53 -0
  89. data/core/ruby_vm.rbs +809 -0
  90. data/core/rubygems/basic_specification.rbs +6 -0
  91. data/core/rubygems/config_file.rbs +38 -0
  92. data/core/rubygems/dependency_installer.rbs +6 -0
  93. data/core/rubygems/errors.rbs +112 -0
  94. data/core/rubygems/installer.rbs +15 -0
  95. data/core/rubygems/path_support.rbs +6 -0
  96. data/core/rubygems/platform.rbs +7 -0
  97. data/core/rubygems/request_set.rbs +49 -0
  98. data/core/rubygems/requirement.rbs +138 -0
  99. data/core/rubygems/rubygems.rbs +1108 -0
  100. data/core/rubygems/source_list.rbs +15 -0
  101. data/core/rubygems/specification.rbs +31 -0
  102. data/core/rubygems/stream_ui.rbs +5 -0
  103. data/core/rubygems/uninstaller.rbs +10 -0
  104. data/core/rubygems/version.rbs +133 -0
  105. data/core/set.rbs +751 -0
  106. data/core/signal.rbs +110 -0
  107. data/core/string.rbs +5532 -0
  108. data/core/struct.rbs +668 -0
  109. data/core/symbol.rbs +482 -0
  110. data/core/thread.rbs +1821 -0
  111. data/core/thread_group.rbs +79 -0
  112. data/core/time.rbs +1793 -0
  113. data/core/trace_point.rbs +483 -0
  114. data/core/true_class.rbs +98 -0
  115. data/core/unbound_method.rbs +337 -0
  116. data/core/warning.rbs +87 -0
  117. data/docs/CONTRIBUTING.md +107 -0
  118. data/docs/aliases.md +79 -0
  119. data/docs/architecture.md +110 -0
  120. data/docs/collection.md +192 -0
  121. data/docs/config.md +171 -0
  122. data/docs/data_and_struct.md +86 -0
  123. data/docs/encoding.md +56 -0
  124. data/docs/gem.md +56 -0
  125. data/docs/inline.md +634 -0
  126. data/docs/rbs_by_example.md +309 -0
  127. data/docs/release.md +69 -0
  128. data/docs/repo.md +125 -0
  129. data/docs/rust.md +96 -0
  130. data/docs/sigs.md +167 -0
  131. data/docs/stdlib.md +147 -0
  132. data/docs/syntax.md +940 -0
  133. data/docs/tools.md +17 -0
  134. data/docs/type_fingerprint.md +21 -0
  135. data/docs/wasm_serialization.md +80 -0
  136. data/exe/rbs +7 -0
  137. data/ext/rbs_extension/ast_translation.c +1855 -0
  138. data/ext/rbs_extension/ast_translation.h +41 -0
  139. data/ext/rbs_extension/class_constants.c +187 -0
  140. data/ext/rbs_extension/class_constants.h +104 -0
  141. data/ext/rbs_extension/compat.h +10 -0
  142. data/ext/rbs_extension/extconf.rb +40 -0
  143. data/ext/rbs_extension/legacy_location.c +299 -0
  144. data/ext/rbs_extension/legacy_location.h +82 -0
  145. data/ext/rbs_extension/main.c +613 -0
  146. data/ext/rbs_extension/rbs_extension.h +16 -0
  147. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  148. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  149. data/goodcheck.yml +91 -0
  150. data/include/rbs/ast.h +1047 -0
  151. data/include/rbs/defines.h +99 -0
  152. data/include/rbs/lexer.h +207 -0
  153. data/include/rbs/location.h +40 -0
  154. data/include/rbs/parser.h +153 -0
  155. data/include/rbs/serialize.h +39 -0
  156. data/include/rbs/string.h +47 -0
  157. data/include/rbs/util/rbs_allocator.h +59 -0
  158. data/include/rbs/util/rbs_assert.h +20 -0
  159. data/include/rbs/util/rbs_buffer.h +83 -0
  160. data/include/rbs/util/rbs_constant_pool.h +155 -0
  161. data/include/rbs/util/rbs_encoding.h +282 -0
  162. data/include/rbs/util/rbs_unescape.h +24 -0
  163. data/include/rbs.h +14 -0
  164. data/lib/rbs/ancestor_graph.rb +92 -0
  165. data/lib/rbs/annotate/annotations.rb +199 -0
  166. data/lib/rbs/annotate/formatter.rb +82 -0
  167. data/lib/rbs/annotate/rdoc_annotator.rb +398 -0
  168. data/lib/rbs/annotate/rdoc_source.rb +131 -0
  169. data/lib/rbs/annotate.rb +8 -0
  170. data/lib/rbs/ast/annotation.rb +29 -0
  171. data/lib/rbs/ast/comment.rb +29 -0
  172. data/lib/rbs/ast/declarations.rb +472 -0
  173. data/lib/rbs/ast/directives.rb +49 -0
  174. data/lib/rbs/ast/members.rb +451 -0
  175. data/lib/rbs/ast/ruby/annotations.rb +451 -0
  176. data/lib/rbs/ast/ruby/comment_block.rb +247 -0
  177. data/lib/rbs/ast/ruby/declarations.rb +291 -0
  178. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  179. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  180. data/lib/rbs/ast/ruby/members.rb +762 -0
  181. data/lib/rbs/ast/type_param.rb +235 -0
  182. data/lib/rbs/ast/visitor.rb +137 -0
  183. data/lib/rbs/buffer.rb +189 -0
  184. data/lib/rbs/builtin_names.rb +58 -0
  185. data/lib/rbs/cli/colored_io.rb +48 -0
  186. data/lib/rbs/cli/diff.rb +84 -0
  187. data/lib/rbs/cli/validate.rb +294 -0
  188. data/lib/rbs/cli.rb +1253 -0
  189. data/lib/rbs/collection/cleaner.rb +38 -0
  190. data/lib/rbs/collection/config/lockfile.rb +92 -0
  191. data/lib/rbs/collection/config/lockfile_generator.rb +269 -0
  192. data/lib/rbs/collection/config.rb +81 -0
  193. data/lib/rbs/collection/installer.rb +32 -0
  194. data/lib/rbs/collection/sources/base.rb +14 -0
  195. data/lib/rbs/collection/sources/git.rb +265 -0
  196. data/lib/rbs/collection/sources/local.rb +81 -0
  197. data/lib/rbs/collection/sources/rubygems.rb +48 -0
  198. data/lib/rbs/collection/sources/stdlib.rb +50 -0
  199. data/lib/rbs/collection/sources.rb +38 -0
  200. data/lib/rbs/collection.rb +16 -0
  201. data/lib/rbs/constant.rb +28 -0
  202. data/lib/rbs/definition.rb +415 -0
  203. data/lib/rbs/definition_builder/ancestor_builder.rb +678 -0
  204. data/lib/rbs/definition_builder/method_builder.rb +295 -0
  205. data/lib/rbs/definition_builder.rb +1054 -0
  206. data/lib/rbs/diff.rb +131 -0
  207. data/lib/rbs/environment/class_entry.rb +69 -0
  208. data/lib/rbs/environment/module_entry.rb +66 -0
  209. data/lib/rbs/environment/use_map.rb +77 -0
  210. data/lib/rbs/environment.rb +1028 -0
  211. data/lib/rbs/environment_loader.rb +167 -0
  212. data/lib/rbs/environment_walker.rb +155 -0
  213. data/lib/rbs/errors.rb +634 -0
  214. data/lib/rbs/factory.rb +18 -0
  215. data/lib/rbs/file_finder.rb +28 -0
  216. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  217. data/lib/rbs/inline_parser.rb +568 -0
  218. data/lib/rbs/location_aux.rb +170 -0
  219. data/lib/rbs/locator.rb +247 -0
  220. data/lib/rbs/method_type.rb +145 -0
  221. data/lib/rbs/namespace.rb +154 -0
  222. data/lib/rbs/parser/lex_result.rb +15 -0
  223. data/lib/rbs/parser/token.rb +23 -0
  224. data/lib/rbs/parser_aux.rb +144 -0
  225. data/lib/rbs/prototype/helpers.rb +197 -0
  226. data/lib/rbs/prototype/node_usage.rb +99 -0
  227. data/lib/rbs/prototype/rb.rb +816 -0
  228. data/lib/rbs/prototype/rbi.rb +793 -0
  229. data/lib/rbs/prototype/runtime/helpers.rb +59 -0
  230. data/lib/rbs/prototype/runtime/reflection.rb +19 -0
  231. data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
  232. data/lib/rbs/prototype/runtime.rb +680 -0
  233. data/lib/rbs/repository.rb +127 -0
  234. data/lib/rbs/resolver/constant_resolver.rb +219 -0
  235. data/lib/rbs/resolver/type_name_resolver.rb +167 -0
  236. data/lib/rbs/rewriter.rb +70 -0
  237. data/lib/rbs/sorter.rb +198 -0
  238. data/lib/rbs/source.rb +99 -0
  239. data/lib/rbs/substitution.rb +83 -0
  240. data/lib/rbs/subtractor.rb +204 -0
  241. data/lib/rbs/test/errors.rb +80 -0
  242. data/lib/rbs/test/guaranteed.rb +30 -0
  243. data/lib/rbs/test/hook.rb +212 -0
  244. data/lib/rbs/test/observer.rb +19 -0
  245. data/lib/rbs/test/setup.rb +84 -0
  246. data/lib/rbs/test/setup_helper.rb +50 -0
  247. data/lib/rbs/test/tester.rb +167 -0
  248. data/lib/rbs/test/type_check.rb +457 -0
  249. data/lib/rbs/test.rb +112 -0
  250. data/lib/rbs/type_alias_dependency.rb +100 -0
  251. data/lib/rbs/type_alias_regularity.rb +126 -0
  252. data/lib/rbs/type_name.rb +122 -0
  253. data/lib/rbs/types.rb +1604 -0
  254. data/lib/rbs/unit_test/convertibles.rb +177 -0
  255. data/lib/rbs/unit_test/spy.rb +138 -0
  256. data/lib/rbs/unit_test/type_assertions.rb +383 -0
  257. data/lib/rbs/unit_test/with_aliases.rb +145 -0
  258. data/lib/rbs/unit_test.rb +6 -0
  259. data/lib/rbs/validator.rb +186 -0
  260. data/lib/rbs/variance_calculator.rb +189 -0
  261. data/lib/rbs/vendorer.rb +71 -0
  262. data/lib/rbs/version.rb +5 -0
  263. data/lib/rbs/wasm/deserializer.rb +213 -0
  264. data/lib/rbs/wasm/location.rb +61 -0
  265. data/lib/rbs/wasm/parser.rb +137 -0
  266. data/lib/rbs/wasm/rbs_parser.wasm +0 -0
  267. data/lib/rbs/wasm/runtime.rb +196 -0
  268. data/lib/rbs/wasm/serialization_schema.rb +110 -0
  269. data/lib/rbs/writer.rb +424 -0
  270. data/lib/rbs.rb +117 -0
  271. data/lib/rbs_jars.rb +39 -0
  272. data/lib/rdoc/discover.rb +20 -0
  273. data/lib/rdoc_plugin/parser.rb +168 -0
  274. data/rbs.gemspec +81 -0
  275. data/schema/annotation.json +14 -0
  276. data/schema/comment.json +26 -0
  277. data/schema/decls.json +326 -0
  278. data/schema/function.json +87 -0
  279. data/schema/location.json +56 -0
  280. data/schema/members.json +266 -0
  281. data/schema/methodType.json +50 -0
  282. data/schema/typeParam.json +52 -0
  283. data/schema/types.json +317 -0
  284. data/sig/ancestor_builder.rbs +163 -0
  285. data/sig/ancestor_graph.rbs +60 -0
  286. data/sig/annotate/annotations.rbs +102 -0
  287. data/sig/annotate/formatter.rbs +24 -0
  288. data/sig/annotate/rdoc_annotater.rbs +85 -0
  289. data/sig/annotate/rdoc_source.rbs +32 -0
  290. data/sig/annotation.rbs +27 -0
  291. data/sig/ast/ruby/annotations.rbs +470 -0
  292. data/sig/ast/ruby/comment_block.rbs +127 -0
  293. data/sig/ast/ruby/declarations.rbs +158 -0
  294. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  295. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  296. data/sig/ast/ruby/members.rbs +198 -0
  297. data/sig/buffer.rbs +108 -0
  298. data/sig/builtin_names.rbs +44 -0
  299. data/sig/cli/colored_io.rbs +15 -0
  300. data/sig/cli/diff.rbs +15 -0
  301. data/sig/cli/validate.rbs +47 -0
  302. data/sig/cli.rbs +89 -0
  303. data/sig/collection/cleaner.rbs +13 -0
  304. data/sig/collection/config/lockfile.rbs +74 -0
  305. data/sig/collection/config/lockfile_generator.rbs +68 -0
  306. data/sig/collection/config.rbs +46 -0
  307. data/sig/collection/installer.rbs +17 -0
  308. data/sig/collection/sources.rbs +214 -0
  309. data/sig/collection.rbs +4 -0
  310. data/sig/comment.rbs +26 -0
  311. data/sig/constant.rbs +21 -0
  312. data/sig/declarations.rbs +274 -0
  313. data/sig/definition.rbs +232 -0
  314. data/sig/definition_builder.rbs +181 -0
  315. data/sig/diff.rbs +28 -0
  316. data/sig/directives.rbs +77 -0
  317. data/sig/environment/class_entry.rbs +50 -0
  318. data/sig/environment/module_entry.rbs +50 -0
  319. data/sig/environment.rbs +286 -0
  320. data/sig/environment_loader.rbs +111 -0
  321. data/sig/environment_walker.rbs +65 -0
  322. data/sig/errors.rbs +408 -0
  323. data/sig/factory.rbs +5 -0
  324. data/sig/file_finder.rbs +28 -0
  325. data/sig/inline_parser/comment_association.rbs +71 -0
  326. data/sig/inline_parser.rbs +126 -0
  327. data/sig/location.rbs +135 -0
  328. data/sig/locator.rbs +56 -0
  329. data/sig/manifest.yaml +5 -0
  330. data/sig/members.rbs +258 -0
  331. data/sig/method_builder.rbs +89 -0
  332. data/sig/method_types.rbs +58 -0
  333. data/sig/namespace.rbs +161 -0
  334. data/sig/parser.rbs +164 -0
  335. data/sig/prototype/helpers.rbs +29 -0
  336. data/sig/prototype/node_usage.rbs +20 -0
  337. data/sig/prototype/rb.rbs +96 -0
  338. data/sig/prototype/rbi.rbs +104 -0
  339. data/sig/prototype/runtime.rbs +182 -0
  340. data/sig/rbs.rbs +21 -0
  341. data/sig/rdoc/rbs.rbs +67 -0
  342. data/sig/repository.rbs +85 -0
  343. data/sig/resolver/constant_resolver.rbs +92 -0
  344. data/sig/resolver/context.rbs +34 -0
  345. data/sig/resolver/type_name_resolver.rbs +61 -0
  346. data/sig/rewriter.rbs +45 -0
  347. data/sig/shims/bundler.rbs +38 -0
  348. data/sig/shims/enumerable.rbs +5 -0
  349. data/sig/shims/rubygems.rbs +19 -0
  350. data/sig/sorter.rbs +41 -0
  351. data/sig/source.rbs +48 -0
  352. data/sig/substitution.rbs +48 -0
  353. data/sig/subtractor.rbs +37 -0
  354. data/sig/test/errors.rbs +52 -0
  355. data/sig/test/guranteed.rbs +9 -0
  356. data/sig/test/type_check.rbs +19 -0
  357. data/sig/test.rbs +82 -0
  358. data/sig/type_alias_dependency.rbs +53 -0
  359. data/sig/type_alias_regularity.rbs +98 -0
  360. data/sig/type_param.rbs +115 -0
  361. data/sig/typename.rbs +89 -0
  362. data/sig/types.rbs +578 -0
  363. data/sig/unit_test/convertibles.rbs +154 -0
  364. data/sig/unit_test/spy.rbs +22 -0
  365. data/sig/unit_test/type_assertions.rbs +211 -0
  366. data/sig/unit_test/with_aliases.rbs +136 -0
  367. data/sig/use_map.rbs +35 -0
  368. data/sig/util.rbs +9 -0
  369. data/sig/validator.rbs +63 -0
  370. data/sig/variance_calculator.rbs +87 -0
  371. data/sig/vendorer.rbs +51 -0
  372. data/sig/version.rbs +3 -0
  373. data/sig/visitor.rbs +47 -0
  374. data/sig/wasm/deserializer.rbs +66 -0
  375. data/sig/wasm/serialization_schema.rbs +13 -0
  376. data/sig/writer.rbs +127 -0
  377. data/src/ast.c +1628 -0
  378. data/src/lexer.c +3221 -0
  379. data/src/lexer.re +155 -0
  380. data/src/lexstate.c +221 -0
  381. data/src/location.c +31 -0
  382. data/src/parser.c +4255 -0
  383. data/src/serialize.c +958 -0
  384. data/src/string.c +41 -0
  385. data/src/util/rbs_allocator.c +171 -0
  386. data/src/util/rbs_assert.c +19 -0
  387. data/src/util/rbs_buffer.c +54 -0
  388. data/src/util/rbs_constant_pool.c +268 -0
  389. data/src/util/rbs_encoding.c +21308 -0
  390. data/src/util/rbs_unescape.c +167 -0
  391. data/stdlib/abbrev/0/abbrev.rbs +66 -0
  392. data/stdlib/abbrev/0/array.rbs +26 -0
  393. data/stdlib/base64/0/base64.rbs +355 -0
  394. data/stdlib/benchmark/0/benchmark.rbs +452 -0
  395. data/stdlib/bigdecimal/0/big_decimal.rbs +1647 -0
  396. data/stdlib/bigdecimal-math/0/big_math.rbs +280 -0
  397. data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
  398. data/stdlib/cgi/0/core.rbs +911 -0
  399. data/stdlib/cgi/0/manifest.yaml +4 -0
  400. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  401. data/stdlib/coverage/0/coverage.rbs +266 -0
  402. data/stdlib/csv/0/csv.rbs +3776 -0
  403. data/stdlib/csv/0/manifest.yaml +3 -0
  404. data/stdlib/date/0/date.rbs +1598 -0
  405. data/stdlib/date/0/date_time.rbs +617 -0
  406. data/stdlib/date/0/time.rbs +26 -0
  407. data/stdlib/dbm/0/dbm.rbs +421 -0
  408. data/stdlib/delegate/0/delegator.rbs +188 -0
  409. data/stdlib/delegate/0/kernel.rbs +47 -0
  410. data/stdlib/delegate/0/simple_delegator.rbs +96 -0
  411. data/stdlib/did_you_mean/0/did_you_mean.rbs +344 -0
  412. data/stdlib/digest/0/digest.rbs +693 -0
  413. data/stdlib/erb/0/erb.rbs +933 -0
  414. data/stdlib/etc/0/etc.rbs +884 -0
  415. data/stdlib/fileutils/0/fileutils.rbs +1753 -0
  416. data/stdlib/find/0/find.rbs +49 -0
  417. data/stdlib/forwardable/0/forwardable.rbs +271 -0
  418. data/stdlib/io-console/0/io-console.rbs +414 -0
  419. data/stdlib/ipaddr/0/ipaddr.rbs +431 -0
  420. data/stdlib/json/0/json.rbs +1963 -0
  421. data/stdlib/kconv/0/kconv.rbs +166 -0
  422. data/stdlib/logger/0/formatter.rbs +45 -0
  423. data/stdlib/logger/0/log_device.rbs +100 -0
  424. data/stdlib/logger/0/logger.rbs +796 -0
  425. data/stdlib/logger/0/manifest.yaml +2 -0
  426. data/stdlib/logger/0/period.rbs +17 -0
  427. data/stdlib/logger/0/severity.rbs +34 -0
  428. data/stdlib/minitest/0/kernel.rbs +42 -0
  429. data/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
  430. data/stdlib/minitest/0/minitest/assertion.rbs +17 -0
  431. data/stdlib/minitest/0/minitest/assertions.rbs +590 -0
  432. data/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
  433. data/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
  434. data/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
  435. data/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
  436. data/stdlib/minitest/0/minitest/compress.rbs +13 -0
  437. data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
  438. data/stdlib/minitest/0/minitest/expectation.rbs +2 -0
  439. data/stdlib/minitest/0/minitest/expectations.rbs +21 -0
  440. data/stdlib/minitest/0/minitest/guard.rbs +64 -0
  441. data/stdlib/minitest/0/minitest/mock.rbs +64 -0
  442. data/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
  443. data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
  444. data/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
  445. data/stdlib/minitest/0/minitest/parallel.rbs +2 -0
  446. data/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
  447. data/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
  448. data/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
  449. data/stdlib/minitest/0/minitest/reportable.rbs +53 -0
  450. data/stdlib/minitest/0/minitest/reporter.rbs +5 -0
  451. data/stdlib/minitest/0/minitest/result.rbs +28 -0
  452. data/stdlib/minitest/0/minitest/runnable.rbs +163 -0
  453. data/stdlib/minitest/0/minitest/skip.rbs +6 -0
  454. data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
  455. data/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
  456. data/stdlib/minitest/0/minitest/spec.rbs +11 -0
  457. data/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
  458. data/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
  459. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
  460. data/stdlib/minitest/0/minitest/test.rbs +69 -0
  461. data/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
  462. data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
  463. data/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
  464. data/stdlib/minitest/0/minitest/unit.rbs +4 -0
  465. data/stdlib/minitest/0/minitest.rbs +115 -0
  466. data/stdlib/monitor/0/monitor.rbs +363 -0
  467. data/stdlib/mutex_m/0/mutex_m.rbs +104 -0
  468. data/stdlib/net-http/0/manifest.yaml +3 -0
  469. data/stdlib/net-http/0/net-http.rbs +5580 -0
  470. data/stdlib/net-protocol/0/manifest.yaml +2 -0
  471. data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
  472. data/stdlib/net-smtp/0/manifest.yaml +2 -0
  473. data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
  474. data/stdlib/nkf/0/nkf.rbs +402 -0
  475. data/stdlib/objspace/0/objspace.rbs +470 -0
  476. data/stdlib/observable/0/observable.rbs +217 -0
  477. data/stdlib/open-uri/0/manifest.yaml +4 -0
  478. data/stdlib/open-uri/0/open-uri.rbs +433 -0
  479. data/stdlib/open3/0/open3.rbs +606 -0
  480. data/stdlib/openssl/0/manifest.yaml +3 -0
  481. data/stdlib/openssl/0/openssl.rbs +12237 -0
  482. data/stdlib/optparse/0/optparse.rbs +1734 -0
  483. data/stdlib/pathname/0/pathname.rbs +36 -0
  484. data/stdlib/pp/0/manifest.yaml +2 -0
  485. data/stdlib/pp/0/pp.rbs +301 -0
  486. data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
  487. data/stdlib/pstore/0/pstore.rbs +608 -0
  488. data/stdlib/psych/0/core_ext.rbs +12 -0
  489. data/stdlib/psych/0/dbm.rbs +237 -0
  490. data/stdlib/psych/0/manifest.yaml +3 -0
  491. data/stdlib/psych/0/psych.rbs +455 -0
  492. data/stdlib/psych/0/store.rbs +57 -0
  493. data/stdlib/pty/0/pty.rbs +240 -0
  494. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  495. data/stdlib/rdoc/0/code_object.rbs +52 -0
  496. data/stdlib/rdoc/0/comment.rbs +61 -0
  497. data/stdlib/rdoc/0/context.rbs +153 -0
  498. data/stdlib/rdoc/0/markup.rbs +117 -0
  499. data/stdlib/rdoc/0/options.rbs +76 -0
  500. data/stdlib/rdoc/0/parser.rbs +56 -0
  501. data/stdlib/rdoc/0/rdoc.rbs +393 -0
  502. data/stdlib/rdoc/0/ri.rbs +17 -0
  503. data/stdlib/rdoc/0/store.rbs +48 -0
  504. data/stdlib/rdoc/0/top_level.rbs +97 -0
  505. data/stdlib/resolv/0/manifest.yaml +3 -0
  506. data/stdlib/resolv/0/resolv.rbs +1787 -0
  507. data/stdlib/ripper/0/ripper.rbs +1654 -0
  508. data/stdlib/securerandom/0/manifest.yaml +2 -0
  509. data/stdlib/securerandom/0/securerandom.rbs +49 -0
  510. data/stdlib/shellwords/0/shellwords.rbs +229 -0
  511. data/stdlib/singleton/0/singleton.rbs +134 -0
  512. data/stdlib/socket/0/addrinfo.rbs +666 -0
  513. data/stdlib/socket/0/basic_socket.rbs +590 -0
  514. data/stdlib/socket/0/constants.rbs +2295 -0
  515. data/stdlib/socket/0/ip_socket.rbs +94 -0
  516. data/stdlib/socket/0/socket.rbs +4170 -0
  517. data/stdlib/socket/0/socket_error.rbs +5 -0
  518. data/stdlib/socket/0/tcp_server.rbs +192 -0
  519. data/stdlib/socket/0/tcp_socket.rbs +87 -0
  520. data/stdlib/socket/0/udp_socket.rbs +133 -0
  521. data/stdlib/socket/0/unix_server.rbs +169 -0
  522. data/stdlib/socket/0/unix_socket.rbs +172 -0
  523. data/stdlib/stringio/0/stringio.rbs +1681 -0
  524. data/stdlib/strscan/0/string_scanner.rbs +1648 -0
  525. data/stdlib/tempfile/0/manifest.yaml +3 -0
  526. data/stdlib/tempfile/0/tempfile.rbs +483 -0
  527. data/stdlib/time/0/time.rbs +434 -0
  528. data/stdlib/timeout/0/timeout.rbs +132 -0
  529. data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
  530. data/stdlib/tsort/0/cyclic.rbs +8 -0
  531. data/stdlib/tsort/0/interfaces.rbs +20 -0
  532. data/stdlib/tsort/0/tsort.rbs +410 -0
  533. data/stdlib/uri/0/common.rbs +621 -0
  534. data/stdlib/uri/0/file.rbs +118 -0
  535. data/stdlib/uri/0/ftp.rbs +13 -0
  536. data/stdlib/uri/0/generic.rbs +1111 -0
  537. data/stdlib/uri/0/http.rbs +104 -0
  538. data/stdlib/uri/0/https.rbs +14 -0
  539. data/stdlib/uri/0/ldap.rbs +230 -0
  540. data/stdlib/uri/0/ldaps.rbs +14 -0
  541. data/stdlib/uri/0/mailto.rbs +92 -0
  542. data/stdlib/uri/0/rfc2396_parser.rbs +189 -0
  543. data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
  544. data/stdlib/uri/0/ws.rbs +13 -0
  545. data/stdlib/uri/0/wss.rbs +9 -0
  546. data/stdlib/yaml/0/manifest.yaml +2 -0
  547. data/stdlib/yaml/0/yaml.rbs +1 -0
  548. data/stdlib/zlib/0/buf_error.rbs +10 -0
  549. data/stdlib/zlib/0/data_error.rbs +10 -0
  550. data/stdlib/zlib/0/deflate.rbs +211 -0
  551. data/stdlib/zlib/0/error.rbs +20 -0
  552. data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
  553. data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
  554. data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
  555. data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
  556. data/stdlib/zlib/0/gzip_file.rbs +156 -0
  557. data/stdlib/zlib/0/gzip_reader.rbs +293 -0
  558. data/stdlib/zlib/0/gzip_writer.rbs +168 -0
  559. data/stdlib/zlib/0/inflate.rbs +180 -0
  560. data/stdlib/zlib/0/mem_error.rbs +10 -0
  561. data/stdlib/zlib/0/need_dict.rbs +13 -0
  562. data/stdlib/zlib/0/stream_end.rbs +11 -0
  563. data/stdlib/zlib/0/stream_error.rbs +11 -0
  564. data/stdlib/zlib/0/version_error.rbs +11 -0
  565. data/stdlib/zlib/0/zlib.rbs +449 -0
  566. data/stdlib/zlib/0/zstream.rbs +200 -0
  567. data/wasm/README.md +60 -0
  568. data/wasm/rbs_wasm.c +423 -0
  569. metadata +671 -0
data/Rakefile ADDED
@@ -0,0 +1,856 @@
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 by default (see RBS::WASM::Runtime).
631
+ JRUBY_WASM_DIR = File.expand_path("lib/rbs/wasm", __dir__)
632
+
633
+ desc "Download the Chicory/ASM jars into the local Maven repository (~/.m2). Run on JRuby."
634
+ task :install_jars do
635
+ # Resolves the `jar` requirements from rbs.gemspec via Maven and downloads
636
+ # them (and their transitive deps) into ~/.m2, the same way `gem install`
637
+ # does; the jars are not copied into the gem. The platform is forced to java
638
+ # because Jars::Installer skips non-java gems, and write_require_file is false
639
+ # because lib/rbs_jars.rb is hand-maintained (the generator mangles the
640
+ # `com.dylibso.chicory:runtime` artifact id).
641
+ require "jars/installer"
642
+ spec = Gem::Specification.load("rbs.gemspec")
643
+ spec.platform = "java"
644
+ Jars::Installer.new(spec).install_jars(write_require_file: false)
645
+ end
646
+
647
+ desc "Build rbs_parser.wasm and copy it next to RBS::WASM::Runtime"
648
+ task :jruby_setup => [:build] do
649
+ cp WASM_OUTPUT, File.join(JRUBY_WASM_DIR, "rbs_parser.wasm")
650
+ puts "rbs_parser.wasm is ready under #{JRUBY_WASM_DIR}"
651
+ end
652
+ end
653
+
654
+ namespace :rust do
655
+ namespace :rbs do
656
+ RUST_DIR = File.expand_path("rust", __dir__)
657
+ RBS_VERSION_FILE = File.join(RUST_DIR, "rbs_version")
658
+
659
+ VENDOR_TARGETS = {
660
+ "ruby-rbs-sys" => %w[include src],
661
+ "ruby-rbs" => %w[config.yml],
662
+ }
663
+
664
+ desc "Sync vendored RBS source from the pinned version"
665
+ task :sync do
666
+ unless File.exist?(RBS_VERSION_FILE)
667
+ raise "#{RBS_VERSION_FILE} not found. Run `rake rust:rbs:pin[VERSION]` first."
668
+ end
669
+
670
+ version = File.read(RBS_VERSION_FILE).strip
671
+ raise "#{RBS_VERSION_FILE} is empty" if version.empty?
672
+
673
+ puts "Syncing vendor/rbs/ from #{version}..."
674
+
675
+ VENDOR_TARGETS.each do |crate, entries|
676
+ vendor_dir = File.join(RUST_DIR, crate, "vendor", "rbs")
677
+
678
+ puts " Copying files for #{crate}:"
679
+ chmod_R "u+w", vendor_dir, verbose: false if File.exist?(vendor_dir)
680
+ rm_rf vendor_dir, verbose: false
681
+ mkdir_p vendor_dir, verbose: false
682
+
683
+ entries.each do |entry|
684
+ target = File.join(vendor_dir, entry)
685
+
686
+ # Extract the entry from the pinned git tag using git archive
687
+ IO.popen(["git", "archive", "--format=tar", version, "--", entry], "rb") do |tar|
688
+ IO.popen(["tar", "xf", "-", "-C", vendor_dir], "wb") do |extract|
689
+ IO.copy_stream(tar, extract)
690
+ end
691
+ end
692
+
693
+ raise "Failed to extract #{entry} from #{version}" unless File.exist?(target)
694
+ puts " #{entry}"
695
+ end
696
+
697
+ # Make files read-only to prevent accidental edits
698
+ chmod_R "a-w", vendor_dir, verbose: false
699
+ end
700
+
701
+ puts "📦 Synced vendor/rbs/ from #{version} (read-only)"
702
+ end
703
+
704
+ desc "Pin a specific RBS version for Rust crates (e.g., rake rust:rbs:pin[v4.0.3])"
705
+ task :pin, [:version] do |_t, args|
706
+ version = args[:version] or raise "Usage: rake rust:rbs:pin[VERSION]"
707
+
708
+ # Verify the tag exists
709
+ unless system("git", "rev-parse", "--verify", "#{version}^{commit}", out: File::NULL, err: File::NULL)
710
+ raise "Tag #{version} not found"
711
+ end
712
+
713
+ File.write(RBS_VERSION_FILE, "#{version}\n")
714
+ puts "📌 Pinned RBS version to #{version}"
715
+
716
+ Rake::Task["rust:rbs:sync"].invoke
717
+ end
718
+
719
+ desc "Create symlinks from vendor/rbs/ to the repository root (for development/CI)"
720
+ task :symlink do
721
+ VENDOR_TARGETS.each do |crate, entries|
722
+ vendor_dir = File.join(RUST_DIR, crate, "vendor", "rbs")
723
+
724
+ puts "Setting up symlinks for #{crate}..."
725
+ entries.each do |entry|
726
+ puts " #{entry} -> repository root"
727
+ end
728
+
729
+ chmod_R "u+w", vendor_dir, verbose: false if File.exist?(vendor_dir)
730
+ rm_rf vendor_dir, verbose: false
731
+ mkdir_p vendor_dir, verbose: false
732
+
733
+ entries.each do |entry|
734
+ ln_s File.join("..", "..", "..", "..", entry), File.join(vendor_dir, entry), verbose: false
735
+ end
736
+ end
737
+
738
+ puts "🔗 Symlinked vendor/rbs/ to repository root"
739
+ end
740
+ end
741
+
742
+ namespace :publish do
743
+ def self.prepare_publish_branch(crate_name)
744
+ dry_run = ENV["RBS_RUST_PUBLISH_DRY_RUN"]
745
+
746
+ version_file = File.join(RUST_DIR, "rbs_version")
747
+
748
+ unless File.exist?(version_file)
749
+ raise "#{version_file} not found. Run `rake rust:rbs:pin[VERSION]` first."
750
+ end
751
+
752
+ rbs_version = File.read(version_file).strip
753
+ raise "#{version_file} is empty" if rbs_version.empty?
754
+
755
+ crate_version = File.read(File.join(RUST_DIR, crate_name, "Cargo.toml"))[/^version\s*=\s*"(.+)"/, 1]
756
+ release_branch = "rust/release-#{crate_name}-#{Time.now.strftime('%Y%m%d%H%M%S')}"
757
+
758
+ puts "=" * 60
759
+ puts "Rust crate publish: #{crate_name}#{dry_run ? " (DRY RUN)" : ""}"
760
+ puts "=" * 60
761
+ puts " RBS source version: #{rbs_version}"
762
+ puts " #{crate_name}: #{crate_version} (tag: #{crate_name}-v#{crate_version})"
763
+ puts " Release branch: #{release_branch}"
764
+ puts "=" * 60
765
+
766
+ # Check that vendor dirs contain real files, not symlinks
767
+ entries = VENDOR_TARGETS.fetch(crate_name)
768
+ entries.each do |entry|
769
+ path = File.join(RUST_DIR, crate_name, "vendor", "rbs", entry)
770
+ if File.symlink?(path)
771
+ raise "#{path} is a symlink. Run `rake rust:rbs:sync` first."
772
+ end
773
+ unless File.exist?(path)
774
+ raise "#{path} does not exist. Run `rake rust:rbs:sync` first."
775
+ end
776
+ end
777
+
778
+ # Ensure working tree is clean before publishing
779
+ unless `git status --porcelain`.strip.empty?
780
+ raise "💢 Working tree is dirty. Please commit or stash your changes before publishing."
781
+ end
782
+
783
+ # Create a release branch with vendor files committed
784
+ original_branch = `git rev-parse --abbrev-ref HEAD`.strip
785
+
786
+ sh "git", "checkout", "-b", release_branch, verbose: false
787
+ vendor_path = File.join("rust", crate_name, "vendor", "rbs")
788
+ sh "git", "add", "-f", vendor_path, verbose: false
789
+ sh "git", "commit", "-m", "Publish #{crate_name} (RBS #{rbs_version})", verbose: false
790
+
791
+ [dry_run, crate_version, original_branch]
792
+ end
793
+
794
+ desc "Publish ruby-rbs-sys crate to crates.io (set RBS_RUST_PUBLISH_DRY_RUN=1 for dry-run only)"
795
+ task :"ruby-rbs-sys" do
796
+ crate_name = "ruby-rbs-sys"
797
+ dry_run, crate_version, original_branch = prepare_publish_branch(crate_name)
798
+
799
+ begin
800
+ puts "🔰 Dry-run publishing..."
801
+
802
+ Dir.chdir(File.join(RUST_DIR, crate_name)) do
803
+ sh "cargo", "publish", "--dry-run"
804
+ end
805
+
806
+ puts "✅ Dry-run succeeded!"
807
+
808
+ unless dry_run
809
+ puts "💪 Publishing #{crate_name} for real..."
810
+
811
+ Dir.chdir(File.join(RUST_DIR, crate_name)) do
812
+ sh "cargo", "publish"
813
+ end
814
+
815
+ sh "git", "tag", "#{crate_name}-v#{crate_version}"
816
+ sh "git", "push", "origin", "#{crate_name}-v#{crate_version}"
817
+
818
+ puts "🎉 Published #{crate_name} successfully!"
819
+ end
820
+ ensure
821
+ sh "git", "checkout", original_branch, verbose: false
822
+ end
823
+ end
824
+
825
+ desc "Publish ruby-rbs crate to crates.io (set RBS_RUST_PUBLISH_DRY_RUN=1 for dry-run only)"
826
+ task :"ruby-rbs" do
827
+ crate_name = "ruby-rbs"
828
+ dry_run, crate_version, original_branch = prepare_publish_branch(crate_name)
829
+
830
+ begin
831
+ puts "🔰 Dry-run publishing..."
832
+
833
+ Dir.chdir(File.join(RUST_DIR, crate_name)) do
834
+ sh "cargo", "publish", "--dry-run", "--no-verify"
835
+ end
836
+
837
+ puts "✅ Dry-run succeeded!"
838
+
839
+ unless dry_run
840
+ puts "💪 Publishing #{crate_name} for real..."
841
+
842
+ Dir.chdir(File.join(RUST_DIR, crate_name)) do
843
+ sh "cargo", "publish"
844
+ end
845
+
846
+ sh "git", "tag", "#{crate_name}-v#{crate_version}"
847
+ sh "git", "push", "origin", "#{crate_name}-v#{crate_version}"
848
+
849
+ puts "🎉 Published #{crate_name} successfully!"
850
+ end
851
+ ensure
852
+ sh "git", "checkout", original_branch, verbose: false
853
+ end
854
+ end
855
+ end
856
+ end