rbs 4.1.0.pre.2-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (574) hide show
  1. checksums.yaml +7 -0
  2. data/.clang-format +75 -0
  3. data/.clangd +2 -0
  4. data/.github/dependabot.yml +24 -0
  5. data/.github/workflows/bundle-update.yml +63 -0
  6. data/.github/workflows/c-check.yml +61 -0
  7. data/.github/workflows/comments.yml +37 -0
  8. data/.github/workflows/dependabot.yml +30 -0
  9. data/.github/workflows/jruby.yml +67 -0
  10. data/.github/workflows/milestone.yml +83 -0
  11. data/.github/workflows/ruby.yml +158 -0
  12. data/.github/workflows/rust.yml +184 -0
  13. data/.github/workflows/truffleruby.yml +54 -0
  14. data/.github/workflows/typecheck.yml +39 -0
  15. data/.github/workflows/wasm.yml +53 -0
  16. data/.github/workflows/windows.yml +49 -0
  17. data/.gitignore +38 -0
  18. data/.rubocop.yml +72 -0
  19. data/BSDL +22 -0
  20. data/CHANGELOG.md +2292 -0
  21. data/COPYING +56 -0
  22. data/README.md +240 -0
  23. data/Rakefile +869 -0
  24. data/Steepfile +53 -0
  25. data/config.yml +913 -0
  26. data/core/array.rbs +4142 -0
  27. data/core/basic_object.rbs +376 -0
  28. data/core/binding.rbs +148 -0
  29. data/core/builtin.rbs +278 -0
  30. data/core/class.rbs +223 -0
  31. data/core/comparable.rbs +192 -0
  32. data/core/complex.rbs +812 -0
  33. data/core/constants.rbs +96 -0
  34. data/core/data.rbs +415 -0
  35. data/core/dir.rbs +993 -0
  36. data/core/encoding.rbs +1368 -0
  37. data/core/enumerable.rbs +2506 -0
  38. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  39. data/core/enumerator/product.rbs +92 -0
  40. data/core/enumerator.rbs +705 -0
  41. data/core/env.rbs +6 -0
  42. data/core/errno.rbs +682 -0
  43. data/core/errors.rbs +789 -0
  44. data/core/exception.rbs +485 -0
  45. data/core/false_class.rbs +82 -0
  46. data/core/fiber.rbs +570 -0
  47. data/core/fiber_error.rbs +11 -0
  48. data/core/file.rbs +2045 -0
  49. data/core/file_constants.rbs +463 -0
  50. data/core/file_stat.rbs +534 -0
  51. data/core/file_test.rbs +331 -0
  52. data/core/float.rbs +1316 -0
  53. data/core/gc.rbs +788 -0
  54. data/core/global_variables.rbs +184 -0
  55. data/core/hash.rbs +2183 -0
  56. data/core/integer.rbs +1374 -0
  57. data/core/io/buffer.rbs +995 -0
  58. data/core/io/wait.rbs +48 -0
  59. data/core/io.rbs +3472 -0
  60. data/core/kernel.rbs +3172 -0
  61. data/core/marshal.rbs +207 -0
  62. data/core/match_data.rbs +637 -0
  63. data/core/math.rbs +770 -0
  64. data/core/method.rbs +422 -0
  65. data/core/module.rbs +1856 -0
  66. data/core/nil_class.rbs +210 -0
  67. data/core/numeric.rbs +832 -0
  68. data/core/object.rbs +108 -0
  69. data/core/object_space/weak_key_map.rbs +166 -0
  70. data/core/object_space.rbs +197 -0
  71. data/core/pathname.rbs +1322 -0
  72. data/core/proc.rbs +905 -0
  73. data/core/process.rbs +2316 -0
  74. data/core/ractor.rbs +924 -0
  75. data/core/random.rbs +255 -0
  76. data/core/range.rbs +1209 -0
  77. data/core/rational.rbs +502 -0
  78. data/core/rb_config.rbs +88 -0
  79. data/core/rbs/ops.rbs +154 -0
  80. data/core/rbs/unnamed/argf.rbs +1236 -0
  81. data/core/rbs/unnamed/env_class.rbs +1214 -0
  82. data/core/rbs/unnamed/main_class.rbs +123 -0
  83. data/core/rbs/unnamed/random.rbs +186 -0
  84. data/core/refinement.rbs +59 -0
  85. data/core/regexp.rbs +1974 -0
  86. data/core/ruby.rbs +53 -0
  87. data/core/ruby_vm.rbs +809 -0
  88. data/core/rubygems/basic_specification.rbs +6 -0
  89. data/core/rubygems/config_file.rbs +38 -0
  90. data/core/rubygems/dependency_installer.rbs +6 -0
  91. data/core/rubygems/errors.rbs +109 -0
  92. data/core/rubygems/installer.rbs +15 -0
  93. data/core/rubygems/path_support.rbs +6 -0
  94. data/core/rubygems/platform.rbs +7 -0
  95. data/core/rubygems/request_set.rbs +49 -0
  96. data/core/rubygems/requirement.rbs +148 -0
  97. data/core/rubygems/rubygems.rbs +1105 -0
  98. data/core/rubygems/source_list.rbs +15 -0
  99. data/core/rubygems/specification.rbs +23 -0
  100. data/core/rubygems/stream_ui.rbs +5 -0
  101. data/core/rubygems/uninstaller.rbs +10 -0
  102. data/core/rubygems/version.rbs +293 -0
  103. data/core/set.rbs +751 -0
  104. data/core/signal.rbs +110 -0
  105. data/core/string.rbs +5532 -0
  106. data/core/struct.rbs +668 -0
  107. data/core/symbol.rbs +482 -0
  108. data/core/thread.rbs +1826 -0
  109. data/core/thread_group.rbs +79 -0
  110. data/core/time.rbs +1793 -0
  111. data/core/trace_point.rbs +483 -0
  112. data/core/true_class.rbs +98 -0
  113. data/core/unbound_method.rbs +337 -0
  114. data/core/warning.rbs +87 -0
  115. data/docs/CONTRIBUTING.md +107 -0
  116. data/docs/aliases.md +79 -0
  117. data/docs/architecture.md +110 -0
  118. data/docs/collection.md +192 -0
  119. data/docs/config.md +171 -0
  120. data/docs/data_and_struct.md +86 -0
  121. data/docs/encoding.md +56 -0
  122. data/docs/gem.md +56 -0
  123. data/docs/inline.md +634 -0
  124. data/docs/rbs_by_example.md +309 -0
  125. data/docs/repo.md +125 -0
  126. data/docs/rust.md +96 -0
  127. data/docs/sigs.md +167 -0
  128. data/docs/stdlib.md +147 -0
  129. data/docs/syntax.md +940 -0
  130. data/docs/tools.md +17 -0
  131. data/docs/type_fingerprint.md +21 -0
  132. data/docs/wasm_serialization.md +80 -0
  133. data/exe/rbs +7 -0
  134. data/ext/rbs_extension/ast_translation.c +1855 -0
  135. data/ext/rbs_extension/ast_translation.h +41 -0
  136. data/ext/rbs_extension/class_constants.c +187 -0
  137. data/ext/rbs_extension/class_constants.h +104 -0
  138. data/ext/rbs_extension/compat.h +10 -0
  139. data/ext/rbs_extension/extconf.rb +40 -0
  140. data/ext/rbs_extension/legacy_location.c +294 -0
  141. data/ext/rbs_extension/legacy_location.h +82 -0
  142. data/ext/rbs_extension/main.c +613 -0
  143. data/ext/rbs_extension/rbs_extension.h +16 -0
  144. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  145. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  146. data/goodcheck.yml +91 -0
  147. data/include/rbs/ast.h +1047 -0
  148. data/include/rbs/defines.h +99 -0
  149. data/include/rbs/lexer.h +207 -0
  150. data/include/rbs/location.h +40 -0
  151. data/include/rbs/parser.h +153 -0
  152. data/include/rbs/serialize.h +39 -0
  153. data/include/rbs/string.h +47 -0
  154. data/include/rbs/util/rbs_allocator.h +59 -0
  155. data/include/rbs/util/rbs_assert.h +20 -0
  156. data/include/rbs/util/rbs_buffer.h +83 -0
  157. data/include/rbs/util/rbs_constant_pool.h +155 -0
  158. data/include/rbs/util/rbs_encoding.h +282 -0
  159. data/include/rbs/util/rbs_unescape.h +24 -0
  160. data/include/rbs.h +14 -0
  161. data/lib/rbs/ancestor_graph.rb +92 -0
  162. data/lib/rbs/annotate/annotations.rb +199 -0
  163. data/lib/rbs/annotate/formatter.rb +82 -0
  164. data/lib/rbs/annotate/rdoc_annotator.rb +398 -0
  165. data/lib/rbs/annotate/rdoc_source.rb +131 -0
  166. data/lib/rbs/annotate.rb +8 -0
  167. data/lib/rbs/ast/annotation.rb +29 -0
  168. data/lib/rbs/ast/comment.rb +29 -0
  169. data/lib/rbs/ast/declarations.rb +472 -0
  170. data/lib/rbs/ast/directives.rb +49 -0
  171. data/lib/rbs/ast/members.rb +451 -0
  172. data/lib/rbs/ast/ruby/annotations.rb +451 -0
  173. data/lib/rbs/ast/ruby/comment_block.rb +247 -0
  174. data/lib/rbs/ast/ruby/declarations.rb +291 -0
  175. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  176. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  177. data/lib/rbs/ast/ruby/members.rb +762 -0
  178. data/lib/rbs/ast/type_param.rb +235 -0
  179. data/lib/rbs/ast/visitor.rb +137 -0
  180. data/lib/rbs/buffer.rb +189 -0
  181. data/lib/rbs/builtin_names.rb +58 -0
  182. data/lib/rbs/cli/colored_io.rb +48 -0
  183. data/lib/rbs/cli/diff.rb +84 -0
  184. data/lib/rbs/cli/validate.rb +294 -0
  185. data/lib/rbs/cli.rb +1253 -0
  186. data/lib/rbs/collection/cleaner.rb +38 -0
  187. data/lib/rbs/collection/config/lockfile.rb +92 -0
  188. data/lib/rbs/collection/config/lockfile_generator.rb +269 -0
  189. data/lib/rbs/collection/config.rb +81 -0
  190. data/lib/rbs/collection/installer.rb +32 -0
  191. data/lib/rbs/collection/sources/base.rb +14 -0
  192. data/lib/rbs/collection/sources/git.rb +265 -0
  193. data/lib/rbs/collection/sources/local.rb +81 -0
  194. data/lib/rbs/collection/sources/rubygems.rb +48 -0
  195. data/lib/rbs/collection/sources/stdlib.rb +50 -0
  196. data/lib/rbs/collection/sources.rb +38 -0
  197. data/lib/rbs/collection.rb +16 -0
  198. data/lib/rbs/constant.rb +28 -0
  199. data/lib/rbs/definition.rb +415 -0
  200. data/lib/rbs/definition_builder/ancestor_builder.rb +678 -0
  201. data/lib/rbs/definition_builder/method_builder.rb +295 -0
  202. data/lib/rbs/definition_builder.rb +1054 -0
  203. data/lib/rbs/diff.rb +131 -0
  204. data/lib/rbs/environment/class_entry.rb +69 -0
  205. data/lib/rbs/environment/module_entry.rb +66 -0
  206. data/lib/rbs/environment/use_map.rb +77 -0
  207. data/lib/rbs/environment.rb +1028 -0
  208. data/lib/rbs/environment_loader.rb +167 -0
  209. data/lib/rbs/environment_walker.rb +155 -0
  210. data/lib/rbs/errors.rb +634 -0
  211. data/lib/rbs/factory.rb +18 -0
  212. data/lib/rbs/file_finder.rb +28 -0
  213. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  214. data/lib/rbs/inline_parser.rb +568 -0
  215. data/lib/rbs/location_aux.rb +170 -0
  216. data/lib/rbs/locator.rb +247 -0
  217. data/lib/rbs/method_type.rb +145 -0
  218. data/lib/rbs/namespace.rb +154 -0
  219. data/lib/rbs/parser/lex_result.rb +15 -0
  220. data/lib/rbs/parser/token.rb +23 -0
  221. data/lib/rbs/parser_aux.rb +142 -0
  222. data/lib/rbs/prototype/helpers.rb +197 -0
  223. data/lib/rbs/prototype/node_usage.rb +99 -0
  224. data/lib/rbs/prototype/rb.rb +816 -0
  225. data/lib/rbs/prototype/rbi.rb +625 -0
  226. data/lib/rbs/prototype/runtime/helpers.rb +59 -0
  227. data/lib/rbs/prototype/runtime/reflection.rb +19 -0
  228. data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
  229. data/lib/rbs/prototype/runtime.rb +680 -0
  230. data/lib/rbs/repository.rb +127 -0
  231. data/lib/rbs/resolver/constant_resolver.rb +219 -0
  232. data/lib/rbs/resolver/type_name_resolver.rb +167 -0
  233. data/lib/rbs/rewriter.rb +70 -0
  234. data/lib/rbs/sorter.rb +198 -0
  235. data/lib/rbs/source.rb +99 -0
  236. data/lib/rbs/substitution.rb +83 -0
  237. data/lib/rbs/subtractor.rb +204 -0
  238. data/lib/rbs/test/errors.rb +80 -0
  239. data/lib/rbs/test/guaranteed.rb +30 -0
  240. data/lib/rbs/test/hook.rb +212 -0
  241. data/lib/rbs/test/observer.rb +19 -0
  242. data/lib/rbs/test/setup.rb +84 -0
  243. data/lib/rbs/test/setup_helper.rb +50 -0
  244. data/lib/rbs/test/tester.rb +167 -0
  245. data/lib/rbs/test/type_check.rb +457 -0
  246. data/lib/rbs/test.rb +112 -0
  247. data/lib/rbs/type_alias_dependency.rb +100 -0
  248. data/lib/rbs/type_alias_regularity.rb +126 -0
  249. data/lib/rbs/type_name.rb +122 -0
  250. data/lib/rbs/types.rb +1604 -0
  251. data/lib/rbs/unit_test/convertibles.rb +177 -0
  252. data/lib/rbs/unit_test/spy.rb +138 -0
  253. data/lib/rbs/unit_test/type_assertions.rb +383 -0
  254. data/lib/rbs/unit_test/with_aliases.rb +145 -0
  255. data/lib/rbs/unit_test.rb +6 -0
  256. data/lib/rbs/validator.rb +186 -0
  257. data/lib/rbs/variance_calculator.rb +189 -0
  258. data/lib/rbs/vendorer.rb +71 -0
  259. data/lib/rbs/version.rb +5 -0
  260. data/lib/rbs/wasm/deserializer.rb +213 -0
  261. data/lib/rbs/wasm/jars/asm-analysis.jar +0 -0
  262. data/lib/rbs/wasm/jars/asm-commons.jar +0 -0
  263. data/lib/rbs/wasm/jars/asm-tree.jar +0 -0
  264. data/lib/rbs/wasm/jars/asm-util.jar +0 -0
  265. data/lib/rbs/wasm/jars/asm.jar +0 -0
  266. data/lib/rbs/wasm/jars/compiler.jar +0 -0
  267. data/lib/rbs/wasm/jars/log.jar +0 -0
  268. data/lib/rbs/wasm/jars/runtime.jar +0 -0
  269. data/lib/rbs/wasm/jars/wasi.jar +0 -0
  270. data/lib/rbs/wasm/jars/wasm.jar +0 -0
  271. data/lib/rbs/wasm/location.rb +61 -0
  272. data/lib/rbs/wasm/parser.rb +137 -0
  273. data/lib/rbs/wasm/rbs_parser.wasm +0 -0
  274. data/lib/rbs/wasm/runtime.rb +217 -0
  275. data/lib/rbs/wasm/serialization_schema.rb +110 -0
  276. data/lib/rbs/writer.rb +424 -0
  277. data/lib/rbs.rb +117 -0
  278. data/lib/rdoc/discover.rb +20 -0
  279. data/lib/rdoc_plugin/parser.rb +163 -0
  280. data/rbs.gemspec +68 -0
  281. data/schema/annotation.json +14 -0
  282. data/schema/comment.json +26 -0
  283. data/schema/decls.json +326 -0
  284. data/schema/function.json +87 -0
  285. data/schema/location.json +56 -0
  286. data/schema/members.json +266 -0
  287. data/schema/methodType.json +50 -0
  288. data/schema/typeParam.json +52 -0
  289. data/schema/types.json +317 -0
  290. data/sig/ancestor_builder.rbs +163 -0
  291. data/sig/ancestor_graph.rbs +60 -0
  292. data/sig/annotate/annotations.rbs +102 -0
  293. data/sig/annotate/formatter.rbs +24 -0
  294. data/sig/annotate/rdoc_annotater.rbs +85 -0
  295. data/sig/annotate/rdoc_source.rbs +32 -0
  296. data/sig/annotation.rbs +27 -0
  297. data/sig/ast/ruby/annotations.rbs +470 -0
  298. data/sig/ast/ruby/comment_block.rbs +127 -0
  299. data/sig/ast/ruby/declarations.rbs +158 -0
  300. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  301. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  302. data/sig/ast/ruby/members.rbs +198 -0
  303. data/sig/buffer.rbs +108 -0
  304. data/sig/builtin_names.rbs +44 -0
  305. data/sig/cli/colored_io.rbs +15 -0
  306. data/sig/cli/diff.rbs +15 -0
  307. data/sig/cli/validate.rbs +47 -0
  308. data/sig/cli.rbs +89 -0
  309. data/sig/collection/cleaner.rbs +13 -0
  310. data/sig/collection/config/lockfile.rbs +74 -0
  311. data/sig/collection/config/lockfile_generator.rbs +68 -0
  312. data/sig/collection/config.rbs +46 -0
  313. data/sig/collection/installer.rbs +17 -0
  314. data/sig/collection/sources.rbs +214 -0
  315. data/sig/collection.rbs +4 -0
  316. data/sig/comment.rbs +26 -0
  317. data/sig/constant.rbs +21 -0
  318. data/sig/declarations.rbs +274 -0
  319. data/sig/definition.rbs +232 -0
  320. data/sig/definition_builder.rbs +181 -0
  321. data/sig/diff.rbs +28 -0
  322. data/sig/directives.rbs +77 -0
  323. data/sig/environment/class_entry.rbs +50 -0
  324. data/sig/environment/module_entry.rbs +50 -0
  325. data/sig/environment.rbs +286 -0
  326. data/sig/environment_loader.rbs +111 -0
  327. data/sig/environment_walker.rbs +65 -0
  328. data/sig/errors.rbs +408 -0
  329. data/sig/factory.rbs +5 -0
  330. data/sig/file_finder.rbs +28 -0
  331. data/sig/inline_parser/comment_association.rbs +71 -0
  332. data/sig/inline_parser.rbs +126 -0
  333. data/sig/location.rbs +135 -0
  334. data/sig/locator.rbs +56 -0
  335. data/sig/manifest.yaml +5 -0
  336. data/sig/members.rbs +258 -0
  337. data/sig/method_builder.rbs +89 -0
  338. data/sig/method_types.rbs +58 -0
  339. data/sig/namespace.rbs +161 -0
  340. data/sig/parser.rbs +164 -0
  341. data/sig/prototype/helpers.rbs +29 -0
  342. data/sig/prototype/node_usage.rbs +20 -0
  343. data/sig/prototype/rb.rbs +96 -0
  344. data/sig/prototype/rbi.rbs +75 -0
  345. data/sig/prototype/runtime.rbs +182 -0
  346. data/sig/rbs.rbs +21 -0
  347. data/sig/rdoc/rbs.rbs +67 -0
  348. data/sig/repository.rbs +85 -0
  349. data/sig/resolver/constant_resolver.rbs +92 -0
  350. data/sig/resolver/context.rbs +34 -0
  351. data/sig/resolver/type_name_resolver.rbs +61 -0
  352. data/sig/rewriter.rbs +45 -0
  353. data/sig/shims/bundler.rbs +38 -0
  354. data/sig/shims/enumerable.rbs +5 -0
  355. data/sig/shims/rubygems.rbs +19 -0
  356. data/sig/sorter.rbs +41 -0
  357. data/sig/source.rbs +48 -0
  358. data/sig/substitution.rbs +48 -0
  359. data/sig/subtractor.rbs +37 -0
  360. data/sig/test/errors.rbs +52 -0
  361. data/sig/test/guranteed.rbs +9 -0
  362. data/sig/test/type_check.rbs +19 -0
  363. data/sig/test.rbs +82 -0
  364. data/sig/type_alias_dependency.rbs +53 -0
  365. data/sig/type_alias_regularity.rbs +98 -0
  366. data/sig/type_param.rbs +115 -0
  367. data/sig/typename.rbs +89 -0
  368. data/sig/types.rbs +578 -0
  369. data/sig/unit_test/convertibles.rbs +154 -0
  370. data/sig/unit_test/spy.rbs +22 -0
  371. data/sig/unit_test/type_assertions.rbs +211 -0
  372. data/sig/unit_test/with_aliases.rbs +136 -0
  373. data/sig/use_map.rbs +35 -0
  374. data/sig/util.rbs +9 -0
  375. data/sig/validator.rbs +63 -0
  376. data/sig/variance_calculator.rbs +87 -0
  377. data/sig/vendorer.rbs +51 -0
  378. data/sig/version.rbs +3 -0
  379. data/sig/visitor.rbs +47 -0
  380. data/sig/wasm/deserializer.rbs +66 -0
  381. data/sig/wasm/serialization_schema.rbs +13 -0
  382. data/sig/writer.rbs +127 -0
  383. data/src/ast.c +1628 -0
  384. data/src/lexer.c +3217 -0
  385. data/src/lexer.re +155 -0
  386. data/src/lexstate.c +217 -0
  387. data/src/location.c +31 -0
  388. data/src/parser.c +4255 -0
  389. data/src/serialize.c +958 -0
  390. data/src/string.c +41 -0
  391. data/src/util/rbs_allocator.c +162 -0
  392. data/src/util/rbs_assert.c +19 -0
  393. data/src/util/rbs_buffer.c +54 -0
  394. data/src/util/rbs_constant_pool.c +268 -0
  395. data/src/util/rbs_encoding.c +21308 -0
  396. data/src/util/rbs_unescape.c +167 -0
  397. data/stdlib/abbrev/0/abbrev.rbs +66 -0
  398. data/stdlib/abbrev/0/array.rbs +26 -0
  399. data/stdlib/base64/0/base64.rbs +355 -0
  400. data/stdlib/benchmark/0/benchmark.rbs +452 -0
  401. data/stdlib/bigdecimal/0/big_decimal.rbs +1647 -0
  402. data/stdlib/bigdecimal-math/0/big_math.rbs +280 -0
  403. data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
  404. data/stdlib/cgi/0/core.rbs +911 -0
  405. data/stdlib/cgi/0/manifest.yaml +4 -0
  406. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  407. data/stdlib/coverage/0/coverage.rbs +266 -0
  408. data/stdlib/csv/0/csv.rbs +3776 -0
  409. data/stdlib/csv/0/manifest.yaml +3 -0
  410. data/stdlib/date/0/date.rbs +1598 -0
  411. data/stdlib/date/0/date_time.rbs +617 -0
  412. data/stdlib/date/0/time.rbs +26 -0
  413. data/stdlib/dbm/0/dbm.rbs +421 -0
  414. data/stdlib/delegate/0/delegator.rbs +187 -0
  415. data/stdlib/delegate/0/kernel.rbs +47 -0
  416. data/stdlib/delegate/0/simple_delegator.rbs +96 -0
  417. data/stdlib/did_you_mean/0/did_you_mean.rbs +344 -0
  418. data/stdlib/digest/0/digest.rbs +687 -0
  419. data/stdlib/erb/0/erb.rbs +933 -0
  420. data/stdlib/etc/0/etc.rbs +884 -0
  421. data/stdlib/fileutils/0/fileutils.rbs +1753 -0
  422. data/stdlib/find/0/find.rbs +49 -0
  423. data/stdlib/forwardable/0/forwardable.rbs +271 -0
  424. data/stdlib/io-console/0/io-console.rbs +414 -0
  425. data/stdlib/ipaddr/0/ipaddr.rbs +436 -0
  426. data/stdlib/json/0/json.rbs +1963 -0
  427. data/stdlib/kconv/0/kconv.rbs +166 -0
  428. data/stdlib/logger/0/formatter.rbs +45 -0
  429. data/stdlib/logger/0/log_device.rbs +100 -0
  430. data/stdlib/logger/0/logger.rbs +796 -0
  431. data/stdlib/logger/0/manifest.yaml +2 -0
  432. data/stdlib/logger/0/period.rbs +17 -0
  433. data/stdlib/logger/0/severity.rbs +34 -0
  434. data/stdlib/minitest/0/kernel.rbs +42 -0
  435. data/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
  436. data/stdlib/minitest/0/minitest/assertion.rbs +17 -0
  437. data/stdlib/minitest/0/minitest/assertions.rbs +590 -0
  438. data/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
  439. data/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
  440. data/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
  441. data/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
  442. data/stdlib/minitest/0/minitest/compress.rbs +13 -0
  443. data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
  444. data/stdlib/minitest/0/minitest/expectation.rbs +2 -0
  445. data/stdlib/minitest/0/minitest/expectations.rbs +21 -0
  446. data/stdlib/minitest/0/minitest/guard.rbs +64 -0
  447. data/stdlib/minitest/0/minitest/mock.rbs +64 -0
  448. data/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
  449. data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
  450. data/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
  451. data/stdlib/minitest/0/minitest/parallel.rbs +2 -0
  452. data/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
  453. data/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
  454. data/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
  455. data/stdlib/minitest/0/minitest/reportable.rbs +53 -0
  456. data/stdlib/minitest/0/minitest/reporter.rbs +5 -0
  457. data/stdlib/minitest/0/minitest/result.rbs +28 -0
  458. data/stdlib/minitest/0/minitest/runnable.rbs +163 -0
  459. data/stdlib/minitest/0/minitest/skip.rbs +6 -0
  460. data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
  461. data/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
  462. data/stdlib/minitest/0/minitest/spec.rbs +11 -0
  463. data/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
  464. data/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
  465. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
  466. data/stdlib/minitest/0/minitest/test.rbs +69 -0
  467. data/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
  468. data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
  469. data/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
  470. data/stdlib/minitest/0/minitest/unit.rbs +4 -0
  471. data/stdlib/minitest/0/minitest.rbs +115 -0
  472. data/stdlib/monitor/0/monitor.rbs +363 -0
  473. data/stdlib/mutex_m/0/mutex_m.rbs +104 -0
  474. data/stdlib/net-http/0/manifest.yaml +3 -0
  475. data/stdlib/net-http/0/net-http.rbs +5580 -0
  476. data/stdlib/net-protocol/0/manifest.yaml +2 -0
  477. data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
  478. data/stdlib/net-smtp/0/manifest.yaml +2 -0
  479. data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
  480. data/stdlib/nkf/0/nkf.rbs +402 -0
  481. data/stdlib/objspace/0/objspace.rbs +470 -0
  482. data/stdlib/observable/0/observable.rbs +217 -0
  483. data/stdlib/open-uri/0/manifest.yaml +4 -0
  484. data/stdlib/open-uri/0/open-uri.rbs +433 -0
  485. data/stdlib/open3/0/open3.rbs +606 -0
  486. data/stdlib/openssl/0/manifest.yaml +3 -0
  487. data/stdlib/openssl/0/openssl.rbs +12231 -0
  488. data/stdlib/optparse/0/optparse.rbs +1734 -0
  489. data/stdlib/pathname/0/pathname.rbs +36 -0
  490. data/stdlib/pp/0/manifest.yaml +2 -0
  491. data/stdlib/pp/0/pp.rbs +301 -0
  492. data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
  493. data/stdlib/pstore/0/pstore.rbs +608 -0
  494. data/stdlib/psych/0/core_ext.rbs +12 -0
  495. data/stdlib/psych/0/dbm.rbs +237 -0
  496. data/stdlib/psych/0/manifest.yaml +3 -0
  497. data/stdlib/psych/0/psych.rbs +455 -0
  498. data/stdlib/psych/0/store.rbs +57 -0
  499. data/stdlib/pty/0/pty.rbs +240 -0
  500. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  501. data/stdlib/rdoc/0/code_object.rbs +52 -0
  502. data/stdlib/rdoc/0/comment.rbs +61 -0
  503. data/stdlib/rdoc/0/context.rbs +153 -0
  504. data/stdlib/rdoc/0/markup.rbs +117 -0
  505. data/stdlib/rdoc/0/options.rbs +76 -0
  506. data/stdlib/rdoc/0/parser.rbs +56 -0
  507. data/stdlib/rdoc/0/rdoc.rbs +393 -0
  508. data/stdlib/rdoc/0/ri.rbs +17 -0
  509. data/stdlib/rdoc/0/store.rbs +48 -0
  510. data/stdlib/rdoc/0/top_level.rbs +97 -0
  511. data/stdlib/resolv/0/manifest.yaml +3 -0
  512. data/stdlib/resolv/0/resolv.rbs +1787 -0
  513. data/stdlib/ripper/0/ripper.rbs +1654 -0
  514. data/stdlib/securerandom/0/manifest.yaml +2 -0
  515. data/stdlib/securerandom/0/securerandom.rbs +49 -0
  516. data/stdlib/shellwords/0/shellwords.rbs +229 -0
  517. data/stdlib/singleton/0/singleton.rbs +134 -0
  518. data/stdlib/socket/0/addrinfo.rbs +666 -0
  519. data/stdlib/socket/0/basic_socket.rbs +590 -0
  520. data/stdlib/socket/0/constants.rbs +2295 -0
  521. data/stdlib/socket/0/ip_socket.rbs +94 -0
  522. data/stdlib/socket/0/socket.rbs +4170 -0
  523. data/stdlib/socket/0/socket_error.rbs +5 -0
  524. data/stdlib/socket/0/tcp_server.rbs +192 -0
  525. data/stdlib/socket/0/tcp_socket.rbs +87 -0
  526. data/stdlib/socket/0/udp_socket.rbs +133 -0
  527. data/stdlib/socket/0/unix_server.rbs +169 -0
  528. data/stdlib/socket/0/unix_socket.rbs +172 -0
  529. data/stdlib/stringio/0/stringio.rbs +1681 -0
  530. data/stdlib/strscan/0/string_scanner.rbs +1648 -0
  531. data/stdlib/tempfile/0/tempfile.rbs +483 -0
  532. data/stdlib/time/0/time.rbs +434 -0
  533. data/stdlib/timeout/0/timeout.rbs +137 -0
  534. data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
  535. data/stdlib/tsort/0/cyclic.rbs +8 -0
  536. data/stdlib/tsort/0/interfaces.rbs +20 -0
  537. data/stdlib/tsort/0/tsort.rbs +410 -0
  538. data/stdlib/uri/0/common.rbs +621 -0
  539. data/stdlib/uri/0/file.rbs +118 -0
  540. data/stdlib/uri/0/ftp.rbs +13 -0
  541. data/stdlib/uri/0/generic.rbs +1116 -0
  542. data/stdlib/uri/0/http.rbs +104 -0
  543. data/stdlib/uri/0/https.rbs +14 -0
  544. data/stdlib/uri/0/ldap.rbs +230 -0
  545. data/stdlib/uri/0/ldaps.rbs +14 -0
  546. data/stdlib/uri/0/mailto.rbs +92 -0
  547. data/stdlib/uri/0/rfc2396_parser.rbs +189 -0
  548. data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
  549. data/stdlib/uri/0/ws.rbs +13 -0
  550. data/stdlib/uri/0/wss.rbs +9 -0
  551. data/stdlib/yaml/0/manifest.yaml +2 -0
  552. data/stdlib/yaml/0/yaml.rbs +1 -0
  553. data/stdlib/zlib/0/buf_error.rbs +10 -0
  554. data/stdlib/zlib/0/data_error.rbs +10 -0
  555. data/stdlib/zlib/0/deflate.rbs +211 -0
  556. data/stdlib/zlib/0/error.rbs +20 -0
  557. data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
  558. data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
  559. data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
  560. data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
  561. data/stdlib/zlib/0/gzip_file.rbs +156 -0
  562. data/stdlib/zlib/0/gzip_reader.rbs +293 -0
  563. data/stdlib/zlib/0/gzip_writer.rbs +168 -0
  564. data/stdlib/zlib/0/inflate.rbs +180 -0
  565. data/stdlib/zlib/0/mem_error.rbs +10 -0
  566. data/stdlib/zlib/0/need_dict.rbs +13 -0
  567. data/stdlib/zlib/0/stream_end.rbs +11 -0
  568. data/stdlib/zlib/0/stream_error.rbs +11 -0
  569. data/stdlib/zlib/0/version_error.rbs +11 -0
  570. data/stdlib/zlib/0/zlib.rbs +449 -0
  571. data/stdlib/zlib/0/zstream.rbs +201 -0
  572. data/wasm/README.md +59 -0
  573. data/wasm/rbs_wasm.c +411 -0
  574. metadata +660 -0
