rbs 3.7.0 → 3.8.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/comments.yml +3 -3
- data/.github/workflows/ruby.yml +7 -7
- data/CHANGELOG.md +52 -0
- data/core/array.rbs +1743 -1580
- data/core/basic_object.rbs +38 -35
- data/core/comparable.rbs +1 -1
- data/core/complex.rbs +165 -93
- data/core/data.rbs +1 -1
- data/core/dir.rbs +1 -17
- data/core/encoding.rbs +12 -6
- data/core/enumerable.rbs +270 -266
- data/core/enumerator.rbs +0 -2
- data/core/env.rbs +1 -1
- data/core/errno.rbs +33 -16
- data/core/errors.rbs +2 -2
- data/core/exception.rbs +236 -170
- data/core/fiber.rbs +3 -2
- data/core/file.rbs +32 -74
- data/core/float.rbs +125 -72
- data/core/gc.rbs +138 -40
- data/core/hash.rbs +120 -141
- data/core/integer.rbs +79 -50
- data/core/io/buffer.rbs +49 -43
- data/core/io.rbs +97 -144
- data/core/kernel.rbs +290 -200
- data/core/match_data.rbs +76 -2
- data/core/math.rbs +0 -36
- data/core/module.rbs +28 -23
- data/core/nil_class.rbs +0 -3
- data/core/numeric.rbs +100 -103
- data/core/object.rbs +0 -4
- data/core/object_space/weak_key_map.rbs +3 -4
- data/core/object_space.rbs +3 -3
- data/core/proc.rbs +0 -2
- data/core/process.rbs +109 -57
- data/core/ractor.rbs +37 -4
- data/core/range.rbs +114 -87
- data/core/rational.rbs +0 -2
- data/core/rbs/unnamed/argf.rbs +234 -33
- data/core/rbs/unnamed/env_class.rbs +35 -53
- data/core/rbs/unnamed/random.rbs +1 -2
- data/core/regexp.rbs +4 -52
- data/core/ruby_vm.rbs +88 -9
- data/core/rubygems/config_file.rbs +3 -0
- data/core/rubygems/errors.rbs +0 -5
- data/core/rubygems/platform.rbs +0 -9
- data/core/rubygems/rubygems.rbs +0 -5
- data/core/rubygems/version.rbs +6 -6
- data/core/set.rbs +3 -15
- data/core/string.rbs +130 -136
- data/core/struct.rbs +6 -18
- data/core/symbol.rbs +14 -21
- data/core/thread.rbs +32 -35
- data/core/time.rbs +127 -50
- data/core/trace_point.rbs +16 -0
- data/core/true_class.rbs +0 -1
- data/core/warning.rbs +9 -2
- data/docs/architecture.md +1 -1
- data/docs/syntax.md +1 -1
- data/ext/rbs_extension/location.c +29 -19
- data/ext/rbs_extension/parser.c +267 -292
- data/ext/rbs_extension/parserstate.c +56 -22
- data/lib/rbs/annotate/annotations.rb +3 -3
- data/lib/rbs/annotate/rdoc_source.rb +2 -2
- data/lib/rbs/cli/diff.rb +3 -3
- data/lib/rbs/cli/validate.rb +1 -1
- data/lib/rbs/cli.rb +13 -13
- data/lib/rbs/collection/config.rb +3 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +3 -3
- data/lib/rbs/environment_loader.rb +1 -1
- data/lib/rbs/namespace.rb +1 -0
- data/lib/rbs/parser_aux.rb +2 -2
- data/lib/rbs/prototype/rb.rb +11 -8
- data/lib/rbs/prototype/rbi.rb +9 -5
- data/lib/rbs/prototype/runtime/value_object_generator.rb +7 -5
- data/lib/rbs/prototype/runtime.rb +4 -5
- data/lib/rbs/type_name.rb +14 -9
- data/lib/rbs/unit_test/type_assertions.rb +2 -2
- data/lib/rbs/validator.rb +3 -1
- data/lib/rbs/version.rb +1 -1
- data/lib/rdoc_plugin/parser.rb +2 -2
- data/rbs.gemspec +4 -0
- data/sig/ancestor_graph.rbs +4 -4
- data/sig/namespace.rbs +2 -3
- data/sig/resolver/constant_resolver.rbs +2 -2
- data/sig/resolver/context.rbs +1 -1
- data/sig/type_alias_regularity.rbs +5 -5
- data/sig/typename.rbs +8 -5
- data/sig/use_map.rbs +1 -1
- data/sig/validator.rbs +2 -2
- data/stdlib/base64/0/base64.rbs +0 -9
- data/stdlib/benchmark/0/benchmark.rbs +11 -2
- data/stdlib/bigdecimal/0/big_decimal.rbs +26 -182
- data/stdlib/cgi/0/core.rbs +47 -0
- data/stdlib/coverage/0/coverage.rbs +0 -3
- data/stdlib/csv/0/csv.rbs +18 -58
- data/stdlib/date/0/date.rbs +4 -19
- data/stdlib/did_you_mean/0/did_you_mean.rbs +0 -5
- data/stdlib/digest/0/digest.rbs +25 -2
- data/stdlib/erb/0/erb.rbs +0 -1
- data/stdlib/etc/0/etc.rbs +51 -34
- data/stdlib/fileutils/0/fileutils.rbs +3 -44
- data/stdlib/io-console/0/io-console.rbs +69 -15
- data/stdlib/ipaddr/0/ipaddr.rbs +8 -4
- data/stdlib/json/0/json.rbs +56 -71
- data/stdlib/logger/0/log_device.rbs +1 -1
- data/stdlib/logger/0/logger.rbs +3 -18
- data/stdlib/net-http/0/net-http.rbs +19 -77
- data/stdlib/nkf/0/nkf.rbs +30 -0
- data/stdlib/objspace/0/objspace.rbs +1 -2
- data/stdlib/observable/0/observable.rbs +1 -1
- data/stdlib/open-uri/0/open-uri.rbs +52 -0
- data/stdlib/open3/0/open3.rbs +0 -8
- data/stdlib/openssl/0/openssl.rbs +136 -69
- data/stdlib/optparse/0/optparse.rbs +58 -18
- data/stdlib/pathname/0/pathname.rbs +2 -8
- data/stdlib/pp/0/pp.rbs +3 -1
- data/stdlib/prettyprint/0/prettyprint.rbs +0 -4
- data/stdlib/pstore/0/pstore.rbs +0 -6
- data/stdlib/psych/0/psych.rbs +15 -4
- data/stdlib/pty/0/pty.rbs +46 -4
- data/stdlib/rdoc/0/code_object.rbs +0 -4
- data/stdlib/rdoc/0/markup.rbs +10 -12
- data/stdlib/rdoc/0/rdoc.rbs +1 -2
- data/stdlib/resolv/0/resolv.rbs +8 -3
- data/stdlib/ripper/0/ripper.rbs +0 -2
- data/stdlib/securerandom/0/securerandom.rbs +0 -2
- data/stdlib/shellwords/0/shellwords.rbs +11 -12
- data/stdlib/singleton/0/singleton.rbs +0 -1
- data/stdlib/socket/0/addrinfo.rbs +0 -1
- data/stdlib/socket/0/basic_socket.rbs +0 -5
- data/stdlib/socket/0/socket.rbs +49 -25
- data/stdlib/socket/0/tcp_server.rbs +0 -3
- data/stdlib/socket/0/tcp_socket.rbs +58 -3
- data/stdlib/socket/0/udp_socket.rbs +0 -1
- data/stdlib/socket/0/unix_server.rbs +0 -3
- data/stdlib/strscan/0/string_scanner.rbs +1265 -422
- data/stdlib/tempfile/0/tempfile.rbs +135 -28
- data/stdlib/time/0/time.rbs +48 -35
- data/stdlib/timeout/0/timeout.rbs +11 -8
- data/stdlib/tmpdir/0/tmpdir.rbs +8 -1
- data/stdlib/tsort/0/tsort.rbs +0 -4
- data/stdlib/uri/0/common.rbs +11 -30
- data/stdlib/uri/0/ftp.rbs +1 -1
- data/stdlib/uri/0/generic.rbs +22 -18
- data/stdlib/uri/0/http.rbs +2 -2
- data/stdlib/uri/0/rfc2396_parser.rbs +3 -0
- data/stdlib/zlib/0/buf_error.rbs +1 -70
- data/stdlib/zlib/0/data_error.rbs +1 -70
- data/stdlib/zlib/0/deflate.rbs +8 -72
- data/stdlib/zlib/0/error.rbs +1 -70
- data/stdlib/zlib/0/gzip_file/crc_error.rbs +2 -105
- data/stdlib/zlib/0/gzip_file/error.rbs +2 -105
- data/stdlib/zlib/0/gzip_file/length_error.rbs +2 -105
- data/stdlib/zlib/0/gzip_file/no_footer.rbs +2 -105
- data/stdlib/zlib/0/gzip_file.rbs +1 -71
- data/stdlib/zlib/0/gzip_reader.rbs +3 -74
- data/stdlib/zlib/0/gzip_writer.rbs +1 -70
- data/stdlib/zlib/0/inflate.rbs +4 -71
- data/stdlib/zlib/0/mem_error.rbs +1 -70
- data/stdlib/zlib/0/need_dict.rbs +1 -70
- data/stdlib/zlib/0/stream_end.rbs +1 -70
- data/stdlib/zlib/0/stream_error.rbs +1 -70
- data/stdlib/zlib/0/version_error.rbs +1 -70
- data/stdlib/zlib/0/zlib.rbs +0 -2
- data/stdlib/zlib/0/zstream.rbs +4 -72
- metadata +4 -6
data/ext/rbs_extension/parser.c
CHANGED
@@ -146,7 +146,6 @@ void parser_advance_no_gap(parserstate *state) {
|
|
146
146
|
static VALUE parse_type_name(parserstate *state, TypeNameKind kind, range *rg) {
|
147
147
|
VALUE absolute = Qfalse;
|
148
148
|
VALUE path = EMPTY_ARRAY;
|
149
|
-
VALUE namespace;
|
150
149
|
|
151
150
|
if (rg) {
|
152
151
|
rg->start = state->current_token.range.start;
|
@@ -169,7 +168,8 @@ static VALUE parse_type_name(parserstate *state, TypeNameKind kind, range *rg) {
|
|
169
168
|
parser_advance(state);
|
170
169
|
parser_advance(state);
|
171
170
|
}
|
172
|
-
|
171
|
+
|
172
|
+
VALUE namespace = rbs_namespace(path, absolute);
|
173
173
|
|
174
174
|
switch (state->current_token.type) {
|
175
175
|
case tLIDENT:
|
@@ -267,7 +267,6 @@ static bool is_keyword_token(enum TokenType type) {
|
|
267
267
|
*/
|
268
268
|
static VALUE parse_function_param(parserstate *state) {
|
269
269
|
range type_range;
|
270
|
-
|
271
270
|
type_range.start = state->next_token.range.start;
|
272
271
|
VALUE type = parse_type(state);
|
273
272
|
type_range.end = state->current_token.range.end;
|
@@ -283,11 +282,13 @@ static VALUE parse_function_param(parserstate *state) {
|
|
283
282
|
return rbs_function_param(type, Qnil, location);
|
284
283
|
} else {
|
285
284
|
range name_range = state->next_token.range;
|
286
|
-
range param_range;
|
287
285
|
|
288
286
|
parser_advance(state);
|
289
|
-
|
290
|
-
param_range
|
287
|
+
|
288
|
+
range param_range = {
|
289
|
+
.start = type_range.start,
|
290
|
+
.end = name_range.end,
|
291
|
+
};
|
291
292
|
|
292
293
|
if (!is_keyword_token(state->current_token.type)) {
|
293
294
|
raise_syntax_error(
|
@@ -320,28 +321,22 @@ static ID intern_token_start_end(parserstate *state, token start_token, token en
|
|
320
321
|
| {} keyword <`?`> `:`
|
321
322
|
*/
|
322
323
|
static VALUE parse_keyword_key(parserstate *state) {
|
323
|
-
VALUE key;
|
324
|
-
|
325
324
|
parser_advance(state);
|
326
325
|
|
327
326
|
if (state->next_token.type == pQUESTION) {
|
328
|
-
key = ID2SYM(intern_token_start_end(state, state->current_token, state->next_token));
|
327
|
+
VALUE key = ID2SYM(intern_token_start_end(state, state->current_token, state->next_token));
|
329
328
|
parser_advance(state);
|
329
|
+
return key;
|
330
330
|
} else {
|
331
|
-
|
331
|
+
return ID2SYM(INTERN_TOKEN(state, state->current_token));
|
332
332
|
}
|
333
|
-
|
334
|
-
return key;
|
335
333
|
}
|
336
334
|
|
337
335
|
/*
|
338
336
|
keyword ::= {} keyword `:` <function_param>
|
339
337
|
*/
|
340
338
|
static void parse_keyword(parserstate *state, VALUE keywords, VALUE memo) {
|
341
|
-
VALUE key;
|
342
|
-
VALUE param;
|
343
|
-
|
344
|
-
key = parse_keyword_key(state);
|
339
|
+
VALUE key = parse_keyword_key(state);
|
345
340
|
|
346
341
|
if (!NIL_P(rb_hash_aref(memo, key))) {
|
347
342
|
raise_syntax_error(
|
@@ -354,7 +349,7 @@ static void parse_keyword(parserstate *state, VALUE keywords, VALUE memo) {
|
|
354
349
|
}
|
355
350
|
|
356
351
|
parser_advance_assert(state, pCOLON);
|
357
|
-
param = parse_function_param(state);
|
352
|
+
VALUE param = parse_function_param(state);
|
358
353
|
|
359
354
|
rb_hash_aset(keywords, key, param);
|
360
355
|
|
@@ -591,6 +586,7 @@ EOP:
|
|
591
586
|
static VALUE parse_optional(parserstate *state) {
|
592
587
|
range rg;
|
593
588
|
rg.start = state->next_token.range.start;
|
589
|
+
|
594
590
|
VALUE type = parse_simple(state);
|
595
591
|
|
596
592
|
if (state->next_token.type == pQUESTION) {
|
@@ -604,13 +600,15 @@ static VALUE parse_optional(parserstate *state) {
|
|
604
600
|
}
|
605
601
|
|
606
602
|
static void initialize_method_params(method_params *params){
|
607
|
-
params
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
603
|
+
*params = (method_params) {
|
604
|
+
.required_positionals = EMPTY_ARRAY,
|
605
|
+
.optional_positionals = EMPTY_ARRAY,
|
606
|
+
.rest_positionals = Qnil,
|
607
|
+
.trailing_positionals = EMPTY_ARRAY,
|
608
|
+
.required_keywords = rb_hash_new(),
|
609
|
+
.optional_keywords = rb_hash_new(),
|
610
|
+
.rest_keywords = Qnil,
|
611
|
+
};
|
614
612
|
}
|
615
613
|
|
616
614
|
/*
|
@@ -790,9 +788,10 @@ static VALUE parse_record_attributes(parserstate *state) {
|
|
790
788
|
case tDQSTRING:
|
791
789
|
case tINTEGER:
|
792
790
|
case kTRUE:
|
793
|
-
case kFALSE:
|
791
|
+
case kFALSE: {
|
794
792
|
key = rb_funcall(parse_simple(state), rb_intern("literal"), 0);
|
795
793
|
break;
|
794
|
+
}
|
796
795
|
default:
|
797
796
|
raise_syntax_error(
|
798
797
|
state,
|
@@ -864,15 +863,12 @@ static VALUE parse_symbol(parserstate *state) {
|
|
864
863
|
| {} `[` type_list <`]`>
|
865
864
|
*/
|
866
865
|
static VALUE parse_instance_type(parserstate *state, bool parse_alias) {
|
867
|
-
range name_range;
|
868
|
-
range args_range;
|
869
|
-
range type_range;
|
870
|
-
|
871
866
|
TypeNameKind expected_kind = INTERFACE_NAME | CLASS_NAME;
|
872
867
|
if (parse_alias) {
|
873
868
|
expected_kind |= ALIAS_NAME;
|
874
869
|
}
|
875
870
|
|
871
|
+
range name_range;
|
876
872
|
VALUE typename = parse_type_name(state, expected_kind, &name_range);
|
877
873
|
VALUE types = EMPTY_ARRAY;
|
878
874
|
|
@@ -887,6 +883,7 @@ static VALUE parse_instance_type(parserstate *state, bool parse_alias) {
|
|
887
883
|
rbs_abort();
|
888
884
|
}
|
889
885
|
|
886
|
+
range args_range;
|
890
887
|
if (state->next_token.type == pLBRACKET) {
|
891
888
|
parser_advance(state);
|
892
889
|
args_range.start = state->current_token.range.start;
|
@@ -897,8 +894,10 @@ static VALUE parse_instance_type(parserstate *state, bool parse_alias) {
|
|
897
894
|
args_range = NULL_RANGE;
|
898
895
|
}
|
899
896
|
|
900
|
-
type_range
|
901
|
-
|
897
|
+
range type_range = {
|
898
|
+
.start = name_range.start,
|
899
|
+
.end = nonnull_pos_or(args_range.end, name_range.end),
|
900
|
+
};
|
902
901
|
|
903
902
|
VALUE location = rbs_new_location(state->buffer, type_range);
|
904
903
|
rbs_loc *loc = rbs_check_location(location);
|
@@ -921,15 +920,14 @@ static VALUE parse_instance_type(parserstate *state, bool parse_alias) {
|
|
921
920
|
singleton_type ::= {`singleton`} `(` type_name <`)`>
|
922
921
|
*/
|
923
922
|
static VALUE parse_singleton_type(parserstate *state) {
|
924
|
-
range name_range;
|
925
|
-
range type_range;
|
926
|
-
|
927
923
|
parser_assert(state, kSINGLETON);
|
928
924
|
|
925
|
+
range type_range;
|
929
926
|
type_range.start = state->current_token.range.start;
|
930
927
|
parser_advance_assert(state, pLPAREN);
|
931
928
|
parser_advance(state);
|
932
929
|
|
930
|
+
range name_range;
|
933
931
|
VALUE typename = parse_type_name(state, CLASS_NAME, &name_range);
|
934
932
|
|
935
933
|
parser_advance_assert(state, pRPAREN);
|
@@ -962,24 +960,33 @@ static VALUE parse_simple(parserstate *state) {
|
|
962
960
|
parser_advance_assert(state, pRPAREN);
|
963
961
|
return type;
|
964
962
|
}
|
965
|
-
case kBOOL:
|
963
|
+
case kBOOL: {
|
966
964
|
return rbs_bases_bool(rbs_location_current_token(state));
|
967
|
-
|
965
|
+
}
|
966
|
+
case kBOT: {
|
968
967
|
return rbs_bases_bottom(rbs_location_current_token(state));
|
969
|
-
|
968
|
+
}
|
969
|
+
case kCLASS: {
|
970
970
|
return rbs_bases_class(rbs_location_current_token(state));
|
971
|
-
|
971
|
+
}
|
972
|
+
case kINSTANCE: {
|
972
973
|
return rbs_bases_instance(rbs_location_current_token(state));
|
973
|
-
|
974
|
+
}
|
975
|
+
case kNIL: {
|
974
976
|
return rbs_bases_nil(rbs_location_current_token(state));
|
975
|
-
|
977
|
+
}
|
978
|
+
case kSELF: {
|
976
979
|
return rbs_bases_self(rbs_location_current_token(state));
|
977
|
-
|
980
|
+
}
|
981
|
+
case kTOP: {
|
978
982
|
return rbs_bases_top(rbs_location_current_token(state));
|
979
|
-
|
983
|
+
}
|
984
|
+
case kVOID: {
|
980
985
|
return rbs_bases_void(rbs_location_current_token(state));
|
981
|
-
|
986
|
+
}
|
987
|
+
case kUNTYPED: {
|
982
988
|
return rbs_bases_any(rbs_location_current_token(state));
|
989
|
+
}
|
983
990
|
case k__TODO__: {
|
984
991
|
VALUE type = rbs_bases_any(rbs_location_current_token(state));
|
985
992
|
rb_funcall(type, rb_intern("todo!"), 0);
|
@@ -996,10 +1003,12 @@ static VALUE parse_simple(parserstate *state) {
|
|
996
1003
|
rbs_location_current_token(state)
|
997
1004
|
);
|
998
1005
|
}
|
999
|
-
case kTRUE:
|
1006
|
+
case kTRUE: {
|
1000
1007
|
return rbs_literal(Qtrue, rbs_location_current_token(state));
|
1001
|
-
|
1008
|
+
}
|
1009
|
+
case kFALSE: {
|
1002
1010
|
return rbs_literal(Qfalse, rbs_location_current_token(state));
|
1011
|
+
}
|
1003
1012
|
case tSQSTRING:
|
1004
1013
|
case tDQSTRING: {
|
1005
1014
|
VALUE literal = rbs_unquote_string(state, state->current_token.range, 0);
|
@@ -1022,10 +1031,12 @@ static VALUE parse_simple(parserstate *state) {
|
|
1022
1031
|
}
|
1023
1032
|
case tULIDENT: // fallthrough
|
1024
1033
|
case tLIDENT: // fallthrough
|
1025
|
-
case pCOLON2:
|
1034
|
+
case pCOLON2: {
|
1026
1035
|
return parse_instance_type(state, true);
|
1027
|
-
|
1036
|
+
}
|
1037
|
+
case kSINGLETON: {
|
1028
1038
|
return parse_singleton_type(state);
|
1039
|
+
}
|
1029
1040
|
case pLBRACKET: {
|
1030
1041
|
range rg;
|
1031
1042
|
rg.start = state->current_token.range.start;
|
@@ -1067,8 +1078,8 @@ static VALUE parse_simple(parserstate *state) {
|
|
1067
1078
|
*/
|
1068
1079
|
static VALUE parse_intersection(parserstate *state) {
|
1069
1080
|
range rg;
|
1070
|
-
|
1071
1081
|
rg.start = state->next_token.range.start;
|
1082
|
+
|
1072
1083
|
VALUE type = parse_optional(state);
|
1073
1084
|
VALUE intersection_types = rb_ary_new();
|
1074
1085
|
|
@@ -1094,8 +1105,8 @@ static VALUE parse_intersection(parserstate *state) {
|
|
1094
1105
|
*/
|
1095
1106
|
VALUE parse_type(parserstate *state) {
|
1096
1107
|
range rg;
|
1097
|
-
|
1098
1108
|
rg.start = state->next_token.range.start;
|
1109
|
+
|
1099
1110
|
VALUE type = parse_intersection(state);
|
1100
1111
|
VALUE union_types = rb_ary_new();
|
1101
1112
|
|
@@ -1134,21 +1145,16 @@ static VALUE parse_type_params(parserstate *state, range *rg, bool module_type_p
|
|
1134
1145
|
rg->start = state->current_token.range.start;
|
1135
1146
|
|
1136
1147
|
while (true) {
|
1137
|
-
VALUE name;
|
1138
1148
|
bool unchecked = false;
|
1139
1149
|
VALUE variance = ID2SYM(rb_intern("invariant"));
|
1140
1150
|
VALUE upper_bound = Qnil;
|
1141
1151
|
VALUE default_type = Qnil;
|
1142
1152
|
|
1143
|
-
range param_range
|
1144
|
-
range name_range;
|
1145
|
-
range variance_range = NULL_RANGE;
|
1146
|
-
range unchecked_range = NULL_RANGE;
|
1147
|
-
range upper_bound_range = NULL_RANGE;
|
1148
|
-
range default_type_range = NULL_RANGE;
|
1149
|
-
|
1153
|
+
range param_range;
|
1150
1154
|
param_range.start = state->next_token.range.start;
|
1151
1155
|
|
1156
|
+
range variance_range = NULL_RANGE;
|
1157
|
+
range unchecked_range = NULL_RANGE;
|
1152
1158
|
if (module_type_params) {
|
1153
1159
|
if (state->next_token.type == kUNCHECKED) {
|
1154
1160
|
unchecked = true;
|
@@ -1174,13 +1180,14 @@ static VALUE parse_type_params(parserstate *state, range *rg, bool module_type_p
|
|
1174
1180
|
}
|
1175
1181
|
|
1176
1182
|
parser_advance_assert(state, tUIDENT);
|
1177
|
-
name_range = state->current_token.range;
|
1183
|
+
range name_range = state->current_token.range;
|
1178
1184
|
|
1179
1185
|
ID id = INTERN_TOKEN(state, state->current_token);
|
1180
|
-
name = ID2SYM(id);
|
1186
|
+
VALUE name = ID2SYM(id);
|
1181
1187
|
|
1182
1188
|
parser_insert_typevar(state, id);
|
1183
1189
|
|
1190
|
+
range upper_bound_range = NULL_RANGE;
|
1184
1191
|
if (state->next_token.type == pLT) {
|
1185
1192
|
parser_advance(state);
|
1186
1193
|
upper_bound_range.start = state->current_token.range.start;
|
@@ -1188,6 +1195,7 @@ static VALUE parse_type_params(parserstate *state, range *rg, bool module_type_p
|
|
1188
1195
|
upper_bound_range.end = state->current_token.range.end;
|
1189
1196
|
}
|
1190
1197
|
|
1198
|
+
range default_type_range = NULL_RANGE;
|
1191
1199
|
if (module_type_params) {
|
1192
1200
|
if (state->next_token.type == pEQ) {
|
1193
1201
|
parser_advance(state);
|
@@ -1257,20 +1265,19 @@ static VALUE parse_type_params(parserstate *state, range *rg, bool module_type_p
|
|
1257
1265
|
method_type ::= {} type_params <function>
|
1258
1266
|
*/
|
1259
1267
|
VALUE parse_method_type(parserstate *state) {
|
1260
|
-
range rg;
|
1261
|
-
range params_range = NULL_RANGE;
|
1262
|
-
range type_range;
|
1263
|
-
|
1264
|
-
VALUE function = Qnil;
|
1265
|
-
VALUE block = Qnil;
|
1266
1268
|
parser_push_typevar_table(state, false);
|
1267
1269
|
|
1270
|
+
range rg;
|
1268
1271
|
rg.start = state->next_token.range.start;
|
1269
1272
|
|
1273
|
+
range params_range = NULL_RANGE;
|
1270
1274
|
VALUE type_params = parse_type_params(state, ¶ms_range, false);
|
1271
1275
|
|
1276
|
+
range type_range;
|
1272
1277
|
type_range.start = state->next_token.range.start;
|
1273
1278
|
|
1279
|
+
VALUE function = Qnil;
|
1280
|
+
VALUE block = Qnil;
|
1274
1281
|
parse_function(state, &function, &block, NULL);
|
1275
1282
|
|
1276
1283
|
rg.end = state->current_token.range.end;
|
@@ -1297,29 +1304,20 @@ VALUE parse_method_type(parserstate *state) {
|
|
1297
1304
|
*/
|
1298
1305
|
static VALUE parse_global_decl(parserstate *state) {
|
1299
1306
|
range decl_range;
|
1300
|
-
range name_range, colon_range;
|
1301
|
-
|
1302
|
-
VALUE typename;
|
1303
|
-
VALUE type;
|
1304
|
-
VALUE location;
|
1305
|
-
VALUE comment;
|
1306
|
-
|
1307
|
-
rbs_loc *loc;
|
1308
|
-
|
1309
1307
|
decl_range.start = state->current_token.range.start;
|
1310
|
-
comment = get_comment(state, decl_range.start.line);
|
1311
1308
|
|
1312
|
-
|
1313
|
-
|
1309
|
+
VALUE comment = get_comment(state, decl_range.start.line);
|
1310
|
+
range name_range = state->current_token.range;
|
1311
|
+
VALUE typename = ID2SYM(INTERN_TOKEN(state, state->current_token));
|
1314
1312
|
|
1315
1313
|
parser_advance_assert(state, pCOLON);
|
1316
|
-
colon_range = state->current_token.range;
|
1314
|
+
range colon_range = state->current_token.range;
|
1317
1315
|
|
1318
|
-
type = parse_type(state);
|
1316
|
+
VALUE type = parse_type(state);
|
1319
1317
|
decl_range.end = state->current_token.range.end;
|
1320
1318
|
|
1321
|
-
location = rbs_new_location(state->buffer, decl_range);
|
1322
|
-
loc = rbs_check_location(location);
|
1319
|
+
VALUE location = rbs_new_location(state->buffer, decl_range);
|
1320
|
+
rbs_loc *loc = rbs_check_location(location);
|
1323
1321
|
rbs_loc_alloc_children(loc, 2);
|
1324
1322
|
rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
|
1325
1323
|
rbs_loc_add_required_child(loc, rb_intern("colon"), colon_range);
|
@@ -1332,28 +1330,21 @@ static VALUE parse_global_decl(parserstate *state) {
|
|
1332
1330
|
*/
|
1333
1331
|
static VALUE parse_const_decl(parserstate *state) {
|
1334
1332
|
range decl_range;
|
1335
|
-
range name_range, colon_range;
|
1336
|
-
|
1337
|
-
VALUE typename;
|
1338
|
-
VALUE type;
|
1339
|
-
VALUE location;
|
1340
|
-
VALUE comment;
|
1341
|
-
|
1342
|
-
rbs_loc *loc;
|
1343
1333
|
|
1344
1334
|
decl_range.start = state->current_token.range.start;
|
1345
|
-
comment = get_comment(state, decl_range.start.line);
|
1335
|
+
VALUE comment = get_comment(state, decl_range.start.line);
|
1346
1336
|
|
1347
|
-
|
1337
|
+
range name_range;
|
1338
|
+
VALUE typename = parse_type_name(state, CLASS_NAME, &name_range);
|
1348
1339
|
|
1349
1340
|
parser_advance_assert(state, pCOLON);
|
1350
|
-
colon_range = state->current_token.range;
|
1341
|
+
range colon_range = state->current_token.range;
|
1351
1342
|
|
1352
|
-
type = parse_type(state);
|
1343
|
+
VALUE type = parse_type(state);
|
1353
1344
|
decl_range.end = state->current_token.range.end;
|
1354
1345
|
|
1355
|
-
location = rbs_new_location(state->buffer, decl_range);
|
1356
|
-
loc = rbs_check_location(location);
|
1346
|
+
VALUE location = rbs_new_location(state->buffer, decl_range);
|
1347
|
+
rbs_loc *loc = rbs_check_location(location);
|
1357
1348
|
rbs_loc_alloc_children(loc, 2);
|
1358
1349
|
rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
|
1359
1350
|
rbs_loc_add_required_child(loc, rb_intern("colon"), colon_range);
|
@@ -1365,23 +1356,24 @@ static VALUE parse_const_decl(parserstate *state) {
|
|
1365
1356
|
type_decl ::= {kTYPE} alias_name `=` <type>
|
1366
1357
|
*/
|
1367
1358
|
static VALUE parse_type_decl(parserstate *state, position comment_pos, VALUE annotations) {
|
1368
|
-
range decl_range;
|
1369
|
-
range keyword_range, name_range, params_range, eq_range;
|
1370
|
-
|
1371
1359
|
parser_push_typevar_table(state, true);
|
1372
1360
|
|
1361
|
+
range decl_range;
|
1373
1362
|
decl_range.start = state->current_token.range.start;
|
1374
1363
|
comment_pos = nonnull_pos_or(comment_pos, decl_range.start);
|
1375
1364
|
|
1376
|
-
keyword_range = state->current_token.range;
|
1365
|
+
range keyword_range = state->current_token.range;
|
1377
1366
|
|
1378
1367
|
parser_advance(state);
|
1368
|
+
|
1369
|
+
range name_range;
|
1379
1370
|
VALUE typename = parse_type_name(state, ALIAS_NAME, &name_range);
|
1380
1371
|
|
1372
|
+
range params_range;
|
1381
1373
|
VALUE type_params = parse_type_params(state, ¶ms_range, true);
|
1382
1374
|
|
1383
1375
|
parser_advance_assert(state, pEQ);
|
1384
|
-
eq_range = state->current_token.range;
|
1376
|
+
range eq_range = state->current_token.range;
|
1385
1377
|
|
1386
1378
|
VALUE type = parse_type(state);
|
1387
1379
|
decl_range.end = state->current_token.range.end;
|
@@ -1520,8 +1512,9 @@ static VALUE parse_method_name(parserstate *state, range *range) {
|
|
1520
1512
|
*range = state->current_token.range;
|
1521
1513
|
return ID2SYM(INTERN_TOKEN(state, state->current_token));
|
1522
1514
|
|
1523
|
-
case tQIDENT:
|
1515
|
+
case tQIDENT: {
|
1524
1516
|
return rb_to_symbol(rbs_unquote_string(state, state->current_token.range, 0));
|
1517
|
+
}
|
1525
1518
|
|
1526
1519
|
case pBAR:
|
1527
1520
|
case pHAT:
|
@@ -1566,8 +1559,6 @@ static InstanceSingletonKind parse_instance_singleton_kind(parserstate *state, b
|
|
1566
1559
|
parser_advance(state);
|
1567
1560
|
parser_advance(state);
|
1568
1561
|
kind = SINGLETON_KIND;
|
1569
|
-
rg->start = self_range.start;
|
1570
|
-
rg->end = state->current_token.range.end;
|
1571
1562
|
} else if (
|
1572
1563
|
state->next_token2.type == pQUESTION
|
1573
1564
|
&& state->next_token.range.end.char_pos == state->next_token2.range.start.char_pos
|
@@ -1577,9 +1568,12 @@ static InstanceSingletonKind parse_instance_singleton_kind(parserstate *state, b
|
|
1577
1568
|
parser_advance(state);
|
1578
1569
|
parser_advance(state);
|
1579
1570
|
kind = INSTANCE_SINGLETON_KIND;
|
1580
|
-
rg->start = self_range.start;
|
1581
|
-
rg->end = state->current_token.range.end;
|
1582
1571
|
}
|
1572
|
+
|
1573
|
+
*rg = (range) {
|
1574
|
+
.start = self_range.start,
|
1575
|
+
.end = state->current_token.range.end,
|
1576
|
+
};
|
1583
1577
|
} else {
|
1584
1578
|
*rg = NULL_RANGE;
|
1585
1579
|
}
|
@@ -1601,40 +1595,38 @@ static InstanceSingletonKind parse_instance_singleton_kind(parserstate *state, b
|
|
1601
1595
|
* */
|
1602
1596
|
static VALUE parse_member_def(parserstate *state, bool instance_only, bool accept_overload, position comment_pos, VALUE annotations) {
|
1603
1597
|
range member_range;
|
1604
|
-
range visibility_range;
|
1605
|
-
range keyword_range;
|
1606
|
-
range name_range;
|
1607
|
-
range kind_range;
|
1608
|
-
range overloading_range = NULL_RANGE;
|
1609
|
-
|
1610
|
-
VALUE visibility;
|
1611
|
-
|
1612
1598
|
member_range.start = state->current_token.range.start;
|
1613
1599
|
comment_pos = nonnull_pos_or(comment_pos, member_range.start);
|
1600
|
+
|
1614
1601
|
VALUE comment = get_comment(state, comment_pos.line);
|
1615
1602
|
|
1603
|
+
range visibility_range;
|
1604
|
+
VALUE visibility;
|
1616
1605
|
switch (state->current_token.type)
|
1617
1606
|
{
|
1618
|
-
case kPRIVATE:
|
1607
|
+
case kPRIVATE: {
|
1619
1608
|
visibility_range = state->current_token.range;
|
1620
1609
|
visibility = ID2SYM(rb_intern("private"));
|
1621
1610
|
member_range.start = visibility_range.start;
|
1622
1611
|
parser_advance(state);
|
1623
1612
|
break;
|
1624
|
-
|
1613
|
+
}
|
1614
|
+
case kPUBLIC: {
|
1625
1615
|
visibility_range = state->current_token.range;
|
1626
1616
|
visibility = ID2SYM(rb_intern("public"));
|
1627
1617
|
member_range.start = visibility_range.start;
|
1628
1618
|
parser_advance(state);
|
1629
1619
|
break;
|
1620
|
+
}
|
1630
1621
|
default:
|
1631
1622
|
visibility_range = NULL_RANGE;
|
1632
1623
|
visibility = Qnil;
|
1633
1624
|
break;
|
1634
1625
|
}
|
1635
1626
|
|
1636
|
-
keyword_range = state->current_token.range;
|
1627
|
+
range keyword_range = state->current_token.range;
|
1637
1628
|
|
1629
|
+
range kind_range;
|
1638
1630
|
InstanceSingletonKind kind;
|
1639
1631
|
if (instance_only) {
|
1640
1632
|
kind_range = NULL_RANGE;
|
@@ -1643,6 +1635,7 @@ static VALUE parse_member_def(parserstate *state, bool instance_only, bool accep
|
|
1643
1635
|
kind = parse_instance_singleton_kind(state, NIL_P(visibility), &kind_range);
|
1644
1636
|
}
|
1645
1637
|
|
1638
|
+
range name_range;
|
1646
1639
|
VALUE name = parse_method_name(state, &name_range);
|
1647
1640
|
VALUE overloads = rb_ary_new();
|
1648
1641
|
VALUE overloading = Qfalse;
|
@@ -1659,6 +1652,7 @@ static VALUE parse_member_def(parserstate *state, bool instance_only, bool accep
|
|
1659
1652
|
|
1660
1653
|
parser_push_typevar_table(state, kind != INSTANCE_KIND);
|
1661
1654
|
|
1655
|
+
range overloading_range = NULL_RANGE;
|
1662
1656
|
bool loop = true;
|
1663
1657
|
while (loop) {
|
1664
1658
|
VALUE annotations = EMPTY_ARRAY;
|
@@ -1781,18 +1775,13 @@ void class_instance_name(parserstate *state, TypeNameKind kind, VALUE *name, VAL
|
|
1781
1775
|
* */
|
1782
1776
|
static VALUE parse_mixin_member(parserstate *state, bool from_interface, position comment_pos, VALUE annotations) {
|
1783
1777
|
range member_range;
|
1784
|
-
range name_range;
|
1785
|
-
range keyword_range;
|
1786
|
-
range args_range = NULL_RANGE;
|
1787
|
-
bool reset_typevar_scope;
|
1788
|
-
enum TokenType type;
|
1789
|
-
|
1790
1778
|
member_range.start = state->current_token.range.start;
|
1791
1779
|
comment_pos = nonnull_pos_or(comment_pos, member_range.start);
|
1792
1780
|
|
1793
|
-
type = state->current_token.type;
|
1794
|
-
keyword_range = state->current_token.range;
|
1781
|
+
enum TokenType type = state->current_token.type;
|
1782
|
+
range keyword_range = state->current_token.range;
|
1795
1783
|
|
1784
|
+
bool reset_typevar_scope;
|
1796
1785
|
switch (type)
|
1797
1786
|
{
|
1798
1787
|
case kINCLUDE:
|
@@ -1822,6 +1811,8 @@ static VALUE parse_mixin_member(parserstate *state, bool from_interface, positio
|
|
1822
1811
|
|
1823
1812
|
VALUE name;
|
1824
1813
|
VALUE args = EMPTY_ARRAY;
|
1814
|
+
range name_range;
|
1815
|
+
range args_range = NULL_RANGE;
|
1825
1816
|
class_instance_name(
|
1826
1817
|
state,
|
1827
1818
|
from_interface ? INTERFACE_NAME : (INTERFACE_NAME | CLASS_NAME),
|
@@ -1863,19 +1854,14 @@ static VALUE parse_mixin_member(parserstate *state, bool from_interface, positio
|
|
1863
1854
|
* */
|
1864
1855
|
static VALUE parse_alias_member(parserstate *state, bool instance_only, position comment_pos, VALUE annotations) {
|
1865
1856
|
range member_range;
|
1866
|
-
range keyword_range, new_name_range, old_name_range;
|
1867
|
-
range new_kind_range, old_kind_range;
|
1868
|
-
|
1869
1857
|
member_range.start = state->current_token.range.start;
|
1870
|
-
keyword_range = state->current_token.range;
|
1858
|
+
range keyword_range = state->current_token.range;
|
1871
1859
|
|
1872
1860
|
comment_pos = nonnull_pos_or(comment_pos, member_range.start);
|
1873
1861
|
VALUE comment = get_comment(state, comment_pos.line);
|
1874
1862
|
|
1875
|
-
VALUE new_name;
|
1876
|
-
|
1877
|
-
VALUE kind;
|
1878
|
-
|
1863
|
+
VALUE kind, new_name, old_name;
|
1864
|
+
range new_kind_range, old_kind_range, new_name_range, old_name_range;
|
1879
1865
|
if (!instance_only && state->next_token.type == kSELF) {
|
1880
1866
|
kind = ID2SYM(rb_intern("singleton"));
|
1881
1867
|
|
@@ -1925,11 +1911,6 @@ static VALUE parse_alias_member(parserstate *state, bool instance_only, position
|
|
1925
1911
|
| {tA2IDENT} `:` <type>
|
1926
1912
|
*/
|
1927
1913
|
static VALUE parse_variable_member(parserstate *state, position comment_pos, VALUE annotations) {
|
1928
|
-
range member_range;
|
1929
|
-
range name_range, colon_range;
|
1930
|
-
range kind_range = NULL_RANGE;
|
1931
|
-
rbs_loc *loc;
|
1932
|
-
|
1933
1914
|
if (rb_array_len(annotations) > 0) {
|
1934
1915
|
raise_syntax_error(
|
1935
1916
|
state,
|
@@ -1938,83 +1919,82 @@ static VALUE parse_variable_member(parserstate *state, position comment_pos, VAL
|
|
1938
1919
|
);
|
1939
1920
|
}
|
1940
1921
|
|
1922
|
+
range member_range;
|
1941
1923
|
member_range.start = state->current_token.range.start;
|
1942
1924
|
comment_pos = nonnull_pos_or(comment_pos, member_range.start);
|
1943
1925
|
VALUE comment = get_comment(state, comment_pos.line);
|
1944
1926
|
|
1945
|
-
VALUE location;
|
1946
|
-
VALUE name;
|
1947
|
-
VALUE type;
|
1948
|
-
|
1949
1927
|
switch (state->current_token.type)
|
1950
1928
|
{
|
1951
|
-
case tAIDENT:
|
1952
|
-
name_range = state->current_token.range;
|
1953
|
-
name = ID2SYM(INTERN_TOKEN(state, state->current_token));
|
1929
|
+
case tAIDENT: {
|
1930
|
+
range name_range = state->current_token.range;
|
1931
|
+
VALUE name = ID2SYM(INTERN_TOKEN(state, state->current_token));
|
1954
1932
|
|
1955
1933
|
parser_advance_assert(state, pCOLON);
|
1956
|
-
colon_range = state->current_token.range;
|
1934
|
+
range colon_range = state->current_token.range;
|
1957
1935
|
|
1958
|
-
type = parse_type(state);
|
1936
|
+
VALUE type = parse_type(state);
|
1959
1937
|
member_range.end = state->current_token.range.end;
|
1960
1938
|
|
1961
|
-
location = rbs_new_location(state->buffer, member_range);
|
1962
|
-
loc = rbs_check_location(location);
|
1939
|
+
VALUE location = rbs_new_location(state->buffer, member_range);
|
1940
|
+
rbs_loc *loc = rbs_check_location(location);
|
1963
1941
|
rbs_loc_alloc_children(loc, 3);
|
1964
1942
|
rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
|
1965
1943
|
rbs_loc_add_required_child(loc, rb_intern("colon"), colon_range);
|
1966
|
-
rbs_loc_add_optional_child(loc, rb_intern("kind"),
|
1944
|
+
rbs_loc_add_optional_child(loc, rb_intern("kind"), NULL_RANGE);
|
1967
1945
|
|
1968
1946
|
return rbs_ast_members_instance_variable(name, type, location, comment);
|
1969
|
-
|
1970
|
-
case tA2IDENT:
|
1971
|
-
name_range = state->current_token.range;
|
1972
|
-
name = ID2SYM(INTERN_TOKEN(state, state->current_token));
|
1947
|
+
}
|
1948
|
+
case tA2IDENT: {
|
1949
|
+
range name_range = state->current_token.range;
|
1950
|
+
VALUE name = ID2SYM(INTERN_TOKEN(state, state->current_token));
|
1973
1951
|
|
1974
1952
|
parser_advance_assert(state, pCOLON);
|
1975
|
-
colon_range = state->current_token.range;
|
1953
|
+
range colon_range = state->current_token.range;
|
1976
1954
|
|
1977
1955
|
parser_push_typevar_table(state, true);
|
1978
|
-
type = parse_type(state);
|
1956
|
+
VALUE type = parse_type(state);
|
1979
1957
|
parser_pop_typevar_table(state);
|
1980
1958
|
member_range.end = state->current_token.range.end;
|
1981
1959
|
|
1982
|
-
location = rbs_new_location(state->buffer, member_range);
|
1983
|
-
loc = rbs_check_location(location);
|
1960
|
+
VALUE location = rbs_new_location(state->buffer, member_range);
|
1961
|
+
rbs_loc *loc = rbs_check_location(location);
|
1984
1962
|
rbs_loc_alloc_children(loc, 3);
|
1985
1963
|
rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
|
1986
1964
|
rbs_loc_add_required_child(loc, rb_intern("colon"), colon_range);
|
1987
|
-
rbs_loc_add_optional_child(loc, rb_intern("kind"),
|
1965
|
+
rbs_loc_add_optional_child(loc, rb_intern("kind"), NULL_RANGE);
|
1988
1966
|
|
1989
1967
|
return rbs_ast_members_class_variable(name, type, location, comment);
|
1990
|
-
|
1991
|
-
case kSELF:
|
1992
|
-
kind_range
|
1993
|
-
|
1968
|
+
}
|
1969
|
+
case kSELF: {
|
1970
|
+
range kind_range = {
|
1971
|
+
.start = state->current_token.range.start,
|
1972
|
+
.end = state->next_token.range.end
|
1973
|
+
};
|
1994
1974
|
|
1995
1975
|
parser_advance_assert(state, pDOT);
|
1996
1976
|
parser_advance_assert(state, tAIDENT);
|
1997
1977
|
|
1998
|
-
name_range = state->current_token.range;
|
1999
|
-
name = ID2SYM(INTERN_TOKEN(state, state->current_token));
|
1978
|
+
range name_range = state->current_token.range;
|
1979
|
+
VALUE name = ID2SYM(INTERN_TOKEN(state, state->current_token));
|
2000
1980
|
|
2001
1981
|
parser_advance_assert(state, pCOLON);
|
2002
|
-
colon_range = state->current_token.range;
|
1982
|
+
range colon_range = state->current_token.range;
|
2003
1983
|
|
2004
1984
|
parser_push_typevar_table(state, true);
|
2005
|
-
type = parse_type(state);
|
1985
|
+
VALUE type = parse_type(state);
|
2006
1986
|
parser_pop_typevar_table(state);
|
2007
1987
|
member_range.end = state->current_token.range.end;
|
2008
1988
|
|
2009
|
-
location = rbs_new_location(state->buffer, member_range);
|
2010
|
-
loc = rbs_check_location(location);
|
1989
|
+
VALUE location = rbs_new_location(state->buffer, member_range);
|
1990
|
+
rbs_loc *loc = rbs_check_location(location);
|
2011
1991
|
rbs_loc_alloc_children(loc, 3);
|
2012
1992
|
rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
|
2013
1993
|
rbs_loc_add_required_child(loc, rb_intern("colon"), colon_range);
|
2014
1994
|
rbs_loc_add_optional_child(loc, rb_intern("kind"), kind_range);
|
2015
1995
|
|
2016
1996
|
return rbs_ast_members_class_instance_variable(name, type, location, comment);
|
2017
|
-
|
1997
|
+
}
|
2018
1998
|
default:
|
2019
1999
|
rbs_abort();
|
2020
2000
|
}
|
@@ -2062,24 +2042,12 @@ static VALUE parse_visibility_member(parserstate *state, VALUE annotations) {
|
|
2062
2042
|
*/
|
2063
2043
|
static VALUE parse_attribute_member(parserstate *state, position comment_pos, VALUE annotations) {
|
2064
2044
|
range member_range;
|
2065
|
-
range keyword_range, name_range, colon_range;
|
2066
|
-
range kind_range = NULL_RANGE, ivar_range = NULL_RANGE, ivar_name_range = NULL_RANGE, visibility_range = NULL_RANGE;
|
2067
|
-
|
2068
|
-
InstanceSingletonKind is_kind;
|
2069
|
-
VALUE kind;
|
2070
|
-
VALUE attr_name;
|
2071
|
-
VALUE ivar_name;
|
2072
|
-
VALUE type;
|
2073
|
-
VALUE comment;
|
2074
|
-
VALUE location;
|
2075
|
-
VALUE visibility;
|
2076
|
-
rbs_loc *loc;
|
2077
|
-
enum TokenType attr_type;
|
2078
|
-
|
2079
2045
|
member_range.start = state->current_token.range.start;
|
2080
2046
|
comment_pos = nonnull_pos_or(comment_pos, member_range.start);
|
2081
|
-
comment = get_comment(state, comment_pos.line);
|
2047
|
+
VALUE comment = get_comment(state, comment_pos.line);
|
2082
2048
|
|
2049
|
+
VALUE visibility;
|
2050
|
+
range visibility_range;
|
2083
2051
|
switch (state->current_token.type)
|
2084
2052
|
{
|
2085
2053
|
case kPRIVATE:
|
@@ -2098,18 +2066,18 @@ static VALUE parse_attribute_member(parserstate *state, position comment_pos, VA
|
|
2098
2066
|
break;
|
2099
2067
|
}
|
2100
2068
|
|
2101
|
-
attr_type = state->current_token.type;
|
2102
|
-
keyword_range = state->current_token.range;
|
2069
|
+
enum TokenType attr_type = state->current_token.type;
|
2070
|
+
range keyword_range = state->current_token.range;
|
2103
2071
|
|
2104
|
-
|
2105
|
-
|
2106
|
-
|
2107
|
-
} else {
|
2108
|
-
kind = ID2SYM(rb_intern("singleton"));
|
2109
|
-
}
|
2072
|
+
range kind_range;
|
2073
|
+
InstanceSingletonKind is_kind = parse_instance_singleton_kind(state, false, &kind_range);
|
2074
|
+
VALUE kind = ID2SYM(rb_intern((is_kind == INSTANCE_KIND) ? "instance" : "singleton"));
|
2110
2075
|
|
2111
|
-
|
2076
|
+
range name_range;
|
2077
|
+
VALUE attr_name = parse_method_name(state, &name_range);
|
2112
2078
|
|
2079
|
+
VALUE ivar_name;
|
2080
|
+
range ivar_range, ivar_name_range;
|
2113
2081
|
if (state->next_token.type == pLPAREN) {
|
2114
2082
|
parser_advance_assert(state, pLPAREN);
|
2115
2083
|
ivar_range.start = state->current_token.range.start;
|
@@ -2119,24 +2087,27 @@ static VALUE parse_attribute_member(parserstate *state, position comment_pos, VA
|
|
2119
2087
|
ivar_name_range = state->current_token.range;
|
2120
2088
|
} else {
|
2121
2089
|
ivar_name = Qfalse;
|
2090
|
+
ivar_name_range = NULL_RANGE;
|
2122
2091
|
}
|
2123
2092
|
|
2124
2093
|
parser_advance_assert(state, pRPAREN);
|
2125
2094
|
ivar_range.end = state->current_token.range.end;
|
2126
2095
|
} else {
|
2096
|
+
ivar_range = NULL_RANGE;
|
2127
2097
|
ivar_name = Qnil;
|
2098
|
+
ivar_name_range = NULL_RANGE;
|
2128
2099
|
}
|
2129
2100
|
|
2130
2101
|
parser_advance_assert(state, pCOLON);
|
2131
|
-
colon_range = state->current_token.range;
|
2102
|
+
range colon_range = state->current_token.range;
|
2132
2103
|
|
2133
2104
|
parser_push_typevar_table(state, is_kind == SINGLETON_KIND);
|
2134
|
-
type = parse_type(state);
|
2105
|
+
VALUE type = parse_type(state);
|
2135
2106
|
parser_pop_typevar_table(state);
|
2136
2107
|
member_range.end = state->current_token.range.end;
|
2137
2108
|
|
2138
|
-
location = rbs_new_location(state->buffer, member_range);
|
2139
|
-
loc = rbs_check_location(location);
|
2109
|
+
VALUE location = rbs_new_location(state->buffer, member_range);
|
2110
|
+
rbs_loc *loc = rbs_check_location(location);
|
2140
2111
|
rbs_loc_alloc_children(loc, 7);
|
2141
2112
|
rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
|
2142
2113
|
rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
|
@@ -2179,19 +2150,22 @@ static VALUE parse_interface_members(parserstate *state) {
|
|
2179
2150
|
|
2180
2151
|
VALUE member;
|
2181
2152
|
switch (state->current_token.type) {
|
2182
|
-
case kDEF:
|
2153
|
+
case kDEF: {
|
2183
2154
|
member = parse_member_def(state, true, true, annot_pos, annotations);
|
2184
2155
|
break;
|
2156
|
+
}
|
2185
2157
|
|
2186
2158
|
case kINCLUDE:
|
2187
2159
|
case kEXTEND:
|
2188
|
-
case kPREPEND:
|
2160
|
+
case kPREPEND: {
|
2189
2161
|
member = parse_mixin_member(state, true, annot_pos, annotations);
|
2190
2162
|
break;
|
2163
|
+
}
|
2191
2164
|
|
2192
|
-
case kALIAS:
|
2165
|
+
case kALIAS: {
|
2193
2166
|
member = parse_alias_member(state, true, annot_pos, annotations);
|
2194
2167
|
break;
|
2168
|
+
}
|
2195
2169
|
|
2196
2170
|
default:
|
2197
2171
|
raise_syntax_error(
|
@@ -2212,24 +2186,24 @@ static VALUE parse_interface_members(parserstate *state) {
|
|
2212
2186
|
interface_decl ::= {`interface`} interface_name module_type_params interface_members <kEND>
|
2213
2187
|
*/
|
2214
2188
|
static VALUE parse_interface_decl(parserstate *state, position comment_pos, VALUE annotations) {
|
2215
|
-
|
2216
|
-
range name_range, keyword_range, end_range;
|
2217
|
-
range type_params_range = NULL_RANGE;
|
2189
|
+
parser_push_typevar_table(state, true);
|
2218
2190
|
|
2191
|
+
range member_range;
|
2219
2192
|
member_range.start = state->current_token.range.start;
|
2220
2193
|
comment_pos = nonnull_pos_or(comment_pos, member_range.start);
|
2221
2194
|
|
2222
|
-
|
2223
|
-
keyword_range = state->current_token.range;
|
2195
|
+
range keyword_range = state->current_token.range;
|
2224
2196
|
|
2225
2197
|
parser_advance(state);
|
2226
2198
|
|
2199
|
+
range name_range;
|
2227
2200
|
VALUE name = parse_type_name(state, INTERFACE_NAME, &name_range);
|
2201
|
+
range type_params_range;
|
2228
2202
|
VALUE params = parse_type_params(state, &type_params_range, true);
|
2229
2203
|
VALUE members = parse_interface_members(state);
|
2230
2204
|
|
2231
2205
|
parser_advance_assert(state, kEND);
|
2232
|
-
end_range = state->current_token.range;
|
2206
|
+
range end_range = state->current_token.range;
|
2233
2207
|
member_range.end = end_range.end;
|
2234
2208
|
|
2235
2209
|
parser_pop_typevar_table(state);
|
@@ -2260,18 +2234,16 @@ static VALUE parse_interface_decl(parserstate *state, position comment_pos, VALU
|
|
2260
2234
|
*/
|
2261
2235
|
static void parse_module_self_types(parserstate *state, VALUE *array) {
|
2262
2236
|
while (true) {
|
2263
|
-
range self_range;
|
2264
|
-
range name_range;
|
2265
|
-
range args_range = NULL_RANGE;
|
2266
|
-
|
2267
2237
|
parser_advance(state);
|
2268
2238
|
|
2239
|
+
range self_range;
|
2269
2240
|
self_range.start = state->current_token.range.start;
|
2270
|
-
|
2241
|
+
range name_range;
|
2271
2242
|
VALUE module_name = parse_type_name(state, CLASS_NAME | INTERFACE_NAME, &name_range);
|
2272
2243
|
self_range.end = name_range.end;
|
2273
2244
|
|
2274
2245
|
VALUE args = EMPTY_ARRAY;
|
2246
|
+
range args_range = NULL_RANGE;
|
2275
2247
|
if (state->next_token.type == pLBRACKET) {
|
2276
2248
|
parser_advance(state);
|
2277
2249
|
args_range.start = state->current_token.range.start;
|
@@ -2315,55 +2287,61 @@ static VALUE parse_module_members(parserstate *state) {
|
|
2315
2287
|
VALUE members = EMPTY_ARRAY;
|
2316
2288
|
|
2317
2289
|
while (state->next_token.type != kEND) {
|
2318
|
-
VALUE member;
|
2319
2290
|
VALUE annotations = EMPTY_ARRAY;
|
2320
2291
|
position annot_pos = NullPosition;
|
2321
|
-
|
2322
2292
|
parse_annotations(state, &annotations, &annot_pos);
|
2323
2293
|
|
2324
2294
|
parser_advance(state);
|
2325
2295
|
|
2296
|
+
VALUE member;
|
2326
2297
|
switch (state->current_token.type)
|
2327
2298
|
{
|
2328
|
-
case kDEF:
|
2299
|
+
case kDEF: {
|
2329
2300
|
member = parse_member_def(state, false, true, annot_pos, annotations);
|
2330
2301
|
break;
|
2302
|
+
}
|
2331
2303
|
|
2332
2304
|
case kINCLUDE:
|
2333
2305
|
case kEXTEND:
|
2334
|
-
case kPREPEND:
|
2306
|
+
case kPREPEND: {
|
2335
2307
|
member = parse_mixin_member(state, false, annot_pos, annotations);
|
2336
2308
|
break;
|
2309
|
+
}
|
2337
2310
|
|
2338
|
-
case kALIAS:
|
2311
|
+
case kALIAS: {
|
2339
2312
|
member = parse_alias_member(state, false, annot_pos, annotations);
|
2340
2313
|
break;
|
2314
|
+
}
|
2341
2315
|
|
2342
2316
|
case tAIDENT:
|
2343
2317
|
case tA2IDENT:
|
2344
|
-
case kSELF:
|
2318
|
+
case kSELF: {
|
2345
2319
|
member = parse_variable_member(state, annot_pos, annotations);
|
2346
2320
|
break;
|
2321
|
+
}
|
2347
2322
|
|
2348
2323
|
case kATTRREADER:
|
2349
2324
|
case kATTRWRITER:
|
2350
|
-
case kATTRACCESSOR:
|
2325
|
+
case kATTRACCESSOR: {
|
2351
2326
|
member = parse_attribute_member(state, annot_pos, annotations);
|
2352
2327
|
break;
|
2328
|
+
}
|
2353
2329
|
|
2354
2330
|
case kPUBLIC:
|
2355
2331
|
case kPRIVATE:
|
2356
2332
|
if (state->next_token.range.start.line == state->current_token.range.start.line) {
|
2357
2333
|
switch (state->next_token.type)
|
2358
2334
|
{
|
2359
|
-
case kDEF:
|
2335
|
+
case kDEF: {
|
2360
2336
|
member = parse_member_def(state, false, true, annot_pos, annotations);
|
2361
2337
|
break;
|
2338
|
+
}
|
2362
2339
|
case kATTRREADER:
|
2363
2340
|
case kATTRWRITER:
|
2364
|
-
case kATTRACCESSOR:
|
2341
|
+
case kATTRACCESSOR: {
|
2365
2342
|
member = parse_attribute_member(state, annot_pos, annotations);
|
2366
2343
|
break;
|
2344
|
+
}
|
2367
2345
|
default:
|
2368
2346
|
raise_syntax_error(state, state->next_token, "method or attribute definition is expected after visibility modifier");
|
2369
2347
|
}
|
@@ -2389,19 +2367,16 @@ static VALUE parse_module_members(parserstate *state) {
|
|
2389
2367
|
| {module_name} module_name module_type_params `:` module_self_types module_members <kEND>
|
2390
2368
|
*/
|
2391
2369
|
static VALUE parse_module_decl0(parserstate *state, range keyword_range, VALUE module_name, range name_range, VALUE comment, VALUE annotations) {
|
2392
|
-
range decl_range;
|
2393
|
-
range end_range;
|
2394
|
-
range type_params_range;
|
2395
|
-
range colon_range;
|
2396
|
-
range self_types_range;
|
2397
|
-
|
2398
2370
|
parser_push_typevar_table(state, true);
|
2399
2371
|
|
2372
|
+
range decl_range;
|
2400
2373
|
decl_range.start = keyword_range.start;
|
2401
|
-
|
2374
|
+
range type_params_range;
|
2402
2375
|
VALUE type_params = parse_type_params(state, &type_params_range, true);
|
2403
|
-
VALUE self_types = EMPTY_ARRAY;
|
2404
2376
|
|
2377
|
+
VALUE self_types = EMPTY_ARRAY;
|
2378
|
+
range colon_range;
|
2379
|
+
range self_types_range;
|
2405
2380
|
if (state->next_token.type == pCOLON) {
|
2406
2381
|
parser_advance(state);
|
2407
2382
|
colon_range = state->current_token.range;
|
@@ -2416,7 +2391,7 @@ static VALUE parse_module_decl0(parserstate *state, range keyword_range, VALUE m
|
|
2416
2391
|
VALUE members = parse_module_members(state);
|
2417
2392
|
|
2418
2393
|
parser_advance_assert(state, kEND);
|
2419
|
-
end_range = state->current_token.range;
|
2394
|
+
range end_range = state->current_token.range;
|
2420
2395
|
decl_range.end = state->current_token.range.end;
|
2421
2396
|
|
2422
2397
|
VALUE location = rbs_new_location(state->buffer, decl_range);
|
@@ -2449,12 +2424,12 @@ static VALUE parse_module_decl0(parserstate *state, range keyword_range, VALUE m
|
|
2449
2424
|
*/
|
2450
2425
|
static VALUE parse_module_decl(parserstate *state, position comment_pos, VALUE annotations) {
|
2451
2426
|
range keyword_range = state->current_token.range;
|
2452
|
-
range module_name_range;
|
2453
2427
|
|
2454
2428
|
comment_pos = nonnull_pos_or(comment_pos, state->current_token.range.start);
|
2455
2429
|
VALUE comment = get_comment(state, comment_pos.line);
|
2456
2430
|
|
2457
2431
|
parser_advance(state);
|
2432
|
+
range module_name_range;
|
2458
2433
|
VALUE module_name = parse_type_name(state, CLASS_NAME, &module_name_range);
|
2459
2434
|
|
2460
2435
|
if (state->next_token.type == pEQ) {
|
@@ -2465,9 +2440,10 @@ static VALUE parse_module_decl(parserstate *state, position comment_pos, VALUE a
|
|
2465
2440
|
range old_name_range;
|
2466
2441
|
VALUE old_name = parse_type_name(state, CLASS_NAME, &old_name_range);
|
2467
2442
|
|
2468
|
-
range decl_range
|
2469
|
-
|
2470
|
-
|
2443
|
+
range decl_range = {
|
2444
|
+
.start = keyword_range.start,
|
2445
|
+
.end = old_name_range.end
|
2446
|
+
};
|
2471
2447
|
|
2472
2448
|
VALUE location = rbs_new_location(state->buffer, decl_range);
|
2473
2449
|
rbs_loc *loc = rbs_check_location(location);
|
@@ -2489,25 +2465,20 @@ static VALUE parse_module_decl(parserstate *state, position comment_pos, VALUE a
|
|
2489
2465
|
*/
|
2490
2466
|
static VALUE parse_class_decl_super(parserstate *state, range *lt_range) {
|
2491
2467
|
if (parser_advance_if(state, pLT)) {
|
2492
|
-
range super_range;
|
2493
|
-
range name_range;
|
2494
|
-
range args_range = NULL_RANGE;
|
2495
|
-
|
2496
|
-
VALUE name;
|
2497
|
-
VALUE args;
|
2498
|
-
VALUE location;
|
2499
|
-
rbs_loc *loc;
|
2500
|
-
|
2501
2468
|
*lt_range = state->current_token.range;
|
2469
|
+
|
2470
|
+
range super_range;
|
2502
2471
|
super_range.start = state->next_token.range.start;
|
2503
2472
|
|
2504
|
-
|
2473
|
+
VALUE name;
|
2474
|
+
VALUE args = EMPTY_ARRAY;
|
2475
|
+
range name_range, args_range;
|
2505
2476
|
class_instance_name(state, CLASS_NAME, &name, &args, &name_range, &args_range);
|
2506
2477
|
|
2507
2478
|
super_range.end = state->current_token.range.end;
|
2508
2479
|
|
2509
|
-
location = rbs_new_location(state->buffer, super_range);
|
2510
|
-
loc = rbs_check_location(location);
|
2480
|
+
VALUE location = rbs_new_location(state->buffer, super_range);
|
2481
|
+
rbs_loc *loc = rbs_check_location(location);
|
2511
2482
|
rbs_loc_alloc_children(loc, 2);
|
2512
2483
|
rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
|
2513
2484
|
rbs_loc_add_optional_child(loc, rb_intern("args"), args_range);
|
@@ -2523,34 +2494,29 @@ static VALUE parse_class_decl_super(parserstate *state, range *lt_range) {
|
|
2523
2494
|
class_decl ::= {class_name} type_params class_decl_super class_members <`end`>
|
2524
2495
|
*/
|
2525
2496
|
static VALUE parse_class_decl0(parserstate *state, range keyword_range, VALUE name, range name_range, VALUE comment, VALUE annotations) {
|
2526
|
-
|
2527
|
-
range end_range;
|
2528
|
-
range type_params_range;
|
2529
|
-
range lt_range;
|
2497
|
+
parser_push_typevar_table(state, true);
|
2530
2498
|
|
2531
|
-
|
2532
|
-
|
2533
|
-
VALUE members;
|
2534
|
-
VALUE location;
|
2499
|
+
range decl_range;
|
2500
|
+
decl_range.start = keyword_range.start;
|
2535
2501
|
|
2536
|
-
|
2502
|
+
range type_params_range;
|
2503
|
+
VALUE type_params = parse_type_params(state, &type_params_range, true);
|
2537
2504
|
|
2538
|
-
|
2505
|
+
range lt_range;
|
2506
|
+
VALUE super = parse_class_decl_super(state, <_range);
|
2539
2507
|
|
2540
|
-
|
2508
|
+
VALUE members = parse_module_members(state);
|
2541
2509
|
|
2542
|
-
type_params = parse_type_params(state, &type_params_range, true);
|
2543
|
-
super = parse_class_decl_super(state, <_range);
|
2544
|
-
members = parse_module_members(state);
|
2545
2510
|
parser_advance_assert(state, kEND);
|
2546
|
-
|
2511
|
+
|
2512
|
+
range end_range = state->current_token.range;
|
2547
2513
|
|
2548
2514
|
decl_range.end = end_range.end;
|
2549
2515
|
|
2550
2516
|
parser_pop_typevar_table(state);
|
2551
2517
|
|
2552
|
-
location = rbs_new_location(state->buffer, decl_range);
|
2553
|
-
loc = rbs_check_location(location);
|
2518
|
+
VALUE location = rbs_new_location(state->buffer, decl_range);
|
2519
|
+
rbs_loc *loc = rbs_check_location(location);
|
2554
2520
|
rbs_loc_alloc_children(loc, 5);
|
2555
2521
|
rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
|
2556
2522
|
rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
|
@@ -2575,12 +2541,12 @@ static VALUE parse_class_decl0(parserstate *state, range keyword_range, VALUE na
|
|
2575
2541
|
*/
|
2576
2542
|
static VALUE parse_class_decl(parserstate *state, position comment_pos, VALUE annotations) {
|
2577
2543
|
range keyword_range = state->current_token.range;
|
2578
|
-
range class_name_range;
|
2579
2544
|
|
2580
2545
|
comment_pos = nonnull_pos_or(comment_pos, state->current_token.range.start);
|
2581
2546
|
VALUE comment = get_comment(state, comment_pos.line);
|
2582
2547
|
|
2583
2548
|
parser_advance(state);
|
2549
|
+
range class_name_range;
|
2584
2550
|
VALUE class_name = parse_type_name(state, CLASS_NAME, &class_name_range);
|
2585
2551
|
|
2586
2552
|
if (state->next_token.type == pEQ) {
|
@@ -2591,9 +2557,10 @@ static VALUE parse_class_decl(parserstate *state, position comment_pos, VALUE an
|
|
2591
2557
|
range old_name_range;
|
2592
2558
|
VALUE old_name = parse_type_name(state, CLASS_NAME, &old_name_range);
|
2593
2559
|
|
2594
|
-
range decl_range
|
2595
|
-
|
2596
|
-
|
2560
|
+
range decl_range = {
|
2561
|
+
.start = keyword_range.start,
|
2562
|
+
.end = old_name_range.end,
|
2563
|
+
};
|
2597
2564
|
|
2598
2565
|
VALUE location = rbs_new_location(state->buffer, decl_range);
|
2599
2566
|
rbs_loc *loc = rbs_check_location(location);
|
@@ -2617,30 +2584,35 @@ static VALUE parse_class_decl(parserstate *state, position comment_pos, VALUE an
|
|
2617
2584
|
| {<class_decl>}
|
2618
2585
|
*/
|
2619
2586
|
static VALUE parse_nested_decl(parserstate *state, const char *nested_in, position annot_pos, VALUE annotations) {
|
2620
|
-
VALUE decl;
|
2621
|
-
|
2622
2587
|
parser_push_typevar_table(state, true);
|
2623
2588
|
|
2589
|
+
VALUE decl;
|
2624
2590
|
switch (state->current_token.type) {
|
2625
2591
|
case tUIDENT:
|
2626
|
-
case pCOLON2:
|
2592
|
+
case pCOLON2: {
|
2627
2593
|
decl = parse_const_decl(state);
|
2628
2594
|
break;
|
2629
|
-
|
2595
|
+
}
|
2596
|
+
case tGIDENT: {
|
2630
2597
|
decl = parse_global_decl(state);
|
2631
2598
|
break;
|
2632
|
-
|
2599
|
+
}
|
2600
|
+
case kTYPE: {
|
2633
2601
|
decl = parse_type_decl(state, annot_pos, annotations);
|
2634
2602
|
break;
|
2635
|
-
|
2603
|
+
}
|
2604
|
+
case kINTERFACE: {
|
2636
2605
|
decl = parse_interface_decl(state, annot_pos, annotations);
|
2637
2606
|
break;
|
2638
|
-
|
2607
|
+
}
|
2608
|
+
case kMODULE: {
|
2639
2609
|
decl = parse_module_decl(state, annot_pos, annotations);
|
2640
2610
|
break;
|
2641
|
-
|
2611
|
+
}
|
2612
|
+
case kCLASS: {
|
2642
2613
|
decl = parse_class_decl(state, annot_pos, annotations);
|
2643
2614
|
break;
|
2615
|
+
}
|
2644
2616
|
default:
|
2645
2617
|
raise_syntax_error(
|
2646
2618
|
state,
|
@@ -2663,18 +2635,24 @@ static VALUE parse_decl(parserstate *state) {
|
|
2663
2635
|
parser_advance(state);
|
2664
2636
|
switch (state->current_token.type) {
|
2665
2637
|
case tUIDENT:
|
2666
|
-
case pCOLON2:
|
2638
|
+
case pCOLON2: {
|
2667
2639
|
return parse_const_decl(state);
|
2668
|
-
|
2640
|
+
}
|
2641
|
+
case tGIDENT: {
|
2669
2642
|
return parse_global_decl(state);
|
2670
|
-
|
2643
|
+
}
|
2644
|
+
case kTYPE: {
|
2671
2645
|
return parse_type_decl(state, annot_pos, annotations);
|
2672
|
-
|
2646
|
+
}
|
2647
|
+
case kINTERFACE: {
|
2673
2648
|
return parse_interface_decl(state, annot_pos, annotations);
|
2674
|
-
|
2649
|
+
}
|
2650
|
+
case kMODULE: {
|
2675
2651
|
return parse_module_decl(state, annot_pos, annotations);
|
2676
|
-
|
2652
|
+
}
|
2653
|
+
case kCLASS: {
|
2677
2654
|
return parse_class_decl(state, annot_pos, annotations);
|
2655
|
+
}
|
2678
2656
|
default:
|
2679
2657
|
raise_syntax_error(
|
2680
2658
|
state,
|
@@ -2692,8 +2670,10 @@ static VALUE parse_namespace(parserstate *state, range *rg) {
|
|
2692
2670
|
bool is_absolute = false;
|
2693
2671
|
|
2694
2672
|
if (state->next_token.type == pCOLON2) {
|
2695
|
-
rg
|
2696
|
-
|
2673
|
+
*rg = (range) {
|
2674
|
+
.start = state->next_token.range.start,
|
2675
|
+
.end = state->next_token.range.end,
|
2676
|
+
};
|
2697
2677
|
is_absolute = true;
|
2698
2678
|
|
2699
2679
|
parser_advance(state);
|
@@ -2731,8 +2711,6 @@ static void parse_use_clauses(parserstate *state, VALUE clauses) {
|
|
2731
2711
|
range namespace_range = NULL_RANGE;
|
2732
2712
|
VALUE namespace = parse_namespace(state, &namespace_range);
|
2733
2713
|
|
2734
|
-
range clause_range = namespace_range;
|
2735
|
-
|
2736
2714
|
switch (state->next_token.type)
|
2737
2715
|
{
|
2738
2716
|
case tLIDENT:
|
@@ -2742,14 +2720,9 @@ static void parse_use_clauses(parserstate *state, VALUE clauses) {
|
|
2742
2720
|
|
2743
2721
|
enum TokenType ident_type = state->current_token.type;
|
2744
2722
|
|
2745
|
-
range type_name_range
|
2746
|
-
|
2747
|
-
|
2748
|
-
} else {
|
2749
|
-
type_name_range.start = namespace_range.start;
|
2750
|
-
type_name_range.end = state->current_token.range.end;
|
2751
|
-
}
|
2752
|
-
clause_range = type_name_range;
|
2723
|
+
range type_name_range = null_range_p(namespace_range)
|
2724
|
+
? state->current_token.range
|
2725
|
+
: (range) { .start = namespace_range.start, .end = state->current_token.range.end };
|
2753
2726
|
|
2754
2727
|
VALUE type_name = rbs_type_name(namespace, ID2SYM(INTERN_TOKEN(state, state->current_token)));
|
2755
2728
|
|
@@ -2757,6 +2730,7 @@ static void parse_use_clauses(parserstate *state, VALUE clauses) {
|
|
2757
2730
|
range new_name_range = NULL_RANGE;
|
2758
2731
|
|
2759
2732
|
VALUE new_name = Qnil;
|
2733
|
+
range clause_range = type_name_range;
|
2760
2734
|
if (state->next_token.type == kAS) {
|
2761
2735
|
parser_advance(state);
|
2762
2736
|
keyword_range = state->current_token.range;
|
@@ -2783,6 +2757,7 @@ static void parse_use_clauses(parserstate *state, VALUE clauses) {
|
|
2783
2757
|
}
|
2784
2758
|
case pSTAR:
|
2785
2759
|
{
|
2760
|
+
range clause_range = namespace_range;
|
2786
2761
|
parser_advance(state);
|
2787
2762
|
|
2788
2763
|
range star_range = state->current_token.range;
|