rbs-relaxed 3.9.0.1
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/.github/dependabot.yml +22 -0
- data/.github/workflows/comments.yml +35 -0
- data/.github/workflows/dependabot.yml +30 -0
- data/.github/workflows/ruby.yml +82 -0
- data/.github/workflows/typecheck.yml +38 -0
- data/.github/workflows/windows.yml +43 -0
- data/.gitignore +23 -0
- data/.rubocop.yml +68 -0
- data/BSDL +22 -0
- data/CHANGELOG.md +1868 -0
- data/COPYING +56 -0
- data/README.md +203 -0
- data/Rakefile +417 -0
- data/Steepfile +44 -0
- data/config.yml +313 -0
- data/core/array.rbs +4062 -0
- data/core/basic_object.rbs +375 -0
- data/core/binding.rbs +150 -0
- data/core/builtin.rbs +277 -0
- data/core/class.rbs +220 -0
- data/core/comparable.rbs +171 -0
- data/core/complex.rbs +786 -0
- data/core/constants.rbs +96 -0
- data/core/data.rbs +415 -0
- data/core/dir.rbs +981 -0
- data/core/encoding.rbs +1371 -0
- data/core/enumerable.rbs +2405 -0
- data/core/enumerator/product.rbs +92 -0
- data/core/enumerator.rbs +630 -0
- data/core/env.rbs +6 -0
- data/core/errno.rbs +673 -0
- data/core/errors.rbs +760 -0
- data/core/exception.rbs +485 -0
- data/core/false_class.rbs +82 -0
- data/core/fiber.rbs +550 -0
- data/core/fiber_error.rbs +11 -0
- data/core/file.rbs +2936 -0
- data/core/file_test.rbs +331 -0
- data/core/float.rbs +1151 -0
- data/core/gc.rbs +644 -0
- data/core/global_variables.rbs +184 -0
- data/core/hash.rbs +1861 -0
- data/core/integer.rbs +1413 -0
- data/core/io/buffer.rbs +984 -0
- data/core/io/wait.rbs +70 -0
- data/core/io.rbs +3406 -0
- data/core/kernel.rbs +3096 -0
- data/core/marshal.rbs +207 -0
- data/core/match_data.rbs +635 -0
- data/core/math.rbs +729 -0
- data/core/method.rbs +386 -0
- data/core/module.rbs +1704 -0
- data/core/nil_class.rbs +209 -0
- data/core/numeric.rbs +818 -0
- data/core/object.rbs +110 -0
- data/core/object_space/weak_key_map.rbs +166 -0
- data/core/object_space.rbs +190 -0
- data/core/proc.rbs +868 -0
- data/core/process.rbs +2296 -0
- data/core/ractor.rbs +1068 -0
- data/core/random.rbs +237 -0
- data/core/range.rbs +1107 -0
- data/core/rational.rbs +531 -0
- data/core/rb_config.rbs +88 -0
- data/core/rbs/unnamed/argf.rbs +1229 -0
- data/core/rbs/unnamed/env_class.rbs +1209 -0
- data/core/rbs/unnamed/random.rbs +293 -0
- data/core/refinement.rbs +59 -0
- data/core/regexp.rbs +1930 -0
- data/core/ruby_vm.rbs +765 -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 +176 -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 +1171 -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 +294 -0
- data/core/set.rbs +621 -0
- data/core/signal.rbs +100 -0
- data/core/string.rbs +3583 -0
- data/core/struct.rbs +667 -0
- data/core/symbol.rbs +475 -0
- data/core/thread.rbs +1765 -0
- data/core/thread_group.rbs +79 -0
- data/core/time.rbs +1762 -0
- data/core/trace_point.rbs +477 -0
- data/core/true_class.rbs +98 -0
- data/core/unbound_method.rbs +329 -0
- data/core/warning.rbs +87 -0
- data/docs/CONTRIBUTING.md +106 -0
- data/docs/architecture.md +110 -0
- data/docs/collection.md +192 -0
- data/docs/data_and_struct.md +86 -0
- data/docs/gem.md +57 -0
- data/docs/rbs_by_example.md +309 -0
- data/docs/repo.md +125 -0
- data/docs/sigs.md +167 -0
- data/docs/stdlib.md +147 -0
- data/docs/syntax.md +910 -0
- data/docs/tools.md +17 -0
- data/exe/rbs +7 -0
- data/ext/rbs_extension/extconf.rb +15 -0
- data/ext/rbs_extension/lexer.c +2728 -0
- data/ext/rbs_extension/lexer.h +179 -0
- data/ext/rbs_extension/lexer.re +147 -0
- data/ext/rbs_extension/lexstate.c +175 -0
- data/ext/rbs_extension/location.c +325 -0
- data/ext/rbs_extension/location.h +85 -0
- data/ext/rbs_extension/main.c +33 -0
- data/ext/rbs_extension/parser.c +2973 -0
- data/ext/rbs_extension/parser.h +18 -0
- data/ext/rbs_extension/parserstate.c +397 -0
- data/ext/rbs_extension/parserstate.h +163 -0
- data/ext/rbs_extension/rbs_extension.h +31 -0
- data/ext/rbs_extension/unescape.c +32 -0
- data/goodcheck.yml +91 -0
- data/include/rbs/constants.h +82 -0
- data/include/rbs/ruby_objs.h +72 -0
- data/include/rbs/util/rbs_constant_pool.h +219 -0
- data/include/rbs.h +7 -0
- data/lib/rbs/ancestor_graph.rb +92 -0
- data/lib/rbs/annotate/annotations.rb +199 -0
- data/lib/rbs/annotate/formatter.rb +92 -0
- data/lib/rbs/annotate/rdoc_annotator.rb +400 -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 +467 -0
- data/lib/rbs/ast/directives.rb +49 -0
- data/lib/rbs/ast/members.rb +451 -0
- data/lib/rbs/ast/type_param.rb +225 -0
- data/lib/rbs/ast/visitor.rb +137 -0
- data/lib/rbs/buffer.rb +67 -0
- data/lib/rbs/builtin_names.rb +58 -0
- data/lib/rbs/cli/colored_io.rb +48 -0
- data/lib/rbs/cli/diff.rb +83 -0
- data/lib/rbs/cli/validate.rb +357 -0
- data/lib/rbs/cli.rb +1223 -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 +218 -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 +258 -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 +401 -0
- data/lib/rbs/definition_builder/ancestor_builder.rb +620 -0
- data/lib/rbs/definition_builder/method_builder.rb +254 -0
- data/lib/rbs/definition_builder.rb +845 -0
- data/lib/rbs/diff.rb +125 -0
- data/lib/rbs/environment/use_map.rb +77 -0
- data/lib/rbs/environment.rb +829 -0
- data/lib/rbs/environment_loader.rb +173 -0
- data/lib/rbs/environment_walker.rb +155 -0
- data/lib/rbs/errors.rb +645 -0
- data/lib/rbs/factory.rb +18 -0
- data/lib/rbs/file_finder.rb +28 -0
- data/lib/rbs/location_aux.rb +138 -0
- data/lib/rbs/locator.rb +243 -0
- data/lib/rbs/method_type.rb +143 -0
- data/lib/rbs/namespace.rb +125 -0
- data/lib/rbs/parser/lex_result.rb +15 -0
- data/lib/rbs/parser/token.rb +23 -0
- data/lib/rbs/parser_aux.rb +114 -0
- data/lib/rbs/prototype/helpers.rb +140 -0
- data/lib/rbs/prototype/node_usage.rb +99 -0
- data/lib/rbs/prototype/rb.rb +840 -0
- data/lib/rbs/prototype/rbi.rb +641 -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 +667 -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 +91 -0
- data/lib/rbs/sorter.rb +198 -0
- data/lib/rbs/substitution.rb +83 -0
- data/lib/rbs/subtractor.rb +201 -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 +435 -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 +109 -0
- data/lib/rbs/types.rb +1596 -0
- data/lib/rbs/unit_test/convertibles.rb +176 -0
- data/lib/rbs/unit_test/spy.rb +138 -0
- data/lib/rbs/unit_test/type_assertions.rb +347 -0
- data/lib/rbs/unit_test/with_aliases.rb +143 -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/writer.rb +424 -0
- data/lib/rbs.rb +94 -0
- data/lib/rdoc/discover.rb +20 -0
- data/lib/rdoc_plugin/parser.rb +163 -0
- data/rbs-relaxed.gemspec +48 -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 +36 -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 +82 -0
- data/sig/annotate/rdoc_source.rbs +30 -0
- data/sig/annotation.rbs +27 -0
- data/sig/buffer.rbs +32 -0
- data/sig/builtin_names.rbs +44 -0
- data/sig/cli/colored_io.rbs +15 -0
- data/sig/cli/diff.rbs +21 -0
- data/sig/cli/validate.rbs +43 -0
- data/sig/cli.rbs +87 -0
- data/sig/collection/cleaner.rbs +13 -0
- data/sig/collection/config/lockfile.rbs +74 -0
- data/sig/collection/config/lockfile_generator.rbs +66 -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 +267 -0
- data/sig/definition.rbs +173 -0
- data/sig/definition_builder.rbs +165 -0
- data/sig/diff.rbs +28 -0
- data/sig/directives.rbs +77 -0
- data/sig/environment.rbs +279 -0
- data/sig/environment_loader.rbs +111 -0
- data/sig/environment_walker.rbs +65 -0
- data/sig/errors.rbs +405 -0
- data/sig/factory.rbs +5 -0
- data/sig/file_finder.rbs +28 -0
- data/sig/location.rbs +110 -0
- data/sig/locator.rbs +58 -0
- data/sig/manifest.yaml +7 -0
- data/sig/members.rbs +258 -0
- data/sig/method_builder.rbs +84 -0
- data/sig/method_types.rbs +58 -0
- data/sig/namespace.rbs +146 -0
- data/sig/parser.rbs +100 -0
- data/sig/prototype/helpers.rbs +27 -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 +35 -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/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 +110 -0
- data/sig/typename.rbs +79 -0
- data/sig/types.rbs +579 -0
- data/sig/unit_test/convertibles.rbs +154 -0
- data/sig/unit_test/spy.rbs +30 -0
- data/sig/unit_test/type_assertions.rbs +196 -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/writer.rbs +127 -0
- data/src/constants.c +153 -0
- data/src/ruby_objs.c +795 -0
- data/src/util/rbs_constant_pool.c +342 -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 +1629 -0
- data/stdlib/bigdecimal-math/0/big_math.rbs +119 -0
- data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
- data/stdlib/cgi/0/core.rbs +1285 -0
- data/stdlib/cgi/0/manifest.yaml +3 -0
- data/stdlib/coverage/0/coverage.rbs +263 -0
- data/stdlib/csv/0/csv.rbs +3776 -0
- data/stdlib/csv/0/manifest.yaml +3 -0
- data/stdlib/date/0/date.rbs +1585 -0
- data/stdlib/date/0/date_time.rbs +616 -0
- data/stdlib/date/0/time.rbs +26 -0
- data/stdlib/dbm/0/dbm.rbs +421 -0
- data/stdlib/delegate/0/delegator.rbs +184 -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 +343 -0
- data/stdlib/digest/0/digest.rbs +577 -0
- data/stdlib/erb/0/erb.rbs +532 -0
- data/stdlib/etc/0/etc.rbs +865 -0
- data/stdlib/fileutils/0/fileutils.rbs +1734 -0
- data/stdlib/find/0/find.rbs +49 -0
- data/stdlib/forwardable/0/forwardable.rbs +268 -0
- data/stdlib/io-console/0/io-console.rbs +414 -0
- data/stdlib/ipaddr/0/ipaddr.rbs +428 -0
- data/stdlib/json/0/json.rbs +1916 -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 +5552 -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 +487 -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 +393 -0
- data/stdlib/open3/0/open3.rbs +147 -0
- data/stdlib/openssl/0/manifest.yaml +3 -0
- data/stdlib/openssl/0/openssl.rbs +12113 -0
- data/stdlib/optparse/0/optparse.rbs +1725 -0
- data/stdlib/pathname/0/pathname.rbs +1406 -0
- data/stdlib/pp/0/manifest.yaml +2 -0
- data/stdlib/pp/0/pp.rbs +300 -0
- data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
- data/stdlib/pstore/0/pstore.rbs +603 -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 +402 -0
- data/stdlib/psych/0/store.rbs +59 -0
- data/stdlib/pty/0/pty.rbs +237 -0
- data/stdlib/rdoc/0/code_object.rbs +51 -0
- data/stdlib/rdoc/0/comment.rbs +59 -0
- data/stdlib/rdoc/0/context.rbs +153 -0
- data/stdlib/rdoc/0/markup.rbs +117 -0
- data/stdlib/rdoc/0/parser.rbs +56 -0
- data/stdlib/rdoc/0/rdoc.rbs +391 -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 +1830 -0
- data/stdlib/ripper/0/ripper.rbs +1648 -0
- data/stdlib/securerandom/0/securerandom.rbs +62 -0
- data/stdlib/shellwords/0/shellwords.rbs +229 -0
- data/stdlib/singleton/0/singleton.rbs +131 -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 +92 -0
- data/stdlib/socket/0/socket.rbs +4157 -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 +79 -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 +567 -0
- data/stdlib/strscan/0/string_scanner.rbs +1627 -0
- data/stdlib/tempfile/0/tempfile.rbs +479 -0
- data/stdlib/time/0/time.rbs +432 -0
- data/stdlib/timeout/0/timeout.rbs +81 -0
- data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
- data/stdlib/tsort/0/cyclic.rbs +5 -0
- data/stdlib/tsort/0/interfaces.rbs +20 -0
- data/stdlib/tsort/0/tsort.rbs +409 -0
- data/stdlib/uri/0/common.rbs +582 -0
- data/stdlib/uri/0/file.rbs +118 -0
- data/stdlib/uri/0/ftp.rbs +13 -0
- data/stdlib/uri/0/generic.rbs +1108 -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 +210 -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 +166 -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 +200 -0
- metadata +532 -0
data/docs/syntax.md
ADDED
@@ -0,0 +1,910 @@
|
|
1
|
+
# Syntax
|
2
|
+
|
3
|
+
## Types
|
4
|
+
|
5
|
+
```markdown
|
6
|
+
_type_ ::= _class-name_ _type-arguments_ (Class instance type)
|
7
|
+
| _interface-name_ _type-arguments_ (Interface type)
|
8
|
+
| _alias-name_ _type-arguments_ (Alias type)
|
9
|
+
| `singleton(` _class-name_ `)` (Class singleton type)
|
10
|
+
| _literal_ (Literal type)
|
11
|
+
| _type_ `|` _type_ (Union type)
|
12
|
+
| _type_ `&` _type_ (Intersection type)
|
13
|
+
| _type_ `?` (Optional type)
|
14
|
+
| `{` _record-name_ `:` _type_ `,` etc. `}` (Record type)
|
15
|
+
| `[]` | `[` _type_ `,` etc. `]` (Tuples)
|
16
|
+
| _type-variable_ (Type variables)
|
17
|
+
| `self`
|
18
|
+
| `instance`
|
19
|
+
| `class`
|
20
|
+
| `bool`
|
21
|
+
| `untyped`
|
22
|
+
| `nil`
|
23
|
+
| `top`
|
24
|
+
| `bot`
|
25
|
+
| `void`
|
26
|
+
| _proc_ (Proc type)
|
27
|
+
|
28
|
+
_class-name_ ::= _namespace_ /[A-Z]\w*/
|
29
|
+
_interface-name_ ::= _namespace_ /_[A-Z]\w*/
|
30
|
+
_alias-name_ ::= _namespace_ /[a-z]\w*/
|
31
|
+
|
32
|
+
_type-variable_ ::= /[A-Z]\w*/
|
33
|
+
|
34
|
+
_namespace_ ::= (Empty namespace)
|
35
|
+
| `::` (Root)
|
36
|
+
| _namespace_ /[A-Z]\w*/ `::` (Namespace)
|
37
|
+
|
38
|
+
_type-arguments_ ::= (No type arguments)
|
39
|
+
| `[` _type_ `,` etc. `]` (Type arguments)
|
40
|
+
|
41
|
+
_literal_ ::= _string-literal_
|
42
|
+
| _symbol-literal_
|
43
|
+
| _integer-literal_
|
44
|
+
| `true`
|
45
|
+
| `false`
|
46
|
+
|
47
|
+
_proc_ ::= `^` _parameters?_ _self-type-binding?_ _block?_ `->` _type_
|
48
|
+
| `^` `(` `?` `)` `->` _type_ # Proc type with untyped parameter
|
49
|
+
```
|
50
|
+
|
51
|
+
### Class instance type
|
52
|
+
|
53
|
+
Class instance type denotes _an instance of a class_.
|
54
|
+
|
55
|
+
```rbs
|
56
|
+
Integer # Instance of Integer class
|
57
|
+
::Integer # Instance of ::Integer class
|
58
|
+
Hash[Symbol, String] # Instance of Hash class with type application of Symbol and String
|
59
|
+
```
|
60
|
+
|
61
|
+
### Interface type
|
62
|
+
|
63
|
+
Interface type denotes _type of a value which can be a subtype of the interface_.
|
64
|
+
|
65
|
+
```rbs
|
66
|
+
_ToS # _ToS interface
|
67
|
+
::Enumerator::_Each[String] # Interface name with namespace and type application
|
68
|
+
```
|
69
|
+
|
70
|
+
### Alias type
|
71
|
+
|
72
|
+
Alias type denotes an alias declared with _alias declaration_.
|
73
|
+
|
74
|
+
The name of type aliases starts with lowercase `[a-z]`.
|
75
|
+
|
76
|
+
```rbs
|
77
|
+
name
|
78
|
+
::JSON::t # Alias name with namespace
|
79
|
+
list[Integer] # Type alias can be generic
|
80
|
+
```
|
81
|
+
|
82
|
+
### Class singleton type
|
83
|
+
|
84
|
+
Class singleton type denotes _the type of a singleton object of a class_.
|
85
|
+
|
86
|
+
```rbs
|
87
|
+
singleton(String)
|
88
|
+
singleton(::Hash) # Class singleton type cannot be parametrized.
|
89
|
+
```
|
90
|
+
|
91
|
+
### Literal type
|
92
|
+
|
93
|
+
Literal type denotes _a type with only one value of the literal_.
|
94
|
+
|
95
|
+
```rbs
|
96
|
+
123 # Integer
|
97
|
+
"hello world" # A string
|
98
|
+
:to_s # A symbol
|
99
|
+
true # true or false
|
100
|
+
```
|
101
|
+
|
102
|
+
### Union type
|
103
|
+
|
104
|
+
Union type denotes _a type of one of the given types_.
|
105
|
+
|
106
|
+
```rbs
|
107
|
+
Integer | String # Integer or String
|
108
|
+
Array[Integer | String] # Array of Integer or String
|
109
|
+
```
|
110
|
+
|
111
|
+
### Intersection type
|
112
|
+
|
113
|
+
Intersection type denotes _a type of all of the given types_.
|
114
|
+
|
115
|
+
```rbs
|
116
|
+
_Reader & _Writer # _Reader and _Writer
|
117
|
+
```
|
118
|
+
|
119
|
+
Note that `&` has higher precedence than `|` that `A & B | C` is `(A & B) | C`.
|
120
|
+
|
121
|
+
### Optional type
|
122
|
+
|
123
|
+
Optional type denotes _a type of value or nil_.
|
124
|
+
|
125
|
+
```rbs
|
126
|
+
Integer?
|
127
|
+
Array[Integer?]
|
128
|
+
```
|
129
|
+
|
130
|
+
### Record type
|
131
|
+
|
132
|
+
Records are `Hash` objects, fixed set of keys, and heterogeneous.
|
133
|
+
|
134
|
+
```rbs
|
135
|
+
{ id: Integer, name: String } # Hash object like `{ id: 31, name: String }`
|
136
|
+
```
|
137
|
+
|
138
|
+
### Tuple type
|
139
|
+
|
140
|
+
Tuples are `Array` objects, fixed size and heterogeneous.
|
141
|
+
|
142
|
+
```rbs
|
143
|
+
[ ] # Empty like `[]`
|
144
|
+
[String] # Single string like `["hi"]`
|
145
|
+
[Integer, Integer] # Pair of integers like `[1, 2]`
|
146
|
+
[Symbol, Integer, Integer] # Tuple of Symbol, Integer, and Integer like `[:pair, 30, 22]`
|
147
|
+
```
|
148
|
+
|
149
|
+
*Empty tuple* or *1-tuple* sound strange, but RBS allows these types.
|
150
|
+
|
151
|
+
### Type variable
|
152
|
+
|
153
|
+
```rbs
|
154
|
+
U
|
155
|
+
T
|
156
|
+
S
|
157
|
+
Elem
|
158
|
+
```
|
159
|
+
|
160
|
+
Type variables cannot be distinguished from _class instance types_.
|
161
|
+
They are scoped in _class/module/interface/alias declaration_ or _generic method types_.
|
162
|
+
|
163
|
+
```rbs
|
164
|
+
class Ref[T] # Object is scoped in the class declaration.
|
165
|
+
@value: T # Type variable `T`
|
166
|
+
def map: [X] { (T) -> X } -> Ref[X] # X is a type variable scoped in the method type.
|
167
|
+
end
|
168
|
+
```
|
169
|
+
|
170
|
+
### Base types
|
171
|
+
|
172
|
+
`self` denotes the type of receiver. The type is used to model the open recursion via `self`.
|
173
|
+
|
174
|
+
`instance` denotes the type of instance of the class. `class` is the singleton of the class.
|
175
|
+
|
176
|
+
`bool` is an alias of `true | false`.
|
177
|
+
|
178
|
+
`untyped` is for _a type without type checking_. It is `?` in gradual typing, _dynamic_ in some languages like C#, and _any_ in TypeScript. It is both subtype _and_ supertype of all of the types. (The type was `any` but renamed to `untyped`.)
|
179
|
+
|
180
|
+
`nil` is for _nil_.
|
181
|
+
|
182
|
+
`top` is a supertype of all of the types. `bot` is a subtype of all of the types.
|
183
|
+
|
184
|
+
`void` is a supertype of all of the types.
|
185
|
+
|
186
|
+
#### `nil` or `NilClass`?
|
187
|
+
|
188
|
+
We recommend using `nil`.
|
189
|
+
|
190
|
+
#### `bool` or `boolish`
|
191
|
+
|
192
|
+
We have a builtin type alias called `boolish`.
|
193
|
+
It is an alias of `top` type, and you can use `boolish` if we want to allow any object of any type.
|
194
|
+
|
195
|
+
We can see an example at the definition of `Enumerable#find`:
|
196
|
+
|
197
|
+
```rbs
|
198
|
+
module Enumerable[Elem, Return]
|
199
|
+
def find: () { (Elem) -> boolish } -> Elem?
|
200
|
+
end
|
201
|
+
```
|
202
|
+
|
203
|
+
We want to write something like:
|
204
|
+
|
205
|
+
```ruby
|
206
|
+
array.find {|x| x && x.some_test? } # The block will return (bool | nil)
|
207
|
+
```
|
208
|
+
|
209
|
+
We recommend using `boolish` for method arguments and block return values, if you only use the values for conditions.
|
210
|
+
You can write `bool` if you strictly want `true | false`.
|
211
|
+
|
212
|
+
#### `void`, `boolish`, or `top`?
|
213
|
+
|
214
|
+
They are all equivalent for the type system; they are all _top type_.
|
215
|
+
|
216
|
+
`void` tells developers a hint that _the value should not be used_. `boolish` implies the value is used as a truth value. `top` is anything else.
|
217
|
+
|
218
|
+
### Proc type
|
219
|
+
|
220
|
+
Proc type denotes type of procedures, `Proc` instances.
|
221
|
+
|
222
|
+
```rbs
|
223
|
+
^(Integer) -> String # A procedure with an `Integer` parameter and returns `String`
|
224
|
+
^(?String, size: Integer) -> bool # A procedure with `String` optional parameter, `size` keyword of `Integer`, and returns `bool`
|
225
|
+
```
|
226
|
+
|
227
|
+
See the next section for details.
|
228
|
+
|
229
|
+
### Types and contexts
|
230
|
+
|
231
|
+
We have contextual limitations on some types:
|
232
|
+
|
233
|
+
* `void` is only allowed as a return type or a generic parameter
|
234
|
+
* `self` is only allowed in *self-context*
|
235
|
+
* `class` and `instance` is only allowed in *classish-context*
|
236
|
+
|
237
|
+
These contextual limitation is introduced at RBS 3.3.
|
238
|
+
The parser accepts those types even if it doesn't satisfy contextual limitation, but warning is reported with `rbs validate` command.
|
239
|
+
We plan to change the parser to reject those types if it breaks the contextual limitations in next release -- `3.4`.
|
240
|
+
|
241
|
+
#### Limitations on `void` types
|
242
|
+
|
243
|
+
The following `void` types are allowed.
|
244
|
+
|
245
|
+
```rbs
|
246
|
+
type t1 = ^() -> void
|
247
|
+
type t2 = Enumerator[Integer, void]
|
248
|
+
```
|
249
|
+
|
250
|
+
The following `void` types are prohibited.
|
251
|
+
|
252
|
+
```rbs
|
253
|
+
type t1 = ^(void) -> untyped # void as a function parameter is prohibited
|
254
|
+
type t2 = ^() -> void? # void cannot be used inside an optional type
|
255
|
+
type t3 = Enumerator[Integer, void | String] # void cannot be used inside a union type
|
256
|
+
```
|
257
|
+
|
258
|
+
#### Examples of *self-context*
|
259
|
+
|
260
|
+
The following `self` types are allowed.
|
261
|
+
|
262
|
+
```rbs
|
263
|
+
class Foo
|
264
|
+
attr_reader parent: self
|
265
|
+
|
266
|
+
def foo: () -> self
|
267
|
+
end
|
268
|
+
```
|
269
|
+
|
270
|
+
The following `self` types are prohibited.
|
271
|
+
|
272
|
+
```rbs
|
273
|
+
class Foo
|
274
|
+
include Enumerable[self] # Mixin argument is not self-context
|
275
|
+
|
276
|
+
VERSION: self # Constant type is not self-context
|
277
|
+
|
278
|
+
@@foos: Array[self] # Class variable type is not self-context
|
279
|
+
|
280
|
+
type list = nil | [self, list] # Type alias is not self-context
|
281
|
+
end
|
282
|
+
```
|
283
|
+
|
284
|
+
#### Examples of *classish-context*
|
285
|
+
|
286
|
+
The following `class`/`instance` types are allowed.
|
287
|
+
|
288
|
+
```rbs
|
289
|
+
class Foo
|
290
|
+
attr_reader parent: class
|
291
|
+
|
292
|
+
def foo: () -> instance # behaves like `self` in this context
|
293
|
+
|
294
|
+
def self?.bar: () -> instance # behaves like `class` for `def self.bar()` and `self` for `def bar()`
|
295
|
+
|
296
|
+
@@foos: Array[instance]
|
297
|
+
|
298
|
+
include Enumerable[class]
|
299
|
+
end
|
300
|
+
```
|
301
|
+
|
302
|
+
The following `class`/`instance` types are prohibited.
|
303
|
+
|
304
|
+
```rbs
|
305
|
+
class Foo
|
306
|
+
VERSION: class # Constant type is not classish-context
|
307
|
+
|
308
|
+
type list = nil | [instance, list] # Type alias is not classish-context
|
309
|
+
end
|
310
|
+
```
|
311
|
+
|
312
|
+
## Method Types and Proc Types
|
313
|
+
|
314
|
+
```markdown
|
315
|
+
_method-type_ ::= _parameters?_ _block?_ `->` _type_ # Method type
|
316
|
+
| `(` `?` `)` `->` _type_ # Method type with untyped parameters
|
317
|
+
|
318
|
+
_parameters?_ ::= (Empty)
|
319
|
+
| _parameters_ (Parameters)
|
320
|
+
|
321
|
+
_parameters_ ::= `(` _required-positionals_ _optional-positionals_ _rest-positional_ _trailing-positionals_ _keywords_ `)`
|
322
|
+
|
323
|
+
_parameter_ ::= _type_ _var-name_ # Parameter with var name
|
324
|
+
| _type_ # Parameter without var name
|
325
|
+
_required-positionals_ ::= _parameter_ `,` etc.
|
326
|
+
_optional-positionals_ ::= `?` _parameter_ `,` etc.
|
327
|
+
_rest-positional_ ::= # Empty
|
328
|
+
| `*` _parameter_
|
329
|
+
_trailing-positionals_ ::= _parameter_ `,` etc.
|
330
|
+
_keywords_ ::= # Empty
|
331
|
+
| `**` _parameter_ # Rest keyword
|
332
|
+
| _keyword_ `:` _parameter_ `,` _keywords_ # Required keyword
|
333
|
+
| `?` _keyword_ `:` _parameter_ `,` _keywords_ # Optional keyword
|
334
|
+
|
335
|
+
_var-name_ ::= /[a-z]\w*/
|
336
|
+
|
337
|
+
_self-type-binding?_ = (Empty)
|
338
|
+
| `[` `self` `:` _type_ `]` (Self type binding)
|
339
|
+
|
340
|
+
_block?_ = (No block)
|
341
|
+
| `{` _parameters_ _self-type-binding?_ `->` _type_ `}` (Block)
|
342
|
+
| `{` `(` `?` `)` `->` _type_ `}` (Block with untyped parameters)
|
343
|
+
| `?` `{` _parameters_ _self-type-binding?_ `->` _type_ `}` (Optional block)
|
344
|
+
| `?` `{` `(` `?` `)` `->` _type_ `}` (Optional block with untyped parameters)
|
345
|
+
```
|
346
|
+
|
347
|
+
### Parameters
|
348
|
+
|
349
|
+
A parameter can be a type or a pair of type and variable name.
|
350
|
+
Variable name can be used for documentation.
|
351
|
+
|
352
|
+
#### Examples
|
353
|
+
|
354
|
+
```rbs
|
355
|
+
# Two required positional `Integer` parameters, and returns `String`
|
356
|
+
(Integer, Integer) -> String
|
357
|
+
|
358
|
+
# Two optional parameters `size` and `name`.
|
359
|
+
# `name` is a optional parameter with optional type so that developer can omit, pass a string, or pass `nil`.
|
360
|
+
(?Integer size, ?String? name) -> String
|
361
|
+
|
362
|
+
# Method type with a rest parameter
|
363
|
+
(*Integer, Integer) -> void
|
364
|
+
|
365
|
+
# `size` is a required keyword, with variable name of `sz`.
|
366
|
+
# `name` is a optional keyword.
|
367
|
+
# `created_at` is a optional keyword, and the value can be `nil`.
|
368
|
+
(size: Integer sz, ?name: String, ?created_at: Time?) -> void
|
369
|
+
```
|
370
|
+
|
371
|
+
### Self type binding
|
372
|
+
|
373
|
+
Self type binding represents the type of methods that uses `#instance_eval`, which replaces the value of `self` inside blocks.
|
374
|
+
|
375
|
+
```ruby
|
376
|
+
123.instance_eval do
|
377
|
+
self + 1 # self is `123` here
|
378
|
+
end
|
379
|
+
```
|
380
|
+
|
381
|
+
Proc types and blocks can have self type bindings.
|
382
|
+
|
383
|
+
```rbs
|
384
|
+
^(Integer) [self: String] -> void # Proc type with self type binding
|
385
|
+
^(Integer) [self: String] { (Symbol) [self: bool] -> void } -> void # Proc type with self type binding of `String` and a block with self type binding of `bool`
|
386
|
+
```
|
387
|
+
|
388
|
+
Method type can have blocks with self type bindings.
|
389
|
+
|
390
|
+
```rbs
|
391
|
+
() { (Integer) [self: String] -> void } -> void # A method type with block with self type binding
|
392
|
+
```
|
393
|
+
|
394
|
+
## Members
|
395
|
+
|
396
|
+
```markdown
|
397
|
+
_member_ ::= _ivar-member_ # Ivar definition
|
398
|
+
| _method-member_ # Method definition
|
399
|
+
| _attribute-member_ # Attribute definition
|
400
|
+
| _include-member_ # Mixin (include)
|
401
|
+
| _extend-member_ # Mixin (extend)
|
402
|
+
| _prepend-member_ # Mixin (prepend)
|
403
|
+
| _alias-member_ # Alias
|
404
|
+
| _visibility-member_ # Visibility member
|
405
|
+
|
406
|
+
_ivar-member_ ::= _ivar-name_ `:` _type_
|
407
|
+
| `self` `.` _ivar-name_ `:` _type_
|
408
|
+
| _cvar-name_ `:` _type_
|
409
|
+
|
410
|
+
_method-member_ ::= _method-class-member_
|
411
|
+
| _method-interface-member_
|
412
|
+
_method-class-member_ ::= _visibility_ `def` _method-name_ `:` _method-types_ # Instance method
|
413
|
+
| _visibility_ `def self.` _method-name_ `:` _method-types_ # Singleton method
|
414
|
+
| `def self?.` _method-name_ `:` _method-types_ # Singleton and instance method
|
415
|
+
_method-interface-member_ ::= `def` _method-name_ `:` _method-types_ # Instance method
|
416
|
+
|
417
|
+
_method-types_ ::= _method-type-parameters_ _method-type_ # Single method type
|
418
|
+
| _method-type-parameters_ _method-type_ `|` _method-types_ # Overloading types
|
419
|
+
| `...` # Overloading for duplicate definitions
|
420
|
+
|
421
|
+
_method-type-parameters_ ::= # Empty
|
422
|
+
| `[` _type-variable_ `,` ... `]`
|
423
|
+
|
424
|
+
_attribute-member_ ::= _visibility_ _attribute-type_ _method-name_ `:` _type_ # Attribute
|
425
|
+
| _visibility_ _attribute-type_ _method-name_ `(` _ivar-name_ `) :` _type_ # Attribute with variable name specification
|
426
|
+
| _visibility_ _attribute-type_ _method-name_ `() :` _type_ # Attribute without variable
|
427
|
+
| _visibility_ _attribute-type_ `self.` _method-name_ `:` _type_ # Singleton attribute
|
428
|
+
| _visibility_ _attribute-type_ `self.` _method-name_ `(` _ivar-name_ `) :` _type_ # Singleton attribute with variable name specification
|
429
|
+
| _visibility_ _attribute-type_ `self.` _method-name_ `() :` _type_ # Singleton attribute without variable
|
430
|
+
_visibility_ ::= `public` | `private`
|
431
|
+
|
432
|
+
_attribute-type_ ::= `attr_reader` | `attr_writer` | `attr_accessor`
|
433
|
+
|
434
|
+
_include-member_ ::= _include-class-member_
|
435
|
+
| _include-interface-member_
|
436
|
+
_include-class-member_ ::= `include` _class-name_ _type-arguments_
|
437
|
+
_include-interface-member_ :== `include` _interface-name_ _type-arguments_
|
438
|
+
_extend-member_ ::= `extend` _class-name_ _type-arguments_
|
439
|
+
| `extend` _interface-name_ _type-arguments_
|
440
|
+
_prepend-member_ ::= `prepend` _class-name_ _type-arguments_
|
441
|
+
|
442
|
+
_alias-member_ ::= `alias` _method-name_ _method-name_
|
443
|
+
| `alias self.` _method-name_ `self.` _method-name_
|
444
|
+
|
445
|
+
_visibility-member_ ::= _visibility_
|
446
|
+
|
447
|
+
_ivar-name_ ::= /@\w+/
|
448
|
+
_cvar-name_ ::= /@@\w+/
|
449
|
+
_method-name_ ::= _most of the possible ruby method names_
|
450
|
+
| /`[^`]+`/ # Quoted method names
|
451
|
+
```
|
452
|
+
|
453
|
+
### Ivar definition
|
454
|
+
|
455
|
+
An instance variable definition consists of the name of an instance variable and its type.
|
456
|
+
|
457
|
+
```rbs
|
458
|
+
@name: String
|
459
|
+
self.@value: Hash[Symbol, Key]
|
460
|
+
@@instances: Array[instance]
|
461
|
+
```
|
462
|
+
|
463
|
+
* Instance variables definition is *self-context* and *classish-context*
|
464
|
+
* Class instance variables definition is *self-context* and *classish-context*
|
465
|
+
* Class variables definition is *classish-context*, but NOT *self-context*
|
466
|
+
|
467
|
+
### Method definition
|
468
|
+
|
469
|
+
Method definition has several syntax variations.
|
470
|
+
|
471
|
+
You can write `self.` or `self?.` before the name of the method to specify the kind of method: instance, singleton, or module function.
|
472
|
+
|
473
|
+
```rbs
|
474
|
+
def to_s: () -> String # Defines a instance method
|
475
|
+
def self.new: () -> AnObject # Defines singleton method
|
476
|
+
def self?.sqrt: (Numeric) -> Numeric # self? is for `module_function`s
|
477
|
+
```
|
478
|
+
|
479
|
+
`self?` method definition adds two methods: a public singleton method and a private instance method, which is equivalent to `module_function` in Ruby.
|
480
|
+
|
481
|
+
The method type can be connected with `|`s to define an overloaded method.
|
482
|
+
|
483
|
+
```rbs
|
484
|
+
def +: (Float) -> Float
|
485
|
+
| (Integer) -> Integer
|
486
|
+
| (Numeric) -> Numeric
|
487
|
+
```
|
488
|
+
|
489
|
+
Overloaded method can have `...` to overload an existing method. It is useful for monkey-patching.
|
490
|
+
|
491
|
+
```rbs
|
492
|
+
def +: (Float) -> Float
|
493
|
+
def +: (BigDecimal) -> BigDecimal
|
494
|
+
| ...
|
495
|
+
```
|
496
|
+
|
497
|
+
You need extra parentheses on return type to avoid ambiguity.
|
498
|
+
|
499
|
+
```rbs
|
500
|
+
def +: (Float | Integer) -> (Float | Integer)
|
501
|
+
| (Numeric) -> Numeric
|
502
|
+
```
|
503
|
+
|
504
|
+
Adding `public` and `private` modifier changes the visibility of the method.
|
505
|
+
|
506
|
+
```rbs
|
507
|
+
private def puts: (*untyped) -> void # Defines private instance method
|
508
|
+
|
509
|
+
public def self.puts: (*untyped) -> void # Defines public singleton method
|
510
|
+
|
511
|
+
public def self?.puts: (*untyped) -> void # 🚨🚨🚨 Error: `?.` has own visibility semantics (== `module_function`) 🚨🚨🚨
|
512
|
+
```
|
513
|
+
|
514
|
+
* Method types are *self-context* and *classish-context*
|
515
|
+
|
516
|
+
### Attribute definition
|
517
|
+
|
518
|
+
Attribute definitions help to define methods and instance variables based on the convention of `attr_reader`, `attr_writer` and `attr_accessor` methods in Ruby.
|
519
|
+
|
520
|
+
You can specify the name of instance variable using `(@some_name)` syntax and also omit the instance variable definition by specifying `()`.
|
521
|
+
|
522
|
+
```rbs
|
523
|
+
# Defines `id` method and `@id` instance variable.
|
524
|
+
attr_reader id: Integer
|
525
|
+
# @id: Integer
|
526
|
+
# def id: () -> Integer
|
527
|
+
|
528
|
+
# Defines `name=` method and `@raw_name` instance variable.
|
529
|
+
attr_writer name (@raw_name) : String
|
530
|
+
# @raw_name: String
|
531
|
+
# def name=: (String) -> String
|
532
|
+
|
533
|
+
# Defines `people` and `people=` methods, but no instance variable.
|
534
|
+
attr_accessor people (): Array[Person]
|
535
|
+
# def people: () -> Array[Person]
|
536
|
+
# def people=: (Array[Person]) -> Array[Person]
|
537
|
+
```
|
538
|
+
|
539
|
+
Attribute definitions can have the `public` and `private` modifiers like method definitions:
|
540
|
+
|
541
|
+
```rbs
|
542
|
+
private attr_accessor id: Integer
|
543
|
+
|
544
|
+
private attr_reader self.name: String
|
545
|
+
```
|
546
|
+
|
547
|
+
* Attribute types are *self-context* and *classish-context*
|
548
|
+
|
549
|
+
### Mixin (include), Mixin (extend), Mixin (prepend)
|
550
|
+
|
551
|
+
You can define mixins between class and modules.
|
552
|
+
|
553
|
+
```rbs
|
554
|
+
include Kernel
|
555
|
+
include Enumerable[String, void]
|
556
|
+
extend ActiveSupport::Concern
|
557
|
+
```
|
558
|
+
|
559
|
+
You can also `include` or `extend` an interface.
|
560
|
+
|
561
|
+
```rbs
|
562
|
+
include _Hashing
|
563
|
+
extend _LikeString
|
564
|
+
```
|
565
|
+
|
566
|
+
This allows importing `def`s from the interface to help developer implementing a set of methods.
|
567
|
+
|
568
|
+
* Mixin arguments are *classish-context*, but not *self-context*
|
569
|
+
|
570
|
+
### Alias
|
571
|
+
|
572
|
+
You can define an alias between methods.
|
573
|
+
|
574
|
+
```rbs
|
575
|
+
def map: [X] () { (String) -> X } -> Array[X]
|
576
|
+
alias collect map # `#collect` has the same type with `map`
|
577
|
+
```
|
578
|
+
|
579
|
+
### Visibility member
|
580
|
+
|
581
|
+
Visibility member allows specifying the default visibility of instance methods and instance attributes.
|
582
|
+
|
583
|
+
```rbs
|
584
|
+
public
|
585
|
+
|
586
|
+
def foo: () -> void # public instance method
|
587
|
+
|
588
|
+
attr_reader name: String # public instance attribute
|
589
|
+
|
590
|
+
private
|
591
|
+
|
592
|
+
def bar: () -> void # private instance method
|
593
|
+
|
594
|
+
attr_reader email: String # private instance attribute
|
595
|
+
```
|
596
|
+
|
597
|
+
The visibility _modifiers_ overwrite the default visibility per member bases.
|
598
|
+
|
599
|
+
The visibility member requires a new line `\n` after the token.
|
600
|
+
|
601
|
+
```rbs
|
602
|
+
private alias foo bar # Syntax error
|
603
|
+
```
|
604
|
+
|
605
|
+
## Declarations
|
606
|
+
|
607
|
+
```markdown
|
608
|
+
_decl_ ::= _class-decl_ # Class declaration
|
609
|
+
| _module-decl_ # Module declaration
|
610
|
+
| _class-alias-decl_ # Class alias declaration
|
611
|
+
| _module-alias-decl_ # Module alias declaration
|
612
|
+
| _interface-decl_ # Interface declaration
|
613
|
+
| _type-alias-decl_ # Type alias declaration
|
614
|
+
| _const-decl_ # Constant declaration
|
615
|
+
| _global-decl_ # Global declaration
|
616
|
+
|
617
|
+
_class-decl_ ::= `class` _class-name_ _module-type-parameters_ _members_ `end`
|
618
|
+
| `class` _class-name_ _module-type-parameters_ `<` _class-name_ _type-arguments_ _members_ `end`
|
619
|
+
|
620
|
+
_module-decl_ ::= `module` _module-name_ _module-type-parameters_ _members_ `end`
|
621
|
+
| `module` _module-name_ _module-type-parameters_ `:` _module-self-types_ _members_ `end`
|
622
|
+
|
623
|
+
_class-alias-decl_ ::= `class` _class-name_ `=` _class-name_
|
624
|
+
|
625
|
+
_module-alias-decl_ ::= `module` _module-name_ `=` _module-name_
|
626
|
+
|
627
|
+
_module-self-types_ ::= _class-name_ _type-arguments_ `,` _module-self-types_ (Class instance)
|
628
|
+
| _interface-name_ _type-arguments_ `,` _module-self-types_ (Interface)
|
629
|
+
|
630
|
+
_interface-decl_ ::= `interface` _interface-name_ _module-type-parameters_ _interface-members_ `end`
|
631
|
+
|
632
|
+
_interface-members_ ::= _method-interface-member_ # Method
|
633
|
+
| _include-interface-member_ # Mixin (include)
|
634
|
+
| _alias-member_ # Alias
|
635
|
+
|
636
|
+
_type-alias-decl_ ::= `type` _alias-name_ _module-type-parameters_ `=` _type_
|
637
|
+
|
638
|
+
_const-decl_ ::= _const-name_ `:` _type_
|
639
|
+
|
640
|
+
_global-decl_ ::= _global-name_ `:` _type_
|
641
|
+
|
642
|
+
_const-name_ ::= _namespace_ /[A-Z]\w*/
|
643
|
+
_global-name_ ::= /$[a-zA-Z]\w+/ | ...
|
644
|
+
|
645
|
+
_module-type-parameters_ ::= # Empty
|
646
|
+
| `[` _module-type-parameter_ `,` ... `]`
|
647
|
+
```
|
648
|
+
|
649
|
+
### Class declaration
|
650
|
+
|
651
|
+
Class declaration can have type parameters and superclass. When you omit superclass, `::Object` is assumed.
|
652
|
+
|
653
|
+
* Super class arguments and generic class upperbounds are not *classish-context* nor *self-context*
|
654
|
+
|
655
|
+
### Module declaration
|
656
|
+
|
657
|
+
Module declaration takes optional _self type_ parameter, which defines a constraint about a class when the module is mixed.
|
658
|
+
|
659
|
+
```rbs
|
660
|
+
interface _Each[A, B]
|
661
|
+
def each: { (A) -> void } -> B
|
662
|
+
end
|
663
|
+
|
664
|
+
module Enumerable[A, B] : _Each[A, B]
|
665
|
+
def count: () -> Integer
|
666
|
+
end
|
667
|
+
```
|
668
|
+
|
669
|
+
The `Enumerable` module above requires `each` method for enumerating objects.
|
670
|
+
|
671
|
+
* Self type arguments and generic class upperbounds are not *classish-context* nor *self-context*
|
672
|
+
|
673
|
+
### Class/module alias declaration
|
674
|
+
|
675
|
+
An alias of a class or module can be defined in RBS.
|
676
|
+
|
677
|
+
```rbs
|
678
|
+
module Foo = Kernel
|
679
|
+
|
680
|
+
class Bar = Array
|
681
|
+
```
|
682
|
+
|
683
|
+
The syntax defines a class and the definition is equivalent to the right-hand-side.
|
684
|
+
|
685
|
+
```rbs
|
686
|
+
class Baz < Bar[String] # Class alias can be inherited
|
687
|
+
include Foo # Module alias can be included
|
688
|
+
end
|
689
|
+
```
|
690
|
+
|
691
|
+
This is a definition corresponding to the following Ruby code.
|
692
|
+
|
693
|
+
```ruby
|
694
|
+
Foo = Kernel
|
695
|
+
|
696
|
+
Bar = Array
|
697
|
+
```
|
698
|
+
|
699
|
+
### Interface declaration
|
700
|
+
|
701
|
+
Interface declaration can have parameters but allows only a few of the members.
|
702
|
+
|
703
|
+
```rbs
|
704
|
+
interface _Hashing
|
705
|
+
def hash: () -> Integer
|
706
|
+
def eql?: (untyped) -> bool
|
707
|
+
end
|
708
|
+
```
|
709
|
+
|
710
|
+
There are several limitations which are not described in the grammar.
|
711
|
+
|
712
|
+
1. Interface cannot `include` modules
|
713
|
+
2. Interface cannot have singleton method definitions
|
714
|
+
|
715
|
+
```rbs
|
716
|
+
interface _Foo
|
717
|
+
include Bar # Error: cannot include modules
|
718
|
+
def self.new: () -> Foo # Error: cannot include singleton method definitions
|
719
|
+
end
|
720
|
+
```
|
721
|
+
|
722
|
+
### Type alias declaration
|
723
|
+
|
724
|
+
You can declare an alias of types.
|
725
|
+
|
726
|
+
```rbs
|
727
|
+
type subject = Attendee | Speaker
|
728
|
+
type JSON::t = Integer | TrueClass | FalseClass | String | Hash[Symbol, t] | Array[t]
|
729
|
+
```
|
730
|
+
|
731
|
+
Type alias can be generic like class, module, and interface.
|
732
|
+
|
733
|
+
```rbs
|
734
|
+
type list[out T] = [T, list[T]] | nil
|
735
|
+
```
|
736
|
+
|
737
|
+
* Alias types are not *classish-context* nor *self-context*
|
738
|
+
|
739
|
+
### Constant type declaration
|
740
|
+
|
741
|
+
You can declare a constant.
|
742
|
+
|
743
|
+
```rbs
|
744
|
+
Person::DefaultEmailAddress: String
|
745
|
+
```
|
746
|
+
|
747
|
+
* Constant types are not *classish-context* nor *self-context*
|
748
|
+
|
749
|
+
### Global type declaration
|
750
|
+
|
751
|
+
You can declare a global variable.
|
752
|
+
|
753
|
+
```rbs
|
754
|
+
$LOAD_PATH: Array[String]
|
755
|
+
```
|
756
|
+
|
757
|
+
* Constant types are not *classish-context* nor *self-context*
|
758
|
+
|
759
|
+
### Generics
|
760
|
+
|
761
|
+
```markdown
|
762
|
+
_module-type-parameter_ ::= _generics-unchecked_ _generics-variance_ _type-variable_ _generics-bound_ _default-type_
|
763
|
+
|
764
|
+
_method-type-param_ ::= _type-variable_ _generics-bound_
|
765
|
+
|
766
|
+
_generics-bound_ ::= (No type bound)
|
767
|
+
| `<` _type_ (The generics parameter is bounded)
|
768
|
+
|
769
|
+
_default-type_ ::= (No default type)
|
770
|
+
| `=` _type_ (The generics parameter has default type)
|
771
|
+
|
772
|
+
_generics-variance_ ::= (Invariant)
|
773
|
+
| `out` (Covariant)
|
774
|
+
| `in` (Contravariant)
|
775
|
+
|
776
|
+
_generics-unchecked_ ::= (Empty)
|
777
|
+
| `unchecked` (Skips variance annotation validation)
|
778
|
+
```
|
779
|
+
|
780
|
+
RBS allows class/module/interface/type alias definitions and methods to be generic.
|
781
|
+
|
782
|
+
```rbs
|
783
|
+
# Simple generic class definition
|
784
|
+
class Stack[T]
|
785
|
+
def push: (T) -> void
|
786
|
+
|
787
|
+
def pop: () -> T
|
788
|
+
end
|
789
|
+
```
|
790
|
+
|
791
|
+
For classes with type parameters, you may specify if they are "invariant" (default), "covariant" (`out`) or "contravariant" (`in`). See [this definition of covariance and contravariance](https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)).
|
792
|
+
|
793
|
+
For example, an `Array` of `String` can almost be considered to be an `Array` of `Object`, but not the reverse, so we can think of:
|
794
|
+
|
795
|
+
```rbs
|
796
|
+
# The `T` type parameter is covariant.
|
797
|
+
class Array[out T]
|
798
|
+
# etc.
|
799
|
+
end
|
800
|
+
```
|
801
|
+
|
802
|
+
There's a limitation with this for mutable objects (like arrays): a mutation could invalidate this.
|
803
|
+
If an `Array` of `String` is passed to a method as an `Array` of `Object`, and that method adds an `Integer` to the `Array`, the promise is broken.
|
804
|
+
|
805
|
+
In those cases, one must use the `unchecked` keyword:
|
806
|
+
|
807
|
+
```rbs
|
808
|
+
# Skips the validation of variance of the type parameter `T`.
|
809
|
+
# The type safety prohibits `out` type parameters to appear at _negative_ position (== method parameter), but we want `Array` to have it.
|
810
|
+
class Array[unchecked out T]
|
811
|
+
def include?: (T) -> bool
|
812
|
+
end
|
813
|
+
```
|
814
|
+
|
815
|
+
This is how `Array` is actually defined in RBS.
|
816
|
+
|
817
|
+
Note that RBS doesn't allow specifying variance related annotations to generic method types.
|
818
|
+
|
819
|
+
```rbs
|
820
|
+
class Foo
|
821
|
+
def bar: [out T] () -> T # Syntax error
|
822
|
+
end
|
823
|
+
```
|
824
|
+
|
825
|
+
You can also specify the _upper bound_ of the type parameter.
|
826
|
+
|
827
|
+
```rbs
|
828
|
+
class PrettyPrint[T < _Output]
|
829
|
+
interface _Output
|
830
|
+
def <<: (String) -> void
|
831
|
+
end
|
832
|
+
|
833
|
+
attr_reader output: T
|
834
|
+
end
|
835
|
+
```
|
836
|
+
|
837
|
+
If a type parameter has an upper bound, the type parameter must be instantiated with types that is a subtype of the upper bound.
|
838
|
+
|
839
|
+
```rbs
|
840
|
+
type str_printer = PrettyPrint[String] # OK
|
841
|
+
type int_printer = PrettyPrint[Integer] # Type error
|
842
|
+
```
|
843
|
+
|
844
|
+
The generics type parameter of modules, classes, interfaces, or type aliases can have a default type.
|
845
|
+
|
846
|
+
```rbs
|
847
|
+
interface _Foo[T = untyped]
|
848
|
+
end
|
849
|
+
|
850
|
+
interface _Bar[T, S = untyped]
|
851
|
+
end
|
852
|
+
|
853
|
+
type foo = _Foo # equivalent to _Foo[untyped]
|
854
|
+
type bar = _Bar[String] # equivalent to _Bar[String, untyped]
|
855
|
+
```
|
856
|
+
|
857
|
+
Type parameters with default types cannot appear before type parameters without default types. The generic method type parameters cannot have the default types.
|
858
|
+
|
859
|
+
### Directives
|
860
|
+
|
861
|
+
Directives are placed at the top of a file and provides per-file-basis features.
|
862
|
+
|
863
|
+
```markdown
|
864
|
+
_use-directive_ ::= `use` _use-clauses_
|
865
|
+
|
866
|
+
_use-clauses_ ::= _use-clause_ `,` ... `,` _use-clause_
|
867
|
+
|
868
|
+
_use-clause_ ::= _type-name_ # Single use clause
|
869
|
+
| _type-name_ `as` _simple-type-name_ # Single use clause with alias
|
870
|
+
| _namespace_ # Wildcard use clause
|
871
|
+
```
|
872
|
+
|
873
|
+
The *use directive* defines relative type names that is an alias of other type names.
|
874
|
+
We can use the simple type names if it is declared with *use*.
|
875
|
+
|
876
|
+
```rbs
|
877
|
+
use RBS::Namespace # => Defines `Namespace`
|
878
|
+
use RBS::TypeName as TN # => Defines `TN`
|
879
|
+
use RBS::AST::* # => Defines modules under `::RBS::AST::` namespace
|
880
|
+
```
|
881
|
+
|
882
|
+
### Comments
|
883
|
+
|
884
|
+
You can write single line comments. Comments must be on their own line. Comments can lead with whitespace.
|
885
|
+
|
886
|
+
```rbs
|
887
|
+
# This if interface Foo
|
888
|
+
# Usage of Foo is bar
|
889
|
+
interface _Foo
|
890
|
+
# New foo is a method
|
891
|
+
# it will return foo.
|
892
|
+
def new: () -> Foo
|
893
|
+
end
|
894
|
+
```
|
895
|
+
|
896
|
+
### Annotations
|
897
|
+
|
898
|
+
Annotations are placed before declarations, members, and method types to mark up a metadata for the declaration, the member, or method types.
|
899
|
+
The meaning of annotations are defined by the toolchain (ex. steep).
|
900
|
+
|
901
|
+
```markdown
|
902
|
+
_annotations_ ::= _annotation_ ...
|
903
|
+
_annotation_ ::= `%a{` _annotation-text_ `}` # Annotation using {}
|
904
|
+
| `%a(` _annotation-text_ `)` # Annotation using ()
|
905
|
+
| `%a[` _annotation-text_ `]` # Annotation using []
|
906
|
+
| `%a|` _annotation-text_ `|` # Annotation using ||
|
907
|
+
| `%a<` _annotation-text_ `>` # Annotation using <>
|
908
|
+
|
909
|
+
_annotation-text_ ::= /[^\x00]*/ # Any characters except NUL (and parenthesis)
|
910
|
+
```
|