From aa433c67d85c5e56c1343ac5eb62872502ca8d55 Mon Sep 17 00:00:00 2001 From: Emil Lauridsen Date: Thu, 9 Jan 2020 18:29:43 +0100 Subject: [PATCH] Parse trait aliases --- crates/ra_parser/src/grammar/items/traits.rs | 10 ++ .../parser/inline/ok/0151_trait_alias.rs | 3 + .../parser/inline/ok/0151_trait_alias.txt | 128 ++++++++++++++++++ 3 files changed, 141 insertions(+) create mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0151_trait_alias.rs create mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0151_trait_alias.txt diff --git a/crates/ra_parser/src/grammar/items/traits.rs b/crates/ra_parser/src/grammar/items/traits.rs index 964fd304128..03dae3cdb4e 100644 --- a/crates/ra_parser/src/grammar/items/traits.rs +++ b/crates/ra_parser/src/grammar/items/traits.rs @@ -10,6 +10,16 @@ pub(super) fn trait_def(p: &mut Parser) { p.bump(T![trait]); name_r(p, ITEM_RECOVERY_SET); type_params::opt_type_param_list(p); + // test trait_alias + // trait Z = T; + // trait Z = T where U: Copy; + // trait Z = where Self: T; + if p.eat(T![=]) { + type_params::bounds_without_colon(p); + type_params::opt_where_clause(p); + p.expect(T![;]); + return; + } if p.at(T![:]) { type_params::bounds(p); } diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0151_trait_alias.rs b/crates/ra_syntax/test_data/parser/inline/ok/0151_trait_alias.rs new file mode 100644 index 00000000000..4bd428ee469 --- /dev/null +++ b/crates/ra_syntax/test_data/parser/inline/ok/0151_trait_alias.rs @@ -0,0 +1,3 @@ +trait Z = T; +trait Z = T where U: Copy; +trait Z = where Self: T; diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0151_trait_alias.txt b/crates/ra_syntax/test_data/parser/inline/ok/0151_trait_alias.txt new file mode 100644 index 00000000000..de1536ef0fc --- /dev/null +++ b/crates/ra_syntax/test_data/parser/inline/ok/0151_trait_alias.txt @@ -0,0 +1,128 @@ +SOURCE_FILE@[0; 83) + TRAIT_DEF@[0; 18) + TRAIT_KW@[0; 5) "trait" + WHITESPACE@[5; 6) " " + NAME@[6; 7) + IDENT@[6; 7) "Z" + TYPE_PARAM_LIST@[7; 10) + L_ANGLE@[7; 8) "<" + TYPE_PARAM@[8; 9) + NAME@[8; 9) + IDENT@[8; 9) "U" + R_ANGLE@[9; 10) ">" + WHITESPACE@[10; 11) " " + EQ@[11; 12) "=" + WHITESPACE@[12; 13) " " + TYPE_BOUND_LIST@[13; 17) + TYPE_BOUND@[13; 17) + PATH_TYPE@[13; 17) + PATH@[13; 17) + PATH_SEGMENT@[13; 17) + NAME_REF@[13; 14) + IDENT@[13; 14) "T" + TYPE_ARG_LIST@[14; 17) + L_ANGLE@[14; 15) "<" + TYPE_ARG@[15; 16) + PATH_TYPE@[15; 16) + PATH@[15; 16) + PATH_SEGMENT@[15; 16) + NAME_REF@[15; 16) + IDENT@[15; 16) "U" + R_ANGLE@[16; 17) ">" + SEMI@[17; 18) ";" + WHITESPACE@[18; 19) "\n" + TRAIT_DEF@[19; 51) + TRAIT_KW@[19; 24) "trait" + WHITESPACE@[24; 25) " " + NAME@[25; 26) + IDENT@[25; 26) "Z" + TYPE_PARAM_LIST@[26; 29) + L_ANGLE@[26; 27) "<" + TYPE_PARAM@[27; 28) + NAME@[27; 28) + IDENT@[27; 28) "U" + R_ANGLE@[28; 29) ">" + WHITESPACE@[29; 30) " " + EQ@[30; 31) "=" + WHITESPACE@[31; 32) " " + TYPE_BOUND_LIST@[32; 36) + TYPE_BOUND@[32; 36) + PATH_TYPE@[32; 36) + PATH@[32; 36) + PATH_SEGMENT@[32; 36) + NAME_REF@[32; 33) + IDENT@[32; 33) "T" + TYPE_ARG_LIST@[33; 36) + L_ANGLE@[33; 34) "<" + TYPE_ARG@[34; 35) + PATH_TYPE@[34; 35) + PATH@[34; 35) + PATH_SEGMENT@[34; 35) + NAME_REF@[34; 35) + IDENT@[34; 35) "U" + R_ANGLE@[35; 36) ">" + WHITESPACE@[36; 37) " " + WHERE_CLAUSE@[37; 50) + WHERE_KW@[37; 42) "where" + WHITESPACE@[42; 43) " " + WHERE_PRED@[43; 50) + PATH_TYPE@[43; 44) + PATH@[43; 44) + PATH_SEGMENT@[43; 44) + NAME_REF@[43; 44) + IDENT@[43; 44) "U" + COLON@[44; 45) ":" + WHITESPACE@[45; 46) " " + TYPE_BOUND_LIST@[46; 50) + TYPE_BOUND@[46; 50) + PATH_TYPE@[46; 50) + PATH@[46; 50) + PATH_SEGMENT@[46; 50) + NAME_REF@[46; 50) + IDENT@[46; 50) "Copy" + SEMI@[50; 51) ";" + WHITESPACE@[51; 52) "\n" + TRAIT_DEF@[52; 82) + TRAIT_KW@[52; 57) "trait" + WHITESPACE@[57; 58) " " + NAME@[58; 59) + IDENT@[58; 59) "Z" + TYPE_PARAM_LIST@[59; 62) + L_ANGLE@[59; 60) "<" + TYPE_PARAM@[60; 61) + NAME@[60; 61) + IDENT@[60; 61) "U" + R_ANGLE@[61; 62) ">" + WHITESPACE@[62; 63) " " + EQ@[63; 64) "=" + WHITESPACE@[64; 65) " " + TYPE_BOUND_LIST@[65; 65) + WHERE_CLAUSE@[65; 81) + WHERE_KW@[65; 70) "where" + WHITESPACE@[70; 71) " " + WHERE_PRED@[71; 81) + PATH_TYPE@[71; 75) + PATH@[71; 75) + PATH_SEGMENT@[71; 75) + NAME_REF@[71; 75) + IDENT@[71; 75) "Self" + COLON@[75; 76) ":" + WHITESPACE@[76; 77) " " + TYPE_BOUND_LIST@[77; 81) + TYPE_BOUND@[77; 81) + PATH_TYPE@[77; 81) + PATH@[77; 81) + PATH_SEGMENT@[77; 81) + NAME_REF@[77; 78) + IDENT@[77; 78) "T" + TYPE_ARG_LIST@[78; 81) + L_ANGLE@[78; 79) "<" + TYPE_ARG@[79; 80) + PATH_TYPE@[79; 80) + PATH@[79; 80) + PATH_SEGMENT@[79; 80) + NAME_REF@[79; 80) + IDENT@[79; 80) "U" + R_ANGLE@[80; 81) ">" + SEMI@[81; 82) ";" + WHITESPACE@[82; 83) "\n"