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,110 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
This guide describes the outline of the architecture of RBS library. It helps you to understand the structure and key features of the library to start contributing to the library.
|
|
4
|
+
|
|
5
|
+
## Bird's Eye View
|
|
6
|
+
|
|
7
|
+
The goal of the library is simple: Read RBS files and generate the structure of Ruby programs.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
RBS files
|
|
11
|
+
↓ -- RBS::Parser
|
|
12
|
+
Syntax tree
|
|
13
|
+
↓
|
|
14
|
+
Environment
|
|
15
|
+
↓ -- Definition builder
|
|
16
|
+
Definition
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The input is RBS files. The gem ships with RBS type definitions of Ruby core library and some of the standard libraries. You write RBS files for your applications or gems.
|
|
20
|
+
|
|
21
|
+
Syntax tree is the next representation. `RBS::Parser` transforms the sequence of characters in RBS files into syntax trees.
|
|
22
|
+
|
|
23
|
+
Syntax tree objects are loaded to `RBS::Environment`. It collects loaded RBS objects, organizes the definitions, and provides some utilities, like resolving type names and finding the declarations.
|
|
24
|
+
|
|
25
|
+
`RBS::Definition` is the goal of the transformation steps. It is associated with a class singleton, a class object, or an interface. You can find the list of available methods and their types, instance variables, and class hierarchies.
|
|
26
|
+
|
|
27
|
+
## Core classes
|
|
28
|
+
|
|
29
|
+
### Types
|
|
30
|
+
|
|
31
|
+
Types are defined under `RBS::Types`, like `RBS::Types::ClassInstance` or `RBS::Types::Union`. You will find the definition of each type supported in RBS.
|
|
32
|
+
|
|
33
|
+
### Parsing RBS files
|
|
34
|
+
|
|
35
|
+
The RBS source code is loaded into `RBS::Buffer`, and `RBS::Parser` is the parser. The parser is implemented in C extension.
|
|
36
|
+
|
|
37
|
+
`RBS::Parser` provides three entrypoints.
|
|
38
|
+
|
|
39
|
+
- `RBS::Parser.parse_method_type` parsers a *method type*. (`[T] (String) { (IO) -> T } -> Array[T]`)
|
|
40
|
+
- `RBS::Parser.parse_type` parses a *type*. (`Hash[Symbol, untyped]`)
|
|
41
|
+
- `RBS::Parser.parse_signature` parses the whole RBS file.
|
|
42
|
+
|
|
43
|
+
### Environment
|
|
44
|
+
|
|
45
|
+
RBS AST is loaded to `RBS::Environment` by `RBS::EnvironmentLoader`. `Environment` gives *absolute names* to the declarations, and provides an index from the *absolute name* to their declarations.
|
|
46
|
+
|
|
47
|
+
Assume we have the following nested RBS declarations:
|
|
48
|
+
|
|
49
|
+
```rbs
|
|
50
|
+
module Hello
|
|
51
|
+
class World
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
class Hello::World
|
|
56
|
+
end
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
And the environment organizes the definitions as follows:
|
|
60
|
+
|
|
61
|
+
- There are two classes `::Hello` and `::Hello::World`
|
|
62
|
+
- It provides a mapping from `::Hello` to it's `module` declaration and `::Hello::World` to it's two `class` declarations
|
|
63
|
+
|
|
64
|
+
### Definition and DefinitionBuilder
|
|
65
|
+
|
|
66
|
+
`RBS::Definition` tells you:
|
|
67
|
+
|
|
68
|
+
- The set of available methods in a class/module/interface
|
|
69
|
+
- The set of instance variables in a class/module
|
|
70
|
+
- The ancestors in a class/module
|
|
71
|
+
|
|
72
|
+
Definition is constructed for:
|
|
73
|
+
|
|
74
|
+
- A singleton class of a class/module -- `singleton(String)`, `singleton(Array)`,
|
|
75
|
+
- An instance of a class -- `String`, `Array[T]`, or
|
|
76
|
+
- An interface -- `_ToS`
|
|
77
|
+
|
|
78
|
+
Note that generic class instances/interfaces are kept generic. We don't have a definition of `Array[String]` but of `Array[T]`.
|
|
79
|
+
|
|
80
|
+
`DefinitionBuilder` constructs `Definition` of given type names.
|
|
81
|
+
|
|
82
|
+
- `DefinitionBuilder#build_singleton` returns a definition of singleton classes of given class/module.
|
|
83
|
+
- `DefinitionBuilder#build_instance` returns a definition of instances of given class/module.
|
|
84
|
+
- `DefinitionBuilder#build_interface` returns a definition of interfaces.
|
|
85
|
+
|
|
86
|
+
It uses `AncestorBuilder` to construct ancestor chains of the type. `MethodBuilder` constructs sets of available methods based on the ancestor chains.
|
|
87
|
+
|
|
88
|
+
The `#build_singleton` calculates the type of `.new` methods based on the definition of `#initialize` method. This is different from Ruby's implementation -- it reused `Class#new` method but we need the custom implementation to give precise `.new` method type of each class.
|
|
89
|
+
|
|
90
|
+
#### Working with type aliases
|
|
91
|
+
|
|
92
|
+
`DefinitionBuilder#expand_alias` and its variants provide one step *unfold* operation of type aliases.
|
|
93
|
+
|
|
94
|
+
```ruby
|
|
95
|
+
builder.expand_alias2(RBS::TypeName.parse("::int"), []) # => returns `::Integer | ::_ToInt`
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
We don't have *normalize* operation for type aliases, because RBS allows recursive type alias definition, which cannot be *fully* unfolded.
|
|
99
|
+
|
|
100
|
+
### Other utilities
|
|
101
|
+
|
|
102
|
+
`RBS::Validator` provides validation of RBS type declaration. It validates that all of the type name references can be resolved, all type applications have correct arity, and so on.
|
|
103
|
+
|
|
104
|
+
`RBS::Test` provides runtime type checking, which confirms if a Ruby object can have an RBS type. It also provides an integration to existing Ruby code so that we run Ruby code, assuming unit tests, with runtime type checking.
|
|
105
|
+
|
|
106
|
+
`RBS::UnitTest` provides utilities to help write unit tests for RBS type definitions. Use the tool to make sure your RBS type definition is consistent with implementation.
|
|
107
|
+
|
|
108
|
+
`RBS::Prototype` is the core of `rbs prototype` feature. It scans Ruby source code or uses reflection features, and it generates the prototype of RBS files.
|
|
109
|
+
|
|
110
|
+
`RBS::Collection` includes `rbs collection` features.
|
data/docs/collection.md
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# RBS Collection manager
|
|
2
|
+
|
|
3
|
+
`rbs collection` sub command manages third party gems' RBS. In short, it is `bundler` for RBS.
|
|
4
|
+
|
|
5
|
+
## Requirements
|
|
6
|
+
|
|
7
|
+
* `git(1)`
|
|
8
|
+
* `Gemfile.lock`
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
### Setup
|
|
13
|
+
|
|
14
|
+
First, generate the configuration file, `rbs_collection.yaml`, with `rbs collection init`.
|
|
15
|
+
|
|
16
|
+
```console
|
|
17
|
+
$ rbs collection init
|
|
18
|
+
created: rbs_collection.yaml
|
|
19
|
+
|
|
20
|
+
$ cat rbs_collection.yaml
|
|
21
|
+
# Download sources
|
|
22
|
+
sources:
|
|
23
|
+
- name: ruby/gem_rbs_collection
|
|
24
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
25
|
+
revision: main
|
|
26
|
+
repo_dir: gems
|
|
27
|
+
|
|
28
|
+
# A directory to install the downloaded RBSs
|
|
29
|
+
path: .gem_rbs_collection
|
|
30
|
+
|
|
31
|
+
# gems:
|
|
32
|
+
# # If you want to avoid installing rbs files for gems, you can specify them here.
|
|
33
|
+
# - name: GEM_NAME
|
|
34
|
+
# ignore: true
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
I also recommend updating `.gitignore`.
|
|
38
|
+
|
|
39
|
+
```console
|
|
40
|
+
$ echo /.gem_rbs_collection/ >> .gitignore
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Install dependencies
|
|
44
|
+
|
|
45
|
+
Then, install gems' RBS with `rbs collection install`! It copies RBS from [the gem RBS repository](https://github.com/ruby/gem_rbs_collection) to `.gem_rbs_collection/` directory by default.
|
|
46
|
+
I recommend to ignore `.gem_rbs_collection/` from version control system, such as Git.
|
|
47
|
+
|
|
48
|
+
```console
|
|
49
|
+
$ rbs collection install
|
|
50
|
+
Installing ast:2.4 (ruby/gem_rbs_collection@4b1a2a2f64c)
|
|
51
|
+
...
|
|
52
|
+
It's done! 42 gems's RBSs now installed.
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Finally the third party RBSs are available! `rbs` commands, such as `rbs validate`, automatically load the third party RBSs.
|
|
56
|
+
|
|
57
|
+
### Other commands
|
|
58
|
+
|
|
59
|
+
`rbs collection` has two more commands.
|
|
60
|
+
|
|
61
|
+
* `rbs collection update` updates `rbs_collection.lock.yaml`.
|
|
62
|
+
* `rbs collection clean` removes unnecessary rbs from `.gem_rbs_collection` directory.
|
|
63
|
+
|
|
64
|
+
## Configuration
|
|
65
|
+
|
|
66
|
+
### `rbs_collection.yaml`
|
|
67
|
+
|
|
68
|
+
Configure `rbs collection` with editing `rbs_collection.yaml`.
|
|
69
|
+
|
|
70
|
+
```yaml
|
|
71
|
+
# rbs_collection.yaml
|
|
72
|
+
|
|
73
|
+
# Download sources.
|
|
74
|
+
# You can add own collection git repository.
|
|
75
|
+
sources:
|
|
76
|
+
- name: ruby/gem_rbs_collection
|
|
77
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
78
|
+
revision: main
|
|
79
|
+
repo_dir: gems
|
|
80
|
+
|
|
81
|
+
# You can also add a local path as a collection source optionally.
|
|
82
|
+
- type: local
|
|
83
|
+
path: path/to/local/dir
|
|
84
|
+
|
|
85
|
+
# A directory to install the downloaded RBSs
|
|
86
|
+
path: .gem_rbs_collection
|
|
87
|
+
|
|
88
|
+
gems:
|
|
89
|
+
# If the Gemfile.lock doesn't contain csv gem but you use csv gem,
|
|
90
|
+
# you can write the gem name explicitly to install RBS of the gem.
|
|
91
|
+
- name: csv
|
|
92
|
+
|
|
93
|
+
# If the Gemfile.lock contains nokogiri gem but you don't want to use the RBS,
|
|
94
|
+
# you can ignore the gem.
|
|
95
|
+
# `rbs collection` avoids to install nokogiri gem's RBS by this change.
|
|
96
|
+
# It is useful if the nokogiri RBS has a problem, such as compatibility issue with other RBS.
|
|
97
|
+
- name: nokogiri
|
|
98
|
+
ignore: true
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Avoid installing RBS
|
|
102
|
+
|
|
103
|
+
There are two ways to avoid RBS installation.
|
|
104
|
+
|
|
105
|
+
#### `require: false` in `Gemfile`
|
|
106
|
+
|
|
107
|
+
First, you can specify `require: false` in `Gemfile`. It is the recommended way to avoid installing RBS.
|
|
108
|
+
For example:
|
|
109
|
+
|
|
110
|
+
```ruby
|
|
111
|
+
# Gemfile
|
|
112
|
+
|
|
113
|
+
gem 'GEM_NAME', require: false
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
In this case, `rbs collection` doesn't install the RBS of `GEM_NAME`.
|
|
117
|
+
We recommend to specify `require: false` for `rbs` gem itself because `rbs` gem's RBS file is not necessary in most cases.
|
|
118
|
+
|
|
119
|
+
#### `ignore: true` in `rbs_collection.yaml`
|
|
120
|
+
|
|
121
|
+
Second, you can write `ignore: true` in `rbs_collection.yaml`. It is useful if you want to avoid installing RBS but you need to require the gem.
|
|
122
|
+
|
|
123
|
+
```yaml
|
|
124
|
+
# rbs_collection.yaml
|
|
125
|
+
|
|
126
|
+
gems:
|
|
127
|
+
- name: GEM_NAME
|
|
128
|
+
ignore: true
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
#### Load RBS specified `require: false`
|
|
132
|
+
|
|
133
|
+
You can also use `ignore: false` if you want to install RBS for a gem which you specify `require: false` in `Gemfile`.
|
|
134
|
+
For example:
|
|
135
|
+
|
|
136
|
+
```ruby
|
|
137
|
+
# Gemfile
|
|
138
|
+
|
|
139
|
+
gem 'GEM_NAME', require: false
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
```yaml
|
|
143
|
+
# rbs_collection.yaml
|
|
144
|
+
|
|
145
|
+
gems:
|
|
146
|
+
- name: GEM_NAME
|
|
147
|
+
ignore: false
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
In this case, `rbs collection` installs the RBS of `GEM_NAME`.
|
|
151
|
+
|
|
152
|
+
### `manifest.yaml`
|
|
153
|
+
|
|
154
|
+
If you are a gem maintainer, you can write `manifest.yaml`.
|
|
155
|
+
You need to put the file if the gem has implicit dependencies, which don't appear in `Gemfile.lock`. You have to write standard libraries' dependencies in most cases.
|
|
156
|
+
For example:
|
|
157
|
+
|
|
158
|
+
```yaml
|
|
159
|
+
# manifest.yaml
|
|
160
|
+
|
|
161
|
+
dependencies:
|
|
162
|
+
# If your gem depends on logger but the gemspec doesn't include logger,
|
|
163
|
+
# you need to write the following.
|
|
164
|
+
- name: logger
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
If the gem's RBS is managed with [ruby/gem_rbs_collection](https://github.com/ruby/gem_rbs_collection), put it as `gems/GEM_NAME/VERSION/manifest.yaml`. For example, `gems/activesupport/6.0/manifest.yaml`.
|
|
168
|
+
If the gem's RBS is included in the gem package, put it as `sig/manifest.yaml`.
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
## Files / Directories
|
|
172
|
+
|
|
173
|
+
* `rbs_collection.yaml`
|
|
174
|
+
* The configuration file.
|
|
175
|
+
* You need to edit it if:
|
|
176
|
+
* You don't want to ignore gem's RBS.
|
|
177
|
+
* You want to add gem's RBS explicitly.
|
|
178
|
+
* You can change the file path with `--collection` option. e.g. `rbs --collection another_conf.yaml collection install`.
|
|
179
|
+
* `rbs_collection.lock.yaml`
|
|
180
|
+
* RBS installs and loads RBS files with this file.
|
|
181
|
+
* It is auto-generated file. Do not edit this file.
|
|
182
|
+
* I recommend to manage it with VCS such as git.
|
|
183
|
+
* `.gem_rbs_collection/`
|
|
184
|
+
* RBS installs third party RBS files to the directory.
|
|
185
|
+
* I recommend to ignore it from VCS.
|
|
186
|
+
* You can change the path with `path` option of `rbs_collection.yaml` file.
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
## How it works
|
|
190
|
+
|
|
191
|
+
`rbs collection` is integrated with Bundler.
|
|
192
|
+
`rbs collection install` command generates `rbs_collection.lock.yaml` from `rbs_collection.yaml` and `Gemfile.lock`. It uses `Gemfile.lock` to detects dependencies.
|
data/docs/config.md
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# config.yml
|
|
2
|
+
|
|
3
|
+
`config.yml` is the definition of data structure for parser results -- AST.
|
|
4
|
+
|
|
5
|
+
It defines the data structure for the parser implementation in C and Rust `node` modules.
|
|
6
|
+
|
|
7
|
+
## C parser code
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
$ rake templates
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Our C parser consists of two components:
|
|
14
|
+
|
|
15
|
+
1. Pure C Parser
|
|
16
|
+
2. Translator from the pure C AST to Ruby object
|
|
17
|
+
|
|
18
|
+
`config.yml` defines the AST for pure C parser in `ast.h`/`ast.c` and translator from the C AST to Ruby objects in `ast_translation.h`/`ast_translation.c`.
|
|
19
|
+
|
|
20
|
+
## `ruby-rbs` crate
|
|
21
|
+
|
|
22
|
+
```sh
|
|
23
|
+
$ cd rust; cargo build
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The `build.rs` in `ruby-rbs` crate defines the data structure derived from `config.yml` definitions under `node` module.
|
|
27
|
+
|
|
28
|
+
## nodes
|
|
29
|
+
|
|
30
|
+
`nodes` defines *node* data types in C or Rust.
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
nodes:
|
|
34
|
+
- name: RBS::AST::Declarations::Class
|
|
35
|
+
rust_name: ClassNode
|
|
36
|
+
fields:
|
|
37
|
+
- name: name
|
|
38
|
+
c_type: rbs_type_name
|
|
39
|
+
- name: type_params
|
|
40
|
+
c_type: rbs_node_list
|
|
41
|
+
- name: super_class
|
|
42
|
+
c_type: rbs_ast_declarations_class_super
|
|
43
|
+
optional: true # NULL when no superclass (e.g., `class Foo end` vs `class Foo < Bar end`)
|
|
44
|
+
- name: members
|
|
45
|
+
c_type: rbs_node_list
|
|
46
|
+
- name: annotations
|
|
47
|
+
c_type: rbs_node_list
|
|
48
|
+
- name: comment
|
|
49
|
+
c_type: rbs_ast_comment
|
|
50
|
+
optional: true # NULL when no comment precedes the declaration
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
This defines `rbs_ast_declarations_class` struct so that the parser constructs the AST using the structs.
|
|
54
|
+
|
|
55
|
+
```c
|
|
56
|
+
typedef struct rbs_ast_declarations_class {
|
|
57
|
+
rbs_node_t base;
|
|
58
|
+
|
|
59
|
+
struct rbs_type_name *name;
|
|
60
|
+
struct rbs_node_list *type_params;
|
|
61
|
+
struct rbs_ast_declarations_class_super *super_class; /* Optional */
|
|
62
|
+
struct rbs_node_list *members;
|
|
63
|
+
struct rbs_node_list *annotations;
|
|
64
|
+
struct rbs_ast_comment *comment; /* Optional */
|
|
65
|
+
|
|
66
|
+
rbs_location_range keyword_range; /* Required */
|
|
67
|
+
rbs_location_range name_range; /* Required */
|
|
68
|
+
rbs_location_range end_range; /* Required */
|
|
69
|
+
rbs_location_range type_params_range; /* Optional */
|
|
70
|
+
rbs_location_range lt_range; /* Optional */
|
|
71
|
+
} rbs_ast_declarations_class_t;
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The `rbs_ast_declarations_class` struct is a pure C AST, and `ast_translation.c` defines translation into a Ruby object of `RBS::AST::Declarations::Class` class.
|
|
75
|
+
|
|
76
|
+
```c
|
|
77
|
+
case RBS_AST_DECLARATIONS_CLASS: {
|
|
78
|
+
rbs_ast_declarations_class_t *node = (rbs_ast_declarations_class_t *) instance;
|
|
79
|
+
|
|
80
|
+
VALUE h = rb_hash_new();
|
|
81
|
+
VALUE location = rbs_location_range_to_ruby_location(ctx, node->base.location);
|
|
82
|
+
rbs_loc *loc = rbs_check_location(location);
|
|
83
|
+
rbs_loc_legacy_alloc_children(loc, 5);
|
|
84
|
+
rbs_loc_legacy_add_required_child(loc, rb_intern("keyword"), (rbs_loc_range) { .start = node->keyword_range.start_char, .end = node->keyword_range.end_char });
|
|
85
|
+
rbs_loc_legacy_add_required_child(loc, rb_intern("name"), (rbs_loc_range) { .start = node->name_range.start_char, .end = node->name_range.end_char });
|
|
86
|
+
rbs_loc_legacy_add_required_child(loc, rb_intern("end"), (rbs_loc_range) { .start = node->end_range.start_char, .end = node->end_range.end_char });
|
|
87
|
+
rbs_loc_legacy_add_optional_child(loc, rb_intern("type_params"), (rbs_loc_range) { .start = node->type_params_range.start_char, .end = node->type_params_range.end_char });
|
|
88
|
+
rbs_loc_legacy_add_optional_child(loc, rb_intern("lt"), (rbs_loc_range) { .start = node->lt_range.start_char, .end = node->lt_range.end_char });
|
|
89
|
+
rb_hash_aset(h, ID2SYM(rb_intern("location")), location);
|
|
90
|
+
rb_hash_aset(h, ID2SYM(rb_intern("name")), rbs_struct_to_ruby_value(ctx, (rbs_node_t *) node->name)); // rbs_type_name
|
|
91
|
+
rb_hash_aset(h, ID2SYM(rb_intern("type_params")), rbs_node_list_to_ruby_array(ctx, node->type_params));
|
|
92
|
+
rb_hash_aset(h, ID2SYM(rb_intern("super_class")), rbs_struct_to_ruby_value(ctx, (rbs_node_t *) node->super_class)); // rbs_ast_declarations_class_super
|
|
93
|
+
rb_hash_aset(h, ID2SYM(rb_intern("members")), rbs_node_list_to_ruby_array(ctx, node->members));
|
|
94
|
+
rb_hash_aset(h, ID2SYM(rb_intern("annotations")), rbs_node_list_to_ruby_array(ctx, node->annotations));
|
|
95
|
+
rb_hash_aset(h, ID2SYM(rb_intern("comment")), rbs_struct_to_ruby_value(ctx, (rbs_node_t *) node->comment)); // rbs_ast_comment
|
|
96
|
+
|
|
97
|
+
rb_funcall(
|
|
98
|
+
RBS_AST_TypeParam,
|
|
99
|
+
rb_intern("resolve_variables"),
|
|
100
|
+
1,
|
|
101
|
+
rb_hash_lookup(h, ID2SYM(rb_intern("type_params")))
|
|
102
|
+
);
|
|
103
|
+
return CLASS_NEW_INSTANCE(
|
|
104
|
+
RBS_AST_Declarations_Class,
|
|
105
|
+
1,
|
|
106
|
+
&h
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## enums
|
|
112
|
+
|
|
113
|
+
`enums` defines *enum* data types in C or Rust.
|
|
114
|
+
|
|
115
|
+
```yaml
|
|
116
|
+
enums:
|
|
117
|
+
attribute_visibility:
|
|
118
|
+
optional: true
|
|
119
|
+
symbols:
|
|
120
|
+
- unspecified
|
|
121
|
+
- public
|
|
122
|
+
- private
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
For example, the `attribute_visibility` enum is a data type for `visibility` attribute of `attr_reader`, `attr_writer`, and `attr_accessor` definitions.
|
|
126
|
+
The `visibility` attribute can be one of `unspecified`, `public`, and `private`.
|
|
127
|
+
|
|
128
|
+
### Symbol enums
|
|
129
|
+
|
|
130
|
+
Enum definition with `symbols:` attribute defines *enum* data that is mapped to Ruby symbols.
|
|
131
|
+
|
|
132
|
+
```yaml
|
|
133
|
+
enums:
|
|
134
|
+
attribute_visibility:
|
|
135
|
+
optional: true
|
|
136
|
+
symbols:
|
|
137
|
+
- unspecified
|
|
138
|
+
- public
|
|
139
|
+
- private
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
It defines an `enum` in C AST definition.
|
|
143
|
+
|
|
144
|
+
```c
|
|
145
|
+
enum RBS_ATTRIBUTE_VISIBILITY_TAG {
|
|
146
|
+
RBS_ATTRIBUTE_VISIBILITY_TAG_UNSPECIFIED,
|
|
147
|
+
RBS_ATTRIBUTE_VISIBILITY_TAG_PUBLIC,
|
|
148
|
+
RBS_ATTRIBUTE_VISIBILITY_TAG_PRIVATE,
|
|
149
|
+
};
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
The C extension also defines a translation:
|
|
153
|
+
|
|
154
|
+
```c
|
|
155
|
+
VALUE rbs_attribute_visibility_to_ruby(enum rbs_attribute_visibility value) {
|
|
156
|
+
switch (value) {
|
|
157
|
+
case RBS_ATTRIBUTE_VISIBILITY_UNSPECIFIED:
|
|
158
|
+
return Qnil;
|
|
159
|
+
case RBS_ATTRIBUTE_VISIBILITY_PUBLIC:
|
|
160
|
+
return rb_id2sym(rb_intern("public"));
|
|
161
|
+
case RBS_ATTRIBUTE_VISIBILITY_PRIVATE:
|
|
162
|
+
return rb_id2sym(rb_intern("private"));
|
|
163
|
+
default:
|
|
164
|
+
rb_fatal("unknown enum rbs_attribute_visibility value: %d", value);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
`RBS_ATTRIBUTE_VISIBILITY_PUBLIC` and `RBS_ATTRIBUTE_VISIBILITY_PRIVATE` are translated to Ruby symbols `:public` and `:private` respectively.
|
|
170
|
+
|
|
171
|
+
Note that the first `RBS_ATTRIBUTE_VISIBILITY_UNSPECIFIED` is translated to `nil` in Ruby. This is specified by the `optional: true` attribute in YAML. When `optional: true` is set, the first enum value is translated to `nil`.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Using `Data` and `Struct`
|
|
2
|
+
|
|
3
|
+
`Data` and `Struct` are commonly used utilities to define simple *value* objects. The objects have attributes, and the equality between the two objects are defined by equality of the attributes. (Note that we can define additional methods and overwrite the equality definitions when we want.)
|
|
4
|
+
|
|
5
|
+
```ruby
|
|
6
|
+
# Defines `Measure` class with `#amount` and `#unit` attributes
|
|
7
|
+
Measure = Data.define(:amount, :unit)
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Unfortunately, supporting `Data` and `Struct` in RBS is not straightforward. You have to write down the attribute definitions and initializers in RBS.
|
|
11
|
+
|
|
12
|
+
```rbs
|
|
13
|
+
class Measure
|
|
14
|
+
# `attr_accessor amount: Integer` in the case of Struct
|
|
15
|
+
attr_reader amount: Integer
|
|
16
|
+
|
|
17
|
+
# `attr_accessor unit: String` in the case of Struct
|
|
18
|
+
attr_reader unit: String
|
|
19
|
+
|
|
20
|
+
def initialize: (Integer amount, String unit) -> void
|
|
21
|
+
| (amount: Integer, unit: String) -> void
|
|
22
|
+
end
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
This is simplified definition of the `Measure` class, for the case you only use the attributes and initializers. You can add more method definitions or inherit from `Data` class to make the definition more complete.
|
|
26
|
+
|
|
27
|
+
However, it's common that you don't need all of the `Data` and `Struct` methods, like `.members` and `.[]`. When you are using those utility classes just for the attributes methods, you can simply ignore other methods or skip specifying a super class.
|
|
28
|
+
|
|
29
|
+
> You may want to implement a generator that understands `Data.define` and `Struct.new`. But even with the generator, you need to edit the generated RBS files so that the attribute definitions have correct types.
|
|
30
|
+
|
|
31
|
+
## Type checking class definitions using `Data` and `Struct`
|
|
32
|
+
|
|
33
|
+
If you use Steep, you may need additional annotation in Ruby implementation.
|
|
34
|
+
|
|
35
|
+
```ruby
|
|
36
|
+
# Type error because return type of `Data.define(...)` is not `singleton(Measure)`
|
|
37
|
+
Measure = Data.define(:amount, :unit)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
You can please the type checker by adding a cast (`_`) or define the class inheriting from `Data.define(...)`.
|
|
41
|
+
|
|
42
|
+
```ruby
|
|
43
|
+
# Skip type checking by assigning to `_`
|
|
44
|
+
Measure = _ = Data.define(:amount, :unit)
|
|
45
|
+
|
|
46
|
+
# Super class is not type checked by Steep
|
|
47
|
+
class Measure < Data.define(:amount, :unit)
|
|
48
|
+
end
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
@soutaro has prefered inheriting from `Data.define`, but you may find an extra annonymous class in `.ancestors` [^1].
|
|
52
|
+
|
|
53
|
+
```ruby
|
|
54
|
+
Measure.ancestors #=> [Measure, #<Class:0xOOF>, Data, ...]
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
[^1]: [Shannon Skipper](https://github.com/havenwood) told me it in Discord
|
|
58
|
+
|
|
59
|
+
## Generate prototype for `Data` and `Struct`
|
|
60
|
+
|
|
61
|
+
RBS prototypes for classes using `Data` and `Struct` can be generated by `rbs prototype runtime`.
|
|
62
|
+
|
|
63
|
+
```rb
|
|
64
|
+
# t.rb
|
|
65
|
+
class Measure < Data.define(:amount, :unit)
|
|
66
|
+
end
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
$ bundle exec rbs prototype runtime -R t.rb Measure
|
|
71
|
+
class Measure < ::Data
|
|
72
|
+
def self.new: (untyped amount, untyped unit) -> instance
|
|
73
|
+
| (amount: untyped, unit: untyped) -> instance
|
|
74
|
+
|
|
75
|
+
def self.[]: (untyped amount, untyped unit) -> instance
|
|
76
|
+
| (amount: untyped, unit: untyped) -> instance
|
|
77
|
+
|
|
78
|
+
def self.members: () -> [ :amount, :unit ]
|
|
79
|
+
|
|
80
|
+
def members: () -> [ :amount, :unit ]
|
|
81
|
+
|
|
82
|
+
attr_reader amount: untyped
|
|
83
|
+
|
|
84
|
+
attr_reader unit: untyped
|
|
85
|
+
end
|
|
86
|
+
```
|
data/docs/encoding.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# RBS File Encoding
|
|
2
|
+
|
|
3
|
+
## Best Practice
|
|
4
|
+
|
|
5
|
+
**Use UTF-8** for both file encoding and your system locale.
|
|
6
|
+
|
|
7
|
+
## Supported Encodings
|
|
8
|
+
|
|
9
|
+
RBS parser supports ASCII-compatible encodings (similar to Ruby's script encoding support).
|
|
10
|
+
|
|
11
|
+
**Examples**: UTF-8, US-ASCII, Shift JIS, EUC-JP, ...
|
|
12
|
+
|
|
13
|
+
## Unicode Codepoint Symbols
|
|
14
|
+
|
|
15
|
+
String literal types in RBS can contain Unicode codepoint escape sequences (`\uXXXX`).
|
|
16
|
+
|
|
17
|
+
When the file encoding is UTF-8, the parser translates Unicode codepoint symbols:
|
|
18
|
+
|
|
19
|
+
```rbs
|
|
20
|
+
# In UTF-8 encoded files
|
|
21
|
+
|
|
22
|
+
type t = "\u0123" # Translated to the actual Unicode character ģ
|
|
23
|
+
type s = "\u3042" # Translated to the actual Unicode character あ
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
When the file encoding is not UTF-8, Unicode escape sequences are interpreted literally as the string `\uXXXX`:
|
|
27
|
+
|
|
28
|
+
```rbs
|
|
29
|
+
# In non-UTF-8 encoded files
|
|
30
|
+
|
|
31
|
+
type t = "\u0123" # Remains as the literal string "\u0123"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Implementation
|
|
35
|
+
|
|
36
|
+
RBS gem currently doesn't do anything for file encoding. It relies on Ruby's encoding handling, specifically `Encoding.default_external` and `Encoding.default_internal`.
|
|
37
|
+
|
|
38
|
+
`Encoding.default_external` is the encoding Ruby assumes when it reads external resources like files. The Ruby interpreter sets it based on the locale. `Encoding.default_internal` is the encoding Ruby converts the external resources to. The default is `nil` (no conversion.)
|
|
39
|
+
|
|
40
|
+
When your locale is set to use `UTF-8` encoding, `default_external` is `Encoding::UTF_8`. So the RBS file content read from the disk will have UTF-8 encoding.
|
|
41
|
+
|
|
42
|
+
### Parsing non UTF-8 RBS source text
|
|
43
|
+
|
|
44
|
+
If you want to work with another encoding, ensure the source string has ASCII compatible encoding.
|
|
45
|
+
|
|
46
|
+
```ruby
|
|
47
|
+
source = '"日本語"'
|
|
48
|
+
RBS::Parser.parse_type(source.encode(Encoding::EUC_JP)) # => Parses successfully
|
|
49
|
+
RBS::Parser.parse_type(source.encode(Encoding::UTF_32)) # => Returns `nil` since UTF-32 is not ASCII compatible
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Specifying file encoding
|
|
53
|
+
|
|
54
|
+
Currently, RBS doesn't support specifying file encoding directly.
|
|
55
|
+
|
|
56
|
+
You can use `Encoding.default_external` while the gem loads RBS files from the storage.
|
data/docs/gem.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Releasing a gem with RBS
|
|
2
|
+
|
|
3
|
+
You can release the RBS type definition of your gem included in the gem package. Just add your RBS files inside `/sig` directory, put them in your rubygem package, and release a new version. RBS gem will load the RBS files from your gem package automatically.
|
|
4
|
+
|
|
5
|
+
## `/sig` directory
|
|
6
|
+
|
|
7
|
+
RBS gem tries to load a type definition of a gem from gem package first. It checks if there is `/sig` directory in the gem package and loads `*.rbs` files from the directory. So, everything you have to do to make your type definition available are:
|
|
8
|
+
|
|
9
|
+
1. Add `/sig` directory in your gem package
|
|
10
|
+
2. Put your RBS files inside the directory
|
|
11
|
+
3. Make sure the RBS files are included in the gem package
|
|
12
|
+
|
|
13
|
+
### Hidden RBS files
|
|
14
|
+
|
|
15
|
+
If you have RBS files you don't want to export to the gem users, you can put the files under a directory that starts with `_``.
|
|
16
|
+
|
|
17
|
+
Assume you have three RBS files in your gem package:
|
|
18
|
+
|
|
19
|
+
* `/sig/foo.rbs`
|
|
20
|
+
* `/sig/bar/baz.rbs`
|
|
21
|
+
* `/sig/_private/internal.rbs`
|
|
22
|
+
|
|
23
|
+
`foo.rbs` and `baz.rbs` will be loaded from the gem package, but the `internal.rbs` will be skipped. This is only when you load RBS files of a *library*, for example through `-r` option given to `rbs` command. If you load RBS files as *source code*, for example through `-I` option given to `rbs` command, the hidden RBS files will be loaded too.
|
|
24
|
+
|
|
25
|
+
* `rbs -r your-gem` => Loading a library
|
|
26
|
+
* `rbs -I sig` => Loading RBS files as source code
|
|
27
|
+
|
|
28
|
+
### Adding `manifest.yaml`
|
|
29
|
+
|
|
30
|
+
`manifest.yaml` lets you declare dependencies to standard libraries. Here is an example, from [RBS gem](https://github.com/ruby/rbs/blob/6b3d0f976a50b3974d0bff26ea8fa9931053f38b/sig/manifest.yaml).
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
dependencies:
|
|
34
|
+
- name: json
|
|
35
|
+
- name: logger
|
|
36
|
+
- name: optparse
|
|
37
|
+
- name: rdoc
|
|
38
|
+
- name: tsort
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Note that you don't have to write the dependencies that are included in your `.gemspec`. RBS will detect the dependencies between gems, declared in `.gemspec`. `manifest.yaml` is a material for undeclared dependencies, which usually is for standard libraries.
|
|
42
|
+
|
|
43
|
+
## Testing your type definition
|
|
44
|
+
|
|
45
|
+
If you develop your gem using a static type checker, like [Steep](https://github.com/soutaro/steep), your type definition will be (mostly) correct and reliable. If not, we strongly recommend adding extra tests focusing on the RBS type definitions.
|
|
46
|
+
|
|
47
|
+
`RBS::UnitTest` is a library to do that. `assert_send_type` is the most important assertion.
|
|
48
|
+
|
|
49
|
+
```rb
|
|
50
|
+
assert_send_type '(Regexp) { (String) -> String } -> String',
|
|
51
|
+
'hello', :gsub, /hello/, &proc { "foo" }
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
It calls `String#gsub` method and confirms if given arguments and the return value has correct types.
|
|
55
|
+
|
|
56
|
+
You can find examples under `test/stdlib` directory of [RBS repository](https://github.com/ruby/rbs/blob/6b3d0f976a50b3974d0bff26ea8fa9931053f38b/test/stdlib/String_test.rb).
|