rbs 3.4.4 → 3.5.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +7 -0
  3. data/CHANGELOG.md +0 -26
  4. data/Gemfile +12 -1
  5. data/Gemfile.lock +51 -34
  6. data/README.md +2 -1
  7. data/Rakefile +2 -2
  8. data/core/enumerator.rbs +1 -1
  9. data/core/gc.rbs +272 -150
  10. data/core/integer.rbs +4 -3
  11. data/core/io/wait.rbs +4 -4
  12. data/core/io.rbs +10 -3
  13. data/core/kernel.rbs +8 -7
  14. data/core/module.rbs +17 -4
  15. data/core/range.rbs +2 -2
  16. data/core/regexp.rbs +101 -90
  17. data/core/ruby_vm.rbs +103 -103
  18. data/core/string.rbs +3 -3
  19. data/core/symbol.rbs +2 -1
  20. data/core/thread.rbs +1 -1
  21. data/core/time.rbs +24 -4
  22. data/docs/architecture.md +110 -0
  23. data/docs/syntax.md +5 -1
  24. data/ext/rbs_extension/constants.c +2 -0
  25. data/ext/rbs_extension/constants.h +1 -0
  26. data/ext/rbs_extension/location.c +79 -70
  27. data/ext/rbs_extension/location.h +23 -5
  28. data/ext/rbs_extension/parser.c +82 -24
  29. data/ext/rbs_extension/parserstate.c +4 -0
  30. data/ext/rbs_extension/ruby_objs.c +13 -3
  31. data/ext/rbs_extension/ruby_objs.h +1 -0
  32. data/lib/rbs/collection/config.rb +1 -1
  33. data/lib/rbs/collection/sources/git.rb +1 -6
  34. data/lib/rbs/definition_builder/method_builder.rb +1 -1
  35. data/lib/rbs/definition_builder.rb +8 -8
  36. data/lib/rbs/diff.rb +1 -1
  37. data/lib/rbs/environment_loader.rb +2 -1
  38. data/lib/rbs/errors.rb +0 -14
  39. data/lib/rbs/parser_aux.rb +0 -5
  40. data/lib/rbs/prototype/helpers.rb +22 -12
  41. data/lib/rbs/prototype/rb.rb +38 -4
  42. data/lib/rbs/prototype/rbi.rb +30 -20
  43. data/lib/rbs/test/errors.rb +19 -14
  44. data/lib/rbs/test/tester.rb +1 -1
  45. data/lib/rbs/test/type_check.rb +95 -16
  46. data/lib/rbs/types.rb +112 -13
  47. data/lib/rbs/unit_test/spy.rb +1 -1
  48. data/lib/rbs/version.rb +1 -1
  49. data/rbs.gemspec +1 -1
  50. data/sig/environment_loader.rbs +1 -1
  51. data/sig/errors.rbs +1 -1
  52. data/sig/method_types.rbs +3 -3
  53. data/sig/prototype/helpers.rbs +4 -0
  54. data/sig/prototype/rbi.rbs +2 -0
  55. data/sig/types.rbs +54 -4
  56. data/sig/variance_calculator.rbs +2 -2
  57. data/stdlib/csv/0/csv.rbs +4 -1
  58. data/stdlib/fileutils/0/fileutils.rbs +1 -1
  59. data/stdlib/net-http/0/net-http.rbs +29 -27
  60. data/stdlib/socket/0/socket.rbs +2 -2
  61. data/stdlib/timeout/0/timeout.rbs +6 -0
  62. data/stdlib/uri/0/generic.rbs +2 -2
  63. data/stdlib/uri/0/http.rbs +2 -2
  64. metadata +3 -6
  65. data/lib/rbs/parser_compat/lexer_error.rb +0 -6
  66. data/lib/rbs/parser_compat/located_value.rb +0 -7
  67. data/lib/rbs/parser_compat/semantics_error.rb +0 -6
  68. data/lib/rbs/parser_compat/syntax_error.rb +0 -6
@@ -52,6 +52,10 @@ typedef struct {
52
52
  VALUE rest_keywords;
53
53
  } method_params;
54
54
 
55
+ static bool rbs_is_untyped_params(method_params *params) {
56
+ return NIL_P(params->required_positionals);
57
+ }
58
+
55
59
  // /**
