From ed8d5c86e3999aeec9a62e69ef065b2c799ecfa0 Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Thu, 16 Jan 2020 23:37:43 +0800 Subject: Fix array element attribute position --- crates/ra_parser/src/grammar/attributes.rs | 22 ++++++++++++++++++++++ crates/ra_parser/src/grammar/expressions.rs | 4 ++-- crates/ra_parser/src/grammar/expressions/atom.rs | 14 ++++++++------ 3 files changed, 32 insertions(+), 8 deletions(-) (limited to 'crates/ra_parser') diff --git a/crates/ra_parser/src/grammar/attributes.rs b/crates/ra_parser/src/grammar/attributes.rs index f3158ade3..224f45127 100644 --- a/crates/ra_parser/src/grammar/attributes.rs +++ b/crates/ra_parser/src/grammar/attributes.rs @@ -8,6 +8,28 @@ 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.rs b/crates/ra_parser/src/grammar/expressions.rs index 81d4f75f9..d733499d1 100644 --- a/crates/ra_parser/src/grammar/expressions.rs +++ b/crates/ra_parser/src/grammar/expressions.rs @@ -14,9 +14,9 @@ pub(super) enum StmtWithSemi { const EXPR_FIRST: TokenSet = LHS_FIRST; -pub(super) fn expr(p: &mut Parser) -> BlockLike { +pub(super) fn expr(p: &mut Parser) -> (Option, BlockLike) { let r = Restrictions { forbid_structs: false, prefer_stmt: false }; - expr_bp(p, r, 1).1 + expr_bp(p, r, 1) } pub(super) fn expr_stmt(p: &mut Parser) -> (Option, BlockLike) { diff --git a/crates/ra_parser/src/grammar/expressions/atom.rs b/crates/ra_parser/src/grammar/expressions/atom.rs index 4ac1d6334..700994e80 100644 --- a/crates/ra_parser/src/grammar/expressions/atom.rs +++ b/crates/ra_parser/src/grammar/expressions/atom.rs @@ -192,9 +192,8 @@ fn array_expr(p: &mut Parser) -> CompletedMarker { // 1, // 2, // ]; - attributes::outer_attributes(p); + attributes::with_outer_attributes(p, |p| expr(p).0); - expr(p); if p.eat(T![;]) { expr(p); p.expect(T![']']); @@ -212,12 +211,15 @@ fn array_expr(p: &mut Parser) -> CompletedMarker { // #[cfg(test)] // 2, // ]; - attributes::outer_attributes(p); - if !p.at_ts(EXPR_FIRST) { - p.error("expected expression"); + if !attributes::with_outer_attributes(p, |p| { + if !p.at_ts(EXPR_FIRST) { + p.error("expected expression"); + return None; + } + expr(p).0 + }) { break; } - expr(p); } p.expect(T![']']); m.complete(p, ARRAY_EXPR) -- cgit v1.2.3