internal: cleanup adt parsing

This commit is contained in:
Aleksey Kladov 2021-09-18 00:50:27 +03:00
parent d890c767c4
commit 2195ecd7e7
5 changed files with 69 additions and 159 deletions

View File

@ -22,9 +22,7 @@ fn struct_or_union(p: &mut Parser, m: Marker, is_struct: bool) {
T![where] => { T![where] => {
type_params::opt_where_clause(p); type_params::opt_where_clause(p);
match p.current() { match p.current() {
T![;] => { T![;] => p.bump(T![;]),
p.bump(T![;]);
}
T!['{'] => record_field_list(p), T!['{'] => record_field_list(p),
_ => { _ => {
//FIXME: special case `(` error message //FIXME: special case `(` error message
@ -53,7 +51,6 @@ fn struct_or_union(p: &mut Parser, m: Marker, is_struct: bool) {
} }
pub(super) fn enum_(p: &mut Parser, m: Marker) { pub(super) fn enum_(p: &mut Parser, m: Marker) {
assert!(p.at(T![enum]));
p.bump(T![enum]); p.bump(T![enum]);
name_r(p, ITEM_RECOVERY_SET); name_r(p, ITEM_RECOVERY_SET);
type_params::opt_generic_param_list(p); type_params::opt_generic_param_list(p);
@ -75,7 +72,16 @@ pub(crate) fn variant_list(p: &mut Parser) {
error_block(p, "expected enum variant"); error_block(p, "expected enum variant");
continue; continue;
} }
let var = p.start(); variant(p);
if !p.at(T!['}']) {
p.expect(T![,]);
}
}
p.expect(T!['}']);
m.complete(p, VARIANT_LIST);
fn variant(p: &mut Parser) {
let m = p.start();
attributes::outer_attrs(p); attributes::outer_attrs(p);
if p.at(IDENT) { if p.at(IDENT) {
name(p); name(p);
@ -90,17 +96,12 @@ pub(crate) fn variant_list(p: &mut Parser) {
if p.eat(T![=]) { if p.eat(T![=]) {
expressions::expr(p); expressions::expr(p);
} }
var.complete(p, VARIANT); m.complete(p, VARIANT);
} else { } else {
var.abandon(p); m.abandon(p);
p.err_and_bump("expected enum variant"); p.err_and_bump("expected enum variant");
} }
if !p.at(T!['}']) {
p.expect(T![,]);
}
} }
p.expect(T!['}']);
m.complete(p, VARIANT_LIST);
} }
// test record_field_list // test record_field_list
@ -114,7 +115,7 @@ pub(crate) fn record_field_list(p: &mut Parser) {
error_block(p, "expected field"); error_block(p, "expected field");
continue; continue;
} }
record_field_def(p); record_field(p);
if !p.at(T!['}']) { if !p.at(T!['}']) {
p.expect(T![,]); p.expect(T![,]);
} }
@ -122,13 +123,10 @@ pub(crate) fn record_field_list(p: &mut Parser) {
p.expect(T!['}']); p.expect(T!['}']);
m.complete(p, RECORD_FIELD_LIST); m.complete(p, RECORD_FIELD_LIST);
fn record_field_def(p: &mut Parser) { fn record_field(p: &mut Parser) {
let m = p.start(); let m = p.start();
// test record_field_attrs // test record_field_attrs
// struct S { // struct S { #[attr] f: f32 }
// #[serde(with = "url_serde")]
// pub uri: Uri,
// }
attributes::outer_attrs(p); attributes::outer_attrs(p);
opt_visibility(p); opt_visibility(p);
if p.at(IDENT) { if p.at(IDENT) {
@ -146,20 +144,11 @@ pub(crate) fn record_field_list(p: &mut Parser) {
fn tuple_field_list(p: &mut Parser) { fn tuple_field_list(p: &mut Parser) {
assert!(p.at(T!['('])); assert!(p.at(T!['(']));
let m = p.start(); let m = p.start();
if !p.expect(T!['(']) { p.bump(T!['(']);
return;
}
while !p.at(T![')']) && !p.at(EOF) { while !p.at(T![')']) && !p.at(EOF) {
let m = p.start(); let m = p.start();
// test tuple_field_attrs // test tuple_field_attrs
// struct S ( // struct S (#[attr] f32);
// #[serde(with = "url_serde")]
// pub Uri,
// );
//
// enum S {
// Uri(#[serde(with = "url_serde")] Uri),
// }
attributes::outer_attrs(p); attributes::outer_attrs(p);
opt_visibility(p); opt_visibility(p);
if !p.at_ts(types::TYPE_FIRST) { if !p.at_ts(types::TYPE_FIRST) {

View File

@ -1,45 +1,33 @@
SOURCE_FILE@0..64 SOURCE_FILE@0..28
STRUCT@0..63 STRUCT@0..27
STRUCT_KW@0..6 "struct" STRUCT_KW@0..6 "struct"
WHITESPACE@6..7 " " WHITESPACE@6..7 " "
NAME@7..8 NAME@7..8
IDENT@7..8 "S" IDENT@7..8 "S"
WHITESPACE@8..9 " " WHITESPACE@8..9 " "
RECORD_FIELD_LIST@9..63 RECORD_FIELD_LIST@9..27
L_CURLY@9..10 "{" L_CURLY@9..10 "{"
WHITESPACE@10..15 "\n " WHITESPACE@10..11 " "
RECORD_FIELD@15..60 RECORD_FIELD@11..25
ATTR@15..43 ATTR@11..18
POUND@15..16 "#" POUND@11..12 "#"
L_BRACK@16..17 "[" L_BRACK@12..13 "["
META@17..42 META@13..17
PATH@17..22 PATH@13..17
PATH_SEGMENT@17..22 PATH_SEGMENT@13..17
NAME_REF@17..22 NAME_REF@13..17
IDENT@17..22 "serde" IDENT@13..17 "attr"
TOKEN_TREE@22..42 R_BRACK@17..18 "]"
L_PAREN@22..23 "(" WHITESPACE@18..19 " "
IDENT@23..27 "with" NAME@19..20
WHITESPACE@27..28 " " IDENT@19..20 "f"
EQ@28..29 "=" COLON@20..21 ":"
WHITESPACE@29..30 " " WHITESPACE@21..22 " "
STRING@30..41 "\"url_serde\"" PATH_TYPE@22..25
R_PAREN@41..42 ")" PATH@22..25
R_BRACK@42..43 "]" PATH_SEGMENT@22..25
WHITESPACE@43..48 "\n " NAME_REF@22..25
VISIBILITY@48..51 IDENT@22..25 "f32"
PUB_KW@48..51 "pub" WHITESPACE@25..26 " "
WHITESPACE@51..52 " " R_CURLY@26..27 "}"
NAME@52..55 WHITESPACE@27..28 "\n"
IDENT@52..55 "uri"
COLON@55..56 ":"
WHITESPACE@56..57 " "
PATH_TYPE@57..60
PATH@57..60
PATH_SEGMENT@57..60
NAME_REF@57..60
IDENT@57..60 "Uri"
COMMA@60..61 ","
WHITESPACE@61..62 "\n"
R_CURLY@62..63 "}"
WHITESPACE@63..64 "\n"

View File

@ -1,4 +1 @@
struct S { struct S { #[attr] f: f32 }
#[serde(with = "url_serde")]
pub uri: Uri,
}

View File

@ -1,85 +1,28 @@
SOURCE_FILE@0..115 SOURCE_FILE@0..24
STRUCT@0..59 STRUCT@0..23
STRUCT_KW@0..6 "struct" STRUCT_KW@0..6 "struct"
WHITESPACE@6..7 " " WHITESPACE@6..7 " "
NAME@7..8 NAME@7..8
IDENT@7..8 "S" IDENT@7..8 "S"
WHITESPACE@8..9 " " WHITESPACE@8..9 " "
TUPLE_FIELD_LIST@9..58 TUPLE_FIELD_LIST@9..22
L_PAREN@9..10 "(" L_PAREN@9..10 "("
WHITESPACE@10..15 "\n " TUPLE_FIELD@10..21
TUPLE_FIELD@15..55 ATTR@10..17
ATTR@15..43 POUND@10..11 "#"
POUND@15..16 "#" L_BRACK@11..12 "["
L_BRACK@16..17 "[" META@12..16
META@17..42 PATH@12..16
PATH@17..22 PATH_SEGMENT@12..16
PATH_SEGMENT@17..22 NAME_REF@12..16
NAME_REF@17..22 IDENT@12..16 "attr"
IDENT@17..22 "serde" R_BRACK@16..17 "]"
TOKEN_TREE@22..42 WHITESPACE@17..18 " "
L_PAREN@22..23 "(" PATH_TYPE@18..21
IDENT@23..27 "with" PATH@18..21
WHITESPACE@27..28 " " PATH_SEGMENT@18..21
EQ@28..29 "=" NAME_REF@18..21
WHITESPACE@29..30 " " IDENT@18..21 "f32"
STRING@30..41 "\"url_serde\"" R_PAREN@21..22 ")"
R_PAREN@41..42 ")" SEMICOLON@22..23 ";"
R_BRACK@42..43 "]" WHITESPACE@23..24 "\n"
WHITESPACE@43..48 "\n "
VISIBILITY@48..51
PUB_KW@48..51 "pub"
WHITESPACE@51..52 " "
PATH_TYPE@52..55
PATH@52..55
PATH_SEGMENT@52..55
NAME_REF@52..55
IDENT@52..55 "Uri"
COMMA@55..56 ","
WHITESPACE@56..57 "\n"
R_PAREN@57..58 ")"
SEMICOLON@58..59 ";"
WHITESPACE@59..61 "\n\n"
ENUM@61..114
ENUM_KW@61..65 "enum"
WHITESPACE@65..66 " "
NAME@66..67
IDENT@66..67 "S"
WHITESPACE@67..68 " "
VARIANT_LIST@68..114
L_CURLY@68..69 "{"
WHITESPACE@69..74 "\n "
VARIANT@74..111
NAME@74..77
IDENT@74..77 "Uri"
TUPLE_FIELD_LIST@77..111
L_PAREN@77..78 "("
TUPLE_FIELD@78..110
ATTR@78..106
POUND@78..79 "#"
L_BRACK@79..80 "["
META@80..105
PATH@80..85
PATH_SEGMENT@80..85
NAME_REF@80..85
IDENT@80..85 "serde"
TOKEN_TREE@85..105
L_PAREN@85..86 "("
IDENT@86..90 "with"
WHITESPACE@90..91 " "
EQ@91..92 "="
WHITESPACE@92..93 " "
STRING@93..104 "\"url_serde\""
R_PAREN@104..105 ")"
R_BRACK@105..106 "]"
WHITESPACE@106..107 " "
PATH_TYPE@107..110
PATH@107..110
PATH_SEGMENT@107..110
NAME_REF@107..110
IDENT@107..110 "Uri"
R_PAREN@110..111 ")"
COMMA@111..112 ","
WHITESPACE@112..113 "\n"
R_CURLY@113..114 "}"
WHITESPACE@114..115 "\n"

View File

@ -1,8 +1 @@
struct S ( struct S (#[attr] f32);
#[serde(with = "url_serde")]
pub Uri,
);
enum S {
Uri(#[serde(with = "url_serde")] Uri),
}