56
60
  // * Returns RBS::Location object of `current_token` of a parser state.
57
61
  // *
@@ -78,7 +82,7 @@ static VALUE string_of_loc(parserstate *state, position start, position end) {
78
82
  }
79
83
 
80
84
  /**
81
- * Raises RuntimeError with "Unexpected error " messsage.
85
+ * Raises RuntimeError with "Unexpected error " message.
82
86
  * */
83
87
  static NORETURN(void) rbs_abort(void) {
84
88
  rb_raise(
@@ -265,6 +269,7 @@ static VALUE parse_function_param(parserstate *state) {
265
269
 
266
270
  VALUE location = rbs_new_location(state->buffer, param_range);
267
271
  rbs_loc *loc = rbs_check_location(location);
272
+ rbs_loc_alloc_children(loc, 1);
268
273
  rbs_loc_add_optional_child(loc, rb_intern("name"), NULL_RANGE);
269
274
 
270
275
  return rbs_function_param(type, Qnil, location);
@@ -287,6 +292,7 @@ static VALUE parse_function_param(parserstate *state) {
287
292
  VALUE name = rb_to_symbol(rbs_unquote_string(state, state->current_token.range, 0));
288
293
  VALUE location = rbs_new_location(state->buffer, param_range);
289
294
  rbs_loc *loc = rbs_check_location(location);
295
+ rbs_loc_alloc_children(loc, 1);
290
296
  rbs_loc_add_optional_child(loc, rb_intern("name"), name_range);
291
297
 
292
298
  return rbs_function_param(type, name, location);
@@ -360,6 +366,7 @@ static bool is_keyword(parserstate *state) {
360
366
 
361
367
  /*
362
368
  params ::= {} `)`
369
+ | {} `?` `)` -- Untyped function params (assign params.required = nil)
363
370
  | <required_params> `)`
364
371
  | <required_params> `,` `)`
365
372
 
@@ -387,6 +394,11 @@ static bool is_keyword(parserstate *state) {
387
394
  | {} `**` <function_param>
388
395
  */
389
396
  static void parse_params(parserstate *state, method_params *params) {
397
+ if (state->next_token.type == pQUESTION && state->next_token2.type == pRPAREN) {
398
+ params->required_positionals = Qnil;
399
+ parser_advance(state);
400
+ return;
401
+ }
390
402
  if (state->next_token.type == pRPAREN) {
391
403
  return;
392
404
  }
@@ -611,6 +623,13 @@ static void parse_function(parserstate *state, VALUE *function, VALUE *block, VA
611
623
  parser_advance_assert(state, pRPAREN);
612
624
  }
613
625
 
626
+ // Untyped method parameter means it cannot have block
627
+ if (rbs_is_untyped_params(&params)) {
628
+ if (state->next_token.type != pARROW) {
629
+ raise_syntax_error(state, state->next_token2, "A method type with untyped method parameter cannot have block");
630
+ }
631
+ }
632
+
614
633
  // Passing NULL to function_self_type means the function itself doesn't accept self type binding. (== method type)
615
634
  if (function_self_type) {
616
635
  *function_self_type = parse_self_type_binding(state);
@@ -639,8 +658,11 @@ static void parse_function(parserstate *state, VALUE *function, VALUE *block, VA
639
658
  parser_advance_assert(state, pARROW);
640
659
  VALUE block_return_type = parse_optional(state);
641
660
 
642
- *block = rbs_block(
643
- rbs_function(
661
+ VALUE block_function = Qnil;
662
+ if (rbs_is_untyped_params(&block_params)) {
663
+ block_function = rbs_untyped_function(block_return_type);
664
+ } else {
665
+ block_function = rbs_function(
644
666
  block_params.required_positionals,
645
667
  block_params.optional_positionals,
646
668
  block_params.rest_positionals,
@@ -649,10 +671,10 @@ static void parse_function(parserstate *state, VALUE *function, VALUE *block, VA
649
671
  block_params.optional_keywords,
650
672
  block_params.rest_keywords,
651
673
  block_return_type
652
- ),
653
- required,
654
- block_self_type
655
- );
674
+ );
675
+ }
676
+
677
+ *block = rbs_block(block_function, required, block_self_type);
656
678
 
657
679
  parser_advance_assert(state, pRBRACE);
658
680
  }
@@ -660,16 +682,20 @@ static void parse_function(parserstate *state, VALUE *function, VALUE *block, VA
660
682
  parser_advance_assert(state, pARROW);
661
683
  VALUE type = parse_optional(state);
662
684
 
663
- *function = rbs_function(
664
- params.required_positionals,
665
- params.optional_positionals,
666
- params.rest_positionals,
667
- params.trailing_positionals,
668
- params.required_keywords,
669
- params.optional_keywords,
670
- params.rest_keywords,
671
- type
672
- );
685
+ if (rbs_is_untyped_params(&params)) {
686
+ *function = rbs_untyped_function(type);
687
+ } else {
688
+ *function = rbs_function(
689
+ params.required_positionals,
690
+ params.optional_positionals,
691
+ params.rest_positionals,
692
+ params.trailing_positionals,
693
+ params.required_keywords,
694
+ params.optional_keywords,
695
+ params.rest_keywords,
696
+ type
697
+ );
698
+ }
673
699
  }
674
700
 
675
701
  /*
@@ -698,15 +724,22 @@ static VALUE parse_proc_type(parserstate *state) {
698
724
  | {} literal_type `=>` <type>
699
725
  */
700
726
  VALUE parse_record_attributes(parserstate *state) {
701
- VALUE hash = rb_hash_new();
727
+ VALUE fields = rb_hash_new();
702
728
 
703
729
  if (state->next_token.type == pRBRACE) {
704
- return hash;
730
+ return fields;
705
731
  }
706
732
 
707
733
  while (true) {
708
- VALUE key;
709
- VALUE type;
734
+ VALUE key, type,
735
+ value = rb_ary_new(),
736
+ required = Qtrue;
737
+
738
+ if (state->next_token.type == pQUESTION) {
739
+ // { ?foo: type } syntax
740
+ required = Qfalse;
741
+ parser_advance(state);
742
+ }
710
743
 
711
744
  if (is_keyword(state)) {
712
745
  // { foo: type } syntax
@@ -735,7 +768,9 @@ VALUE parse_record_attributes(parserstate *state) {
735
768
  parser_advance_assert(state, pFATARROW);
736
769
  }
737
770
  type = parse_type(state);
738
- rb_hash_aset(hash, key, type);
771
+ rb_ary_push(value, type);
772
+ rb_ary_push(value, required);
773
+ rb_hash_aset(fields, key, value);
739
774
 
740
775
  if (parser_advance_if(state, pCOMMA)) {
741
776
  if (state->next_token.type == pRBRACE) {
@@ -745,8 +780,7 @@ VALUE parse_record_attributes(parserstate *state) {
745
780
  break;
746
781
  }
747
782
  }
748
-
749
- return hash;
783
+ return fields;
750
784
  }
751
785
 
752
786
  /*
@@ -832,6 +866,7 @@ static VALUE parse_instance_type(parserstate *state, bool parse_alias) {
832
866
 
833
867
  VALUE location = rbs_new_location(state->buffer, type_range);
834
868
  rbs_loc *loc = rbs_check_location(location);
869
+ rbs_loc_alloc_children(loc, 2);
835
870
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
836
871
  rbs_loc_add_optional_child(loc, rb_intern("args"), args_range);
837
872
 
@@ -866,6 +901,7 @@ static VALUE parse_singleton_type(parserstate *state) {
866
901
 
867
902
  VALUE location = rbs_new_location(state->buffer, type_range);
868
903
  rbs_loc *loc = rbs_check_location(location);
904
+ rbs_loc_alloc_children(loc, 1);
869
905
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
870
906
 
871
907
  return rbs_class_singleton(typename, location);
@@ -1121,6 +1157,7 @@ VALUE parse_type_params(parserstate *state, range *rg, bool module_type_params)
1121
1157
 
1122
1158
  VALUE location = rbs_new_location(state->buffer, param_range);
1123
1159
  rbs_loc *loc = rbs_check_location(location);
1160
+ rbs_loc_alloc_children(loc, 4);
1124
1161
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
1125
1162
  rbs_loc_add_optional_child(loc, rb_intern("variance"), variance_range);
1126
1163
  rbs_loc_add_optional_child(loc, rb_intern("unchecked"), unchecked_range);
@@ -1181,6 +1218,7 @@ VALUE parse_method_type(parserstate *state) {
1181
1218
 
1182
1219
  VALUE location = rbs_new_location(state->buffer, rg);
1183
1220
  rbs_loc *loc = rbs_check_location(location);
1221
+ rbs_loc_alloc_children(loc, 2);
1184
1222
  rbs_loc_add_required_child(loc, rb_intern("type"), type_range);
1185
1223
  rbs_loc_add_optional_child(loc, rb_intern("type_params"), params_range);
1186
1224
 
@@ -1220,6 +1258,7 @@ VALUE parse_global_decl(parserstate *state) {
1220
1258
 
1221
1259
  location = rbs_new_location(state->buffer, decl_range);
1222
1260
  loc = rbs_check_location(location);
1261
+ rbs_loc_alloc_children(loc, 2);
1223
1262
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
1224
1263
  rbs_loc_add_required_child(loc, rb_intern("colon"), colon_range);
1225
1264
 
@@ -1253,6 +1292,7 @@ VALUE parse_const_decl(parserstate *state) {
1253
1292
 
1254
1293
  location = rbs_new_location(state->buffer, decl_range);
1255
1294
  loc = rbs_check_location(location);
1295
+ rbs_loc_alloc_children(loc, 2);
1256
1296
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
1257
1297
  rbs_loc_add_required_child(loc, rb_intern("colon"), colon_range);
1258
1298
 
@@ -1286,6 +1326,7 @@ VALUE parse_type_decl(parserstate *state, position comment_pos, VALUE annotation
1286
1326
 
1287
1327
  VALUE location = rbs_new_location(state->buffer, decl_range);
1288
1328
  rbs_loc *loc = rbs_check_location(location);
1329
+ rbs_loc_alloc_children(loc, 4);
1289
1330
  rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
1290
1331
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
1291
1332
  rbs_loc_add_optional_child(loc, rb_intern("type_params"), params_range);
@@ -1627,6 +1668,7 @@ VALUE parse_member_def(parserstate *state, bool instance_only, bool accept_overl
1627
1668
 
1628
1669
  VALUE location = rbs_new_location(state->buffer, member_range);
1629
1670
  rbs_loc *loc = rbs_check_location(location);
1671
+ rbs_loc_alloc_children(loc, 5);
1630
1672
  rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
1631
1673
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
1632
1674
  rbs_loc_add_optional_child(loc, rb_intern("kind"), kind_range);
@@ -1731,6 +1773,7 @@ VALUE parse_mixin_member(parserstate *state, bool from_interface, position comme
1731
1773
 
1732
1774
  VALUE location = rbs_new_location(state->buffer, member_range);
1733
1775
  rbs_loc *loc = rbs_check_location(location);
1776
+ rbs_loc_alloc_children(loc, 3);
1734
1777
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
1735
1778
  rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
1736
1779
  rbs_loc_add_optional_child(loc, rb_intern("args"), args_range);
@@ -1794,6 +1837,7 @@ VALUE parse_alias_member(parserstate *state, bool instance_only, position commen
1794
1837
  member_range.end = state->current_token.range.end;
1795
1838
  VALUE location = rbs_new_location(state->buffer, member_range);
1796
1839
  rbs_loc *loc = rbs_check_location(location);
1840
+ rbs_loc_alloc_children(loc, 5);
1797
1841
  rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
1798
1842
  rbs_loc_add_required_child(loc, rb_intern("new_name"), new_name_range);
1799
1843
  rbs_loc_add_required_child(loc, rb_intern("old_name"), old_name_range);
@@ -1897,6 +1941,7 @@ VALUE parse_variable_member(parserstate *state, position comment_pos, VALUE anno
1897
1941
 
1898
1942
  location = rbs_new_location(state->buffer, member_range);
1899
1943
  rbs_loc *loc = rbs_check_location(location);
1944
+ rbs_loc_alloc_children(loc, 3);
1900
1945
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
1901
1946
  rbs_loc_add_required_child(loc, rb_intern("colon"), colon_range);
1902
1947
  rbs_loc_add_optional_child(loc, rb_intern("kind"), kind_range);
@@ -2041,6 +2086,7 @@ VALUE parse_attribute_member(parserstate *state, position comment_pos, VALUE ann
2041
2086
 
2042
2087
  location = rbs_new_location(state->buffer, member_range);
2043
2088
  loc = rbs_check_location(location);
2089
+ rbs_loc_alloc_children(loc, 7);
2044
2090
  rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
2045
2091
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
2046
2092
  rbs_loc_add_required_child(loc, rb_intern("colon"), colon_range);
@@ -2138,6 +2184,7 @@ VALUE parse_interface_decl(parserstate *state, position comment_pos, VALUE annot
2138
2184
 
2139
2185
  VALUE location = rbs_new_location(state->buffer, member_range);
2140
2186
  rbs_loc *loc = rbs_check_location(location);
2187
+ rbs_loc_alloc_children(loc, 4);
2141
2188
  rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
2142
2189
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
2143
2190
  rbs_loc_add_required_child(loc, rb_intern("end"), end_range);
@@ -2183,6 +2230,7 @@ void parse_module_self_types(parserstate *state, VALUE array) {
2183
2230
 
2184
2231
  VALUE location = rbs_new_location(state->buffer, self_range);
2185
2232
  rbs_loc *loc = rbs_check_location(location);
2233
+ rbs_loc_alloc_children(loc, 2);
2186
2234
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
2187
2235
  rbs_loc_add_optional_child(loc, rb_intern("args"), args_range);
2188
2236
 
@@ -2319,6 +2367,7 @@ VALUE parse_module_decl0(parserstate *state, range keyword_range, VALUE module_n
2319
2367
 
2320
2368
  VALUE location = rbs_new_location(state->buffer, decl_range);
2321
2369
  rbs_loc *loc = rbs_check_location(location);
2370
+ rbs_loc_alloc_children(loc, 6);
2322
2371
  rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
2323
2372
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
2324
2373
  rbs_loc_add_required_child(loc, rb_intern("end"), end_range);
@@ -2368,6 +2417,7 @@ VALUE parse_module_decl(parserstate *state, position comment_pos, VALUE annotati
2368
2417
 
2369
2418
  VALUE location = rbs_new_location(state->buffer, decl_range);
2370
2419
  rbs_loc *loc = rbs_check_location(location);
2420
+ rbs_loc_alloc_children(loc, 4);
2371
2421
  rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
2372
2422
  rbs_loc_add_required_child(loc, rb_intern("new_name"), module_name_range);
2373
2423
  rbs_loc_add_required_child(loc, rb_intern("eq"), eq_range);
@@ -2404,6 +2454,7 @@ VALUE parse_class_decl_super(parserstate *state, range *lt_range) {
2404
2454
 
2405
2455
  location = rbs_new_location(state->buffer, super_range);
2406
2456
  loc = rbs_check_location(location);
2457
+ rbs_loc_alloc_children(loc, 2);
2407
2458
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
2408
2459
  rbs_loc_add_optional_child(loc, rb_intern("args"), args_range);
2409
2460
 
@@ -2446,6 +2497,7 @@ VALUE parse_class_decl0(parserstate *state, range keyword_range, VALUE name, ran
2446
2497
 
2447
2498
  location = rbs_new_location(state->buffer, decl_range);
2448
2499
  loc = rbs_check_location(location);
2500
+ rbs_loc_alloc_children(loc, 5);
2449
2501
  rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
2450
2502
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
2451
2503
  rbs_loc_add_required_child(loc, rb_intern("end"), end_range);
@@ -2491,6 +2543,7 @@ VALUE parse_class_decl(parserstate *state, position comment_pos, VALUE annotatio
2491
2543
 
2492
2544
  VALUE location = rbs_new_location(state->buffer, decl_range);
2493
2545
  rbs_loc *loc = rbs_check_location(location);
2546
+ rbs_loc_alloc_children(loc, 4);
2494
2547
  rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
2495
2548
  rbs_loc_add_required_child(loc, rb_intern("new_name"), class_name_range);
2496
2549
  rbs_loc_add_required_child(loc, rb_intern("eq"), eq_range);
@@ -2664,6 +2717,7 @@ void parse_use_clauses(parserstate *state, VALUE clauses) {
2664
2717
 
2665
2718
  VALUE location = rbs_new_location(state->buffer, clause_range);
2666
2719
  rbs_loc *loc = rbs_check_location(location);
2720
+ rbs_loc_alloc_children(loc, 3);
2667
2721
  rbs_loc_add_required_child(loc, rb_intern("type_name"), type_name_range);
2668
2722
  rbs_loc_add_optional_child(loc, rb_intern("keyword"), keyword_range);
2669
2723
  rbs_loc_add_optional_child(loc, rb_intern("new_name"), new_name_range);
@@ -2681,6 +2735,7 @@ void parse_use_clauses(parserstate *state, VALUE clauses) {
2681
2735
 
2682
2736
  VALUE location = rbs_new_location(state->buffer, clause_range);
2683
2737
  rbs_loc *loc = rbs_check_location(location);
2738
+ rbs_loc_alloc_children(loc, 2);
2684
2739
  rbs_loc_add_required_child(loc, rb_intern("namespace"), namespace_range);
2685
2740
  rbs_loc_add_required_child(loc, rb_intern("star"), star_range);
2686
2741
 
@@ -2723,6 +2778,7 @@ VALUE parse_use_directive(parserstate *state) {
2723
2778
 
2724
2779
  VALUE location = rbs_new_location(state->buffer, directive_range);
2725
2780
  rbs_loc *loc = rbs_check_location(location);
2781
+ rbs_loc_alloc_children(loc, 1);
2726
2782
  rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
2727
2783
 
2728
2784
  return rbs_ast_directives_use(clauses, location);
@@ -2755,6 +2811,7 @@ rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, V
2755
2811
  parserstate *parser = alloc_parser(buffer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
2756
2812
 
2757
2813
  if (parser->next_token.type == pEOF) {
2814
+ free_parser(parser);
2758
2815
  return Qnil;
2759
2816
  }
2760
2817
 
@@ -2775,6 +2832,7 @@ rbsparser_parse_method_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end
2775
2832
  parserstate *parser = alloc_parser(buffer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
2776
2833
 
2777
2834
  if (parser->next_token.type == pEOF) {
2835
+ free_parser(parser);
2778
2836
  return Qnil;
2779
2837
  }
2780
2838
 
@@ -277,6 +277,10 @@ parserstate *alloc_parser(VALUE buffer, int start_pos, int end_pos, VALUE variab
277
277
 
278
278
  StringValue(string);
279
279
 
280
+ if (start_pos < 0 || end_pos < 0) {
281
+ rb_raise(rb_eArgError, "negative position range: %d...%d", start_pos, end_pos);
282
+ }
283
+
280
284
  lexstate *lexer = calloc(1, sizeof(lexstate));
281
285
  lexer->string = string;
282
286
  lexer->current.line = 1;
@@ -170,6 +170,17 @@ VALUE rbs_function_param(VALUE type, VALUE name, VALUE location) {
170
170
  );
171
171
  }
172
172
 
173
+ VALUE rbs_untyped_function(VALUE return_type) {
174
+ VALUE args = rb_hash_new();
175
+ rb_hash_aset(args, ID2SYM(rb_intern("return_type")), return_type);
176
+
177
+ return CLASS_NEW_INSTANCE(
178
+ RBS_Types_UntypedFunction,
179
+ 1,
180
+ &args
181
+ );
182
+ }
183
+
173
184
  VALUE rbs_function(
174
185
  VALUE required_positional_params,
175
186
  VALUE optional_positional_params,
@@ -234,10 +245,10 @@ VALUE rbs_literal(VALUE literal, VALUE location) {
234
245
  );
235
246
  }
236
247
 
237
- VALUE rbs_record(VALUE fields, VALUE location) {
248
+ VALUE rbs_record(VALUE fields,VALUE location) {
238
249
  VALUE args = rb_hash_new();
239
250
  rb_hash_aset(args, ID2SYM(rb_intern("location")), location);
240
- rb_hash_aset(args, ID2SYM(rb_intern("fields")), fields);
251
+ rb_hash_aset(args, ID2SYM(rb_intern("all_fields")), fields);
241
252
 
242
253
  return CLASS_NEW_INSTANCE(
243
254
  RBS_Types_Record,
@@ -588,4 +599,3 @@ VALUE rbs_ast_directives_use_wildcard_clause(VALUE namespace, VALUE location) {
588
599
 
589
600
  return CLASS_NEW_INSTANCE(RBS_AST_Directives_Use_WildcardClause, 1, &kwargs);
590
601
  }
591
-
@@ -30,6 +30,7 @@ VALUE rbs_class_instance(VALUE typename, VALUE type_args, VALUE location);
30
30
  VALUE rbs_class_singleton(VALUE typename, VALUE location);
31
31
  VALUE rbs_function_param(VALUE type, VALUE name, VALUE location);
32
32
  VALUE rbs_function(VALUE required_positional_params, VALUE optional_positional_params, VALUE rest_positional_params, VALUE trailing_positional_params, VALUE required_keywords, VALUE optional_keywords, VALUE rest_keywords, VALUE return_type);
33
+ VALUE rbs_untyped_function(VALUE return_type);
33
34
  VALUE rbs_interface(VALUE typename, VALUE type_args, VALUE location);
34
35
  VALUE rbs_intersection(VALUE types, VALUE location);
35
36
  VALUE rbs_literal(VALUE literal, VALUE location);
@@ -65,8 +65,8 @@ module RBS
65
65
 
66
66
  def sources
67
67
  @sources ||= [
68
- Sources::Stdlib.instance,
69
68
  Sources::Rubygems.instance,
69
+ Sources::Stdlib.instance,
70
70
  *@data['sources'].map { |c| Sources.from_config_entry(c, base_directory: @config_path.dirname) }
71
71
  ]
72
72
  end
@@ -152,12 +152,7 @@ module RBS
152
152
  private def need_to_fetch?(revision)
153
153
  return true unless commit_hash?
154
154
 
155
- begin
156
- git('cat-file', '-e', revision)
157
- false
158
- rescue CommandError
159
- true
160
- end
155
+ !git?('cat-file', '-e', revision)
161
156
  end
162
157
 
163
158
  private def git_dir
@@ -4,7 +4,7 @@ module RBS
4
4
  class DefinitionBuilder
5
5
  class MethodBuilder
6
6
  class Methods
7
- Definition = _ = Struct.new(:name, :type, :originals, :overloads, :accessibilities, keyword_init: true) do
7
+ class Definition < Struct.new(:name, :type, :originals, :overloads, :accessibilities, keyword_init: true)
8
8
  # @implements Definition
9
9
 
10
10
  def original
@@ -630,12 +630,12 @@ module RBS
630
630
  end
631
631
 
632
632
  # @type var accessibility: RBS::Definition::accessibility
633
- accessibility = if method.name == :initialize
634
- :private
635
- else
636
- method.accessibility
637
- end
638
-
633
+ accessibility =
634
+ if original.instance? && [:initialize, :initialize_copy, :initialize_clone, :initialize_dup, :respond_to_missing?].include?(method.name)
635
+ :private
636
+ else
637
+ method.accessibility
638
+ end
639
639
  # Skip setting up `super_method` if `implemented_in` is `nil`, that means the type doesn't have implementation.
640
640
  # This typically happens if the type is an interface.
641
641
  if implemented_in
@@ -669,7 +669,7 @@ module RBS
669
669
  ]
670
670
  ),
671
671
  block: nil,
672
- location: nil
672
+ location: original.location
673
673
  )
674
674
  else
675
675
  # getter
@@ -677,7 +677,7 @@ module RBS
677
677
  type_params: [],
678
678
  type: Types::Function.empty(attr_type),
679
679
  block: nil,
680
- location: nil
680
+ location: original.location
681
681
  )
682
682
  end
683
683
 
data/lib/rbs/diff.rb CHANGED
@@ -83,7 +83,7 @@ module RBS
83
83
  manifest_pathname = dir_pathname / 'manifest.yaml'
84
84
  if manifest_pathname.exist?
85
85
  manifest = YAML.safe_load(manifest_pathname.read)
86
- if manifest['dependencies']
86
+ if manifest && manifest['dependencies']
87
87
  manifest['dependencies'].each do |dependency|
88
88
  loader.add(library: dependency['name'], version: nil)
89
89
  end
@@ -14,7 +14,8 @@ module RBS
14
14
 
15
15
  include FileFinder
16
16
 
17
- Library = _ = Struct.new(:name, :version, keyword_init: true)
17
+ class Library < Struct.new(:name, :version, keyword_init: true)
18
+ end
18
19
 
19
20
  attr_reader :core_root
20
21
  attr_reader :repository
data/lib/rbs/errors.rb CHANGED
@@ -62,20 +62,6 @@ module RBS
62
62
 
63
63
  super "#{Location.to_string location}: Syntax error: #{error_message}, token=`#{location.source}` (#{token_type})"
64
64
  end
65
-
66
- def error_value
67
- RBS.print_warning {
68
- "#{self.class.name}#error_value is deprecated and will be deleted in RBS 2.0. Consider using `location.source` instead."
69
- }
70
- location.source
71
- end
72
-
73
- def token_str
74
- RBS.print_warning {
75
- "#{self.class.name}#token_str is deprecated and will be deleted in RBS 2.0. Consider using `token_type` instead."
76
- }
77
- token_type
78
- end
79
65
  end
80
66
 
81
67
  class InvalidTypeApplicationError < DefinitionError
@@ -28,11 +28,6 @@ module RBS
28
28
  end
29
29
  end
30
30
 
31
- autoload :SyntaxError, "rbs/parser_compat/syntax_error"
32
- autoload :SemanticsError, "rbs/parser_compat/semantics_error"
33
- autoload :LexerError, "rbs/parser_compat/lexer_error"
34
- autoload :LocatedValue, "rbs/parser_compat/located_value"
35
-
36
31
  KEYWORDS = %w(
37
32
  bool
38
33
  bot
@@ -37,13 +37,9 @@ module RBS
37
37
  end
38
38
  end
39
39
 
40
- method_block = Types::Block.new(
41
- required: required,
42
- type: Types::Function.empty(untyped),
43
- self_type: nil
44
- )
45
-
46
40
  if yields
41
+ function = Types::Function.empty(untyped)
42
+
47
43
  yields.each do |yield_node|
48
44
  array_content = yield_node.children[0]&.children&.compact || []
49
45
 
@@ -54,9 +50,9 @@ module RBS
54
50
  [array_content, nil]
55
51
  end
56
52
 
57
- if (diff = positionals.size - method_block.type.required_positionals.size) > 0
53
+ if (diff = positionals.size - function.required_positionals.size) > 0
58
54
  diff.times do
59
- method_block.type.required_positionals << Types::Function::Param.new(
55
+ function.required_positionals << Types::Function::Param.new(
60
56
  type: untyped,
61
57
  name: nil
62
58
  )
@@ -67,7 +63,7 @@ module RBS
67
63
  keywords.children[0].children.each_slice(2) do |key_node, value_node|
68
64
  if key_node
69
65
  key = key_node.children[0]
70
- method_block.type.required_keywords[key] ||=
66
+ function.required_keywords[key] ||=
71
67
  Types::Function::Param.new(
72
68
  type: untyped,
73
69
  name: nil
@@ -76,10 +72,13 @@ module RBS
76
72
  end
77
73
  end
78
74
  end
75
+ else
76
+ function = Types::UntypedFunction.new(return_type: untyped)
79
77
  end
80
- end
81
78
 
82
- method_block
79
+
80
+ Types::Block.new(required: required, type: function, self_type: nil)
81
+ end
83
82
  end
84
83
 
85
84
  def each_child(node, &block)
@@ -109,7 +108,7 @@ module RBS
109
108
  def keyword_hash?(node)
110
109
  if node && node.type == :HASH
111
110
  node.children[0].children.compact.each_slice(2).all? {|key, _|
112
- key.type == :LIT && key.children[0].is_a?(Symbol)
111
+ symbol_literal_node?(key)
113
112
  }
114
113
  else
115
114
  false
@@ -122,6 +121,17 @@ module RBS
122
121
  args_node&.children || [0, nil, nil, nil, 0, nil, nil, nil, nil, nil]
123
122
  end
124
123
 
124
+ def symbol_literal_node?(node)
125
+ case node.type
126
+ when :LIT
127
+ if node.children[0].is_a?(Symbol)
128
+ node.children[0]
129
+ end
130
+ when :SYM
131
+ node.children[0]
132
+ end
133
+ end
134
+
125
135
  def untyped
126
136
  @untyped ||= Types::Bases::Any.new(location: nil)
127
137
  end