rbs 3.0.0.dev.1 → 3.0.0.dev.2
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/.github/workflows/ruby.yml +0 -3
- data/CHANGELOG.md +28 -0
- data/Gemfile.lock +2 -2
- data/README.md +1 -0
- data/Rakefile +75 -1
- data/core/array.rbs +1 -1
- data/core/builtin.rbs +1 -1
- data/core/hash.rbs +1 -1
- data/core/module.rbs +1 -1
- data/ext/rbs_extension/constants.c +16 -2
- data/ext/rbs_extension/constants.h +8 -1
- data/ext/rbs_extension/extconf.rb +1 -1
- data/ext/rbs_extension/lexer.c +834 -777
- data/ext/rbs_extension/lexer.h +3 -1
- data/ext/rbs_extension/lexer.re +3 -1
- data/ext/rbs_extension/lexstate.c +4 -2
- data/ext/rbs_extension/parser.c +264 -44
- data/ext/rbs_extension/ruby_objs.c +56 -2
- data/ext/rbs_extension/ruby_objs.h +7 -1
- data/lib/rbs/annotate/rdoc_annotator.rb +1 -1
- data/lib/rbs/ast/declarations.rb +49 -2
- data/lib/rbs/ast/directives.rb +39 -0
- data/lib/rbs/cli.rb +32 -18
- data/lib/rbs/collection/config/lockfile_generator.rb +25 -20
- data/lib/rbs/collection/config.rb +2 -2
- data/lib/rbs/collection/sources/git.rb +1 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +24 -8
- data/lib/rbs/definition_builder.rb +8 -8
- data/lib/rbs/environment/use_map.rb +77 -0
- data/lib/rbs/environment.rb +352 -83
- data/lib/rbs/environment_loader.rb +9 -7
- data/lib/rbs/environment_walker.rb +1 -1
- data/lib/rbs/errors.rb +34 -37
- data/lib/rbs/locator.rb +1 -1
- data/lib/rbs/parser_aux.rb +8 -6
- data/lib/rbs/resolver/constant_resolver.rb +23 -7
- data/lib/rbs/resolver/type_name_resolver.rb +2 -1
- data/lib/rbs/sorter.rb +3 -3
- data/lib/rbs/test/setup.rb +1 -1
- data/lib/rbs/type_alias_dependency.rb +1 -1
- data/lib/rbs/type_alias_regularity.rb +3 -3
- data/lib/rbs/validator.rb +23 -2
- data/lib/rbs/variance_calculator.rb +2 -2
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +28 -2
- data/lib/rbs.rb +2 -2
- data/lib/rdoc_plugin/parser.rb +2 -2
- data/rbs.gemspec +1 -1
- data/sig/ancestor_graph.rbs +22 -2
- data/sig/collection/config/lockfile_generator.rbs +8 -10
- data/sig/collection/config.rbs +1 -1
- data/sig/collection/sources.rbs +12 -6
- data/sig/constant.rbs +1 -1
- data/sig/declarations.rbs +36 -3
- data/sig/definition.rbs +1 -1
- data/sig/definition_builder.rbs +0 -1
- data/sig/directives.rbs +61 -0
- data/sig/environment.rbs +150 -28
- data/sig/environment_loader.rbs +1 -1
- data/sig/errors.rbs +22 -1
- data/sig/parser.rbs +8 -15
- data/sig/resolver/constant_resolver.rbs +1 -2
- data/sig/shims/bundler.rbs +18 -0
- data/sig/shims/rubygems.rbs +6 -0
- data/sig/use_map.rbs +35 -0
- data/sig/validator.rbs +12 -5
- data/sig/writer.rbs +4 -2
- metadata +7 -9
- data/lib/rbs/constant_table.rb +0 -167
- data/lib/rbs/type_name_resolver.rb +0 -67
- data/sig/constant_table.rbs +0 -30
- data/sig/type_name_resolver.rbs +0 -26
- data/steep/Gemfile +0 -3
- data/steep/Gemfile.lock +0 -61
data/ext/rbs_extension/lexer.h
CHANGED
@@ -58,6 +58,8 @@ enum TokenType {
|
|
58
58
|
kUNCHECKED, /* unchecked */
|
59
59
|
kUNTYPED, /* untyped */
|
60
60
|
kVOID, /* void */
|
61
|
+
kUSE, /* use */
|
62
|
+
kAS, /* as */
|
61
63
|
|
62
64
|
tLIDENT, /* Identifiers starting with lower case */
|
63
65
|
tUIDENT, /* Identifiers starting with upper case */
|
@@ -150,7 +152,7 @@ unsigned int peek(lexstate *state);
|
|
150
152
|
/**
|
151
153
|
* Skip one character.
|
152
154
|
* */
|
153
|
-
void
|
155
|
+
void rbs_skip(lexstate *state);
|
154
156
|
|
155
157
|
/**
|
156
158
|
* Skip n characters.
|
data/ext/rbs_extension/lexer.re
CHANGED
@@ -12,7 +12,7 @@ start:
|
|
12
12
|
re2c:flags:input = custom;
|
13
13
|
re2c:define:YYCTYPE = "unsigned int";
|
14
14
|
re2c:define:YYPEEK = "peek(state)";
|
15
|
-
re2c:define:YYSKIP = "
|
15
|
+
re2c:define:YYSKIP = "rbs_skip(state);";
|
16
16
|
re2c:define:YYBACKUP = "backup = *state;";
|
17
17
|
re2c:define:YYRESTORE = "*state = backup;";
|
18
18
|
re2c:yyfill:enable = 0;
|
@@ -93,6 +93,8 @@ start:
|
|
93
93
|
"unchecked" { return next_token(state, kUNCHECKED); }
|
94
94
|
"untyped" { return next_token(state, kUNTYPED); }
|
95
95
|
"void" { return next_token(state, kVOID); }
|
96
|
+
"use" { return next_token(state, kUSE); }
|
97
|
+
"as" { return next_token(state, kAS); }
|
96
98
|
|
97
99
|
dqstring = ["] ("\\"[abefnrstv"\\] | [^"\\\x00])* ["];
|
98
100
|
sqstring = ['] ("\\"['\\] | [^'\x00])* ['];
|
@@ -57,6 +57,8 @@ static const char *RBS_TOKENTYPE_NAMES[] = {
|
|
57
57
|
"kUNCHECKED", /* unchecked */
|
58
58
|
"kUNTYPED", /* untyped */
|
59
59
|
"kVOID", /* void */
|
60
|
+
"kUSE", /* use */
|
61
|
+
"kAS", /* as */
|
60
62
|
|
61
63
|
"tLIDENT", /* Identifiers starting with lower case */
|
62
64
|
"tUIDENT", /* Identifiers starting with upper case */
|
@@ -122,7 +124,7 @@ token next_token(lexstate *state, enum TokenType type) {
|
|
122
124
|
return t;
|
123
125
|
}
|
124
126
|
|
125
|
-
void
|
127
|
+
void rbs_skip(lexstate *state) {
|
126
128
|
if (!state->last_char) {
|
127
129
|
peek(state);
|
128
130
|
}
|
@@ -143,7 +145,7 @@ void skip(lexstate *state) {
|
|
143
145
|
void skipn(lexstate *state, size_t size) {
|
144
146
|
for (size_t i = 0; i < size; i ++) {
|
145
147
|
peek(state);
|
146
|
-
|
148
|
+
rbs_skip(state);
|
147
149
|
}
|
148
150
|
}
|
149
151
|
|
data/ext/rbs_extension/parser.c
CHANGED
@@ -37,6 +37,8 @@
|
|
37
37
|
case kPUBLIC: \
|
38
38
|
case kPRIVATE: \
|
39
39
|
case kUNTYPED: \
|
40
|
+
case kUSE: \
|
41
|
+
case kAS: \
|
40
42
|
/* nop */
|
41
43
|
|
42
44
|
typedef struct {
|
@@ -1034,7 +1036,6 @@ VALUE parse_type(parserstate *state) {
|
|
1034
1036
|
|
1035
1037
|
type_param ::= tUIDENT (module_type_params == false)
|
1036
1038
|
*/
|
1037
|
-
|
1038
1039
|
VALUE parse_type_params(parserstate *state, range *rg, bool module_type_params) {
|
1039
1040
|
VALUE params = rb_ary_new();
|
1040
1041
|
|
@@ -1277,7 +1278,7 @@ VALUE parse_type_decl(parserstate *state, position comment_pos, VALUE annotation
|
|
1277
1278
|
|
1278
1279
|
parser_pop_typevar_table(state);
|
1279
1280
|
|
1280
|
-
return
|
1281
|
+
return rbs_ast_decl_type_alias(
|
1281
1282
|
typename,
|
1282
1283
|
type_params,
|
1283
1284
|
type,
|
@@ -2267,13 +2268,11 @@ VALUE parse_module_members(parserstate *state) {
|
|
2267
2268
|
}
|
2268
2269
|
|
2269
2270
|
/*
|
2270
|
-
module_decl ::= {
|
2271
|
-
| {
|
2271
|
+
module_decl ::= {module_name} module_type_params module_members <kEND>
|
2272
|
+
| {module_name} module_name module_type_params `:` module_self_types module_members <kEND>
|
2272
2273
|
*/
|
2273
|
-
VALUE
|
2274
|
+
VALUE parse_module_decl0(parserstate *state, range keyword_range, VALUE module_name, range name_range, VALUE comment, VALUE annotations) {
|
2274
2275
|
range decl_range;
|
2275
|
-
range keyword_range;
|
2276
|
-
range name_range;
|
2277
2276
|
range end_range;
|
2278
2277
|
range type_params_range;
|
2279
2278
|
range colon_range;
|
@@ -2281,15 +2280,8 @@ VALUE parse_module_decl(parserstate *state, position comment_pos, VALUE annotati
|
|
2281
2280
|
|
2282
2281
|
parser_push_typevar_table(state, true);
|
2283
2282
|
|
2284
|
-
|
2285
|
-
comment_pos = nonnull_pos_or(comment_pos, start);
|
2286
|
-
VALUE comment = get_comment(state, comment_pos.line);
|
2287
|
-
|
2288
|
-
keyword_range = state->current_token.range;
|
2289
|
-
decl_range.start = state->current_token.range.start;
|
2283
|
+
decl_range.start = keyword_range.start;
|
2290
2284
|
|
2291
|
-
parser_advance(state);
|
2292
|
-
VALUE module_name = parse_type_name(state, CLASS_NAME, &name_range);
|
2293
2285
|
VALUE type_params = parse_type_params(state, &type_params_range, true);
|
2294
2286
|
VALUE self_types = rb_ary_new();
|
2295
2287
|
|
@@ -2332,6 +2324,46 @@ VALUE parse_module_decl(parserstate *state, position comment_pos, VALUE annotati
|
|
2332
2324
|
);
|
2333
2325
|
}
|
2334
2326
|
|
2327
|
+
/*
|
2328
|
+
module_decl ::= {`module`} module_name `=` old_module_name <kEND>
|
2329
|
+
| {`module`} module_name module_decl0 <kEND>
|
2330
|
+
|
2331
|
+
*/
|
2332
|
+
VALUE parse_module_decl(parserstate *state, position comment_pos, VALUE annotations) {
|
2333
|
+
range keyword_range = state->current_token.range;
|
2334
|
+
range module_name_range;
|
2335
|
+
|
2336
|
+
comment_pos = nonnull_pos_or(comment_pos, state->current_token.range.start);
|
2337
|
+
VALUE comment = get_comment(state, comment_pos.line);
|
2338
|
+
|
2339
|
+
parser_advance(state);
|
2340
|
+
VALUE module_name = parse_type_name(state, CLASS_NAME, &module_name_range);
|
2341
|
+
|
2342
|
+
if (state->next_token.type == pEQ) {
|
2343
|
+
range eq_range = state->next_token.range;
|
2344
|
+
parser_advance(state);
|
2345
|
+
parser_advance(state);
|
2346
|
+
|
2347
|
+
range old_name_range;
|
2348
|
+
VALUE old_name = parse_type_name(state, CLASS_NAME, &old_name_range);
|
2349
|
+
|
2350
|
+
range decl_range;
|
2351
|
+
decl_range.start = keyword_range.start;
|
2352
|
+
decl_range.end = old_name_range.end;
|
2353
|
+
|
2354
|
+
VALUE location = rbs_new_location(state->buffer, decl_range);
|
2355
|
+
rbs_loc *loc = rbs_check_location(location);
|
2356
|
+
rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
|
2357
|
+
rbs_loc_add_required_child(loc, rb_intern("new_name"), module_name_range);
|
2358
|
+
rbs_loc_add_required_child(loc, rb_intern("eq"), eq_range);
|
2359
|
+
rbs_loc_add_optional_child(loc, rb_intern("old_name"), old_name_range);
|
2360
|
+
|
2361
|
+
return rbs_ast_decl_module_alias(module_name, old_name, location, comment);
|
2362
|
+
} else {
|
2363
|
+
return parse_module_decl0(state, keyword_range, module_name, module_name_range, comment, annotations);
|
2364
|
+
}
|
2365
|
+
}
|
2366
|
+
|
2335
2367
|
/*
|
2336
2368
|
class_decl_super ::= {} `<` <class_instance_name>
|
2337
2369
|
| {<>}
|
@@ -2368,35 +2400,25 @@ VALUE parse_class_decl_super(parserstate *state, range *lt_range) {
|
|
2368
2400
|
}
|
2369
2401
|
|
2370
2402
|
/*
|
2371
|
-
class_decl ::= {
|
2403
|
+
class_decl ::= {class_name} type_params class_decl_super class_members <`end`>
|
2372
2404
|
*/
|
2373
|
-
VALUE
|
2405
|
+
VALUE parse_class_decl0(parserstate *state, range keyword_range, VALUE name, range name_range, VALUE comment, VALUE annotations) {
|
2374
2406
|
range decl_range;
|
2375
|
-
range keyword_range;
|
2376
|
-
range name_range;
|
2377
2407
|
range end_range;
|
2378
2408
|
range type_params_range;
|
2379
2409
|
range lt_range;
|
2380
2410
|
|
2381
|
-
VALUE name;
|
2382
2411
|
VALUE type_params;
|
2383
2412
|
VALUE super;
|
2384
2413
|
VALUE members;
|
2385
|
-
VALUE comment;
|
2386
2414
|
VALUE location;
|
2387
2415
|
|
2388
2416
|
rbs_loc *loc;
|
2389
2417
|
|
2390
2418
|
parser_push_typevar_table(state, true);
|
2391
2419
|
|
2392
|
-
decl_range.start =
|
2393
|
-
keyword_range = state->current_token.range;
|
2394
|
-
|
2395
|
-
comment_pos = nonnull_pos_or(comment_pos, decl_range.start);
|
2396
|
-
comment = get_comment(state, comment_pos.line);
|
2420
|
+
decl_range.start = keyword_range.start;
|
2397
2421
|
|
2398
|
-
parser_advance(state);
|
2399
|
-
name = parse_type_name(state, CLASS_NAME, &name_range);
|
2400
2422
|
type_params = parse_type_params(state, &type_params_range, true);
|
2401
2423
|
super = parse_class_decl_super(state, <_range);
|
2402
2424
|
members = parse_module_members(state);
|
@@ -2426,6 +2448,45 @@ VALUE parse_class_decl(parserstate *state, position comment_pos, VALUE annotatio
|
|
2426
2448
|
);
|
2427
2449
|
}
|
2428
2450
|
|
2451
|
+
/*
|
2452
|
+
class_decl ::= {`class`} class_name `=` <class_name>
|
2453
|
+
| {`class`} class_name <class_decl0>
|
2454
|
+
*/
|
2455
|
+
VALUE parse_class_decl(parserstate *state, position comment_pos, VALUE annotations) {
|
2456
|
+
range keyword_range = state->current_token.range;
|
2457
|
+
range class_name_range;
|
2458
|
+
|
2459
|
+
comment_pos = nonnull_pos_or(comment_pos, state->current_token.range.start);
|
2460
|
+
VALUE comment = get_comment(state, comment_pos.line);
|
2461
|
+
|
2462
|
+
parser_advance(state);
|
2463
|
+
VALUE class_name = parse_type_name(state, CLASS_NAME, &class_name_range);
|
2464
|
+
|
2465
|
+
if (state->next_token.type == pEQ) {
|
2466
|
+
range eq_range = state->next_token.range;
|
2467
|
+
parser_advance(state);
|
2468
|
+
parser_advance(state);
|
2469
|
+
|
2470
|
+
range old_name_range;
|
2471
|
+
VALUE old_name = parse_type_name(state, CLASS_NAME, &old_name_range);
|
2472
|
+
|
2473
|
+
range decl_range;
|
2474
|
+
decl_range.start = keyword_range.start;
|
2475
|
+
decl_range.end = old_name_range.end;
|
2476
|
+
|
2477
|
+
VALUE location = rbs_new_location(state->buffer, decl_range);
|
2478
|
+
rbs_loc *loc = rbs_check_location(location);
|
2479
|
+
rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
|
2480
|
+
rbs_loc_add_required_child(loc, rb_intern("new_name"), class_name_range);
|
2481
|
+
rbs_loc_add_required_child(loc, rb_intern("eq"), eq_range);
|
2482
|
+
rbs_loc_add_optional_child(loc, rb_intern("old_name"), old_name_range);
|
2483
|
+
|
2484
|
+
return rbs_ast_decl_class_alias(class_name, old_name, location, comment);
|
2485
|
+
} else {
|
2486
|
+
return parse_class_decl0(state, keyword_range, class_name, class_name_range, comment, annotations);
|
2487
|
+
}
|
2488
|
+
}
|
2489
|
+
|
2429
2490
|
/*
|
2430
2491
|
nested_decl ::= {<const_decl>}
|
2431
2492
|
| {<class_decl>}
|
@@ -2501,18 +2562,185 @@ VALUE parse_decl(parserstate *state) {
|
|
2501
2562
|
}
|
2502
2563
|
}
|
2503
2564
|
|
2565
|
+
/*
|
2566
|
+
namespace ::= {} (`::`)? (`tUIDENT` `::`)* `tUIDENT` <`::`>
|
2567
|
+
| {} <> (empty -- returns empty namespace)
|
2568
|
+
*/
|
2569
|
+
VALUE parse_namespace(parserstate *state, range *rg) {
|
2570
|
+
bool is_absolute = false;
|
2571
|
+
|
2572
|
+
if (state->next_token.type == pCOLON2) {
|
2573
|
+
rg->start = state->next_token.range.start;
|
2574
|
+
rg->end = state->next_token.range.end;
|
2575
|
+
is_absolute = true;
|
2576
|
+
|
2577
|
+
parser_advance(state);
|
2578
|
+
}
|
2579
|
+
|
2580
|
+
VALUE path = rb_ary_new();
|
2581
|
+
|
2582
|
+
while (true) {
|
2583
|
+
if (state->next_token.type == tUIDENT && state->next_token2.type == pCOLON2) {
|
2584
|
+
rb_ary_push(path, ID2SYM(INTERN_TOKEN(state, state->next_token)));
|
2585
|
+
if (null_position_p(rg->start)) {
|
2586
|
+
rg->start = state->next_token.range.start;
|
2587
|
+
}
|
2588
|
+
rg->end = state->next_token2.range.end;
|
2589
|
+
parser_advance(state);
|
2590
|
+
parser_advance(state);
|
2591
|
+
} else {
|
2592
|
+
break;
|
2593
|
+
}
|
2594
|
+
}
|
2595
|
+
|
2596
|
+
return rbs_namespace(path, is_absolute ? Qtrue : Qfalse);
|
2597
|
+
}
|
2598
|
+
|
2599
|
+
/*
|
2600
|
+
use_clauses ::= {} use_clause `,` ... `,` <use_clause>
|
2601
|
+
|
2602
|
+
use_clause ::= {} namespace <tUIDENT>
|
2603
|
+
| {} namespace tUIDENT `as` <tUIDENT>
|
2604
|
+
| {} namespace <tSTAR>
|
2605
|
+
*/
|
2606
|
+
void parse_use_clauses(parserstate *state, VALUE clauses) {
|
2607
|
+
while (true) {
|
2608
|
+
range namespace_range = NULL_RANGE;
|
2609
|
+
VALUE namespace = parse_namespace(state, &namespace_range);
|
2610
|
+
|
2611
|
+
range clause_range = namespace_range;
|
2612
|
+
|
2613
|
+
switch (state->next_token.type)
|
2614
|
+
{
|
2615
|
+
case tLIDENT:
|
2616
|
+
case tULIDENT:
|
2617
|
+
case tUIDENT: {
|
2618
|
+
parser_advance(state);
|
2619
|
+
|
2620
|
+
enum TokenType ident_type = state->current_token.type;
|
2621
|
+
|
2622
|
+
range type_name_range;
|
2623
|
+
if (null_range_p(namespace_range)) {
|
2624
|
+
type_name_range = state->current_token.range;
|
2625
|
+
} else {
|
2626
|
+
type_name_range.start = namespace_range.start;
|
2627
|
+
type_name_range.end = state->current_token.range.end;
|
2628
|
+
}
|
2629
|
+
clause_range = type_name_range;
|
2630
|
+
|
2631
|
+
VALUE type_name = rbs_type_name(namespace, ID2SYM(INTERN_TOKEN(state, state->current_token)));
|
2632
|
+
|
2633
|
+
range keyword_range = NULL_RANGE;
|
2634
|
+
range new_name_range = NULL_RANGE;
|
2635
|
+
|
2636
|
+
VALUE new_name = Qnil;
|
2637
|
+
if (state->next_token.type == kAS) {
|
2638
|
+
parser_advance(state);
|
2639
|
+
keyword_range = state->current_token.range;
|
2640
|
+
|
2641
|
+
if (ident_type == tUIDENT) parser_advance_assert(state, tUIDENT);
|
2642
|
+
if (ident_type == tLIDENT) parser_advance_assert(state, tLIDENT);
|
2643
|
+
if (ident_type == tULIDENT) parser_advance_assert(state, tULIDENT);
|
2644
|
+
|
2645
|
+
new_name = ID2SYM(INTERN_TOKEN(state, state->current_token));
|
2646
|
+
new_name_range = state->current_token.range;
|
2647
|
+
clause_range.end = new_name_range.end;
|
2648
|
+
}
|
2649
|
+
|
2650
|
+
VALUE location = rbs_new_location(state->buffer, clause_range);
|
2651
|
+
rbs_loc *loc = rbs_check_location(location);
|
2652
|
+
rbs_loc_add_required_child(loc, rb_intern("type_name"), state->current_token.range);
|
2653
|
+
if (!null_range_p(keyword_range)) {
|
2654
|
+
rbs_loc_add_optional_child(loc, rb_intern("keyword"), keyword_range);
|
2655
|
+
}
|
2656
|
+
if (!null_range_p(new_name_range)) {
|
2657
|
+
rbs_loc_add_optional_child(loc, rb_intern("new_name"), new_name_range);
|
2658
|
+
}
|
2659
|
+
|
2660
|
+
rb_ary_push(clauses, rbs_ast_directives_use_single_clause(type_name, new_name, location));
|
2661
|
+
|
2662
|
+
break;
|
2663
|
+
}
|
2664
|
+
case pSTAR:
|
2665
|
+
{
|
2666
|
+
parser_advance(state);
|
2667
|
+
|
2668
|
+
range star_range = state->current_token.range;
|
2669
|
+
clause_range.end = star_range.end;
|
2670
|
+
|
2671
|
+
VALUE location = rbs_new_location(state->buffer, clause_range);
|
2672
|
+
rbs_loc *loc = rbs_check_location(location);
|
2673
|
+
rbs_loc_add_required_child(loc, rb_intern("namespace"), namespace_range);
|
2674
|
+
rbs_loc_add_required_child(loc, rb_intern("star"), star_range);
|
2675
|
+
|
2676
|
+
rb_ary_push(clauses, rbs_ast_directives_use_wildcard_clause(namespace, location));
|
2677
|
+
|
2678
|
+
break;
|
2679
|
+
}
|
2680
|
+
default:
|
2681
|
+
raise_syntax_error(
|
2682
|
+
state,
|
2683
|
+
state->next_token,
|
2684
|
+
"use clause is expected"
|
2685
|
+
);
|
2686
|
+
}
|
2687
|
+
|
2688
|
+
if (state->next_token.type == pCOMMA) {
|
2689
|
+
parser_advance(state);
|
2690
|
+
} else {
|
2691
|
+
break;
|
2692
|
+
}
|
2693
|
+
}
|
2694
|
+
|
2695
|
+
return;
|
2696
|
+
}
|
2697
|
+
|
2698
|
+
/*
|
2699
|
+
use_directive ::= {} `use` <clauses>
|
2700
|
+
*/
|
2701
|
+
VALUE parse_use_directive(parserstate *state) {
|
2702
|
+
if (state->next_token.type == kUSE) {
|
2703
|
+
parser_advance(state);
|
2704
|
+
|
2705
|
+
range keyword_range = state->current_token.range;
|
2706
|
+
|
2707
|
+
VALUE clauses = rb_ary_new();
|
2708
|
+
parse_use_clauses(state, clauses);
|
2709
|
+
|
2710
|
+
range directive_range = keyword_range;
|
2711
|
+
directive_range.end = state->current_token.range.end;
|
2712
|
+
|
2713
|
+
VALUE location = rbs_new_location(state->buffer, directive_range);
|
2714
|
+
rbs_loc *loc = rbs_check_location(location);
|
2715
|
+
rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
|
2716
|
+
|
2717
|
+
return rbs_ast_directives_use(clauses, location);
|
2718
|
+
} else {
|
2719
|
+
return Qnil;
|
2720
|
+
}
|
2721
|
+
}
|
2722
|
+
|
2504
2723
|
VALUE parse_signature(parserstate *state) {
|
2724
|
+
VALUE dirs = rb_ary_new();
|
2505
2725
|
VALUE decls = rb_ary_new();
|
2506
2726
|
|
2507
2727
|
while (state->next_token.type != pEOF) {
|
2508
|
-
|
2728
|
+
if (state->next_token.type == kUSE) {
|
2729
|
+
VALUE use = parse_use_directive(state);
|
2730
|
+
rb_ary_push(dirs, use);
|
2731
|
+
} else {
|
2732
|
+
rb_ary_push(decls, parse_decl(state));
|
2733
|
+
}
|
2509
2734
|
}
|
2510
2735
|
|
2511
|
-
|
2736
|
+
VALUE ret = rb_ary_new();
|
2737
|
+
rb_ary_push(ret, dirs);
|
2738
|
+
rb_ary_push(ret, decls);
|
2739
|
+
return ret;
|
2512
2740
|
}
|
2513
2741
|
|
2514
2742
|
static VALUE
|
2515
|
-
rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables
|
2743
|
+
rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables)
|
2516
2744
|
{
|
2517
2745
|
parserstate *parser = alloc_parser(buffer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
|
2518
2746
|
|
@@ -2522,17 +2750,13 @@ rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, V
|
|
2522
2750
|
|
2523
2751
|
VALUE type = parse_type(parser);
|
2524
2752
|
|
2525
|
-
if (RTEST(requires_eof)) {
|
2526
|
-
parser_advance_assert(parser, pEOF);
|
2527
|
-
}
|
2528
|
-
|
2529
2753
|
free_parser(parser);
|
2530
2754
|
|
2531
2755
|
return type;
|
2532
2756
|
}
|
2533
2757
|
|
2534
2758
|
static VALUE
|
2535
|
-
rbsparser_parse_method_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables
|
2759
|
+
rbsparser_parse_method_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables)
|
2536
2760
|
{
|
2537
2761
|
parserstate *parser = alloc_parser(buffer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
|
2538
2762
|
|
@@ -2542,10 +2766,6 @@ rbsparser_parse_method_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end
|
|
2542
2766
|
|
2543
2767
|
VALUE method_type = parse_method_type(parser);
|
2544
2768
|
|
2545
|
-
if (RTEST(requires_eof)) {
|
2546
|
-
parser_advance_assert(parser, pEOF);
|
2547
|
-
}
|
2548
|
-
|
2549
2769
|
free_parser(parser);
|
2550
2770
|
|
2551
2771
|
return method_type;
|
@@ -2555,15 +2775,15 @@ static VALUE
|
|
2555
2775
|
rbsparser_parse_signature(VALUE self, VALUE buffer, VALUE end_pos)
|
2556
2776
|
{
|
2557
2777
|
parserstate *parser = alloc_parser(buffer, 0, FIX2INT(end_pos), Qnil);
|
2558
|
-
VALUE
|
2778
|
+
VALUE pair = parse_signature(parser);
|
2559
2779
|
free_parser(parser);
|
2560
2780
|
|
2561
|
-
return
|
2781
|
+
return pair;
|
2562
2782
|
}
|
2563
2783
|
|
2564
2784
|
void rbs__init_parser(void) {
|
2565
2785
|
RBS_Parser = rb_define_class_under(RBS, "Parser", rb_cObject);
|
2566
|
-
rb_define_singleton_method(RBS_Parser, "_parse_type", rbsparser_parse_type,
|
2567
|
-
rb_define_singleton_method(RBS_Parser, "_parse_method_type", rbsparser_parse_method_type,
|
2786
|
+
rb_define_singleton_method(RBS_Parser, "_parse_type", rbsparser_parse_type, 4);
|
2787
|
+
rb_define_singleton_method(RBS_Parser, "_parse_method_type", rbsparser_parse_method_type, 4);
|
2568
2788
|
rb_define_singleton_method(RBS_Parser, "_parse_signature", rbsparser_parse_signature, 2);
|
2569
2789
|
}
|
@@ -340,7 +340,7 @@ VALUE rbs_ast_decl_global(VALUE name, VALUE type, VALUE location, VALUE comment)
|
|
340
340
|
);
|
341
341
|
}
|
342
342
|
|
343
|
-
VALUE
|
343
|
+
VALUE rbs_ast_decl_type_alias(VALUE name, VALUE type_params, VALUE type, VALUE annotations, VALUE location, VALUE comment) {
|
344
344
|
VALUE args = rb_hash_new();
|
345
345
|
rb_hash_aset(args, ID2SYM(rb_intern("name")), name);
|
346
346
|
rb_hash_aset(args, ID2SYM(rb_intern("type_params")), type_params);
|
@@ -350,7 +350,7 @@ VALUE rbs_ast_decl_alias(VALUE name, VALUE type_params, VALUE type, VALUE annota
|
|
350
350
|
rb_hash_aset(args, ID2SYM(rb_intern("comment")), comment);
|
351
351
|
|
352
352
|
return CLASS_NEW_INSTANCE(
|
353
|
-
|
353
|
+
RBS_AST_Declarations_TypeAlias,
|
354
354
|
1,
|
355
355
|
&args
|
356
356
|
);
|
@@ -402,6 +402,34 @@ VALUE rbs_ast_decl_module(VALUE name, VALUE type_params, VALUE self_types, VALUE
|
|
402
402
|
);
|
403
403
|
}
|
404
404
|
|
405
|
+
VALUE rbs_ast_decl_class_alias(VALUE new_name, VALUE old_name, VALUE location, VALUE comment) {
|
406
|
+
VALUE args = rb_hash_new();
|
407
|
+
rb_hash_aset(args, ID2SYM(rb_intern("new_name")), new_name);
|
408
|
+
rb_hash_aset(args, ID2SYM(rb_intern("old_name")), old_name);
|
409
|
+
rb_hash_aset(args, ID2SYM(rb_intern("location")), location);
|
410
|
+
rb_hash_aset(args, ID2SYM(rb_intern("comment")), comment);
|
411
|
+
|
412
|
+
return CLASS_NEW_INSTANCE(
|
413
|
+
RBS_AST_Declarations_ClassAlias,
|
414
|
+
1,
|
415
|
+
&args
|
416
|
+
);
|
417
|
+
}
|
418
|
+
|
419
|
+
VALUE rbs_ast_decl_module_alias(VALUE new_name, VALUE old_name, VALUE location, VALUE comment) {
|
420
|
+
VALUE args = rb_hash_new();
|
421
|
+
rb_hash_aset(args, ID2SYM(rb_intern("new_name")), new_name);
|
422
|
+
rb_hash_aset(args, ID2SYM(rb_intern("old_name")), old_name);
|
423
|
+
rb_hash_aset(args, ID2SYM(rb_intern("location")), location);
|
424
|
+
rb_hash_aset(args, ID2SYM(rb_intern("comment")), comment);
|
425
|
+
|
426
|
+
return CLASS_NEW_INSTANCE(
|
427
|
+
RBS_AST_Declarations_ModuleAlias,
|
428
|
+
1,
|
429
|
+
&args
|
430
|
+
);
|
431
|
+
}
|
432
|
+
|
405
433
|
VALUE rbs_ast_members_method_definition_overload(VALUE annotations, VALUE method_type) {
|
406
434
|
VALUE args = rb_hash_new();
|
407
435
|
rb_hash_aset(args, ID2SYM(rb_intern("annotations")), annotations);
|
@@ -535,3 +563,29 @@ VALUE rbs_ast_decl_class(VALUE name, VALUE type_params, VALUE super_class, VALUE
|
|
535
563
|
&kwargs
|
536
564
|
);
|
537
565
|
}
|
566
|
+
|
567
|
+
VALUE rbs_ast_directives_use(VALUE clauses, VALUE location) {
|
568
|
+
VALUE kwargs = rb_hash_new();
|
569
|
+
rb_hash_aset(kwargs, ID2SYM(rb_intern("clauses")), clauses);
|
570
|
+
rb_hash_aset(kwargs, ID2SYM(rb_intern("location")), location);
|
571
|
+
|
572
|
+
return CLASS_NEW_INSTANCE(RBS_AST_Directives_Use, 1, &kwargs);
|
573
|
+
}
|
574
|
+
|
575
|
+
VALUE rbs_ast_directives_use_single_clause(VALUE type_name, VALUE new_name, VALUE location) {
|
576
|
+
VALUE kwargs = rb_hash_new();
|
577
|
+
rb_hash_aset(kwargs, ID2SYM(rb_intern("type_name")), type_name);
|
578
|
+
rb_hash_aset(kwargs, ID2SYM(rb_intern("new_name")), new_name);
|
579
|
+
rb_hash_aset(kwargs, ID2SYM(rb_intern("location")), location);
|
580
|
+
|
581
|
+
return CLASS_NEW_INSTANCE(RBS_AST_Directives_Use_SingleClause, 1, &kwargs);
|
582
|
+
}
|
583
|
+
|
584
|
+
VALUE rbs_ast_directives_use_wildcard_clause(VALUE namespace, VALUE location) {
|
585
|
+
VALUE kwargs = rb_hash_new();
|
586
|
+
rb_hash_aset(kwargs, ID2SYM(rb_intern("namespace")), namespace);
|
587
|
+
rb_hash_aset(kwargs, ID2SYM(rb_intern("location")), location);
|
588
|
+
|
589
|
+
return CLASS_NEW_INSTANCE(RBS_AST_Directives_Use_WildcardClause, 1, &kwargs);
|
590
|
+
}
|
591
|
+
|
@@ -7,7 +7,7 @@ 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
9
|
VALUE rbs_ast_type_param(VALUE name, VALUE variance, bool unchecked, VALUE upper_bound, VALUE location);
|
10
|
-
VALUE
|
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);
|
13
13
|
VALUE rbs_ast_decl_constant(VALUE name, VALUE type, VALUE location, VALUE comment);
|
@@ -15,6 +15,8 @@ VALUE rbs_ast_decl_global(VALUE name, VALUE type, VALUE location, VALUE comment)
|
|
15
15
|
VALUE rbs_ast_decl_interface(VALUE name, VALUE type_params, VALUE members, VALUE annotations, VALUE location, VALUE comment);
|
16
16
|
VALUE rbs_ast_decl_module_self(VALUE name, VALUE args, VALUE location);
|
17
17
|
VALUE rbs_ast_decl_module(VALUE name, VALUE type_params, VALUE self_types, VALUE members, VALUE annotations, VALUE location, VALUE comment);
|
18
|
+
VALUE rbs_ast_decl_module_alias(VALUE new_name, VALUE old_name, VALUE location, VALUE comment);
|
19
|
+
VALUE rbs_ast_decl_class_alias(VALUE new_name, VALUE old_name, VALUE location, VALUE comment);
|
18
20
|
VALUE rbs_ast_members_alias(VALUE new_name, VALUE old_name, VALUE kind, VALUE annotations, VALUE location, VALUE comment);
|
19
21
|
VALUE rbs_ast_members_attribute(VALUE klass, VALUE name, VALUE type, VALUE ivar_name, VALUE kind, VALUE annotations, VALUE location, VALUE comment, VALUE visibility);
|
20
22
|
VALUE rbs_ast_members_method_definition(VALUE name, VALUE kind, VALUE overloads, VALUE annotations, VALUE location, VALUE comment, VALUE overloading, VALUE visibility);
|
@@ -41,4 +43,8 @@ VALUE rbs_type_name(VALUE namespace, VALUE name);
|
|
41
43
|
VALUE rbs_union(VALUE types, VALUE location);
|
42
44
|
VALUE rbs_variable(VALUE name, VALUE location);
|
43
45
|
|
46
|
+
VALUE rbs_ast_directives_use(VALUE clauses, VALUE location);
|
47
|
+
VALUE rbs_ast_directives_use_single_clause(VALUE type_name, VALUE new_name, VALUE location);
|
48
|
+
VALUE rbs_ast_directives_use_wildcard_clause(VALUE namespace, VALUE location);
|
49
|
+
|
44
50
|
#endif
|
data/lib/rbs/ast/declarations.rb
CHANGED
@@ -265,7 +265,7 @@ module RBS
|
|
265
265
|
end
|
266
266
|
end
|
267
267
|
|
268
|
-
class
|
268
|
+
class TypeAlias < Base
|
269
269
|
attr_reader :name
|
270
270
|
attr_reader :type_params
|
271
271
|
attr_reader :type
|
@@ -283,7 +283,7 @@ module RBS
|
|
283
283
|
end
|
284
284
|
|
285
285
|
def ==(other)
|
286
|
-
other.is_a?(
|
286
|
+
other.is_a?(TypeAlias) &&
|
287
287
|
other.name == name &&
|
288
288
|
other.type_params == type_params &&
|
289
289
|
other.type == type
|
@@ -379,6 +379,53 @@ module RBS
|
|
379
379
|
}.to_json(state)
|
380
380
|
end
|
381
381
|
end
|
382
|
+
|
383
|
+
class AliasDecl < Base
|
384
|
+
attr_reader :new_name, :old_name, :location, :comment
|
385
|
+
|
386
|
+
def initialize(new_name:, old_name:, location:, comment:)
|
387
|
+
@new_name = new_name
|
388
|
+
@old_name = old_name
|
389
|
+
@location = location
|
390
|
+
@comment = comment
|
391
|
+
end
|
392
|
+
|
393
|
+
def ==(other)
|
394
|
+
other.is_a?(self.class) &&
|
395
|
+
other.new_name == new_name &&
|
396
|
+
other.old_name == old_name
|
397
|
+
end
|
398
|
+
|
399
|
+
alias eql? ==
|
400
|
+
|
401
|
+
def hash
|
402
|
+
self.class.hash ^ new_name.hash ^ old_name.hash
|
403
|
+
end
|
404
|
+
end
|
405
|
+
|
406
|
+
class ClassAlias < AliasDecl
|
407
|
+
def to_json(state = _ = nil)
|
408
|
+
{
|
409
|
+
declaration: :class_alias,
|
410
|
+
new_name: new_name,
|
411
|
+
old_name: old_name,
|
412
|
+
location: location,
|
413
|
+
comment: comment
|
414
|
+
}.to_json(state)
|
415
|
+
end
|
416
|
+
end
|
417
|
+
|
418
|
+
class ModuleAlias < AliasDecl
|
419
|
+
def to_json(state = _ = nil)
|
420
|
+
{
|
421
|
+
declaration: :module_alias,
|
422
|
+
new_name: new_name,
|
423
|
+
old_name: old_name,
|
424
|
+
location: location,
|
425
|
+
comment: comment
|
426
|
+
}.to_json(state)
|
427
|
+
end
|
428
|
+
end
|
382
429
|
end
|
383
430
|
end
|
384
431
|
end
|