@@ -0,0 +1,213 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "serialization_schema"
4
+
5
+ module RBS
6
+ module WASM
7
+ # Rebuilds RBS::AST objects from the binary buffer produced by
8
+ # `rbs_serialize_node` (src/serialize.c), driven by the generated
9
+ # SerializationSchema. This is the pure-Ruby counterpart of the C extension's
10
+ # ast_translation.c, used when the parser runs inside WebAssembly (JRuby).
11
+ #
12
+ # All locations are reconstructed through the public RBS::Location API, so the
13
+ # same code works whether RBS::Location is backed by the C extension (CRuby)
14
+ # or by a pure-Ruby implementation (JRuby).
15
+ class Deserializer
16
+ # Deserialize a buffer produced for a whole signature, returning
17
+ # `[directives, declarations]` to match RBS::Parser._parse_signature.
18
+ def self.deserialize(bytes, buffer)
19
+ new(bytes, buffer).read_node
20
+ end
21
+
22
+ # Deserialize a bare node list (rbs_serialize_node_list), e.g. the result
23
+ # of RBS::Parser._parse_type_params.
24
+ def self.deserialize_node_list(bytes, buffer)
25
+ new(bytes, buffer).read_node_list
26
+ end
27
+
28
+ # Deserialize the token stream produced by rbs_wasm_lex into the
29
+ # [type, location] pairs RBS::Parser._lex returns.
30
+ def self.deserialize_tokens(bytes, buffer)
31
+ new(bytes, buffer).read_tokens
32
+ end
33
+
34
+ def initialize(bytes, buffer)
35
+ @bytes = bytes
36
+ @buffer = buffer
37
+ # Symbols and rbs_string fields (comments, annotations) inherit the
38
+ # source encoding, matching ast_translation.c. String/Integer literal
39
+ # nodes are always UTF-8 (see read_node).
40
+ @encoding = buffer.content.encoding
41
+ @pos = 0
42
+ @class_cache = {} #: Hash[String, untyped]
43
+ end
44
+
45
+ def read_node
46
+ tag = read_u8
47
+ return nil if tag == 0
48
+ return read_string(@encoding).to_sym if tag == SerializationSchema::SYMBOL_TAG
49
+
50
+ entry = SerializationSchema::SCHEMA[tag] or raise "Unknown node tag: #{tag}"
51
+
52
+ case entry[0]
53
+ when :node then read_struct(entry)
54
+ when :bool then read_u8 != 0
55
+ when :integer then read_string(Encoding::UTF_8).to_i
56
+ when :string_value then read_string(Encoding::UTF_8)
57
+ when :record_field then [read_node, read_u8 != 0]
58
+ when :signature then [read_node_list, read_node_list]
59
+ when :namespace then RBS::Namespace[read_node_list, read_u8 != 0]
60
+ when :type_name then RBS::TypeName[read_node, read_node]
61
+ else raise "Unknown schema entry kind: #{entry[0].inspect}"
62
+ end
63
+ end
64
+
65
+ def read_node_list
66
+ Array.new(read_count) { read_node }
67
+ end
68
+
69
+ # The lex stream has no leading count: read records until the buffer is
70
+ # exhausted. Each is a token type name followed by its character range.
71
+ def read_tokens
72
+ tokens = [] #: Array[[ Symbol, Location ]]
73
+ until @pos >= @bytes.bytesize
74
+ type = read_string(Encoding::UTF_8).to_sym
75
+ start_char = read_i32
76
+ end_char = read_i32
77
+ tokens << [type, RBS::Location.new(@buffer, start_char, end_char)]
78
+ end
79
+ tokens
80
+ end
81
+
82
+ private
83
+
84
+ def read_struct(entry)
85
+ _, class_name, expose_location, loc_children, fields, resolve_type_params = entry
86
+
87
+ location = read_location(loc_children) if expose_location
88
+
89
+ kwargs = {} #: Hash[Symbol, untyped]
90
+ (fields || []).each do |name, reader|
91
+ kwargs[name] = read_field(reader)
92
+ end
93
+
94
+ RBS::AST::TypeParam.resolve_variables(kwargs[:type_params]) if resolve_type_params
95
+
96
+ klass = class_for(class_name)
97
+ if expose_location
98
+ klass.new(location: location, **kwargs)
99
+ else
100
+ klass.new(**kwargs)
101
+ end
102
+ end
103
+
104
+ def read_field(reader)
105
+ case reader
106
+ when :node then read_node
107
+ when :node_list then read_node_list
108
+ when :hash then read_hash
109
+ when :string then read_string(@encoding)
110
+ when :bool then read_u8 != 0
111
+ when :location_range then read_location_value
112
+ when :location_range_list then read_location_value_list
113
+ when :attr_ivar_name then read_attr_ivar_name
114
+ else # [:enum, [value_or_nil, ...]]
115
+ reader[1][read_u8]
116
+ end
117
+ end
118
+
119
+ def read_hash
120
+ hash = {} #: Hash[untyped, untyped]
121
+ read_count.times do
122
+ key = read_node
123
+ hash[key] = read_node
124
+ end
125
+ hash
126
+ end
127
+
128
+ # A count of nested items. Each item is at least one byte, so a count that
129
+ # exceeds the bytes remaining signals the cursor has drifted out of sync.
130
+ def read_count
131
+ count = read_u32
132
+ if count > @bytes.bytesize - @pos
133
+ raise "Corrupt buffer: count #{count} exceeds #{@bytes.bytesize - @pos} remaining bytes at offset #{@pos}"
134
+ end
135
+ count
136
+ end
137
+
138
+ # The base location of a node, followed by its named child ranges.
139
+ def read_location(loc_children)
140
+ base = read_range
141
+ children = (loc_children || []).map { |name, required| [name, required, read_range] }
142
+
143
+ return nil unless base
144
+
145
+ location = RBS::Location.new(@buffer, base[0], base[1])
146
+ children.each do |name, required, range|
147
+ if required
148
+ location.add_required_child(name, range[0]...range[1]) if range
149
+ else
150
+ location.add_optional_child(name, range ? (range[0]...range[1]) : nil)
151
+ end
152
+ end
153
+ location
154
+ end
155
+
156
+ # A standalone location range field: nil or an RBS::Location without children.
157
+ def read_location_value
158
+ range = read_range
159
+ range && RBS::Location.new(@buffer, range[0], range[1])
160
+ end
161
+
162
+ def read_location_value_list
163
+ Array.new(read_count) { read_location_value }
164
+ end
165
+
166
+ def read_attr_ivar_name
167
+ case read_u8
168
+ when 0 then nil # inferred instance variable
169
+ when 1 then false # no instance variable
170
+ else read_string(@encoding).to_sym
171
+ end
172
+ end
173
+
174
+ # Reads a presence byte and, when present, the start/end character positions.
175
+ def read_range
176
+ return nil if read_u8 == 0
177
+
178
+ start_char = read_i32
179
+ end_char = read_i32
180
+ [start_char, end_char]
181
+ end
182
+
183
+ def read_u8
184
+ byte = @bytes.getbyte(@pos) or raise "Unexpected end of buffer"
185
+ @pos += 1
186
+ byte
187
+ end
188
+
189
+ def read_u32
190
+ value = @bytes.unpack1("L<", offset: @pos) #: Integer
191
+ @pos += 4
192
+ value
193
+ end
194
+
195
+ def read_i32
196
+ value = @bytes.unpack1("l<", offset: @pos) #: Integer
197
+ @pos += 4
198
+ value
199
+ end
200
+
201
+ def read_string(encoding)
202
+ length = read_u32
203
+ string = @bytes.byteslice(@pos, length) or raise "Unexpected end of buffer"
204
+ @pos += length
205
+ string.force_encoding(encoding)
206
+ end
207
+
208
+ def class_for(name)
209
+ @class_cache[name] ||= Object.const_get(name)
210
+ end
211
+ end
212
+ end
213
+ end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ # Pure-Ruby implementation of the primitives that back RBS::Location.
5
+ #
6
+ # On CRuby these come from the C extension (ext/rbs_extension/legacy_location.c).
7
+ # JRuby loads this instead, before rbs/location_aux.rb layers the public API on
8
+ # top, so RBS::Location behaves identically without the native extension.
9
+ class Location
10
+ attr_reader :buffer
11
+
12
+ def initialize(buffer, start_pos, end_pos)
13
+ @buffer = buffer
14
+ @start_pos = start_pos
15
+ @end_pos = end_pos
16
+ @required_children = {} #: Hash[Symbol, [ Integer, Integer ]]
17
+ @optional_children = {} #: Hash[Symbol, [ Integer, Integer ]?]
18
+ end
19
+
20
+ def _start_pos
21
+ @start_pos
22
+ end
23
+
24
+ def _end_pos
25
+ @end_pos
26
+ end
27
+
28
+ def _add_required_child(name, start_pos, end_pos)
29
+ @required_children[name] = [start_pos, end_pos]
30
+ end
31
+
32
+ def _add_optional_child(name, start_pos, end_pos)
33
+ @optional_children[name] = [start_pos, end_pos]
34
+ end
35
+
36
+ def _add_optional_no_child(name)
37
+ @optional_children[name] = nil
38
+ end
39
+
40
+ def _required_keys
41
+ @required_children.keys
42
+ end
43
+
44
+ def _optional_keys
45
+ @optional_children.keys
46
+ end
47
+
48
+ def [](name)
49
+ if (range = @required_children[name])
50
+ return Location.new(@buffer, range[0], range[1])
51
+ end
52
+
53
+ if @optional_children.key?(name)
54
+ range = @optional_children[name]
55
+ return range && Location.new(@buffer, range[0], range[1])
56
+ end
57
+
58
+ raise "Unknown child name given: #{name}"
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "runtime"
4
+ require_relative "deserializer"
5
+
6
+ module RBS
7
+ # WebAssembly-backed implementation of the parser primitives.
8
+ #
9
+ # On CRuby these come from the C extension (ext/rbs_extension/main.c). JRuby
10
+ # loads this instead: it runs the parser inside WebAssembly, then rebuilds the
11
+ # AST with RBS::WASM::Deserializer. rbs/parser_aux.rb layers the public
12
+ # RBS::Parser API on top, exactly as it does for the C extension.
13
+ class Parser
14
+ class << self
15
+ def _parse_signature(buffer, start_pos, end_pos)
16
+ validate_position_range(start_pos, end_pos)
17
+ encoding = buffer.content.encoding.name
18
+ success, bytes = WASM::Runtime.instance.parse_signature(buffer.content, encoding, start_pos, end_pos)
19
+ raise_parsing_error(buffer, bytes) unless success
20
+
21
+ WASM::Deserializer.deserialize(bytes, buffer)
22
+ end
23
+
24
+ def _parse_type(buffer, start_pos, end_pos, variables, require_eof, void_allowed, self_allowed, classish_allowed)
25
+ validate_position_range(start_pos, end_pos)
26
+ validate_variables(variables)
27
+ encoding = buffer.content.encoding.name
28
+ success, bytes = WASM::Runtime.instance.parse_type(buffer.content, encoding, start_pos, end_pos, variables, require_eof, void_allowed, self_allowed, classish_allowed)
29
+ raise_parsing_error(buffer, bytes) unless success
30
+
31
+ deserialize_or_nil(bytes, buffer)
32
+ end
33
+
34
+ def _parse_method_type(buffer, start_pos, end_pos, variables, require_eof)
35
+ validate_position_range(start_pos, end_pos)
36
+ validate_variables(variables)
37
+ encoding = buffer.content.encoding.name
38
+ success, bytes = WASM::Runtime.instance.parse_method_type(buffer.content, encoding, start_pos, end_pos, variables, require_eof)
39
+ raise_parsing_error(buffer, bytes) unless success
40
+
41
+ deserialize_or_nil(bytes, buffer)
42
+ end
43
+
44
+ def _parse_type_params(buffer, start_pos, end_pos, module_type_params)
45
+ validate_position_range(start_pos, end_pos)
46
+ encoding = buffer.content.encoding.name
47
+ success, bytes = WASM::Runtime.instance.parse_type_params(buffer.content, encoding, start_pos, end_pos, module_type_params)
48
+ raise_parsing_error(buffer, bytes) unless success
49
+
50
+ bytes.empty? ? nil : WASM::Deserializer.deserialize_node_list(bytes, buffer)
51
+ end
52
+
53
+ def _lex(buffer, end_pos)
54
+ encoding = buffer.content.encoding.name
55
+ _success, bytes = WASM::Runtime.instance.lex(buffer.content, encoding, end_pos)
56
+
57
+ WASM::Deserializer.deserialize_tokens(bytes, buffer)
58
+ end
59
+
60
+ def _parse_inline_leading_annotation(buffer, start_pos, end_pos, variables)
61
+ validate_position_range(start_pos, end_pos)
62
+ validate_variables(variables)
63
+ encoding = buffer.content.encoding.name
64
+ success, bytes = WASM::Runtime.instance.parse_inline_leading_annotation(buffer.content, encoding, start_pos, end_pos, variables)
65
+ raise_parsing_error(buffer, bytes) unless success
66
+
67
+ deserialize_or_nil(bytes, buffer)
68
+ end
69
+
70
+ def _parse_inline_trailing_annotation(buffer, start_pos, end_pos, variables)
71
+ validate_position_range(start_pos, end_pos)
72
+ validate_variables(variables)
73
+ encoding = buffer.content.encoding.name
74
+ success, bytes = WASM::Runtime.instance.parse_inline_trailing_annotation(buffer.content, encoding, start_pos, end_pos, variables)
75
+ raise_parsing_error(buffer, bytes) unless success
76
+
77
+ deserialize_or_nil(bytes, buffer)
78
+ end
79
+
80
+ private
81
+
82
+ # Reject negative or reversed ranges before handing them to the parser,
83
+ # matching validate_position_range in the C extension (main.c). A reversed
84
+ # range would otherwise make the lexer loop forever inside WebAssembly.
85
+ def validate_position_range(start_pos, end_pos)
86
+ if start_pos < 0 || end_pos < 0
87
+ raise ArgumentError, "negative position range: #{start_pos}...#{end_pos}"
88
+ end
89
+ if start_pos > end_pos
90
+ raise ArgumentError, "invalid position range: #{start_pos}...#{end_pos}"
91
+ end
92
+ end
93
+
94
+ # Reject anything that is not nil or an Array of Symbols, matching
95
+ # declare_type_variables in the C extension (main.c).
96
+ def validate_variables(variables)
97
+ return if variables.nil?
98
+
99
+ unless variables.is_a?(Array)
100
+ raise TypeError, "wrong argument type #{variables.class} (must be an Array of Symbols or nil)"
101
+ end
102
+
103
+ variables.each do |variable|
104
+ unless variable.is_a?(Symbol)
105
+ raise TypeError, "Type variables Array contains invalid value #{variable.inspect} of type #{variable.class} (must be an Array of Symbols or nil)"
106
+ end
107
+ end
108
+ end
109
+
110
+ # An empty result means the parser reached EOF immediately (`nil`).
111
+ def deserialize_or_nil(bytes, buffer)
112
+ bytes.empty? ? nil : WASM::Deserializer.deserialize(bytes, buffer)
113
+ end
114
+
115
+ # Decodes the error blob written by set_error_result (rbs_wasm.c) and raises
116
+ # the same error the C extension would (see raise_error in main.c).
117
+ def raise_parsing_error(buffer, blob)
118
+ start_char, end_char, syntax_error = blob.unpack("l<l<C")
119
+
120
+ raise "Unexpected error" if syntax_error.zero?
121
+
122
+ offset = 9
123
+ token_type_length = blob.unpack1("L<", offset: offset)
124
+ offset += 4
125
+ token_type = blob.byteslice(offset, token_type_length).to_s.force_encoding(Encoding::UTF_8)
126
+ offset += token_type_length
127
+
128
+ message_length = blob.unpack1("L<", offset: offset)
129
+ offset += 4
130
+ message = blob.byteslice(offset, message_length).to_s.force_encoding(Encoding::UTF_8)
131
+
132
+ location = Location.new(buffer, start_char, end_char)
133
+ raise ParsingError.new(location, message, token_type)
134
+ end
135
+ end
136
+ end
137
+ end
Binary file
@@ -0,0 +1,217 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "java"
4
+ require "monitor"
5
+
6
+ module RBS
7
+ module WASM
8
+ # Loads rbs_parser.wasm into a JVM WebAssembly runtime (Chicory) and drives
9
+ # it. This is the JRuby counterpart of the C extension's main.c: it copies a
10
+ # source string into the module's linear memory, runs the parser, and returns
11
+ # the serialized result for RBS::WASM::Deserializer to rebuild.
12
+ #
13
+ # Chicory is a pure-Java runtime, so there is no native dependency: only the
14
+ # `.wasm` and the Chicory jars need to ship with the gem.
15
+ class Runtime
16
+ include MonitorMixin
17
+
18
+ # The Chicory jars the runtime needs at load time.
19
+ # Jars Chicory needs to load and run the module.
20
+ JARS = %w[wasm runtime log wasi].freeze
21
+
22
+ # Jars for Chicory's ahead-of-time compiler (wasm -> JVM bytecode), which
23
+ # runs the parser ~8x faster than the interpreter. Optional: the runtime
24
+ # falls back to the interpreter when they are absent. asm* are the ow2 ASM
25
+ # libraries the compiler depends on.
26
+ OPTIONAL_JARS = %w[compiler asm asm-tree asm-util asm-commons asm-analysis].freeze
27
+
28
+ class << self
29
+ def instance
30
+ @instance ||= new
31
+ end
32
+
33
+ def wasm_path
34
+ ENV["RBS_WASM_PARSER"] || File.expand_path("rbs_parser.wasm", __dir__)
35
+ end
36
+
37
+ def jars_dir
38
+ ENV["RBS_WASM_JARS"] || File.expand_path("jars", __dir__)
39
+ end
40
+ end
41
+
42
+ def initialize
43
+ super()
44
+ load_jars
45
+ @wasm = build_instance
46
+ @memory = @wasm.memory
47
+ @alloc = @wasm.export("rbs_wasm_alloc")
48
+ @free = @wasm.export("rbs_wasm_free")
49
+ @result_ptr = @wasm.export("rbs_wasm_result_ptr")
50
+ @result_len = @wasm.export("rbs_wasm_result_len")
51
+ @parse_signature = @wasm.export("rbs_wasm_parse_signature")
52
+ @parse_type = @wasm.export("rbs_wasm_parse_type")
53
+ @parse_method_type = @wasm.export("rbs_wasm_parse_method_type")
54
+ @parse_type_params = @wasm.export("rbs_wasm_parse_type_params")
55
+ @parse_inline_leading_annotation = @wasm.export("rbs_wasm_parse_inline_leading_annotation")
56
+ @parse_inline_trailing_annotation = @wasm.export("rbs_wasm_parse_inline_trailing_annotation")
57
+ @lex = @wasm.export("rbs_wasm_lex")
58
+ end
59
+
60
+ # `content` is the whole buffer; `start_pos`/`end_pos` are the character
61
+ # range within it to parse. Each method returns [success, bytes]: on success
62
+ # `bytes` is the serialized AST, otherwise it is the error blob (see
63
+ # set_error_result in rbs_wasm.c).
64
+
65
+ def parse_signature(content, encoding, start_pos, end_pos)
66
+ run(content, encoding) { |ptr, len, enc_ptr, enc_len| @parse_signature.apply(ptr, len, enc_ptr, enc_len, start_pos, end_pos)[0] }
67
+ end
68
+
69
+ def parse_type(content, encoding, start_pos, end_pos, variables, require_eof, void_allowed, self_allowed, classish_allowed)
70
+ with_variables(variables) do |vars_ptr, vars_len|
71
+ run(content, encoding) do |ptr, len, enc_ptr, enc_len|
72
+ @parse_type.apply(ptr, len, enc_ptr, enc_len, start_pos, end_pos, vars_ptr, vars_len, bool(require_eof), bool(void_allowed), bool(self_allowed), bool(classish_allowed))[0]
73
+ end
74
+ end
75
+ end
76
+
77
+ def parse_method_type(content, encoding, start_pos, end_pos, variables, require_eof)
78
+ with_variables(variables) do |vars_ptr, vars_len|
79
+ run(content, encoding) do |ptr, len, enc_ptr, enc_len|
80
+ @parse_method_type.apply(ptr, len, enc_ptr, enc_len, start_pos, end_pos, vars_ptr, vars_len, bool(require_eof))[0]
81
+ end
82
+ end
83
+ end
84
+
85
+ def parse_type_params(content, encoding, start_pos, end_pos, module_type_params)
86
+ run(content, encoding) do |ptr, len, enc_ptr, enc_len|
87
+ @parse_type_params.apply(ptr, len, enc_ptr, enc_len, start_pos, end_pos, bool(module_type_params))[0]
88
+ end
89
+ end
90
+
91
+ def parse_inline_leading_annotation(content, encoding, start_pos, end_pos, variables)
92
+ with_variables(variables) do |vars_ptr, vars_len|
93
+ run(content, encoding) do |ptr, len, enc_ptr, enc_len|
94
+ @parse_inline_leading_annotation.apply(ptr, len, enc_ptr, enc_len, start_pos, end_pos, vars_ptr, vars_len)[0]
95
+ end
96
+ end
97
+ end
98
+
99
+ def parse_inline_trailing_annotation(content, encoding, start_pos, end_pos, variables)
100
+ with_variables(variables) do |vars_ptr, vars_len|
101
+ run(content, encoding) do |ptr, len, enc_ptr, enc_len|
102
+ @parse_inline_trailing_annotation.apply(ptr, len, enc_ptr, enc_len, start_pos, end_pos, vars_ptr, vars_len)[0]
103
+ end
104
+ end
105
+ end
106
+
107
+ def lex(content, encoding, end_pos)
108
+ run(content, encoding) do |ptr, len, enc_ptr, enc_len|
109
+ @lex.apply(ptr, len, enc_ptr, enc_len, end_pos)[0]
110
+ end
111
+ end
112
+
113
+ private
114
+
115
+ # Copies `source` and its encoding name into linear memory, yields their
116
+ # pointers/lengths to the block (which invokes the parser and returns its
117
+ # status), then reads the result back out. Serialized through the monitor
118
+ # because the module keeps its result in a single shared location.
119
+ def run(source, encoding)
120
+ synchronize do
121
+ bytes = source.b
122
+ length = bytes.bytesize
123
+ name = encoding.to_s.b
124
+ name_length = name.bytesize
125
+ source_ptr = @alloc.apply(length)[0]
126
+ name_ptr = @alloc.apply(name_length)[0]
127
+ begin
128
+ @memory.write(source_ptr, bytes.to_java_bytes)
129
+ @memory.write(name_ptr, name.to_java_bytes) unless name_length.zero?
130
+ status = yield(source_ptr, length, name_ptr, name_length)
131
+ [status == 1, read_result]
132
+ ensure
133
+ @free.apply(source_ptr)
134
+ @free.apply(name_ptr)
135
+ end
136
+ end
137
+ end
138
+
139
+ def read_result
140
+ pointer = @result_ptr.apply[0]
141
+ length = @result_len.apply[0]
142
+ return "".b if length.zero?
143
+
144
+ String.from_java_bytes(@memory.read_bytes(pointer, length)).b
145
+ end
146
+
147
+ # Allocates a buffer of newline-separated variable names and yields its
148
+ # pointer/length. A nil `variables` is passed as length -1 ("no variables").
149
+ def with_variables(variables)
150
+ names = variables&.map(&:to_s)&.join("\n")
151
+
152
+ if names.nil? || names.empty?
153
+ return yield(0, variables.nil? ? -1 : 0)
154
+ end
155
+
156
+ bytes = names.b
157
+ length = bytes.bytesize
158
+ synchronize do
159
+ pointer = @alloc.apply(length)[0]
160
+ begin
161
+ @memory.write(pointer, bytes.to_java_bytes)
162
+ yield(pointer, length)
163
+ ensure
164
+ @free.apply(pointer)
165
+ end
166
+ end
167
+ end
168
+
169
+ def bool(value)
170
+ value ? 1 : 0
171
+ end
172
+
173
+ def build_instance
174
+ parser = Java::ComDylibsoChicoryWasm::Parser
175
+ instance_class = Java::ComDylibsoChicoryRuntime::Instance
176
+ import_values = Java::ComDylibsoChicoryRuntime::ImportValues
177
+ wasi_preview1 = Java::ComDylibsoChicoryWasi::WasiPreview1
178
+ wasi_options = Java::ComDylibsoChicoryWasi::WasiOptions
179
+
180
+ wasm_module = parser.parse(java.io.File.new(self.class.wasm_path))
181
+ wasi = wasi_preview1.builder.with_options(wasi_options.builder.build).build
182
+ imports = import_values.builder.add_function(wasi.to_host_functions).build
183
+
184
+ builder = instance_class.builder(wasm_module).with_import_values(imports)
185
+ if (factory = machine_factory(wasm_module))
186
+ builder = builder.with_machine_factory(factory)
187
+ end
188
+
189
+ wasm = builder.build
190
+ wasm.export("_initialize").apply
191
+ wasm
192
+ end
193
+
194
+ # Chicory's AOT compiler when its jars are present and usable, otherwise nil
195
+ # (the builder then uses the interpreter). NameError covers a missing
196
+ # compiler class; LinkageError covers an incompatible/missing ASM (so a bad
197
+ # jar set degrades to the interpreter instead of crashing).
198
+ def machine_factory(wasm_module)
199
+ Java::ComDylibsoChicoryCompiler::MachineFactoryCompiler.compile(wasm_module)
200
+ rescue NameError, Java::JavaLang::LinkageError
201
+ nil
202
+ end
203
+
204
+ def load_jars
205
+ JARS.each { |name| require jar_path(name) }
206
+ OPTIONAL_JARS.each do |name|
207
+ path = jar_path(name)
208
+ require path if File.exist?(path)
209
+ end
210
+ end
211
+
212
+ def jar_path(name)
213
+ File.join(self.class.jars_dir, "#{name}.jar")
214
+ end
215
+ end
216
+ end
217
+ end