rbs 4.0.3 → 4.1.3
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 +4 -4
- data/.dockerignore +37 -0
- data/.github/dependabot.yml +1 -1
- data/.github/workflows/bundle-update.yml +2 -2
- data/.github/workflows/c-check.yml +14 -6
- data/.github/workflows/comments.yml +2 -2
- data/.github/workflows/dependabot.yml +2 -2
- data/.github/workflows/jruby.yml +74 -0
- data/.github/workflows/release-gems.yml +235 -0
- data/.github/workflows/ruby.yml +43 -3
- data/.github/workflows/rust.yml +13 -10
- data/.github/workflows/truffleruby.yml +54 -0
- data/.github/workflows/typecheck.yml +5 -2
- data/.github/workflows/wasm.yml +55 -0
- data/.github/workflows/windows.yml +5 -2
- data/.gitignore +8 -0
- data/CHANGELOG.md +113 -0
- data/Dockerfile.jruby +53 -0
- data/README.md +4 -4
- data/Rakefile +512 -82
- data/Steepfile +9 -0
- data/config.yml +26 -0
- data/core/array.rbs +243 -180
- data/core/builtin.rbs +7 -6
- data/core/class.rbs +5 -3
- data/core/enumerable.rbs +109 -109
- data/core/enumerator/product.rbs +5 -5
- data/core/enumerator.rbs +28 -28
- data/core/file.rbs +24 -1018
- data/core/file_constants.rbs +463 -0
- data/core/file_stat.rbs +534 -0
- data/core/float.rbs +0 -24
- data/core/hash.rbs +117 -101
- data/core/integer.rbs +21 -58
- data/core/io.rbs +25 -7
- data/core/kernel.rbs +26 -11
- data/core/match_data.rbs +1 -1
- data/core/module.rbs +88 -74
- data/core/numeric.rbs +3 -0
- data/core/object_space/weak_key_map.rbs +7 -7
- data/core/pathname.rbs +0 -10
- data/core/ractor.rbs +0 -10
- data/core/range.rbs +23 -23
- data/core/rbs/ops.rbs +154 -0
- data/core/rbs/unnamed/argf.rbs +3 -3
- data/core/ruby_vm.rbs +40 -0
- data/core/rubygems/errors.rbs +4 -1
- data/core/rubygems/requirement.rbs +0 -10
- data/core/rubygems/rubygems.rbs +4 -1
- data/core/rubygems/specification.rbs +8 -0
- data/core/rubygems/version.rbs +0 -160
- data/core/set.rbs +3 -3
- data/core/struct.rbs +16 -16
- data/core/thread.rbs +9 -14
- data/docs/CONTRIBUTING.md +2 -1
- data/docs/inline.md +65 -7
- data/docs/rbs_by_example.md +20 -20
- data/docs/release.md +247 -0
- data/docs/syntax.md +2 -2
- data/docs/wasm_serialization.md +80 -0
- data/ext/rbs_extension/ast_translation.c +1298 -956
- data/ext/rbs_extension/ast_translation.h +4 -0
- data/ext/rbs_extension/class_constants.c +2 -0
- data/ext/rbs_extension/class_constants.h +1 -0
- data/ext/rbs_extension/extconf.rb +1 -0
- data/ext/rbs_extension/legacy_location.c +11 -6
- data/ext/rbs_extension/main.c +139 -4
- data/include/rbs/ast.h +323 -298
- data/include/rbs/defines.h +18 -0
- data/include/rbs/lexer.h +1 -0
- data/include/rbs/serialize.h +39 -0
- data/lib/rbs/annotate/rdoc_annotator.rb +27 -31
- data/lib/rbs/ast/ruby/annotations.rb +42 -0
- data/lib/rbs/ast/ruby/comment_block.rb +6 -4
- data/lib/rbs/ast/ruby/declarations.rb +11 -1
- data/lib/rbs/ast/ruby/helpers/location_helper.rb +1 -1
- data/lib/rbs/ast/ruby/members.rb +40 -1
- data/lib/rbs/buffer.rb +48 -11
- data/lib/rbs/cli.rb +3 -5
- data/lib/rbs/collection/config/lockfile_generator.rb +14 -1
- data/lib/rbs/collection/sources/git.rb +6 -0
- data/lib/rbs/definition_builder/method_builder.rb +12 -6
- data/lib/rbs/environment.rb +10 -3
- data/lib/rbs/inline_parser.rb +54 -28
- data/lib/rbs/namespace.rb +47 -11
- data/lib/rbs/parser_aux.rb +4 -2
- data/lib/rbs/prototype/rbi.rb +193 -25
- data/lib/rbs/prototype/runtime.rb +2 -0
- data/lib/rbs/resolver/type_name_resolver.rb +12 -14
- data/lib/rbs/rewriter.rb +70 -0
- data/lib/rbs/test/type_check.rb +6 -1
- data/lib/rbs/type_name.rb +33 -13
- data/lib/rbs/unit_test/type_assertions.rb +14 -5
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/wasm/deserializer.rb +213 -0
- data/lib/rbs/wasm/location.rb +61 -0
- data/lib/rbs/wasm/parser.rb +137 -0
- data/lib/rbs/wasm/runtime.rb +196 -0
- data/lib/rbs/wasm/serialization_schema.rb +110 -0
- data/lib/rbs.rb +14 -2
- data/lib/rbs_jars.rb +39 -0
- data/lib/rdoc_plugin/parser.rb +5 -0
- data/rbs.gemspec +32 -2
- data/sig/annotate/rdoc_annotater.rbs +12 -9
- data/sig/ast/ruby/annotations.rbs +49 -0
- data/sig/ast/ruby/members.rbs +21 -1
- data/sig/buffer.rbs +19 -1
- data/sig/collection/config/lockfile_generator.rbs +2 -0
- data/sig/inline_parser.rbs +2 -0
- data/sig/manifest.yaml +0 -1
- data/sig/namespace.rbs +20 -0
- data/sig/parser.rbs +10 -0
- data/sig/prototype/rbi.rbs +33 -4
- data/sig/resolver/type_name_resolver.rbs +2 -4
- data/sig/rewriter.rbs +45 -0
- data/sig/typename.rbs +15 -0
- data/sig/unit_test/type_assertions.rbs +6 -2
- data/sig/wasm/deserializer.rbs +66 -0
- data/sig/wasm/serialization_schema.rbs +13 -0
- data/src/ast.c +186 -162
- data/src/lexer.c +220 -193
- data/src/lexer.re +2 -1
- data/src/lexstate.c +10 -1
- data/src/parser.c +61 -8
- data/src/serialize.c +958 -0
- data/src/util/rbs_allocator.c +14 -8
- data/stdlib/abbrev/0/array.rbs +1 -1
- data/stdlib/csv/0/csv.rbs +5 -5
- data/stdlib/delegate/0/delegator.rbs +2 -1
- data/stdlib/digest/0/digest.rbs +11 -5
- data/stdlib/erb/0/erb.rbs +1 -1
- data/stdlib/etc/0/etc.rbs +18 -4
- data/stdlib/fileutils/0/fileutils.rbs +21 -21
- data/stdlib/ipaddr/0/ipaddr.rbs +0 -5
- data/stdlib/json/0/json.rbs +6 -6
- data/stdlib/monitor/0/monitor.rbs +2 -2
- data/stdlib/openssl/0/openssl.rbs +46 -40
- data/stdlib/resolv/0/resolv.rbs +1 -1
- data/stdlib/shellwords/0/shellwords.rbs +1 -1
- data/stdlib/stringio/0/stringio.rbs +32 -10
- data/stdlib/strscan/0/string_scanner.rbs +74 -55
- data/stdlib/tempfile/0/manifest.yaml +3 -0
- data/stdlib/timeout/0/timeout.rbs +0 -5
- data/stdlib/tsort/0/cyclic.rbs +1 -1
- data/stdlib/tsort/0/interfaces.rbs +8 -8
- data/stdlib/tsort/0/tsort.rbs +9 -9
- data/stdlib/uri/0/generic.rbs +0 -5
- data/stdlib/zlib/0/gzip_reader.rbs +2 -2
- data/stdlib/zlib/0/zstream.rbs +0 -1
- data/wasm/README.md +93 -0
- data/wasm/rbs_wasm.c +423 -0
- metadata +29 -6
- data/.github/workflows/milestone.yml +0 -80
- data/.vscode/extensions.json +0 -5
- data/.vscode/settings.json +0 -19
data/src/lexer.re
CHANGED
|
@@ -58,7 +58,7 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) {
|
|
|
58
58
|
"%a|" [^|\x00]* "|" { return rbs_next_token(lexer, tANNOTATION); }
|
|
59
59
|
"%a<" [^>\x00]* ">" { return rbs_next_token(lexer, tANNOTATION); }
|
|
60
60
|
|
|
61
|
-
"#" (. \ [\x00])* {
|
|
61
|
+
"#" (. \ [\x00\uFFFD])* {
|
|
62
62
|
return rbs_next_token(
|
|
63
63
|
lexer,
|
|
64
64
|
lexer->first_token_of_line ? tLINECOMMENT : tCOMMENT
|
|
@@ -83,6 +83,7 @@ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) {
|
|
|
83
83
|
"interface" { return rbs_next_token(lexer, kINTERFACE); }
|
|
84
84
|
"module" { return rbs_next_token(lexer, kMODULE); }
|
|
85
85
|
"module-alias" { return rbs_next_token(lexer, kMODULEALIAS); }
|
|
86
|
+
"module-self" { return rbs_next_token(lexer, kMODULESELF); }
|
|
86
87
|
"nil" { return rbs_next_token(lexer, kNIL); }
|
|
87
88
|
"out" { return rbs_next_token(lexer, kOUT); }
|
|
88
89
|
"prepend" { return rbs_next_token(lexer, kPREPEND); }
|
data/src/lexstate.c
CHANGED
|
@@ -68,6 +68,7 @@ static const char *RBS_TOKENTYPE_NAMES[] = {
|
|
|
68
68
|
"kATRBS", /* @rbs */
|
|
69
69
|
"kSKIP", /* skip */
|
|
70
70
|
"kRETURN", /* return */
|
|
71
|
+
"kMODULESELF", /* module-self */
|
|
71
72
|
|
|
72
73
|
"tLIDENT", /* Identifiers starting with lower case */
|
|
73
74
|
"tUIDENT", /* Identifiers starting with upper case */
|
|
@@ -133,7 +134,15 @@ bool rbs_next_char(rbs_lexer_t *lexer, unsigned int *codepoint, size_t *byte_len
|
|
|
133
134
|
|
|
134
135
|
*byte_len = lexer->encoding->char_width((const uint8_t *) start, (ptrdiff_t) (lexer->string.end - start));
|
|
135
136
|
|
|
136
|
-
if (*byte_len ==
|
|
137
|
+
if (*byte_len == 0) {
|
|
138
|
+
// Invalid byte under the active encoding. Map it to a sentinel code
|
|
139
|
+
// point (U+FFFD) and advance one byte so the lexer always makes
|
|
140
|
+
// progress. Token rules that scan until a delimiter exclude this
|
|
141
|
+
// sentinel, so an invalid byte surfaces as an ErrorToken instead of
|
|
142
|
+
// being silently swallowed.
|
|
143
|
+
*byte_len = 1;
|
|
144
|
+
*codepoint = 0xFFFD;
|
|
145
|
+
} else if (*byte_len == 1) {
|
|
137
146
|
*codepoint = (unsigned int) *start;
|
|
138
147
|
} else {
|
|
139
148
|
*codepoint = 12523; // Dummy data for "ル" from "ルビー" (Ruby) in Unicode
|
data/src/parser.c
CHANGED
|
@@ -405,18 +405,21 @@ NODISCARD
|
|
|
405
405
|
static bool parse_keyword_key(rbs_parser_t *parser, rbs_ast_symbol_t **key) {
|
|
406
406
|
rbs_parser_advance(parser);
|
|
407
407
|
|
|
408
|
-
|
|
408
|
+
rbs_range_t symbol_range = parser->current_token.range;
|
|
409
409
|
|
|
410
410
|
if (parser->next_token.type == pQUESTION) {
|
|
411
|
+
// The `?` is part of the key, so it is part of the location too.
|
|
412
|
+
symbol_range.end = parser->next_token.range.end;
|
|
413
|
+
|
|
411
414
|
*key = rbs_ast_symbol_new(
|
|
412
415
|
ALLOCATOR(),
|
|
413
|
-
symbol_range,
|
|
416
|
+
RBS_RANGE_LEX2AST(symbol_range),
|
|
414
417
|
&parser->constant_pool,
|
|
415
418
|
intern_token_start_end(parser, parser->current_token, parser->next_token)
|
|
416
419
|
);
|
|
417
420
|
rbs_parser_advance(parser);
|
|
418
421
|
} else {
|
|
419
|
-
*key = rbs_ast_symbol_new(ALLOCATOR(), symbol_range, &parser->constant_pool, INTERN_TOKEN(parser, parser->current_token));
|
|
422
|
+
*key = rbs_ast_symbol_new(ALLOCATOR(), RBS_RANGE_LEX2AST(symbol_range), &parser->constant_pool, INTERN_TOKEN(parser, parser->current_token));
|
|
420
423
|
}
|
|
421
424
|
|
|
422
425
|
return true;
|
|
@@ -3324,11 +3327,7 @@ bool rbs_parse_signature(rbs_parser_t *parser, rbs_signature_t **signature) {
|
|
|
3324
3327
|
rbs_ast_directives_use_t *use_node;
|
|
3325
3328
|
CHECK_PARSE(parse_use_directive(parser, &use_node));
|
|
3326
3329
|
|
|
3327
|
-
|
|
3328
|
-
rbs_node_list_append(dirs, NULL);
|
|
3329
|
-
} else {
|
|
3330
|
-
rbs_node_list_append(dirs, (rbs_node_t *) use_node);
|
|
3331
|
-
}
|
|
3330
|
+
rbs_node_list_append(dirs, (rbs_node_t *) use_node);
|
|
3332
3331
|
}
|
|
3333
3332
|
|
|
3334
3333
|
while (parser->next_token.type != pEOF) {
|
|
@@ -4052,6 +4051,60 @@ static bool parse_inline_leading_annotation(rbs_parser_t *parser, rbs_ast_ruby_a
|
|
|
4052
4051
|
);
|
|
4053
4052
|
return true;
|
|
4054
4053
|
}
|
|
4054
|
+
case kMODULESELF: {
|
|
4055
|
+
rbs_parser_advance(parser);
|
|
4056
|
+
rbs_range_t keyword_range = parser->current_token.range;
|
|
4057
|
+
|
|
4058
|
+
ADVANCE_ASSERT(parser, pCOLON);
|
|
4059
|
+
rbs_range_t colon_range = parser->current_token.range;
|
|
4060
|
+
|
|
4061
|
+
rbs_parser_advance(parser);
|
|
4062
|
+
|
|
4063
|
+
rbs_range_t name_range;
|
|
4064
|
+
rbs_type_name_t *type_name = NULL;
|
|
4065
|
+
if (!parse_type_name(parser, (TypeNameKind) (CLASS_NAME | INTERFACE_NAME), &name_range, &type_name)) {
|
|
4066
|
+
return false;
|
|
4067
|
+
}
|
|
4068
|
+
|
|
4069
|
+
rbs_node_list_t *args = rbs_node_list_new(ALLOCATOR());
|
|
4070
|
+
rbs_location_range open_bracket_loc = RBS_LOCATION_NULL_RANGE;
|
|
4071
|
+
rbs_location_range close_bracket_loc = RBS_LOCATION_NULL_RANGE;
|
|
4072
|
+
rbs_location_range_list_t *args_comma_locations = rbs_location_range_list_new(ALLOCATOR());
|
|
4073
|
+
if (parser->next_token.type == pLBRACKET) {
|
|
4074
|
+
rbs_parser_advance(parser);
|
|
4075
|
+
open_bracket_loc = RBS_RANGE_LEX2AST(parser->current_token.range);
|
|
4076
|
+
CHECK_PARSE(parse_type_list_with_commas(parser, pRBRACKET, args, args_comma_locations, true, false, false));
|
|
4077
|
+
rbs_parser_advance(parser);
|
|
4078
|
+
close_bracket_loc = RBS_RANGE_LEX2AST(parser->current_token.range);
|
|
4079
|
+
}
|
|
4080
|
+
|
|
4081
|
+
rbs_location_range comment_loc = RBS_LOCATION_NULL_RANGE;
|
|
4082
|
+
if (!parse_inline_comment(parser, &comment_loc)) {
|
|
4083
|
+
return false;
|
|
4084
|
+
}
|
|
4085
|
+
|
|
4086
|
+
rbs_range_t full_range = {
|
|
4087
|
+
.start = rbs_range.start,
|
|
4088
|
+
.end = parser->current_token.range.end
|
|
4089
|
+
};
|
|
4090
|
+
|
|
4091
|
+
rbs_location_range full_loc = RBS_RANGE_LEX2AST(full_range);
|
|
4092
|
+
|
|
4093
|
+
*annotation = (rbs_ast_ruby_annotations_t *) rbs_ast_ruby_annotations_module_self_annotation_new(
|
|
4094
|
+
ALLOCATOR(),
|
|
4095
|
+
full_loc,
|
|
4096
|
+
RBS_RANGE_LEX2AST(rbs_range),
|
|
4097
|
+
RBS_RANGE_LEX2AST(keyword_range),
|
|
4098
|
+
RBS_RANGE_LEX2AST(colon_range),
|
|
4099
|
+
type_name,
|
|
4100
|
+
args,
|
|
4101
|
+
open_bracket_loc,
|
|
4102
|
+
close_bracket_loc,
|
|
4103
|
+
args_comma_locations,
|
|
4104
|
+
comment_loc
|
|
4105
|
+
);
|
|
4106
|
+
return true;
|
|
4107
|
+
}
|
|
4055
4108
|
default: {
|
|
4056
4109
|
rbs_parser_set_error(parser, parser->next_token, true, "unexpected token for @rbs annotation");
|
|
4057
4110
|
return false;
|