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.
- checksums.yaml +7 -0
- data/.clang-format +75 -0
- data/.clangd +2 -0
- data/.github/dependabot.yml +24 -0
- data/.github/workflows/bundle-update.yml +63 -0
- data/.github/workflows/c-check.yml +61 -0
- data/.github/workflows/comments.yml +37 -0
- data/.github/workflows/dependabot.yml +30 -0
- data/.github/workflows/jruby.yml +67 -0
- data/.github/workflows/milestone.yml +83 -0
- data/.github/workflows/ruby.yml +158 -0
- data/.github/workflows/rust.yml +184 -0
- data/.github/workflows/truffleruby.yml +54 -0
- data/.github/workflows/typecheck.yml +39 -0
- data/.github/workflows/wasm.yml +53 -0
- data/.github/workflows/windows.yml +49 -0
- data/.gitignore +38 -0
- data/.rubocop.yml +72 -0
- data/BSDL +22 -0
- data/CHANGELOG.md +2292 -0
- data/COPYING +56 -0
- data/README.md +240 -0
- data/Rakefile +869 -0
- data/Steepfile +53 -0
- data/config.yml +913 -0
- data/core/array.rbs +4142 -0
- data/core/basic_object.rbs +376 -0
- data/core/binding.rbs +148 -0
- data/core/builtin.rbs +278 -0
- data/core/class.rbs +223 -0
- data/core/comparable.rbs +192 -0
- data/core/complex.rbs +812 -0
- data/core/constants.rbs +96 -0
- data/core/data.rbs +415 -0
- data/core/dir.rbs +993 -0
- data/core/encoding.rbs +1368 -0
- data/core/enumerable.rbs +2506 -0
- data/core/enumerator/arithmetic_sequence.rbs +70 -0
- data/core/enumerator/product.rbs +92 -0
- data/core/enumerator.rbs +705 -0
- data/core/env.rbs +6 -0
- data/core/errno.rbs +682 -0
- data/core/errors.rbs +789 -0
- data/core/exception.rbs +485 -0
- data/core/false_class.rbs +82 -0
- data/core/fiber.rbs +570 -0
- data/core/fiber_error.rbs +11 -0
- data/core/file.rbs +2045 -0
- data/core/file_constants.rbs +463 -0
- data/core/file_stat.rbs +534 -0
- data/core/file_test.rbs +331 -0
- data/core/float.rbs +1316 -0
- data/core/gc.rbs +788 -0
- data/core/global_variables.rbs +184 -0
- data/core/hash.rbs +2183 -0
- data/core/integer.rbs +1374 -0
- data/core/io/buffer.rbs +995 -0
- data/core/io/wait.rbs +48 -0
- data/core/io.rbs +3472 -0
- data/core/kernel.rbs +3172 -0
- data/core/marshal.rbs +207 -0
- data/core/match_data.rbs +637 -0
- data/core/math.rbs +770 -0
- data/core/method.rbs +422 -0
- data/core/module.rbs +1856 -0
- data/core/nil_class.rbs +210 -0
- data/core/numeric.rbs +832 -0
- data/core/object.rbs +108 -0
- data/core/object_space/weak_key_map.rbs +166 -0
- data/core/object_space.rbs +197 -0
- data/core/pathname.rbs +1322 -0
- data/core/proc.rbs +905 -0
- data/core/process.rbs +2316 -0
- data/core/ractor.rbs +924 -0
- data/core/random.rbs +255 -0
- data/core/range.rbs +1209 -0
- data/core/rational.rbs +502 -0
- data/core/rb_config.rbs +88 -0
- data/core/rbs/ops.rbs +154 -0
- data/core/rbs/unnamed/argf.rbs +1236 -0
- data/core/rbs/unnamed/env_class.rbs +1214 -0
- data/core/rbs/unnamed/main_class.rbs +123 -0
- data/core/rbs/unnamed/random.rbs +186 -0
- data/core/refinement.rbs +59 -0
- data/core/regexp.rbs +1974 -0
- data/core/ruby.rbs +53 -0
- data/core/ruby_vm.rbs +809 -0
- data/core/rubygems/basic_specification.rbs +6 -0
- data/core/rubygems/config_file.rbs +38 -0
- data/core/rubygems/dependency_installer.rbs +6 -0
- data/core/rubygems/errors.rbs +109 -0
- data/core/rubygems/installer.rbs +15 -0
- data/core/rubygems/path_support.rbs +6 -0
- data/core/rubygems/platform.rbs +7 -0
- data/core/rubygems/request_set.rbs +49 -0
- data/core/rubygems/requirement.rbs +148 -0
- data/core/rubygems/rubygems.rbs +1105 -0
- data/core/rubygems/source_list.rbs +15 -0
- data/core/rubygems/specification.rbs +23 -0
- data/core/rubygems/stream_ui.rbs +5 -0
- data/core/rubygems/uninstaller.rbs +10 -0
- data/core/rubygems/version.rbs +293 -0
- data/core/set.rbs +751 -0
- data/core/signal.rbs +110 -0
- data/core/string.rbs +5532 -0
- data/core/struct.rbs +668 -0
- data/core/symbol.rbs +482 -0
- data/core/thread.rbs +1826 -0
- data/core/thread_group.rbs +79 -0
- data/core/time.rbs +1793 -0
- data/core/trace_point.rbs +483 -0
- data/core/true_class.rbs +98 -0
- data/core/unbound_method.rbs +337 -0
- data/core/warning.rbs +87 -0
- data/docs/CONTRIBUTING.md +107 -0
- data/docs/aliases.md +79 -0
- data/docs/architecture.md +110 -0
- data/docs/collection.md +192 -0
- data/docs/config.md +171 -0
- data/docs/data_and_struct.md +86 -0
- data/docs/encoding.md +56 -0
- data/docs/gem.md +56 -0
- data/docs/inline.md +634 -0
- data/docs/rbs_by_example.md +309 -0
- data/docs/repo.md +125 -0
- data/docs/rust.md +96 -0
- data/docs/sigs.md +167 -0
- data/docs/stdlib.md +147 -0
- data/docs/syntax.md +940 -0
- data/docs/tools.md +17 -0
- data/docs/type_fingerprint.md +21 -0
- data/docs/wasm_serialization.md +80 -0
- data/exe/rbs +7 -0
- data/ext/rbs_extension/ast_translation.c +1855 -0
- data/ext/rbs_extension/ast_translation.h +41 -0
- data/ext/rbs_extension/class_constants.c +187 -0
- data/ext/rbs_extension/class_constants.h +104 -0
- data/ext/rbs_extension/compat.h +10 -0
- data/ext/rbs_extension/extconf.rb +40 -0
- data/ext/rbs_extension/legacy_location.c +294 -0
- data/ext/rbs_extension/legacy_location.h +82 -0
- data/ext/rbs_extension/main.c +613 -0
- data/ext/rbs_extension/rbs_extension.h +16 -0
- data/ext/rbs_extension/rbs_string_bridging.c +9 -0
- data/ext/rbs_extension/rbs_string_bridging.h +24 -0
- data/goodcheck.yml +91 -0
- data/include/rbs/ast.h +1047 -0
- data/include/rbs/defines.h +99 -0
- data/include/rbs/lexer.h +207 -0
- data/include/rbs/location.h +40 -0
- data/include/rbs/parser.h +153 -0
- data/include/rbs/serialize.h +39 -0
- data/include/rbs/string.h +47 -0
- data/include/rbs/util/rbs_allocator.h +59 -0
- data/include/rbs/util/rbs_assert.h +20 -0
- data/include/rbs/util/rbs_buffer.h +83 -0
- data/include/rbs/util/rbs_constant_pool.h +155 -0
- data/include/rbs/util/rbs_encoding.h +282 -0
- data/include/rbs/util/rbs_unescape.h +24 -0
- data/include/rbs.h +14 -0
- data/lib/rbs/ancestor_graph.rb +92 -0
- data/lib/rbs/annotate/annotations.rb +199 -0
- data/lib/rbs/annotate/formatter.rb +82 -0
- data/lib/rbs/annotate/rdoc_annotator.rb +398 -0
- data/lib/rbs/annotate/rdoc_source.rb +131 -0
- data/lib/rbs/annotate.rb +8 -0
- data/lib/rbs/ast/annotation.rb +29 -0
- data/lib/rbs/ast/comment.rb +29 -0
- data/lib/rbs/ast/declarations.rb +472 -0
- data/lib/rbs/ast/directives.rb +49 -0
- data/lib/rbs/ast/members.rb +451 -0
- data/lib/rbs/ast/ruby/annotations.rb +451 -0
- data/lib/rbs/ast/ruby/comment_block.rb +247 -0
- data/lib/rbs/ast/ruby/declarations.rb +291 -0
- data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
- data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
- data/lib/rbs/ast/ruby/members.rb +762 -0
- data/lib/rbs/ast/type_param.rb +235 -0
- data/lib/rbs/ast/visitor.rb +137 -0
- data/lib/rbs/buffer.rb +189 -0
- data/lib/rbs/builtin_names.rb +58 -0
- data/lib/rbs/cli/colored_io.rb +48 -0
- data/lib/rbs/cli/diff.rb +84 -0
- data/lib/rbs/cli/validate.rb +294 -0
- data/lib/rbs/cli.rb +1253 -0
- data/lib/rbs/collection/cleaner.rb +38 -0
- data/lib/rbs/collection/config/lockfile.rb +92 -0
- data/lib/rbs/collection/config/lockfile_generator.rb +269 -0
- data/lib/rbs/collection/config.rb +81 -0
- data/lib/rbs/collection/installer.rb +32 -0
- data/lib/rbs/collection/sources/base.rb +14 -0
- data/lib/rbs/collection/sources/git.rb +265 -0
- data/lib/rbs/collection/sources/local.rb +81 -0
- data/lib/rbs/collection/sources/rubygems.rb +48 -0
- data/lib/rbs/collection/sources/stdlib.rb +50 -0
- data/lib/rbs/collection/sources.rb +38 -0
- data/lib/rbs/collection.rb +16 -0
- data/lib/rbs/constant.rb +28 -0
- data/lib/rbs/definition.rb +415 -0
- data/lib/rbs/definition_builder/ancestor_builder.rb +678 -0
- data/lib/rbs/definition_builder/method_builder.rb +295 -0
- data/lib/rbs/definition_builder.rb +1054 -0
- data/lib/rbs/diff.rb +131 -0
- data/lib/rbs/environment/class_entry.rb +69 -0
- data/lib/rbs/environment/module_entry.rb +66 -0
- data/lib/rbs/environment/use_map.rb +77 -0
- data/lib/rbs/environment.rb +1028 -0
- data/lib/rbs/environment_loader.rb +167 -0
- data/lib/rbs/environment_walker.rb +155 -0
- data/lib/rbs/errors.rb +634 -0
- data/lib/rbs/factory.rb +18 -0
- data/lib/rbs/file_finder.rb +28 -0
- data/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/lib/rbs/inline_parser.rb +568 -0
- data/lib/rbs/location_aux.rb +170 -0
- data/lib/rbs/locator.rb +247 -0
- data/lib/rbs/method_type.rb +145 -0
- data/lib/rbs/namespace.rb +154 -0
- data/lib/rbs/parser/lex_result.rb +15 -0
- data/lib/rbs/parser/token.rb +23 -0
- data/lib/rbs/parser_aux.rb +142 -0
- data/lib/rbs/prototype/helpers.rb +197 -0
- data/lib/rbs/prototype/node_usage.rb +99 -0
- data/lib/rbs/prototype/rb.rb +816 -0
- data/lib/rbs/prototype/rbi.rb +625 -0
- data/lib/rbs/prototype/runtime/helpers.rb +59 -0
- data/lib/rbs/prototype/runtime/reflection.rb +19 -0
- data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
- data/lib/rbs/prototype/runtime.rb +680 -0
- data/lib/rbs/repository.rb +127 -0
- data/lib/rbs/resolver/constant_resolver.rb +219 -0
- data/lib/rbs/resolver/type_name_resolver.rb +167 -0
- data/lib/rbs/rewriter.rb +70 -0
- data/lib/rbs/sorter.rb +198 -0
- data/lib/rbs/source.rb +99 -0
- data/lib/rbs/substitution.rb +83 -0
- data/lib/rbs/subtractor.rb +204 -0
- data/lib/rbs/test/errors.rb +80 -0
- data/lib/rbs/test/guaranteed.rb +30 -0
- data/lib/rbs/test/hook.rb +212 -0
- data/lib/rbs/test/observer.rb +19 -0
- data/lib/rbs/test/setup.rb +84 -0
- data/lib/rbs/test/setup_helper.rb +50 -0
- data/lib/rbs/test/tester.rb +167 -0
- data/lib/rbs/test/type_check.rb +457 -0
- data/lib/rbs/test.rb +112 -0
- data/lib/rbs/type_alias_dependency.rb +100 -0
- data/lib/rbs/type_alias_regularity.rb +126 -0
- data/lib/rbs/type_name.rb +122 -0
- data/lib/rbs/types.rb +1604 -0
- data/lib/rbs/unit_test/convertibles.rb +177 -0
- data/lib/rbs/unit_test/spy.rb +138 -0
- data/lib/rbs/unit_test/type_assertions.rb +383 -0
- data/lib/rbs/unit_test/with_aliases.rb +145 -0
- data/lib/rbs/unit_test.rb +6 -0
- data/lib/rbs/validator.rb +186 -0
- data/lib/rbs/variance_calculator.rb +189 -0
- data/lib/rbs/vendorer.rb +71 -0
- data/lib/rbs/version.rb +5 -0
- data/lib/rbs/wasm/deserializer.rb +213 -0
- data/lib/rbs/wasm/jars/asm-analysis.jar +0 -0
- data/lib/rbs/wasm/jars/asm-commons.jar +0 -0
- data/lib/rbs/wasm/jars/asm-tree.jar +0 -0
- data/lib/rbs/wasm/jars/asm-util.jar +0 -0
- data/lib/rbs/wasm/jars/asm.jar +0 -0
- data/lib/rbs/wasm/jars/compiler.jar +0 -0
- data/lib/rbs/wasm/jars/log.jar +0 -0
- data/lib/rbs/wasm/jars/runtime.jar +0 -0
- data/lib/rbs/wasm/jars/wasi.jar +0 -0
- data/lib/rbs/wasm/jars/wasm.jar +0 -0
- data/lib/rbs/wasm/location.rb +61 -0
- data/lib/rbs/wasm/parser.rb +137 -0
- data/lib/rbs/wasm/rbs_parser.wasm +0 -0
- data/lib/rbs/wasm/runtime.rb +217 -0
- data/lib/rbs/wasm/serialization_schema.rb +110 -0
- data/lib/rbs/writer.rb +424 -0
- data/lib/rbs.rb +117 -0
- data/lib/rdoc/discover.rb +20 -0
- data/lib/rdoc_plugin/parser.rb +163 -0
- data/rbs.gemspec +68 -0
- data/schema/annotation.json +14 -0
- data/schema/comment.json +26 -0
- data/schema/decls.json +326 -0
- data/schema/function.json +87 -0
- data/schema/location.json +56 -0
- data/schema/members.json +266 -0
- data/schema/methodType.json +50 -0
- data/schema/typeParam.json +52 -0
- data/schema/types.json +317 -0
- data/sig/ancestor_builder.rbs +163 -0
- data/sig/ancestor_graph.rbs +60 -0
- data/sig/annotate/annotations.rbs +102 -0
- data/sig/annotate/formatter.rbs +24 -0
- data/sig/annotate/rdoc_annotater.rbs +85 -0
- data/sig/annotate/rdoc_source.rbs +32 -0
- data/sig/annotation.rbs +27 -0
- data/sig/ast/ruby/annotations.rbs +470 -0
- data/sig/ast/ruby/comment_block.rbs +127 -0
- data/sig/ast/ruby/declarations.rbs +158 -0
- data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
- data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
- data/sig/ast/ruby/members.rbs +198 -0
- data/sig/buffer.rbs +108 -0
- data/sig/builtin_names.rbs +44 -0
- data/sig/cli/colored_io.rbs +15 -0
- data/sig/cli/diff.rbs +15 -0
- data/sig/cli/validate.rbs +47 -0
- data/sig/cli.rbs +89 -0
- data/sig/collection/cleaner.rbs +13 -0
- data/sig/collection/config/lockfile.rbs +74 -0
- data/sig/collection/config/lockfile_generator.rbs +68 -0
- data/sig/collection/config.rbs +46 -0
- data/sig/collection/installer.rbs +17 -0
- data/sig/collection/sources.rbs +214 -0
- data/sig/collection.rbs +4 -0
- data/sig/comment.rbs +26 -0
- data/sig/constant.rbs +21 -0
- data/sig/declarations.rbs +274 -0
- data/sig/definition.rbs +232 -0
- data/sig/definition_builder.rbs +181 -0
- data/sig/diff.rbs +28 -0
- data/sig/directives.rbs +77 -0
- data/sig/environment/class_entry.rbs +50 -0
- data/sig/environment/module_entry.rbs +50 -0
- data/sig/environment.rbs +286 -0
- data/sig/environment_loader.rbs +111 -0
- data/sig/environment_walker.rbs +65 -0
- data/sig/errors.rbs +408 -0
- data/sig/factory.rbs +5 -0
- data/sig/file_finder.rbs +28 -0
- data/sig/inline_parser/comment_association.rbs +71 -0
- data/sig/inline_parser.rbs +126 -0
- data/sig/location.rbs +135 -0
- data/sig/locator.rbs +56 -0
- data/sig/manifest.yaml +5 -0
- data/sig/members.rbs +258 -0
- data/sig/method_builder.rbs +89 -0
- data/sig/method_types.rbs +58 -0
- data/sig/namespace.rbs +161 -0
- data/sig/parser.rbs +164 -0
- data/sig/prototype/helpers.rbs +29 -0
- data/sig/prototype/node_usage.rbs +20 -0
- data/sig/prototype/rb.rbs +96 -0
- data/sig/prototype/rbi.rbs +75 -0
- data/sig/prototype/runtime.rbs +182 -0
- data/sig/rbs.rbs +21 -0
- data/sig/rdoc/rbs.rbs +67 -0
- data/sig/repository.rbs +85 -0
- data/sig/resolver/constant_resolver.rbs +92 -0
- data/sig/resolver/context.rbs +34 -0
- data/sig/resolver/type_name_resolver.rbs +61 -0
- data/sig/rewriter.rbs +45 -0
- data/sig/shims/bundler.rbs +38 -0
- data/sig/shims/enumerable.rbs +5 -0
- data/sig/shims/rubygems.rbs +19 -0
- data/sig/sorter.rbs +41 -0
- data/sig/source.rbs +48 -0
- data/sig/substitution.rbs +48 -0
- data/sig/subtractor.rbs +37 -0
- data/sig/test/errors.rbs +52 -0
- data/sig/test/guranteed.rbs +9 -0
- data/sig/test/type_check.rbs +19 -0
- data/sig/test.rbs +82 -0
- data/sig/type_alias_dependency.rbs +53 -0
- data/sig/type_alias_regularity.rbs +98 -0
- data/sig/type_param.rbs +115 -0
- data/sig/typename.rbs +89 -0
- data/sig/types.rbs +578 -0
- data/sig/unit_test/convertibles.rbs +154 -0
- data/sig/unit_test/spy.rbs +22 -0
- data/sig/unit_test/type_assertions.rbs +211 -0
- data/sig/unit_test/with_aliases.rbs +136 -0
- data/sig/use_map.rbs +35 -0
- data/sig/util.rbs +9 -0
- data/sig/validator.rbs +63 -0
- data/sig/variance_calculator.rbs +87 -0
- data/sig/vendorer.rbs +51 -0
- data/sig/version.rbs +3 -0
- data/sig/visitor.rbs +47 -0
- data/sig/wasm/deserializer.rbs +66 -0
- data/sig/wasm/serialization_schema.rbs +13 -0
- data/sig/writer.rbs +127 -0
- data/src/ast.c +1628 -0
- data/src/lexer.c +3217 -0
- data/src/lexer.re +155 -0
- data/src/lexstate.c +217 -0
- data/src/location.c +31 -0
- data/src/parser.c +4255 -0
- data/src/serialize.c +958 -0
- data/src/string.c +41 -0
- data/src/util/rbs_allocator.c +162 -0
- data/src/util/rbs_assert.c +19 -0
- data/src/util/rbs_buffer.c +54 -0
- data/src/util/rbs_constant_pool.c +268 -0
- data/src/util/rbs_encoding.c +21308 -0
- data/src/util/rbs_unescape.c +167 -0
- data/stdlib/abbrev/0/abbrev.rbs +66 -0
- data/stdlib/abbrev/0/array.rbs +26 -0
- data/stdlib/base64/0/base64.rbs +355 -0
- data/stdlib/benchmark/0/benchmark.rbs +452 -0
- data/stdlib/bigdecimal/0/big_decimal.rbs +1647 -0
- data/stdlib/bigdecimal-math/0/big_math.rbs +280 -0
- data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
- data/stdlib/cgi/0/core.rbs +911 -0
- data/stdlib/cgi/0/manifest.yaml +4 -0
- data/stdlib/cgi-escape/0/escape.rbs +171 -0
- data/stdlib/coverage/0/coverage.rbs +266 -0
- data/stdlib/csv/0/csv.rbs +3776 -0
- data/stdlib/csv/0/manifest.yaml +3 -0
- data/stdlib/date/0/date.rbs +1598 -0
- data/stdlib/date/0/date_time.rbs +617 -0
- data/stdlib/date/0/time.rbs +26 -0
- data/stdlib/dbm/0/dbm.rbs +421 -0
- data/stdlib/delegate/0/delegator.rbs +187 -0
- data/stdlib/delegate/0/kernel.rbs +47 -0
- data/stdlib/delegate/0/simple_delegator.rbs +96 -0
- data/stdlib/did_you_mean/0/did_you_mean.rbs +344 -0
- data/stdlib/digest/0/digest.rbs +687 -0
- data/stdlib/erb/0/erb.rbs +933 -0
- data/stdlib/etc/0/etc.rbs +884 -0
- data/stdlib/fileutils/0/fileutils.rbs +1753 -0
- data/stdlib/find/0/find.rbs +49 -0
- data/stdlib/forwardable/0/forwardable.rbs +271 -0
- data/stdlib/io-console/0/io-console.rbs +414 -0
- data/stdlib/ipaddr/0/ipaddr.rbs +436 -0
- data/stdlib/json/0/json.rbs +1963 -0
- data/stdlib/kconv/0/kconv.rbs +166 -0
- data/stdlib/logger/0/formatter.rbs +45 -0
- data/stdlib/logger/0/log_device.rbs +100 -0
- data/stdlib/logger/0/logger.rbs +796 -0
- data/stdlib/logger/0/manifest.yaml +2 -0
- data/stdlib/logger/0/period.rbs +17 -0
- data/stdlib/logger/0/severity.rbs +34 -0
- data/stdlib/minitest/0/kernel.rbs +42 -0
- data/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
- data/stdlib/minitest/0/minitest/assertion.rbs +17 -0
- data/stdlib/minitest/0/minitest/assertions.rbs +590 -0
- data/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
- data/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
- data/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
- data/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
- data/stdlib/minitest/0/minitest/compress.rbs +13 -0
- data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
- data/stdlib/minitest/0/minitest/expectation.rbs +2 -0
- data/stdlib/minitest/0/minitest/expectations.rbs +21 -0
- data/stdlib/minitest/0/minitest/guard.rbs +64 -0
- data/stdlib/minitest/0/minitest/mock.rbs +64 -0
- data/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
- data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
- data/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
- data/stdlib/minitest/0/minitest/parallel.rbs +2 -0
- data/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
- data/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
- data/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
- data/stdlib/minitest/0/minitest/reportable.rbs +53 -0
- data/stdlib/minitest/0/minitest/reporter.rbs +5 -0
- data/stdlib/minitest/0/minitest/result.rbs +28 -0
- data/stdlib/minitest/0/minitest/runnable.rbs +163 -0
- data/stdlib/minitest/0/minitest/skip.rbs +6 -0
- data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
- data/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
- data/stdlib/minitest/0/minitest/spec.rbs +11 -0
- data/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
- data/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
- data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
- data/stdlib/minitest/0/minitest/test.rbs +69 -0
- data/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
- data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
- data/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
- data/stdlib/minitest/0/minitest/unit.rbs +4 -0
- data/stdlib/minitest/0/minitest.rbs +115 -0
- data/stdlib/monitor/0/monitor.rbs +363 -0
- data/stdlib/mutex_m/0/mutex_m.rbs +104 -0
- data/stdlib/net-http/0/manifest.yaml +3 -0
- data/stdlib/net-http/0/net-http.rbs +5580 -0
- data/stdlib/net-protocol/0/manifest.yaml +2 -0
- data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
- data/stdlib/net-smtp/0/manifest.yaml +2 -0
- data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
- data/stdlib/nkf/0/nkf.rbs +402 -0
- data/stdlib/objspace/0/objspace.rbs +470 -0
- data/stdlib/observable/0/observable.rbs +217 -0
- data/stdlib/open-uri/0/manifest.yaml +4 -0
- data/stdlib/open-uri/0/open-uri.rbs +433 -0
- data/stdlib/open3/0/open3.rbs +606 -0
- data/stdlib/openssl/0/manifest.yaml +3 -0
- data/stdlib/openssl/0/openssl.rbs +12231 -0
- data/stdlib/optparse/0/optparse.rbs +1734 -0
- data/stdlib/pathname/0/pathname.rbs +36 -0
- data/stdlib/pp/0/manifest.yaml +2 -0
- data/stdlib/pp/0/pp.rbs +301 -0
- data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
- data/stdlib/pstore/0/pstore.rbs +608 -0
- data/stdlib/psych/0/core_ext.rbs +12 -0
- data/stdlib/psych/0/dbm.rbs +237 -0
- data/stdlib/psych/0/manifest.yaml +3 -0
- data/stdlib/psych/0/psych.rbs +455 -0
- data/stdlib/psych/0/store.rbs +57 -0
- data/stdlib/pty/0/pty.rbs +240 -0
- data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
- data/stdlib/rdoc/0/code_object.rbs +52 -0
- data/stdlib/rdoc/0/comment.rbs +61 -0
- data/stdlib/rdoc/0/context.rbs +153 -0
- data/stdlib/rdoc/0/markup.rbs +117 -0
- data/stdlib/rdoc/0/options.rbs +76 -0
- data/stdlib/rdoc/0/parser.rbs +56 -0
- data/stdlib/rdoc/0/rdoc.rbs +393 -0
- data/stdlib/rdoc/0/ri.rbs +17 -0
- data/stdlib/rdoc/0/store.rbs +48 -0
- data/stdlib/rdoc/0/top_level.rbs +97 -0
- data/stdlib/resolv/0/manifest.yaml +3 -0
- data/stdlib/resolv/0/resolv.rbs +1787 -0
- data/stdlib/ripper/0/ripper.rbs +1654 -0
- data/stdlib/securerandom/0/manifest.yaml +2 -0
- data/stdlib/securerandom/0/securerandom.rbs +49 -0
- data/stdlib/shellwords/0/shellwords.rbs +229 -0
- data/stdlib/singleton/0/singleton.rbs +134 -0
- data/stdlib/socket/0/addrinfo.rbs +666 -0
- data/stdlib/socket/0/basic_socket.rbs +590 -0
- data/stdlib/socket/0/constants.rbs +2295 -0
- data/stdlib/socket/0/ip_socket.rbs +94 -0
- data/stdlib/socket/0/socket.rbs +4170 -0
- data/stdlib/socket/0/socket_error.rbs +5 -0
- data/stdlib/socket/0/tcp_server.rbs +192 -0
- data/stdlib/socket/0/tcp_socket.rbs +87 -0
- data/stdlib/socket/0/udp_socket.rbs +133 -0
- data/stdlib/socket/0/unix_server.rbs +169 -0
- data/stdlib/socket/0/unix_socket.rbs +172 -0
- data/stdlib/stringio/0/stringio.rbs +1681 -0
- data/stdlib/strscan/0/string_scanner.rbs +1648 -0
- data/stdlib/tempfile/0/tempfile.rbs +483 -0
- data/stdlib/time/0/time.rbs +434 -0
- data/stdlib/timeout/0/timeout.rbs +137 -0
- data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
- data/stdlib/tsort/0/cyclic.rbs +8 -0
- data/stdlib/tsort/0/interfaces.rbs +20 -0
- data/stdlib/tsort/0/tsort.rbs +410 -0
- data/stdlib/uri/0/common.rbs +621 -0
- data/stdlib/uri/0/file.rbs +118 -0
- data/stdlib/uri/0/ftp.rbs +13 -0
- data/stdlib/uri/0/generic.rbs +1116 -0
- data/stdlib/uri/0/http.rbs +104 -0
- data/stdlib/uri/0/https.rbs +14 -0
- data/stdlib/uri/0/ldap.rbs +230 -0
- data/stdlib/uri/0/ldaps.rbs +14 -0
- data/stdlib/uri/0/mailto.rbs +92 -0
- data/stdlib/uri/0/rfc2396_parser.rbs +189 -0
- data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
- data/stdlib/uri/0/ws.rbs +13 -0
- data/stdlib/uri/0/wss.rbs +9 -0
- data/stdlib/yaml/0/manifest.yaml +2 -0
- data/stdlib/yaml/0/yaml.rbs +1 -0
- data/stdlib/zlib/0/buf_error.rbs +10 -0
- data/stdlib/zlib/0/data_error.rbs +10 -0
- data/stdlib/zlib/0/deflate.rbs +211 -0
- data/stdlib/zlib/0/error.rbs +20 -0
- data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
- data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
- data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
- data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
- data/stdlib/zlib/0/gzip_file.rbs +156 -0
- data/stdlib/zlib/0/gzip_reader.rbs +293 -0
- data/stdlib/zlib/0/gzip_writer.rbs +168 -0
- data/stdlib/zlib/0/inflate.rbs +180 -0
- data/stdlib/zlib/0/mem_error.rbs +10 -0
- data/stdlib/zlib/0/need_dict.rbs +13 -0
- data/stdlib/zlib/0/stream_end.rbs +11 -0
- data/stdlib/zlib/0/stream_error.rbs +11 -0
- data/stdlib/zlib/0/version_error.rbs +11 -0
- data/stdlib/zlib/0/zlib.rbs +449 -0
- data/stdlib/zlib/0/zstream.rbs +201 -0
- data/wasm/README.md +59 -0
- data/wasm/rbs_wasm.c +411 -0
- 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
|