From: csmoe <35686186+csmoe@users.noreply.github.com> Date: Tue, 25 Sep 2018 14:00:43 +0000 (+0800) Subject: parse impl type X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=edf1cc3582a842837d64fa6ec08df00c028521f9;p=rust.git parse impl type --- diff --git a/crates/ra_syntax/src/grammar/items/traits.rs b/crates/ra_syntax/src/grammar/items/traits.rs index 25b6cb66b3d..62ab877fce1 100644 --- a/crates/ra_syntax/src/grammar/items/traits.rs +++ b/crates/ra_syntax/src/grammar/items/traits.rs @@ -54,16 +54,8 @@ pub(super) fn impl_item(p: &mut Parser) { // test impl_item_neg // impl !Send for X {} - if p.at(IMPL_KW) { - p.error("expected type"); - } else { - p.eat(EXCL); - if p.at(IMPL_KW) { - p.error("expected type"); - } else { - types::type_(p); - } - } + p.eat(EXCL); + impl_type(p); if p.eat(FOR_KW) { types::type_(p); } @@ -123,3 +115,17 @@ fn choose_type_params_over_qpath(p: &Parser) -> bool { (p.nth(1) == LIFETIME || p.nth(1) == IDENT) && (p.nth(2) == R_ANGLE || p.nth(2) == COMMA || p.nth(2) == COLON || p.nth(2) == EQ) } + +// impl Type {} +// ^^^^ +// impl Trait for T {} +// ^^^^^ +pub(crate) fn impl_type(p: &mut Parser) { + if p.at(IMPL_KW) { + p.error("expected trait or type"); + return; + } + types::type_(p); +} + + diff --git a/crates/ra_syntax/tests/data/parser/err/0026_imp_recovery.rs b/crates/ra_syntax/tests/data/parser/err/0026_imp_recovery.rs index c4f5eca87c8..eac922109b8 100644 --- a/crates/ra_syntax/tests/data/parser/err/0026_imp_recovery.rs +++ b/crates/ra_syntax/tests/data/parser/err/0026_imp_recovery.rs @@ -1,4 +1,3 @@ impl -impl -!impl OnceCell { +impl OnceCell { } diff --git a/crates/ra_syntax/tests/data/parser/err/0026_imp_recovery.txt b/crates/ra_syntax/tests/data/parser/err/0026_imp_recovery.txt index 60b65bce506..60337d6de17 100644 --- a/crates/ra_syntax/tests/data/parser/err/0026_imp_recovery.txt +++ b/crates/ra_syntax/tests/data/parser/err/0026_imp_recovery.txt @@ -1,4 +1,4 @@ -ROOT@[0; 54) +ROOT@[0; 39) IMPL_ITEM@[0; 14) IMPL_KW@[0; 4) TYPE_PARAM_LIST@[4; 14) @@ -14,53 +14,35 @@ ROOT@[0; 54) NAME_REF@[8; 13) IDENT@[8; 13) "Clone" R_ANGLE@[13; 14) - err: `expected type` + err: `expected trait or type` err: `expected `{`` WHITESPACE@[14; 15) - IMPL_ITEM@[15; 30) + IMPL_ITEM@[15; 38) IMPL_KW@[15; 19) - TYPE_PARAM_LIST@[19; 28) + TYPE_PARAM_LIST@[19; 22) L_ANGLE@[19; 20) - TYPE_PARAM@[20; 27) + TYPE_PARAM@[20; 21) NAME@[20; 21) IDENT@[20; 21) "T" - COLON@[21; 22) - PATH_TYPE@[22; 27) - PATH@[22; 27) - PATH_SEGMENT@[22; 27) - NAME_REF@[22; 27) - IDENT@[22; 27) "Clone" - R_ANGLE@[27; 28) - WHITESPACE@[28; 29) - EXCL@[29; 30) - err: `expected type` - err: `expected `{`` - IMPL_ITEM@[30; 53) - IMPL_KW@[30; 34) - TYPE_PARAM_LIST@[34; 37) - L_ANGLE@[34; 35) - TYPE_PARAM@[35; 36) - NAME@[35; 36) - IDENT@[35; 36) "T" - R_ANGLE@[36; 37) - WHITESPACE@[37; 38) - PATH_TYPE@[38; 49) - PATH@[38; 49) - PATH_SEGMENT@[38; 49) - NAME_REF@[38; 46) - IDENT@[38; 46) "OnceCell" - TYPE_ARG_LIST@[46; 49) - L_ANGLE@[46; 47) - TYPE_ARG@[47; 48) - PATH_TYPE@[47; 48) - PATH@[47; 48) - PATH_SEGMENT@[47; 48) - NAME_REF@[47; 48) - IDENT@[47; 48) "T" - R_ANGLE@[48; 49) - WHITESPACE@[49; 50) - ITEM_LIST@[50; 53) - L_CURLY@[50; 51) - WHITESPACE@[51; 52) - R_CURLY@[52; 53) - WHITESPACE@[53; 54) + R_ANGLE@[21; 22) + WHITESPACE@[22; 23) + PATH_TYPE@[23; 34) + PATH@[23; 34) + PATH_SEGMENT@[23; 34) + NAME_REF@[23; 31) + IDENT@[23; 31) "OnceCell" + TYPE_ARG_LIST@[31; 34) + L_ANGLE@[31; 32) + TYPE_ARG@[32; 33) + PATH_TYPE@[32; 33) + PATH@[32; 33) + PATH_SEGMENT@[32; 33) + NAME_REF@[32; 33) + IDENT@[32; 33) "T" + R_ANGLE@[33; 34) + WHITESPACE@[34; 35) + ITEM_LIST@[35; 38) + L_CURLY@[35; 36) + WHITESPACE@[36; 37) + R_CURLY@[37; 38) + WHITESPACE@[38; 39)