Simplify array parsing

This commit is contained in:
Aleksey Kladov 2020-01-16 18:35:03 +01:00
parent d3c4fbbbc4
commit ab0a11b1de
3 changed files with 45 additions and 69 deletions

View file

@ -8,28 +8,6 @@ pub(super) fn inner_attributes(p: &mut Parser) {
}
}
pub(super) fn with_outer_attributes(
p: &mut Parser,
f: impl Fn(&mut Parser) -> Option<CompletedMarker>,
) -> bool {
let am = p.start();
let has_attrs = p.at(T![#]);
attributes::outer_attributes(p);
let cm = f(p);
let success = cm.is_some();
match (has_attrs, cm) {
(true, Some(cm)) => {
let kind = cm.kind();
cm.undo_completion(p).abandon(p);
am.complete(p, kind);
}
_ => am.abandon(p),
}
success
}
pub(super) fn outer_attributes(p: &mut Parser) {
while p.at(T![#]) {
attribute(p, false)

View file

@ -181,29 +181,19 @@ fn tuple_expr(p: &mut Parser) -> CompletedMarker {
fn array_expr(p: &mut Parser) -> CompletedMarker {
assert!(p.at(T!['[']));
let m = p.start();
let mut n_exprs = 0u32;
let mut has_semi = false;
p.bump(T!['[']);
if p.eat(T![']']) {
return m.complete(p, ARRAY_EXPR);
}
// test first_array_member_attributes
// pub const A: &[i64] = &[
// #[cfg(test)]
// 1,
// 2,
// ];
attributes::with_outer_attributes(p, |p| expr(p).0);
if p.eat(T![;]) {
expr(p);
p.expect(T![']']);
return m.complete(p, ARRAY_EXPR);
}
while !p.at(EOF) && !p.at(T![']']) {
p.expect(T![,]);
if p.at(T![']']) {
break;
}
n_exprs += 1;
// test first_array_member_attributes
// pub const A: &[i64] = &[
// #[cfg(test)]
// 1,
// 2,
// ];
// test subsequent_array_member_attributes
// pub const A: &[i64] = &[
@ -211,17 +201,32 @@ fn array_expr(p: &mut Parser) -> CompletedMarker {
// #[cfg(test)]
// 2,
// ];
if !attributes::with_outer_attributes(p, |p| {
if !p.at_ts(EXPR_FIRST) {
p.error("expected expression");
return None;
let m = p.start();
let has_attrs = p.at(T![#]);
attributes::outer_attributes(p);
let cm = expr(p).0;
match (has_attrs, cm) {
(true, Some(cm)) => {
let kind = cm.kind();
cm.undo_completion(p).abandon(p);
m.complete(p, kind);
}
expr(p).0
}) {
_ => m.abandon(p),
}
if n_exprs == 1 && p.eat(T![;]) {
has_semi = true;
continue;
}
if has_semi || !p.at(T![']']) && !p.expect(T![,]) {
break;
}
}
p.expect(T![']']);
m.complete(p, ARRAY_EXPR)
}

View file

@ -12,8 +12,8 @@ SOURCE_FILE@[0; 112)
BLOCK@[7; 33)
L_CURLY@[7; 8) "{"
WHITESPACE@[8; 9) " "
EXPR_STMT@[9; 15)
ARRAY_EXPR@[9; 15)
EXPR_STMT@[9; 26)
ARRAY_EXPR@[9; 26)
L_BRACK@[9; 10) "["
LITERAL@[10; 11)
INT_NUMBER@[10; 11) "1"
@ -22,17 +22,13 @@ SOURCE_FILE@[0; 112)
LITERAL@[13; 14)
INT_NUMBER@[13; 14) "2"
COMMA@[14; 15) ","
WHITESPACE@[15; 16) " "
EXPR_STMT@[16; 17)
ERROR@[16; 17)
AT@[16; 17) "@"
EXPR_STMT@[17; 18)
ERROR@[17; 18)
WHITESPACE@[15; 16) " "
ERROR@[16; 17)
AT@[16; 17) "@"
COMMA@[17; 18) ","
WHITESPACE@[18; 19) " "
STRUCT_DEF@[19; 26)
STRUCT_KW@[19; 25) "struct"
ERROR@[25; 26)
WHITESPACE@[18; 19) " "
ERROR@[19; 25)
STRUCT_KW@[19; 25) "struct"
COMMA@[25; 26) ","
WHITESPACE@[26; 27) " "
LET_STMT@[27; 31)
@ -151,15 +147,12 @@ SOURCE_FILE@[0; 112)
WHITESPACE@[109; 110) " "
R_CURLY@[110; 111) "}"
WHITESPACE@[111; 112) "\n"
error 15: expected expression
error 15: expected R_BRACK
error 15: expected SEMI
error 16: expected expression
error 17: expected SEMI
error 17: expected expression
error 18: expected SEMI
error 25: expected a name
error 26: expected `;`, `{`, or `(`
error 19: expected expression
error 26: expected expression
error 26: expected COMMA
error 26: expected R_BRACK
error 26: expected SEMI
error 30: expected pattern
error 31: expected SEMI
error 52: expected expression