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.
Files changed (155) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +37 -0
  3. data/.github/dependabot.yml +1 -1
  4. data/.github/workflows/bundle-update.yml +2 -2
  5. data/.github/workflows/c-check.yml +14 -6
  6. data/.github/workflows/comments.yml +2 -2
  7. data/.github/workflows/dependabot.yml +2 -2
  8. data/.github/workflows/jruby.yml +74 -0
  9. data/.github/workflows/release-gems.yml +235 -0
  10. data/.github/workflows/ruby.yml +43 -3
  11. data/.github/workflows/rust.yml +13 -10
  12. data/.github/workflows/truffleruby.yml +54 -0
  13. data/.github/workflows/typecheck.yml +5 -2
  14. data/.github/workflows/wasm.yml +55 -0
  15. data/.github/workflows/windows.yml +5 -2
  16. data/.gitignore +8 -0
  17. data/CHANGELOG.md +113 -0
  18. data/Dockerfile.jruby +53 -0
  19. data/README.md +4 -4
  20. data/Rakefile +512 -82
  21. data/Steepfile +9 -0
  22. data/config.yml +26 -0
  23. data/core/array.rbs +243 -180
  24. data/core/builtin.rbs +7 -6
  25. data/core/class.rbs +5 -3
  26. data/core/enumerable.rbs +109 -109
  27. data/core/enumerator/product.rbs +5 -5
  28. data/core/enumerator.rbs +28 -28
  29. data/core/file.rbs +24 -1018
  30. data/core/file_constants.rbs +463 -0
  31. data/core/file_stat.rbs +534 -0
  32. data/core/float.rbs +0 -24
  33. data/core/hash.rbs +117 -101
  34. data/core/integer.rbs +21 -58
  35. data/core/io.rbs +25 -7
  36. data/core/kernel.rbs +26 -11
  37. data/core/match_data.rbs +1 -1
  38. data/core/module.rbs +88 -74
  39. data/core/numeric.rbs +3 -0
  40. data/core/object_space/weak_key_map.rbs +7 -7
  41. data/core/pathname.rbs +0 -10
  42. data/core/ractor.rbs +0 -10
  43. data/core/range.rbs +23 -23
  44. data/core/rbs/ops.rbs +154 -0
  45. data/core/rbs/unnamed/argf.rbs +3 -3
  46. data/core/ruby_vm.rbs +40 -0
  47. data/core/rubygems/errors.rbs +4 -1
  48. data/core/rubygems/requirement.rbs +0 -10
  49. data/core/rubygems/rubygems.rbs +4 -1
  50. data/core/rubygems/specification.rbs +8 -0
  51. data/core/rubygems/version.rbs +0 -160
  52. data/core/set.rbs +3 -3
  53. data/core/struct.rbs +16 -16
  54. data/core/thread.rbs +9 -14
  55. data/docs/CONTRIBUTING.md +2 -1
  56. data/docs/inline.md +65 -7
  57. data/docs/rbs_by_example.md +20 -20
  58. data/docs/release.md +247 -0
  59. data/docs/syntax.md +2 -2
  60. data/docs/wasm_serialization.md +80 -0
  61. data/ext/rbs_extension/ast_translation.c +1298 -956
  62. data/ext/rbs_extension/ast_translation.h +4 -0
  63. data/ext/rbs_extension/class_constants.c +2 -0
  64. data/ext/rbs_extension/class_constants.h +1 -0
  65. data/ext/rbs_extension/extconf.rb +1 -0
  66. data/ext/rbs_extension/legacy_location.c +11 -6
  67. data/ext/rbs_extension/main.c +139 -4
  68. data/include/rbs/ast.h +323 -298
  69. data/include/rbs/defines.h +18 -0
  70. data/include/rbs/lexer.h +1 -0
  71. data/include/rbs/serialize.h +39 -0
  72. data/lib/rbs/annotate/rdoc_annotator.rb +27 -31
  73. data/lib/rbs/ast/ruby/annotations.rb +42 -0
  74. data/lib/rbs/ast/ruby/comment_block.rb +6 -4
  75. data/lib/rbs/ast/ruby/declarations.rb +11 -1
  76. data/lib/rbs/ast/ruby/helpers/location_helper.rb +1 -1
  77. data/lib/rbs/ast/ruby/members.rb +40 -1
  78. data/lib/rbs/buffer.rb +48 -11
  79. data/lib/rbs/cli.rb +3 -5
  80. data/lib/rbs/collection/config/lockfile_generator.rb +14 -1
  81. data/lib/rbs/collection/sources/git.rb +6 -0
  82. data/lib/rbs/definition_builder/method_builder.rb +12 -6
  83. data/lib/rbs/environment.rb +10 -3
  84. data/lib/rbs/inline_parser.rb +54 -28
  85. data/lib/rbs/namespace.rb +47 -11
  86. data/lib/rbs/parser_aux.rb +4 -2
  87. data/lib/rbs/prototype/rbi.rb +193 -25
  88. data/lib/rbs/prototype/runtime.rb +2 -0
  89. data/lib/rbs/resolver/type_name_resolver.rb +12 -14
  90. data/lib/rbs/rewriter.rb +70 -0
  91. data/lib/rbs/test/type_check.rb +6 -1
  92. data/lib/rbs/type_name.rb +33 -13
  93. data/lib/rbs/unit_test/type_assertions.rb +14 -5
  94. data/lib/rbs/version.rb +1 -1
  95. data/lib/rbs/wasm/deserializer.rb +213 -0
  96. data/lib/rbs/wasm/location.rb +61 -0
  97. data/lib/rbs/wasm/parser.rb +137 -0
  98. data/lib/rbs/wasm/runtime.rb +196 -0
  99. data/lib/rbs/wasm/serialization_schema.rb +110 -0
  100. data/lib/rbs.rb +14 -2
  101. data/lib/rbs_jars.rb +39 -0
  102. data/lib/rdoc_plugin/parser.rb +5 -0
  103. data/rbs.gemspec +32 -2
  104. data/sig/annotate/rdoc_annotater.rbs +12 -9
  105. data/sig/ast/ruby/annotations.rbs +49 -0
  106. data/sig/ast/ruby/members.rbs +21 -1
  107. data/sig/buffer.rbs +19 -1
  108. data/sig/collection/config/lockfile_generator.rbs +2 -0
  109. data/sig/inline_parser.rbs +2 -0
  110. data/sig/manifest.yaml +0 -1
  111. data/sig/namespace.rbs +20 -0
  112. data/sig/parser.rbs +10 -0
  113. data/sig/prototype/rbi.rbs +33 -4
  114. data/sig/resolver/type_name_resolver.rbs +2 -4
  115. data/sig/rewriter.rbs +45 -0
  116. data/sig/typename.rbs +15 -0
  117. data/sig/unit_test/type_assertions.rbs +6 -2
  118. data/sig/wasm/deserializer.rbs +66 -0
  119. data/sig/wasm/serialization_schema.rbs +13 -0
  120. data/src/ast.c +186 -162
  121. data/src/lexer.c +220 -193
  122. data/src/lexer.re +2 -1
  123. data/src/lexstate.c +10 -1
  124. data/src/parser.c +61 -8
  125. data/src/serialize.c +958 -0
  126. data/src/util/rbs_allocator.c +14 -8
  127. data/stdlib/abbrev/0/array.rbs +1 -1
  128. data/stdlib/csv/0/csv.rbs +5 -5
  129. data/stdlib/delegate/0/delegator.rbs +2 -1
  130. data/stdlib/digest/0/digest.rbs +11 -5
  131. data/stdlib/erb/0/erb.rbs +1 -1
  132. data/stdlib/etc/0/etc.rbs +18 -4
  133. data/stdlib/fileutils/0/fileutils.rbs +21 -21
  134. data/stdlib/ipaddr/0/ipaddr.rbs +0 -5
  135. data/stdlib/json/0/json.rbs +6 -6
  136. data/stdlib/monitor/0/monitor.rbs +2 -2
  137. data/stdlib/openssl/0/openssl.rbs +46 -40
  138. data/stdlib/resolv/0/resolv.rbs +1 -1
  139. data/stdlib/shellwords/0/shellwords.rbs +1 -1
  140. data/stdlib/stringio/0/stringio.rbs +32 -10
  141. data/stdlib/strscan/0/string_scanner.rbs +74 -55
  142. data/stdlib/tempfile/0/manifest.yaml +3 -0
  143. data/stdlib/timeout/0/timeout.rbs +0 -5
  144. data/stdlib/tsort/0/cyclic.rbs +1 -1
  145. data/stdlib/tsort/0/interfaces.rbs +8 -8
  146. data/stdlib/tsort/0/tsort.rbs +9 -9
  147. data/stdlib/uri/0/generic.rbs +0 -5
  148. data/stdlib/zlib/0/gzip_reader.rbs +2 -2
  149. data/stdlib/zlib/0/zstream.rbs +0 -1
  150. data/wasm/README.md +93 -0
  151. data/wasm/rbs_wasm.c +423 -0
  152. metadata +29 -6
  153. data/.github/workflows/milestone.yml +0 -80
  154. data/.vscode/extensions.json +0 -5
  155. 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 == 1) {
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
- rbs_location_range symbol_range = rbs_location_range_current_token(parser);
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
- if (use_node == NULL) {
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;