From ab0a11b1de3237a476639fee39fcf6ef506bdf34 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 16 Jan 2020 18:35:03 +0100 Subject: Simplify array parsing --- crates/ra_parser/src/grammar/attributes.rs | 22 --------- crates/ra_parser/src/grammar/expressions/atom.rs | 57 ++++++++++++---------- .../test_data/parser/err/0022_bad_exprs.txt | 33 +++++-------- 3 files changed, 44 insertions(+), 68 deletions(-) diff --git a/crates/ra_parser/src/grammar/attributes.rs b/crates/ra_parser/src/grammar/attributes.rs index eeae37aef..f3158ade3 100644 --- a/crates/ra_parser/src/grammar/attributes.rs +++ b/crates/ra_parser/src/grammar/attributes.rs @@ -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, -) -> 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) diff --git a/crates/ra_parser/src/grammar/expressions/atom.rs b/crates/ra_parser/src/grammar/expressions/atom.rs index 700994e80..5c413317e 100644 --- a/crates/ra_parser/src/grammar/expressions/atom.rs +++ b/crates/ra_parser/src/grammar/expressions/atom.rs @@ -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(); - 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); + let mut n_exprs = 0u32; + let mut has_semi = false; - if p.eat(T![;]) { - expr(p); - p.expect(T![']']); - return m.complete(p, ARRAY_EXPR); - } + p.bump(T!['[']); 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) } diff --git a/crates/ra_syntax/test_data/parser/err/0022_bad_exprs.txt b/crates/ra_syntax/test_data/parser/err/0022_bad_exprs.txt index ee0ac52c3..310a82464 100644 --- a/crates/ra_syntax/test_data/parser/err/0022_bad_exprs.txt +++ b/crates/ra_syntax/test_data/parser/err/0022_bad_exprs.txt @@ -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 -- cgit v1.2.3