From e4463165854071e16645a3244e016b45752e68b7 Mon Sep 17 00:00:00 2001 From: csmoe <35686186+csmoe@users.noreply.github.com> Date: Mon, 24 Sep 2018 11:41:31 +0800 Subject: add test for impl recovery --- .../tests/data/parser/err/0026_imp_recovery.rs | 4 ++ .../tests/data/parser/err/0026_imp_recovery.txt | 66 ++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 crates/ra_syntax/tests/data/parser/err/0026_imp_recovery.rs create mode 100644 crates/ra_syntax/tests/data/parser/err/0026_imp_recovery.txt (limited to 'crates/ra_syntax') 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 new file mode 100644 index 000000000..c4f5eca87 --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/err/0026_imp_recovery.rs @@ -0,0 +1,4 @@ +impl +impl +!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 new file mode 100644 index 000000000..60b65bce5 --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/err/0026_imp_recovery.txt @@ -0,0 +1,66 @@ +ROOT@[0; 54) + IMPL_ITEM@[0; 14) + IMPL_KW@[0; 4) + TYPE_PARAM_LIST@[4; 14) + L_ANGLE@[4; 5) + TYPE_PARAM@[5; 13) + NAME@[5; 6) + IDENT@[5; 6) "T" + COLON@[6; 7) + WHITESPACE@[7; 8) + PATH_TYPE@[8; 13) + PATH@[8; 13) + PATH_SEGMENT@[8; 13) + NAME_REF@[8; 13) + IDENT@[8; 13) "Clone" + R_ANGLE@[13; 14) + err: `expected type` + err: `expected `{`` + WHITESPACE@[14; 15) + IMPL_ITEM@[15; 30) + IMPL_KW@[15; 19) + TYPE_PARAM_LIST@[19; 28) + L_ANGLE@[19; 20) + TYPE_PARAM@[20; 27) + 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) -- cgit v1.2.3 From cacb32d88aa27b8e671173571325756890941b06 Mon Sep 17 00:00:00 2001 From: csmoe <35686186+csmoe@users.noreply.github.com> Date: Mon, 24 Sep 2018 11:42:01 +0800 Subject: reject impl keyword in impl header --- crates/ra_syntax/src/grammar/items/traits.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'crates/ra_syntax') diff --git a/crates/ra_syntax/src/grammar/items/traits.rs b/crates/ra_syntax/src/grammar/items/traits.rs index c21cfb1a9..25b6cb66b 100644 --- a/crates/ra_syntax/src/grammar/items/traits.rs +++ b/crates/ra_syntax/src/grammar/items/traits.rs @@ -54,8 +54,16 @@ pub(super) fn impl_item(p: &mut Parser) { // test impl_item_neg // impl !Send for X {} - p.eat(EXCL); - types::type_(p); + 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); + } + } if p.eat(FOR_KW) { types::type_(p); } -- cgit v1.2.3 From edf1cc3582a842837d64fa6ec08df00c028521f9 Mon Sep 17 00:00:00 2001 From: csmoe <35686186+csmoe@users.noreply.github.com> Date: Tue, 25 Sep 2018 22:00:43 +0800 Subject: parse impl type --- crates/ra_syntax/src/grammar/items/traits.rs | 26 +++++--- .../tests/data/parser/err/0026_imp_recovery.rs | 3 +- .../tests/data/parser/err/0026_imp_recovery.txt | 72 ++++++++-------------- 3 files changed, 44 insertions(+), 57 deletions(-) (limited to 'crates/ra_syntax') diff --git a/crates/ra_syntax/src/grammar/items/traits.rs b/crates/ra_syntax/src/grammar/items/traits.rs index 25b6cb66b..62ab877fc 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 c4f5eca87..eac922109 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 60b65bce5..60337d6de 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) -- cgit v1.2.3 From 8b710e95353d9f840f78645c9593a66adb0636b6 Mon Sep 17 00:00:00 2001 From: csmoe <35686186+csmoe@users.noreply.github.com> Date: Wed, 26 Sep 2018 10:01:42 +0800 Subject: generate testsuite for impl_type --- crates/ra_syntax/src/grammar/items/traits.rs | 10 +-- .../tests/data/parser/err/0026_imp_recovery.rs | 3 +- .../tests/data/parser/err/0026_imp_recovery.txt | 11 ++- .../tests/data/parser/inline/0111_impl_type.rs | 4 ++ .../tests/data/parser/inline/0111_impl_type.txt | 79 ++++++++++++++++++++++ 5 files changed, 94 insertions(+), 13 deletions(-) create mode 100644 crates/ra_syntax/tests/data/parser/inline/0111_impl_type.rs create mode 100644 crates/ra_syntax/tests/data/parser/inline/0111_impl_type.txt (limited to 'crates/ra_syntax') diff --git a/crates/ra_syntax/src/grammar/items/traits.rs b/crates/ra_syntax/src/grammar/items/traits.rs index 62ab877fc..5dfdb470c 100644 --- a/crates/ra_syntax/src/grammar/items/traits.rs +++ b/crates/ra_syntax/src/grammar/items/traits.rs @@ -57,7 +57,7 @@ pub(super) fn impl_item(p: &mut Parser) { p.eat(EXCL); impl_type(p); if p.eat(FOR_KW) { - types::type_(p); + impl_type(p); } type_params::opt_where_clause(p); if p.at(L_CURLY) { @@ -116,10 +116,11 @@ fn choose_type_params_over_qpath(p: &Parser) -> bool { && (p.nth(2) == R_ANGLE || p.nth(2) == COMMA || p.nth(2) == COLON || p.nth(2) == EQ) } +// test impl_type // impl Type {} -// ^^^^ -// impl Trait for T {} -// ^^^^^ +// impl Trait1 for T {} +// impl impl NotType {} +// impl Trait2 for impl NotType {} pub(crate) fn impl_type(p: &mut Parser) { if p.at(IMPL_KW) { p.error("expected trait or type"); @@ -128,4 +129,3 @@ pub(crate) fn impl_type(p: &mut Parser) { 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 eac922109..829ca1c4b 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,3 +1,2 @@ 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 60337d6de..9e26f58a0 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; 39) +ROOT@[0; 38) IMPL_ITEM@[0; 14) IMPL_KW@[0; 4) TYPE_PARAM_LIST@[4; 14) @@ -17,7 +17,7 @@ ROOT@[0; 39) err: `expected trait or type` err: `expected `{`` WHITESPACE@[14; 15) - IMPL_ITEM@[15; 38) + IMPL_ITEM@[15; 37) IMPL_KW@[15; 19) TYPE_PARAM_LIST@[19; 22) L_ANGLE@[19; 20) @@ -41,8 +41,7 @@ ROOT@[0; 39) IDENT@[32; 33) "T" R_ANGLE@[33; 34) WHITESPACE@[34; 35) - ITEM_LIST@[35; 38) + ITEM_LIST@[35; 37) L_CURLY@[35; 36) - WHITESPACE@[36; 37) - R_CURLY@[37; 38) - WHITESPACE@[38; 39) + R_CURLY@[36; 37) + WHITESPACE@[37; 38) diff --git a/crates/ra_syntax/tests/data/parser/inline/0111_impl_type.rs b/crates/ra_syntax/tests/data/parser/inline/0111_impl_type.rs new file mode 100644 index 000000000..b8c7b65e3 --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/inline/0111_impl_type.rs @@ -0,0 +1,4 @@ +impl Type {} +impl Trait1 for T {} +impl impl NotType {} +impl Trait2 for impl NotType {} diff --git a/crates/ra_syntax/tests/data/parser/inline/0111_impl_type.txt b/crates/ra_syntax/tests/data/parser/inline/0111_impl_type.txt new file mode 100644 index 000000000..a2907b060 --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/inline/0111_impl_type.txt @@ -0,0 +1,79 @@ +ROOT@[0; 87) + IMPL_ITEM@[0; 12) + IMPL_KW@[0; 4) + WHITESPACE@[4; 5) + PATH_TYPE@[5; 9) + PATH@[5; 9) + PATH_SEGMENT@[5; 9) + NAME_REF@[5; 9) + IDENT@[5; 9) "Type" + WHITESPACE@[9; 10) + ITEM_LIST@[10; 12) + L_CURLY@[10; 11) + R_CURLY@[11; 12) + WHITESPACE@[12; 13) + IMPL_ITEM@[13; 33) + IMPL_KW@[13; 17) + WHITESPACE@[17; 18) + PATH_TYPE@[18; 24) + PATH@[18; 24) + PATH_SEGMENT@[18; 24) + NAME_REF@[18; 24) + IDENT@[18; 24) "Trait1" + WHITESPACE@[24; 25) + FOR_KW@[25; 28) + WHITESPACE@[28; 29) + PATH_TYPE@[29; 30) + PATH@[29; 30) + PATH_SEGMENT@[29; 30) + NAME_REF@[29; 30) + IDENT@[29; 30) "T" + WHITESPACE@[30; 31) + ITEM_LIST@[31; 33) + L_CURLY@[31; 32) + R_CURLY@[32; 33) + WHITESPACE@[33; 34) + IMPL_ITEM@[34; 38) + IMPL_KW@[34; 38) + err: `expected trait or type` + err: `expected `{`` + WHITESPACE@[38; 39) + IMPL_ITEM@[39; 54) + IMPL_KW@[39; 43) + WHITESPACE@[43; 44) + PATH_TYPE@[44; 51) + PATH@[44; 51) + PATH_SEGMENT@[44; 51) + NAME_REF@[44; 51) + IDENT@[44; 51) "NotType" + WHITESPACE@[51; 52) + ITEM_LIST@[52; 54) + L_CURLY@[52; 53) + R_CURLY@[53; 54) + WHITESPACE@[54; 55) + IMPL_ITEM@[55; 70) + IMPL_KW@[55; 59) + WHITESPACE@[59; 60) + PATH_TYPE@[60; 66) + PATH@[60; 66) + PATH_SEGMENT@[60; 66) + NAME_REF@[60; 66) + IDENT@[60; 66) "Trait2" + WHITESPACE@[66; 67) + FOR_KW@[67; 70) + err: `expected trait or type` + err: `expected `{`` + WHITESPACE@[70; 71) + IMPL_ITEM@[71; 86) + IMPL_KW@[71; 75) + WHITESPACE@[75; 76) + PATH_TYPE@[76; 83) + PATH@[76; 83) + PATH_SEGMENT@[76; 83) + NAME_REF@[76; 83) + IDENT@[76; 83) "NotType" + WHITESPACE@[83; 84) + ITEM_LIST@[84; 86) + L_CURLY@[84; 85) + R_CURLY@[85; 86) + WHITESPACE@[86; 87) -- cgit v1.2.3