rbs 3.5.3 → 3.6.0.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/dependabot.yml +5 -1
- data/.github/workflows/ruby.yml +2 -18
- data/.github/workflows/windows.yml +26 -0
- data/.rubocop.yml +28 -1
- data/CHANGELOG.md +58 -0
- data/Rakefile +8 -2
- data/core/array.rbs +10 -10
- data/core/basic_object.rbs +4 -4
- data/core/builtin.rbs +4 -4
- data/core/dir.rbs +1 -1
- data/core/enumerable.rbs +17 -11
- data/core/enumerator/product.rbs +1 -1
- data/core/enumerator.rbs +9 -2
- data/core/errors.rbs +1 -1
- data/core/exception.rbs +1 -1
- data/core/fiber.rbs +1 -1
- data/core/file.rbs +1 -1
- data/core/global_variables.rbs +2 -2
- data/core/integer.rbs +4 -4
- data/core/kernel.rbs +69 -40
- data/core/method.rbs +98 -7
- data/core/module.rbs +3 -3
- data/core/proc.rbs +184 -23
- data/core/ractor.rbs +1 -1
- data/core/random.rbs +1 -1
- data/core/range.rbs +30 -0
- data/core/rbs/unnamed/env_class.rbs +7 -7
- data/core/rbs/unnamed/random.rbs +14 -14
- data/core/refinement.rbs +16 -26
- data/core/regexp.rbs +2 -2
- data/core/symbol.rbs +34 -26
- data/core/thread.rbs +8 -7
- data/core/trace_point.rbs +12 -12
- data/core/unbound_method.rbs +1 -1
- data/docs/syntax.md +26 -12
- data/ext/rbs_extension/lexer.c +1 -1
- data/ext/rbs_extension/lexer.h +5 -0
- data/ext/rbs_extension/lexer.re +1 -1
- data/ext/rbs_extension/lexstate.c +16 -0
- data/ext/rbs_extension/location.c +27 -39
- data/ext/rbs_extension/location.h +7 -2
- data/ext/rbs_extension/parser.c +119 -51
- data/ext/rbs_extension/ruby_objs.c +2 -1
- data/ext/rbs_extension/ruby_objs.h +1 -1
- data/lib/rbs/ast/declarations.rb +36 -0
- data/lib/rbs/ast/type_param.rb +71 -15
- data/lib/rbs/ast/visitor.rb +137 -0
- data/lib/rbs/buffer.rb +5 -0
- data/lib/rbs/cli/validate.rb +81 -7
- data/lib/rbs/cli.rb +3 -3
- data/lib/rbs/definition.rb +2 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +30 -4
- data/lib/rbs/definition_builder.rb +21 -6
- data/lib/rbs/environment_loader.rb +1 -1
- data/lib/rbs/errors.rb +8 -3
- data/lib/rbs/file_finder.rb +9 -12
- data/lib/rbs/location_aux.rb +2 -6
- data/lib/rbs/locator.rb +8 -5
- data/lib/rbs/prototype/rbi.rb +2 -1
- data/lib/rbs/prototype/runtime.rb +3 -2
- data/lib/rbs/sorter.rb +9 -6
- data/lib/rbs/test/type_check.rb +13 -0
- data/lib/rbs/types.rb +11 -0
- data/lib/rbs/validator.rb +2 -2
- data/lib/rbs/vendorer.rb +3 -3
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs.rb +1 -0
- data/sig/declarations.rbs +6 -0
- data/sig/definition.rbs +1 -1
- data/sig/definition_builder.rbs +3 -1
- data/sig/errors.rbs +3 -2
- data/sig/file_finder.rbs +24 -2
- data/sig/location.rbs +0 -3
- data/sig/method_types.rbs +1 -1
- data/sig/sorter.rbs +1 -1
- data/sig/type_param.rbs +41 -9
- data/sig/types.rbs +12 -0
- data/sig/visitor.rbs +47 -0
- data/stdlib/csv/0/csv.rbs +44 -6
- data/stdlib/digest/0/digest.rbs +22 -28
- data/stdlib/ipaddr/0/ipaddr.rbs +1 -1
- data/stdlib/kconv/0/kconv.rbs +166 -0
- data/stdlib/net-http/0/net-http.rbs +2 -2
- data/stdlib/psych/0/store.rbs +1 -1
- data/stdlib/uri/0/ldap.rbs +1 -1
- data/stdlib/zlib/0/deflate.rbs +1 -1
- data/stdlib/zlib/0/gzip_reader.rbs +5 -1
- metadata +6 -2
data/ext/rbs_extension/parser.c
CHANGED
@@ -52,6 +52,14 @@ typedef struct {
|
|
52
52
|
VALUE rest_keywords;
|
53
53
|
} method_params;
|
54
54
|
|
55
|
+
static VALUE EMPTY_ARRAY;
|
56
|
+
|
57
|
+
static void inline melt_array(VALUE *array) {
|
58
|
+
if (*array == EMPTY_ARRAY) {
|
59
|
+
*array = rb_ary_new();
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
55
63
|
static bool rbs_is_untyped_params(method_params *params) {
|
56
64
|
return NIL_P(params->required_positionals);
|
57
65
|
}
|
@@ -137,7 +145,7 @@ void parser_advance_no_gap(parserstate *state) {
|
|
137
145
|
*/
|
138
146
|
VALUE parse_type_name(parserstate *state, TypeNameKind kind, range *rg) {
|
139
147
|
VALUE absolute = Qfalse;
|
140
|
-
VALUE path =
|
148
|
+
VALUE path = EMPTY_ARRAY;
|
141
149
|
VALUE namespace;
|
142
150
|
|
143
151
|
if (rg) {
|
@@ -155,6 +163,7 @@ VALUE parse_type_name(parserstate *state, TypeNameKind kind, range *rg) {
|
|
155
163
|
&& state->current_token.range.end.byte_pos == state->next_token.range.start.byte_pos
|
156
164
|
&& state->next_token.range.end.byte_pos == state->next_token2.range.start.byte_pos
|
157
165
|
) {
|
166
|
+
melt_array(&path);
|
158
167
|
rb_ary_push(path, ID2SYM(INTERN_TOKEN(state, state->current_token)));
|
159
168
|
|
160
169
|
parser_advance(state);
|
@@ -211,9 +220,10 @@ VALUE parse_type_name(parserstate *state, TypeNameKind kind, range *rg) {
|
|
211
220
|
type_list ::= {} type `,` ... <`,`> eol
|
212
221
|
| {} type `,` ... `,` <type> eol
|
213
222
|
*/
|
214
|
-
static
|
223
|
+
static void parse_type_list(parserstate *state, enum TokenType eol, VALUE *types) {
|
215
224
|
while (true) {
|
216
|
-
|
225
|
+
melt_array(types);
|
226
|
+
rb_ary_push(*types, parse_type(state));
|
217
227
|
|
218
228
|
if (state->next_token.type == pCOMMA) {
|
219
229
|
parser_advance(state);
|
@@ -233,8 +243,6 @@ static VALUE parse_type_list(parserstate *state, enum TokenType eol, VALUE types
|
|
233
243
|
}
|
234
244
|
}
|
235
245
|
}
|
236
|
-
|
237
|
-
return types;
|
238
246
|
}
|
239
247
|
|
240
248
|
static bool is_keyword_token(enum TokenType type) {
|
@@ -329,11 +337,22 @@ static VALUE parse_keyword_key(parserstate *state) {
|
|
329
337
|
/*
|
330
338
|
keyword ::= {} keyword `:` <function_param>
|
331
339
|
*/
|
332
|
-
static void parse_keyword(parserstate *state, VALUE keywords) {
|
340
|
+
static void parse_keyword(parserstate *state, VALUE keywords, VALUE memo) {
|
333
341
|
VALUE key;
|
334
342
|
VALUE param;
|
335
343
|
|
336
344
|
key = parse_keyword_key(state);
|
345
|
+
|
346
|
+
if (!NIL_P(rb_hash_aref(memo, key))) {
|
347
|
+
raise_syntax_error(
|
348
|
+
state,
|
349
|
+
state->current_token,
|
350
|
+
"duplicated keyword argument"
|
351
|
+
);
|
352
|
+
} else {
|
353
|
+
rb_hash_aset(memo, key, Qtrue);
|
354
|
+
}
|
355
|
+
|
337
356
|
parser_advance_assert(state, pCOLON);
|
338
357
|
param = parse_function_param(state);
|
339
358
|
|
@@ -403,6 +422,8 @@ static void parse_params(parserstate *state, method_params *params) {
|
|
403
422
|
return;
|
404
423
|
}
|
405
424
|
|
425
|
+
VALUE memo = rb_hash_new();
|
426
|
+
|
406
427
|
while (true) {
|
407
428
|
VALUE param;
|
408
429
|
|
@@ -422,6 +443,7 @@ static void parse_params(parserstate *state, method_params *params) {
|
|
422
443
|
}
|
423
444
|
|
424
445
|
param = parse_function_param(state);
|
446
|
+
melt_array(¶ms->required_positionals);
|
425
447
|
rb_ary_push(params->required_positionals, param);
|
426
448
|
|
427
449
|
break;
|
@@ -441,12 +463,13 @@ PARSE_OPTIONAL_PARAMS:
|
|
441
463
|
parser_advance(state);
|
442
464
|
|
443
465
|
if (is_keyword(state)) {
|
444
|
-
parse_keyword(state, params->optional_keywords);
|
466
|
+
parse_keyword(state, params->optional_keywords, memo);
|
445
467
|
parser_advance_if(state, pCOMMA);
|
446
468
|
goto PARSE_KEYWORDS;
|
447
469
|
}
|
448
470
|
|
449
471
|
param = parse_function_param(state);
|
472
|
+
melt_array(¶ms->optional_positionals);
|
450
473
|
rb_ary_push(params->optional_positionals, param);
|
451
474
|
|
452
475
|
break;
|
@@ -490,6 +513,7 @@ PARSE_TRAILING_PARAMS:
|
|
490
513
|
}
|
491
514
|
|
492
515
|
param = parse_function_param(state);
|
516
|
+
melt_array(¶ms->trailing_positionals);
|
493
517
|
rb_ary_push(params->trailing_positionals, param);
|
494
518
|
|
495
519
|
break;
|
@@ -506,7 +530,7 @@ PARSE_KEYWORDS:
|
|
506
530
|
case pQUESTION:
|
507
531
|
parser_advance(state);
|
508
532
|
if (is_keyword(state)) {
|
509
|
-
parse_keyword(state, params->optional_keywords);
|
533
|
+
parse_keyword(state, params->optional_keywords, memo);
|
510
534
|
} else {
|
511
535
|
raise_syntax_error(
|
512
536
|
state,
|
@@ -529,7 +553,7 @@ PARSE_KEYWORDS:
|
|
529
553
|
case tBANGIDENT:
|
530
554
|
KEYWORD_CASES
|
531
555
|
if (is_keyword(state)) {
|
532
|
-
parse_keyword(state, params->required_keywords);
|
556
|
+
parse_keyword(state, params->required_keywords, memo);
|
533
557
|
} else {
|
534
558
|
raise_syntax_error(
|
535
559
|
state,
|
@@ -580,10 +604,10 @@ static VALUE parse_optional(parserstate *state) {
|
|
580
604
|
}
|
581
605
|
|
582
606
|
static void initialize_method_params(method_params *params){
|
583
|
-
params->required_positionals =
|
584
|
-
params->optional_positionals =
|
607
|
+
params->required_positionals = EMPTY_ARRAY;
|
608
|
+
params->optional_positionals = EMPTY_ARRAY;
|
585
609
|
params->rest_positionals = Qnil;
|
586
|
-
params->trailing_positionals =
|
610
|
+
params->trailing_positionals = EMPTY_ARRAY;
|
587
611
|
params->required_keywords = rb_hash_new();
|
588
612
|
params->optional_keywords = rb_hash_new();
|
589
613
|
params->rest_keywords = Qnil;
|
@@ -713,6 +737,16 @@ static VALUE parse_proc_type(parserstate *state) {
|
|
713
737
|
return rbs_proc(function, block, loc, proc_self);
|
714
738
|
}
|
715
739
|
|
740
|
+
static void check_key_duplication(parserstate *state, VALUE fields, VALUE key) {
|
741
|
+
if (!NIL_P(rb_hash_aref(fields, key))) {
|
742
|
+
raise_syntax_error(
|
743
|
+
state,
|
744
|
+
state->current_token,
|
745
|
+
"duplicated record key"
|
746
|
+
);
|
747
|
+
}
|
748
|
+
}
|
749
|
+
|
716
750
|
/**
|
717
751
|
* ... `{` ... `}` ...
|
718
752
|
* > >
|
@@ -744,6 +778,7 @@ VALUE parse_record_attributes(parserstate *state) {
|
|
744
778
|
if (is_keyword(state)) {
|
745
779
|
// { foo: type } syntax
|
746
780
|
key = parse_keyword_key(state);
|
781
|
+
check_key_duplication(state, fields, key);
|
747
782
|
parser_advance_assert(state, pCOLON);
|
748
783
|
} else {
|
749
784
|
// { key => type } syntax
|
@@ -765,6 +800,7 @@ VALUE parse_record_attributes(parserstate *state) {
|
|
765
800
|
"unexpected record key token"
|
766
801
|
);
|
767
802
|
}
|
803
|
+
check_key_duplication(state, fields, key);
|
768
804
|
parser_advance_assert(state, pFATARROW);
|
769
805
|
}
|
770
806
|
type = parse_type(state);
|
@@ -838,7 +874,7 @@ static VALUE parse_instance_type(parserstate *state, bool parse_alias) {
|
|
838
874
|
}
|
839
875
|
|
840
876
|
VALUE typename = parse_type_name(state, expected_kind, &name_range);
|
841
|
-
VALUE types =
|
877
|
+
VALUE types = EMPTY_ARRAY;
|
842
878
|
|
843
879
|
TypeNameKind kind;
|
844
880
|
if (state->current_token.type == tUIDENT) {
|
@@ -854,7 +890,7 @@ static VALUE parse_instance_type(parserstate *state, bool parse_alias) {
|
|
854
890
|
if (state->next_token.type == pLBRACKET) {
|
855
891
|
parser_advance(state);
|
856
892
|
args_range.start = state->current_token.range.start;
|
857
|
-
parse_type_list(state, pRBRACKET, types);
|
893
|
+
parse_type_list(state, pRBRACKET, &types);
|
858
894
|
parser_advance_assert(state, pRBRACKET);
|
859
895
|
args_range.end = state->current_token.range.end;
|
860
896
|
} else {
|
@@ -993,9 +1029,9 @@ static VALUE parse_simple(parserstate *state) {
|
|
993
1029
|
case pLBRACKET: {
|
994
1030
|
range rg;
|
995
1031
|
rg.start = state->current_token.range.start;
|
996
|
-
VALUE types =
|
1032
|
+
VALUE types = EMPTY_ARRAY;
|
997
1033
|
if (state->next_token.type != pRBRACKET) {
|
998
|
-
parse_type_list(state, pRBRACKET, types);
|
1034
|
+
parse_type_list(state, pRBRACKET, &types);
|
999
1035
|
}
|
1000
1036
|
parser_advance_assert(state, pRBRACKET);
|
1001
1037
|
rg.end = state->current_token.range.end;
|
@@ -1003,7 +1039,7 @@ static VALUE parse_simple(parserstate *state) {
|
|
1003
1039
|
return rbs_tuple(types, rbs_new_location(state->buffer, rg));
|
1004
1040
|
}
|
1005
1041
|
case pAREF_OPR: {
|
1006
|
-
return rbs_tuple(
|
1042
|
+
return rbs_tuple(EMPTY_ARRAY, rbs_new_location(state->buffer, state->current_token.range));
|
1007
1043
|
}
|
1008
1044
|
case pLBRACE: {
|
1009
1045
|
position start = state->current_token.range.start;
|
@@ -1083,12 +1119,14 @@ VALUE parse_type(parserstate *state) {
|
|
1083
1119
|
type_params ::= {} `[` type_param `,` ... <`]`>
|
1084
1120
|
| {<>}
|
1085
1121
|
|
1086
|
-
type_param ::= kUNCHECKED? (kIN|kOUT|) tUIDENT
|
1122
|
+
type_param ::= kUNCHECKED? (kIN|kOUT|) tUIDENT upper_bound? default_type? (module_type_params == true)
|
1087
1123
|
|
1088
|
-
type_param ::= tUIDENT
|
1124
|
+
type_param ::= tUIDENT upper_bound? default_type? (module_type_params == false)
|
1089
1125
|
*/
|
1090
1126
|
VALUE parse_type_params(parserstate *state, range *rg, bool module_type_params) {
|
1091
|
-
VALUE params =
|
1127
|
+
VALUE params = EMPTY_ARRAY;
|
1128
|
+
|
1129
|
+
bool required_param_allowed = true;
|
1092
1130
|
|
1093
1131
|
if (state->next_token.type == pLBRACKET) {
|
1094
1132
|
parser_advance(state);
|
@@ -1100,12 +1138,14 @@ VALUE parse_type_params(parserstate *state, range *rg, bool module_type_params)
|
|
1100
1138
|
bool unchecked = false;
|
1101
1139
|
VALUE variance = ID2SYM(rb_intern("invariant"));
|
1102
1140
|
VALUE upper_bound = Qnil;
|
1141
|
+
VALUE default_type = Qnil;
|
1103
1142
|
|
1104
1143
|
range param_range = NULL_RANGE;
|
1105
1144
|
range name_range;
|
1106
1145
|
range variance_range = NULL_RANGE;
|
1107
1146
|
range unchecked_range = NULL_RANGE;
|
1108
1147
|
range upper_bound_range = NULL_RANGE;
|
1148
|
+
range default_type_range = NULL_RANGE;
|
1109
1149
|
|
1110
1150
|
param_range.start = state->next_token.range.start;
|
1111
1151
|
|
@@ -1143,13 +1183,28 @@ VALUE parse_type_params(parserstate *state, range *rg, bool module_type_params)
|
|
1143
1183
|
|
1144
1184
|
if (state->next_token.type == pLT) {
|
1145
1185
|
parser_advance(state);
|
1186
|
+
upper_bound_range.start = state->current_token.range.start;
|
1187
|
+
upper_bound = parse_type(state);
|
1188
|
+
upper_bound_range.end = state->current_token.range.end;
|
1189
|
+
}
|
1146
1190
|
|
1147
|
-
|
1191
|
+
if (module_type_params) {
|
1192
|
+
if (state->next_token.type == pEQ) {
|
1148
1193
|
parser_advance(state);
|
1149
|
-
|
1194
|
+
|
1195
|
+
default_type_range.start = state->current_token.range.start;
|
1196
|
+
default_type = parse_type(state);
|
1197
|
+
default_type_range.end = state->current_token.range.end;
|
1198
|
+
|
1199
|
+
required_param_allowed = false;
|
1150
1200
|
} else {
|
1151
|
-
|
1152
|
-
|
1201
|
+
if (!required_param_allowed) {
|
1202
|
+
raise_syntax_error(
|
1203
|
+
state,
|
1204
|
+
state->current_token,
|
1205
|
+
"required type parameter is not allowed after optional type parameter"
|
1206
|
+
);
|
1207
|
+
}
|
1153
1208
|
}
|
1154
1209
|
}
|
1155
1210
|
|
@@ -1162,8 +1217,10 @@ VALUE parse_type_params(parserstate *state, range *rg, bool module_type_params)
|
|
1162
1217
|
rbs_loc_add_optional_child(loc, rb_intern("variance"), variance_range);
|
1163
1218
|
rbs_loc_add_optional_child(loc, rb_intern("unchecked"), unchecked_range);
|
1164
1219
|
rbs_loc_add_optional_child(loc, rb_intern("upper_bound"), upper_bound_range);
|
1220
|
+
rbs_loc_add_optional_child(loc, rb_intern("default"), default_type_range);
|
1165
1221
|
|
1166
|
-
VALUE param = rbs_ast_type_param(name, variance, unchecked, upper_bound, location);
|
1222
|
+
VALUE param = rbs_ast_type_param(name, variance, unchecked, upper_bound, default_type, location);
|
1223
|
+
melt_array(¶ms);
|
1167
1224
|
rb_ary_push(params, param);
|
1168
1225
|
|
1169
1226
|
if (state->next_token.type == pCOMMA) {
|
@@ -1403,7 +1460,7 @@ VALUE parse_annotation(parserstate *state) {
|
|
1403
1460
|
annotations ::= {} annotation ... <annotation>
|
1404
1461
|
| {<>}
|
1405
1462
|
*/
|
1406
|
-
void parse_annotations(parserstate *state, VALUE annotations, position *annot_pos) {
|
1463
|
+
void parse_annotations(parserstate *state, VALUE *annotations, position *annot_pos) {
|
1407
1464
|
*annot_pos = NullPosition;
|
1408
1465
|
|
1409
1466
|
while (true) {
|
@@ -1414,7 +1471,8 @@ void parse_annotations(parserstate *state, VALUE annotations, position *annot_po
|
|
1414
1471
|
*annot_pos = state->current_token.range.start;
|
1415
1472
|
}
|
1416
1473
|
|
1417
|
-
|
1474
|
+
melt_array(annotations);
|
1475
|
+
rb_ary_push(*annotations, parse_annotation(state));
|
1418
1476
|
} else {
|
1419
1477
|
break;
|
1420
1478
|
}
|
@@ -1598,11 +1656,11 @@ VALUE parse_member_def(parserstate *state, bool instance_only, bool accept_overl
|
|
1598
1656
|
|
1599
1657
|
bool loop = true;
|
1600
1658
|
while (loop) {
|
1601
|
-
VALUE annotations =
|
1659
|
+
VALUE annotations = EMPTY_ARRAY;
|
1602
1660
|
position overload_annot_pos = NullPosition;
|
1603
1661
|
|
1604
1662
|
if (state->next_token.type == tANNOTATION) {
|
1605
|
-
parse_annotations(state, annotations, &overload_annot_pos);
|
1663
|
+
parse_annotations(state, &annotations, &overload_annot_pos);
|
1606
1664
|
}
|
1607
1665
|
|
1608
1666
|
switch (state->next_token.type) {
|
@@ -1693,7 +1751,7 @@ VALUE parse_member_def(parserstate *state, bool instance_only, bool accept_overl
|
|
1693
1751
|
*
|
1694
1752
|
* @param kind
|
1695
1753
|
* */
|
1696
|
-
void class_instance_name(parserstate *state, TypeNameKind kind, VALUE *name, VALUE args, range *name_range, range *args_range) {
|
1754
|
+
void class_instance_name(parserstate *state, TypeNameKind kind, VALUE *name, VALUE *args, range *name_range, range *args_range) {
|
1697
1755
|
parser_advance(state);
|
1698
1756
|
|
1699
1757
|
*name = parse_type_name(state, kind, name_range);
|
@@ -1760,11 +1818,11 @@ VALUE parse_mixin_member(parserstate *state, bool from_interface, position comme
|
|
1760
1818
|
parser_push_typevar_table(state, reset_typevar_scope);
|
1761
1819
|
|
1762
1820
|
VALUE name;
|
1763
|
-
VALUE args =
|
1821
|
+
VALUE args = EMPTY_ARRAY;
|
1764
1822
|
class_instance_name(
|
1765
1823
|
state,
|
1766
1824
|
from_interface ? INTERFACE_NAME : (INTERFACE_NAME | CLASS_NAME),
|
1767
|
-
&name, args, &name_range, &args_range
|
1825
|
+
&name, &args, &name_range, &args_range
|
1768
1826
|
);
|
1769
1827
|
|
1770
1828
|
parser_pop_typevar_table(state);
|
@@ -2116,13 +2174,13 @@ VALUE parse_attribute_member(parserstate *state, position comment_pos, VALUE ann
|
|
2116
2174
|
| alias_member (instance only)
|
2117
2175
|
*/
|
2118
2176
|
VALUE parse_interface_members(parserstate *state) {
|
2119
|
-
VALUE members =
|
2177
|
+
VALUE members = EMPTY_ARRAY;
|
2120
2178
|
|
2121
2179
|
while (state->next_token.type != kEND) {
|
2122
|
-
VALUE annotations =
|
2180
|
+
VALUE annotations = EMPTY_ARRAY;
|
2123
2181
|
position annot_pos = NullPosition;
|
2124
2182
|
|
2125
|
-
parse_annotations(state, annotations, &annot_pos);
|
2183
|
+
parse_annotations(state, &annotations, &annot_pos);
|
2126
2184
|
|
2127
2185
|
parser_advance(state);
|
2128
2186
|
|
@@ -2150,6 +2208,7 @@ VALUE parse_interface_members(parserstate *state) {
|
|
2150
2208
|
);
|
2151
2209
|
}
|
2152
2210
|
|
2211
|
+
melt_array(&members);
|
2153
2212
|
rb_ary_push(members, member);
|
2154
2213
|
}
|
2155
2214
|
|
@@ -2206,7 +2265,7 @@ VALUE parse_interface_decl(parserstate *state, position comment_pos, VALUE annot
|
|
2206
2265
|
module_self_type ::= <module_name>
|
2207
2266
|
| module_name `[` type_list <`]`>
|
2208
2267
|
*/
|
2209
|
-
void parse_module_self_types(parserstate *state, VALUE array) {
|
2268
|
+
void parse_module_self_types(parserstate *state, VALUE *array) {
|
2210
2269
|
while (true) {
|
2211
2270
|
range self_range;
|
2212
2271
|
range name_range;
|
@@ -2219,11 +2278,11 @@ void parse_module_self_types(parserstate *state, VALUE array) {
|
|
2219
2278
|
VALUE module_name = parse_type_name(state, CLASS_NAME | INTERFACE_NAME, &name_range);
|
2220
2279
|
self_range.end = name_range.end;
|
2221
2280
|
|
2222
|
-
VALUE args =
|
2281
|
+
VALUE args = EMPTY_ARRAY;
|
2223
2282
|
if (state->next_token.type == pLBRACKET) {
|
2224
2283
|
parser_advance(state);
|
2225
2284
|
args_range.start = state->current_token.range.start;
|
2226
|
-
parse_type_list(state, pRBRACKET, args);
|
2285
|
+
parse_type_list(state, pRBRACKET, &args);
|
2227
2286
|
parser_advance(state);
|
2228
2287
|
self_range.end = args_range.end = state->current_token.range.end;
|
2229
2288
|
}
|
@@ -2235,7 +2294,8 @@ void parse_module_self_types(parserstate *state, VALUE array) {
|
|
2235
2294
|
rbs_loc_add_optional_child(loc, rb_intern("args"), args_range);
|
2236
2295
|
|
2237
2296
|
VALUE self_type = rbs_ast_decl_module_self(module_name, args, location);
|
2238
|
-
|
2297
|
+
melt_array(array);
|
2298
|
+
rb_ary_push(*array, self_type);
|
2239
2299
|
|
2240
2300
|
if (state->next_token.type == pCOMMA) {
|
2241
2301
|
parser_advance(state);
|
@@ -2259,14 +2319,14 @@ VALUE parse_nested_decl(parserstate *state, const char *nested_in, position anno
|
|
2259
2319
|
| `private`
|
2260
2320
|
*/
|
2261
2321
|
VALUE parse_module_members(parserstate *state) {
|
2262
|
-
VALUE members =
|
2322
|
+
VALUE members = EMPTY_ARRAY;
|
2263
2323
|
|
2264
2324
|
while (state->next_token.type != kEND) {
|
2265
2325
|
VALUE member;
|
2266
|
-
VALUE annotations =
|
2326
|
+
VALUE annotations = EMPTY_ARRAY;
|
2267
2327
|
position annot_pos = NullPosition;
|
2268
2328
|
|
2269
|
-
parse_annotations(state, annotations, &annot_pos);
|
2329
|
+
parse_annotations(state, &annotations, &annot_pos);
|
2270
2330
|
|
2271
2331
|
parser_advance(state);
|
2272
2332
|
|
@@ -2324,6 +2384,7 @@ VALUE parse_module_members(parserstate *state) {
|
|
2324
2384
|
break;
|
2325
2385
|
}
|
2326
2386
|
|
2387
|
+
melt_array(&members);
|
2327
2388
|
rb_ary_push(members, member);
|
2328
2389
|
}
|
2329
2390
|
|
@@ -2346,13 +2407,13 @@ VALUE parse_module_decl0(parserstate *state, range keyword_range, VALUE module_n
|
|
2346
2407
|
decl_range.start = keyword_range.start;
|
2347
2408
|
|
2348
2409
|
VALUE type_params = parse_type_params(state, &type_params_range, true);
|
2349
|
-
VALUE self_types =
|
2410
|
+
VALUE self_types = EMPTY_ARRAY;
|
2350
2411
|
|
2351
2412
|
if (state->next_token.type == pCOLON) {
|
2352
2413
|
parser_advance(state);
|
2353
2414
|
colon_range = state->current_token.range;
|
2354
2415
|
self_types_range.start = state->next_token.range.start;
|
2355
|
-
parse_module_self_types(state, self_types);
|
2416
|
+
parse_module_self_types(state, &self_types);
|
2356
2417
|
self_types_range.end = state->current_token.range.end;
|
2357
2418
|
} else {
|
2358
2419
|
colon_range = NULL_RANGE;
|
@@ -2447,8 +2508,8 @@ VALUE parse_class_decl_super(parserstate *state, range *lt_range) {
|
|
2447
2508
|
*lt_range = state->current_token.range;
|
2448
2509
|
super_range.start = state->next_token.range.start;
|
2449
2510
|
|
2450
|
-
args =
|
2451
|
-
class_instance_name(state, CLASS_NAME, &name, args, &name_range, &args_range);
|
2511
|
+
args = EMPTY_ARRAY;
|
2512
|
+
class_instance_name(state, CLASS_NAME, &name, &args, &name_range, &args_range);
|
2452
2513
|
|
2453
2514
|
super_range.end = state->current_token.range.end;
|
2454
2515
|
|
@@ -2601,10 +2662,10 @@ VALUE parse_nested_decl(parserstate *state, const char *nested_in, position anno
|
|
2601
2662
|
}
|
2602
2663
|
|
2603
2664
|
VALUE parse_decl(parserstate *state) {
|
2604
|
-
VALUE annotations =
|
2665
|
+
VALUE annotations = EMPTY_ARRAY;
|
2605
2666
|
position annot_pos = NullPosition;
|
2606
2667
|
|
2607
|
-
parse_annotations(state, annotations, &annot_pos);
|
2668
|
+
parse_annotations(state, &annotations, &annot_pos);
|
2608
2669
|
|
2609
2670
|
parser_advance(state);
|
2610
2671
|
switch (state->current_token.type) {
|
@@ -2645,10 +2706,11 @@ VALUE parse_namespace(parserstate *state, range *rg) {
|
|
2645
2706
|
parser_advance(state);
|
2646
2707
|
}
|
2647
2708
|
|
2648
|
-
VALUE path =
|
2709
|
+
VALUE path = EMPTY_ARRAY;
|
2649
2710
|
|
2650
2711
|
while (true) {
|
2651
2712
|
if (state->next_token.type == tUIDENT && state->next_token2.type == pCOLON2) {
|
2713
|
+
melt_array(&path);
|
2652
2714
|
rb_ary_push(path, ID2SYM(INTERN_TOKEN(state, state->next_token)));
|
2653
2715
|
if (null_position_p(rg->start)) {
|
2654
2716
|
rg->start = state->next_token.range.start;
|
@@ -2788,14 +2850,16 @@ VALUE parse_use_directive(parserstate *state) {
|
|
2788
2850
|
}
|
2789
2851
|
|
2790
2852
|
VALUE parse_signature(parserstate *state) {
|
2791
|
-
VALUE dirs =
|
2792
|
-
VALUE decls =
|
2853
|
+
VALUE dirs = EMPTY_ARRAY;
|
2854
|
+
VALUE decls = EMPTY_ARRAY;
|
2793
2855
|
|
2794
2856
|
while (state->next_token.type == kUSE) {
|
2857
|
+
melt_array(&dirs);
|
2795
2858
|
rb_ary_push(dirs, parse_use_directive(state));
|
2796
2859
|
}
|
2797
2860
|
|
2798
2861
|
while (state->next_token.type != pEOF) {
|
2862
|
+
melt_array(&decls);
|
2799
2863
|
rb_ary_push(decls, parse_decl(state));
|
2800
2864
|
}
|
2801
2865
|
|
@@ -2918,6 +2982,10 @@ rbsparser_lex(VALUE self, VALUE buffer, VALUE end_pos) {
|
|
2918
2982
|
void rbs__init_parser(void) {
|
2919
2983
|
RBS_Parser = rb_define_class_under(RBS, "Parser", rb_cObject);
|
2920
2984
|
rb_gc_register_mark_object(RBS_Parser);
|
2985
|
+
VALUE empty_array = rb_obj_freeze(rb_ary_new());
|
2986
|
+
rb_gc_register_mark_object(empty_array);
|
2987
|
+
EMPTY_ARRAY = empty_array;
|
2988
|
+
|
2921
2989
|
rb_define_singleton_method(RBS_Parser, "_parse_type", rbsparser_parse_type, 5);
|
2922
2990
|
rb_define_singleton_method(RBS_Parser, "_parse_method_type", rbsparser_parse_method_type, 5);
|
2923
2991
|
rb_define_singleton_method(RBS_Parser, "_parse_signature", rbsparser_parse_signature, 2);
|
@@ -307,11 +307,12 @@ VALUE rbs_ast_annotation(VALUE string, VALUE location) {
|
|
307
307
|
);
|
308
308
|
}
|
309
309
|
|
310
|
-
VALUE rbs_ast_type_param(VALUE name, VALUE variance, bool unchecked, VALUE upper_bound, VALUE location) {
|
310
|
+
VALUE rbs_ast_type_param(VALUE name, VALUE variance, bool unchecked, VALUE upper_bound, VALUE default_type, VALUE location) {
|
311
311
|
VALUE args = rb_hash_new();
|
312
312
|
rb_hash_aset(args, ID2SYM(rb_intern("name")), name);
|
313
313
|
rb_hash_aset(args, ID2SYM(rb_intern("variance")), variance);
|
314
314
|
rb_hash_aset(args, ID2SYM(rb_intern("upper_bound")), upper_bound);
|
315
|
+
rb_hash_aset(args, ID2SYM(rb_intern("default_type")), default_type);
|
315
316
|
rb_hash_aset(args, ID2SYM(rb_intern("location")), location);
|
316
317
|
|
317
318
|
VALUE type_param = CLASS_NEW_INSTANCE(RBS_AST_TypeParam, 1, &args);
|
@@ -6,7 +6,7 @@
|
|
6
6
|
VALUE rbs_alias(VALUE typename, VALUE args, VALUE location);
|
7
7
|
VALUE rbs_ast_annotation(VALUE string, VALUE location);
|
8
8
|
VALUE rbs_ast_comment(VALUE string, VALUE location);
|
9
|
-
VALUE rbs_ast_type_param(VALUE name, VALUE variance, bool unchecked, VALUE upper_bound, VALUE location);
|
9
|
+
VALUE rbs_ast_type_param(VALUE name, VALUE variance, bool unchecked, VALUE upper_bound, VALUE default_type, VALUE location);
|
10
10
|
VALUE rbs_ast_decl_type_alias(VALUE name, VALUE type_params, VALUE type, VALUE annotations, VALUE location, VALUE comment);
|
11
11
|
VALUE rbs_ast_decl_class_super(VALUE name, VALUE args, VALUE location);
|
12
12
|
VALUE rbs_ast_decl_class(VALUE name, VALUE type_params, VALUE super_class, VALUE members, VALUE annotations, VALUE location, VALUE comment);
|
data/lib/rbs/ast/declarations.rb
CHANGED
@@ -104,6 +104,18 @@ module RBS
|
|
104
104
|
@comment = comment
|
105
105
|
end
|
106
106
|
|
107
|
+
def update(name: self.name, type_params: self.type_params, super_class: self.super_class, members: self.members, annotations: self.annotations, location: self.location, comment: self.comment)
|
108
|
+
self.class.new(
|
109
|
+
name: name,
|
110
|
+
type_params: type_params,
|
111
|
+
super_class: super_class,
|
112
|
+
members: members,
|
113
|
+
annotations: annotations,
|
114
|
+
location: location,
|
115
|
+
comment: comment
|
116
|
+
)
|
117
|
+
end
|
118
|
+
|
107
119
|
def ==(other)
|
108
120
|
other.is_a?(Class) &&
|
109
121
|
other.name == name &&
|
@@ -192,6 +204,19 @@ module RBS
|
|
192
204
|
@comment = comment
|
193
205
|
end
|
194
206
|
|
207
|
+
def update(name: self.name, type_params: self.type_params, members: self.members, self_types: self.self_types, annotations: self.annotations, location: self.location, comment: self.comment)
|
208
|
+
self.class.new(
|
209
|
+
name: name,
|
210
|
+
type_params: type_params,
|
211
|
+
members: members,
|
212
|
+
self_types: self_types,
|
213
|
+
annotations: annotations,
|
214
|
+
location: location,
|
215
|
+
comment: comment
|
216
|
+
)
|
217
|
+
end
|
218
|
+
|
219
|
+
|
195
220
|
def ==(other)
|
196
221
|
other.is_a?(Module) &&
|
197
222
|
other.name == name &&
|
@@ -239,6 +264,17 @@ module RBS
|
|
239
264
|
@comment = comment
|
240
265
|
end
|
241
266
|
|
267
|
+
def update(name: self.name, type_params: self.type_params, members: self.members, annotations: self.annotations, location: self.location, comment: self.comment)
|
268
|
+
self.class.new(
|
269
|
+
name: name,
|
270
|
+
type_params: type_params,
|
271
|
+
members: members,
|
272
|
+
annotations: annotations,
|
273
|
+
location: location,
|
274
|
+
comment: comment
|
275
|
+
)
|
276
|
+
end
|
277
|
+
|
242
278
|
def ==(other)
|
243
279
|
other.is_a?(Interface) &&
|
244
280
|
other.name == name &&
|