From 23fdc562bf06bd001ec728d63a8f5b945bd96700 Mon Sep 17 00:00:00 2001 From: Ville Penttinen Date: Sat, 30 Mar 2019 17:11:21 +0200 Subject: Add new TYPE_BOUND_LIST and TYPE_BOUND syntax kinds These are now used when parsing type bounds. In addition parsing paths inside a bound now does not recursively parse paths, rather they are treated as separate bounds, separated by +. --- crates/ra_parser/src/grammar/items/traits.rs | 1 + crates/ra_parser/src/grammar/type_params.rs | 11 ++++- crates/ra_parser/src/syntax_kind/generated.rs | 4 ++ crates/ra_syntax/src/ast/generated.rs | 68 +++++++++++++++++++++++++++ crates/ra_syntax/src/grammar.ron | 13 +++++ 5 files changed, 95 insertions(+), 2 deletions(-) diff --git a/crates/ra_parser/src/grammar/items/traits.rs b/crates/ra_parser/src/grammar/items/traits.rs index f49615f6b..d03a6be0d 100644 --- a/crates/ra_parser/src/grammar/items/traits.rs +++ b/crates/ra_parser/src/grammar/items/traits.rs @@ -2,6 +2,7 @@ use super::*; // test trait_item // trait T: Hash + Clone where U: Copy {} +// trait X: Hash + Clone where U: Copy {} pub(super) fn trait_def(p: &mut Parser) { assert!(p.at(TRAIT_KW)); p.bump(); diff --git a/crates/ra_parser/src/grammar/type_params.rs b/crates/ra_parser/src/grammar/type_params.rs index 40f998682..e28c124cd 100644 --- a/crates/ra_parser/src/grammar/type_params.rs +++ b/crates/ra_parser/src/grammar/type_params.rs @@ -80,22 +80,29 @@ fn lifetime_bounds(p: &mut Parser) { } pub(super) fn bounds_without_colon(p: &mut Parser) { + let outer = p.start(); loop { + let inner = p.start(); let has_paren = p.eat(L_PAREN); p.eat(QUESTION); match p.current() { LIFETIME => p.bump(), FOR_KW => types::for_type(p), - _ if paths::is_path_start(p) => types::path_type(p), - _ => break, + _ if paths::is_path_start(p) => types::path_type_(p, false), + _ => { + inner.abandon(p); + break; + } } if has_paren { p.expect(R_PAREN); } + inner.complete(p, TYPE_BOUND); if !p.eat(PLUS) { break; } } + outer.complete(p, TYPE_BOUND_LIST); } // test where_clause diff --git a/crates/ra_parser/src/syntax_kind/generated.rs b/crates/ra_parser/src/syntax_kind/generated.rs index 03247ae38..547af1b27 100644 --- a/crates/ra_parser/src/syntax_kind/generated.rs +++ b/crates/ra_parser/src/syntax_kind/generated.rs @@ -228,6 +228,8 @@ pub enum SyntaxKind { PARAM, SELF_PARAM, ARG_LIST, + TYPE_BOUND, + TYPE_BOUND_LIST, } use self::SyntaxKind::*; @@ -567,6 +569,8 @@ impl SyntaxKind { PARAM => &SyntaxInfo { name: "PARAM" }, SELF_PARAM => &SyntaxInfo { name: "SELF_PARAM" }, ARG_LIST => &SyntaxInfo { name: "ARG_LIST" }, + TYPE_BOUND => &SyntaxInfo { name: "TYPE_BOUND" }, + TYPE_BOUND_LIST => &SyntaxInfo { name: "TYPE_BOUND_LIST" }, TOMBSTONE => &SyntaxInfo { name: "TOMBSTONE" }, EOF => &SyntaxInfo { name: "EOF" }, } diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index 47a37e4d1..faf80bc32 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs @@ -4369,6 +4369,74 @@ impl TypeArgList { } } +// TypeBound +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct TypeBound { + pub(crate) syntax: SyntaxNode, +} +unsafe impl TransparentNewType for TypeBound { + type Repr = rowan::SyntaxNode; +} + +impl AstNode for TypeBound { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { + match syntax.kind() { + TYPE_BOUND => Some(TypeBound::from_repr(syntax.into_repr())), + _ => None, + } + } + fn syntax(&self) -> &SyntaxNode { &self.syntax } +} + +impl ToOwned for TypeBound { + type Owned = TreeArc; + fn to_owned(&self) -> TreeArc { TreeArc::cast(self.syntax.to_owned()) } +} + + +impl TypeBound { + pub fn type_ref(&self) -> Option<&TypeRef> { + super::child_opt(self) + } + + pub fn lifetime(&self) -> Option<&Lifetime> { + super::child_opt(self) + } +} + +// TypeBoundList +#[derive(Debug, PartialEq, Eq, Hash)] +#[repr(transparent)] +pub struct TypeBoundList { + pub(crate) syntax: SyntaxNode, +} +unsafe impl TransparentNewType for TypeBoundList { + type Repr = rowan::SyntaxNode; +} + +impl AstNode for TypeBoundList { + fn cast(syntax: &SyntaxNode) -> Option<&Self> { + match syntax.kind() { + TYPE_BOUND_LIST => Some(TypeBoundList::from_repr(syntax.into_repr())), + _ => None, + } + } + fn syntax(&self) -> &SyntaxNode { &self.syntax } +} + +impl ToOwned for TypeBoundList { + type Owned = TreeArc; + fn to_owned(&self) -> TreeArc { TreeArc::cast(self.syntax.to_owned()) } +} + + +impl TypeBoundList { + pub fn bounds(&self) -> impl Iterator { + super::children(self) + } +} + // TypeParam #[derive(Debug, PartialEq, Eq, Hash)] #[repr(transparent)] diff --git a/crates/ra_syntax/src/grammar.ron b/crates/ra_syntax/src/grammar.ron index ad6d74162..660a2b207 100644 --- a/crates/ra_syntax/src/grammar.ron +++ b/crates/ra_syntax/src/grammar.ron @@ -243,6 +243,8 @@ Grammar( "PARAM", "SELF_PARAM", "ARG_LIST", + "TYPE_BOUND", + "TYPE_BOUND_LIST", ], ast: { "SourceFile": ( @@ -577,6 +579,17 @@ Grammar( traits: ["AttrsOwner"], ), "Lifetime": ( traits: ["AstToken"] ), + "TypeBound": ( + options: [ + "TypeRef", + "Lifetime", + ] + ), + "TypeBoundList": ( + collections: [ + ["bounds", "TypeBound"], + ] + ), "WhereClause": (), "ExprStmt": ( options: [ ["expr", "Expr"] ] -- cgit v1.2.3 From bfc2ac90c8b59884a1b100806387c7e6c67db3b6 Mon Sep 17 00:00:00 2001 From: Ville Penttinen Date: Sat, 30 Mar 2019 17:11:46 +0200 Subject: Update tests --- .../data/parser/err/0024_many_type_parens.txt | 198 +++++++++++---------- .../tests/data/parser/err/0026_imp_recovery.txt | 12 +- .../data/parser/inline/ok/0001_trait_item_list.txt | 12 +- .../data/parser/inline/ok/0003_where_pred_for.txt | 38 ++-- .../parser/inline/ok/0005_function_type_params.txt | 23 +-- .../parser/inline/ok/0007_type_param_bounds.txt | 38 ++-- .../inline/ok/0012_type_item_where_clause.txt | 12 +- .../data/parser/inline/ok/0028_impl_trait_type.txt | 49 ++--- .../tests/data/parser/inline/ok/0041_trait_item.rs | 1 + .../data/parser/inline/ok/0041_trait_item.txt | 108 +++++++++-- .../inline/ok/0045_param_list_opt_patterns.txt | 48 ++--- .../inline/ok/0048_path_type_with_bounds.txt | 4 +- .../data/parser/inline/ok/0056_where_clause.txt | 38 ++-- .../data/parser/inline/ok/0065_dyn_trait_type.txt | 49 ++--- .../inline/ok/0076_function_where_clause.txt | 12 +- .../tests/data/parser/inline/ok/0081_for_type.txt | 24 +-- .../parser/inline/ok/0114_tuple_struct_where.txt | 12 +- .../tests/data/parser/ok/0001_struct_item.txt | 12 +- .../tests/data/parser/ok/0020_type_param_bounds.rs | 1 + .../data/parser/ok/0020_type_param_bounds.txt | 172 ++++++++++++------ .../tests/data/parser/ok/0032_where_for.txt | 67 +++---- .../tests/data/parser/ok/0035_weird_exprs.txt | 32 ++-- .../tests/data/parser/ok/0036_fully_qualified.txt | 24 +-- .../tests/data/parser/ok/0038_where_pred_type.txt | 12 +- .../data/parser/ok/0045_block_inner_attrs.txt | 54 +++--- 25 files changed, 634 insertions(+), 418 deletions(-) diff --git a/crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.txt b/crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.txt index 8720fc6ea..b353a5383 100644 --- a/crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.txt +++ b/crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.txt @@ -11,47 +11,51 @@ SOURCE_FILE@[0; 240) IDENT@[5; 6) "T" COLON@[6; 7) WHITESPACE@[7; 8) - L_PAREN@[8; 9) - PATH_TYPE@[9; 13) - PATH@[9; 13) - PATH_SEGMENT@[9; 13) - NAME_REF@[9; 13) - IDENT@[9; 13) "Copy" - R_PAREN@[13; 14) - WHITESPACE@[14; 15) - PLUS@[15; 16) - WHITESPACE@[16; 17) - L_PAREN@[17; 18) - QUESTION@[18; 19) - PATH_TYPE@[19; 24) - PATH@[19; 24) - PATH_SEGMENT@[19; 24) - NAME_REF@[19; 24) - IDENT@[19; 24) "Sized" - R_PAREN@[24; 25) - WHITESPACE@[25; 26) - PLUS@[26; 27) - WHITESPACE@[27; 28) - L_PAREN@[28; 29) - FOR_TYPE@[29; 46) - FOR_KW@[29; 32) - TYPE_PARAM_LIST@[32; 36) - L_ANGLE@[32; 33) - LIFETIME_PARAM@[33; 35) - LIFETIME@[33; 35) "'a" - R_ANGLE@[35; 36) - WHITESPACE@[36; 37) - PATH_TYPE@[37; 46) - PATH@[37; 46) - PATH_SEGMENT@[37; 46) - NAME_REF@[37; 42) - IDENT@[37; 42) "Trait" - TYPE_ARG_LIST@[42; 46) - L_ANGLE@[42; 43) - LIFETIME_ARG@[43; 45) - LIFETIME@[43; 45) "'a" - R_ANGLE@[45; 46) - R_PAREN@[46; 47) + TYPE_BOUND_LIST@[8; 47) + TYPE_BOUND@[8; 14) + L_PAREN@[8; 9) + PATH_TYPE@[9; 13) + PATH@[9; 13) + PATH_SEGMENT@[9; 13) + NAME_REF@[9; 13) + IDENT@[9; 13) "Copy" + R_PAREN@[13; 14) + WHITESPACE@[14; 15) + PLUS@[15; 16) + WHITESPACE@[16; 17) + TYPE_BOUND@[17; 25) + L_PAREN@[17; 18) + QUESTION@[18; 19) + PATH_TYPE@[19; 24) + PATH@[19; 24) + PATH_SEGMENT@[19; 24) + NAME_REF@[19; 24) + IDENT@[19; 24) "Sized" + R_PAREN@[24; 25) + WHITESPACE@[25; 26) + PLUS@[26; 27) + WHITESPACE@[27; 28) + TYPE_BOUND@[28; 47) + L_PAREN@[28; 29) + FOR_TYPE@[29; 46) + FOR_KW@[29; 32) + TYPE_PARAM_LIST@[32; 36) + L_ANGLE@[32; 33) + LIFETIME_PARAM@[33; 35) + LIFETIME@[33; 35) "'a" + R_ANGLE@[35; 36) + WHITESPACE@[36; 37) + PATH_TYPE@[37; 46) + PATH@[37; 46) + PATH_SEGMENT@[37; 46) + NAME_REF@[37; 42) + IDENT@[37; 42) "Trait" + TYPE_ARG_LIST@[42; 46) + L_ANGLE@[42; 43) + LIFETIME_ARG@[43; 45) + LIFETIME@[43; 45) "'a" + R_ANGLE@[45; 46) + R_PAREN@[46; 47) R_ANGLE@[47; 48) PARAM_LIST@[48; 50) L_PAREN@[48; 49) @@ -101,39 +105,42 @@ SOURCE_FILE@[0; 240) WHITESPACE@[88; 89) PLUS@[89; 90) WHITESPACE@[90; 91) - L_PAREN@[91; 92) - QUESTION@[92; 93) - PATH_TYPE@[93; 98) - PATH@[93; 98) - PATH_SEGMENT@[93; 98) - NAME_REF@[93; 98) - IDENT@[93; 98) "Sized" - R_PAREN@[98; 99) - WHITESPACE@[99; 100) - PLUS@[100; 101) - WHITESPACE@[101; 102) - L_PAREN@[102; 103) - FOR_TYPE@[103; 120) - FOR_KW@[103; 106) - TYPE_PARAM_LIST@[106; 110) - L_ANGLE@[106; 107) - LIFETIME_PARAM@[107; 109) - LIFETIME@[107; 109) "'a" - R_ANGLE@[109; 110) - WHITESPACE@[110; 111) - PATH_TYPE@[111; 120) - PATH@[111; 120) - PATH_SEGMENT@[111; 120) - NAME_REF@[111; 116) - IDENT@[111; 116) "Trait" - TYPE_ARG_LIST@[116; 120) - L_ANGLE@[116; 117) - LIFETIME_ARG@[117; 119) - LIFETIME@[117; 119) "'a" - R_ANGLE@[119; 120) - R_PAREN@[120; 121) - err: `expected SEMI` - err: `expected expression` + TYPE_BOUND_LIST@[91; 121) + TYPE_BOUND@[91; 99) + L_PAREN@[91; 92) + QUESTION@[92; 93) + PATH_TYPE@[93; 98) + PATH@[93; 98) + PATH_SEGMENT@[93; 98) + NAME_REF@[93; 98) + IDENT@[93; 98) "Sized" + R_PAREN@[98; 99) + WHITESPACE@[99; 100) + PLUS@[100; 101) + WHITESPACE@[101; 102) + TYPE_BOUND@[102; 121) + L_PAREN@[102; 103) + FOR_TYPE@[103; 120) + FOR_KW@[103; 106) + TYPE_PARAM_LIST@[106; 110) + L_ANGLE@[106; 107) + LIFETIME_PARAM@[107; 109) + LIFETIME@[107; 109) "'a" + R_ANGLE@[109; 110) + WHITESPACE@[110; 111) + PATH_TYPE@[111; 120) + PATH@[111; 120) + PATH_SEGMENT@[111; 120) + NAME_REF@[111; 116) + IDENT@[111; 116) "Trait" + TYPE_ARG_LIST@[116; 120) + L_ANGLE@[116; 117) + LIFETIME_ARG@[117; 119) + LIFETIME@[117; 119) "'a" + R_ANGLE@[119; 120) + R_PAREN@[120; 121) + err: `expected SEMI` + err: `expected expression` EXPR_STMT@[121; 123) ERROR@[121; 122) R_ANGLE@[121; 122) @@ -281,26 +288,29 @@ SOURCE_FILE@[0; 240) WHITESPACE@[215; 216) PLUS@[216; 217) WHITESPACE@[217; 218) - L_PAREN@[218; 219) - PATH_TYPE@[219; 223) - PATH@[219; 223) - PATH_SEGMENT@[219; 223) - NAME_REF@[219; 223) - IDENT@[219; 223) "Copy" - R_PAREN@[223; 224) - WHITESPACE@[224; 225) - PLUS@[225; 226) - WHITESPACE@[226; 227) - L_PAREN@[227; 228) - QUESTION@[228; 229) - PATH_TYPE@[229; 234) - PATH@[229; 234) - PATH_SEGMENT@[229; 234) - NAME_REF@[229; 234) - IDENT@[229; 234) "Sized" - R_PAREN@[234; 235) - err: `expected SEMI` - err: `expected expression` + TYPE_BOUND_LIST@[218; 235) + TYPE_BOUND@[218; 224) + L_PAREN@[218; 219) + PATH_TYPE@[219; 223) + PATH@[219; 223) + PATH_SEGMENT@[219; 223) + NAME_REF@[219; 223) + IDENT@[219; 223) "Copy" + R_PAREN@[223; 224) + WHITESPACE@[224; 225) + PLUS@[225; 226) + WHITESPACE@[226; 227) + TYPE_BOUND@[227; 235) + L_PAREN@[227; 228) + QUESTION@[228; 229) + PATH_TYPE@[229; 234) + PATH@[229; 234) + PATH_SEGMENT@[229; 234) + NAME_REF@[229; 234) + IDENT@[229; 234) "Sized" + R_PAREN@[234; 235) + err: `expected SEMI` + err: `expected expression` EXPR_STMT@[235; 237) ERROR@[235; 236) R_ANGLE@[235; 236) 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 9b5fadcf7..a6d1a59ef 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 @@ -8,11 +8,13 @@ SOURCE_FILE@[0; 38) 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" + TYPE_BOUND_LIST@[8; 13) + TYPE_BOUND@[8; 13) + 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 trait or type` err: `expected `{`` diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0001_trait_item_list.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0001_trait_item_list.txt index 7c9e1e621..39cadffbc 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0001_trait_item_list.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0001_trait_item_list.txt @@ -18,11 +18,13 @@ SOURCE_FILE@[0; 83) IDENT@[18; 19) "A" COLON@[19; 20) WHITESPACE@[20; 21) - PATH_TYPE@[21; 26) - PATH@[21; 26) - PATH_SEGMENT@[21; 26) - NAME_REF@[21; 26) - IDENT@[21; 26) "Clone" + TYPE_BOUND_LIST@[21; 26) + TYPE_BOUND@[21; 26) + PATH_TYPE@[21; 26) + PATH@[21; 26) + PATH_SEGMENT@[21; 26) + NAME_REF@[21; 26) + IDENT@[21; 26) "Clone" SEMI@[26; 27) WHITESPACE@[27; 32) CONST_DEF@[32; 45) diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0003_where_pred_for.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0003_where_pred_for.txt index 41420ea92..8bc29564e 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0003_where_pred_for.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0003_where_pred_for.txt @@ -33,24 +33,26 @@ SOURCE_FILE@[0; 49) IDENT@[30; 31) "F" COLON@[31; 32) WHITESPACE@[32; 33) - PATH_TYPE@[33; 44) - PATH@[33; 44) - PATH_SEGMENT@[33; 44) - NAME_REF@[33; 35) - IDENT@[33; 35) "Fn" - PARAM_LIST@[35; 44) - L_PAREN@[35; 36) - PARAM@[36; 43) - REFERENCE_TYPE@[36; 43) - AMP@[36; 37) - LIFETIME@[37; 39) "'a" - WHITESPACE@[39; 40) - PATH_TYPE@[40; 43) - PATH@[40; 43) - PATH_SEGMENT@[40; 43) - NAME_REF@[40; 43) - IDENT@[40; 43) "str" - R_PAREN@[43; 44) + TYPE_BOUND_LIST@[33; 44) + TYPE_BOUND@[33; 44) + PATH_TYPE@[33; 44) + PATH@[33; 44) + PATH_SEGMENT@[33; 44) + NAME_REF@[33; 35) + IDENT@[33; 35) "Fn" + PARAM_LIST@[35; 44) + L_PAREN@[35; 36) + PARAM@[36; 43) + REFERENCE_TYPE@[36; 43) + AMP@[36; 37) + LIFETIME@[37; 39) "'a" + WHITESPACE@[39; 40) + PATH_TYPE@[40; 43) + PATH@[40; 43) + PATH_SEGMENT@[40; 43) + NAME_REF@[40; 43) + IDENT@[40; 43) "str" + R_PAREN@[43; 44) WHITESPACE@[44; 45) BLOCK@[45; 48) L_CURLY@[45; 46) diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0005_function_type_params.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0005_function_type_params.txt index b20f13267..0cbe7c56c 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0005_function_type_params.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0005_function_type_params.txt @@ -11,19 +11,22 @@ SOURCE_FILE@[0; 28) IDENT@[7; 8) "T" COLON@[8; 9) WHITESPACE@[9; 10) - PATH_TYPE@[10; 22) - PATH@[10; 15) - PATH_SEGMENT@[10; 15) - NAME_REF@[10; 15) - IDENT@[10; 15) "Clone" + TYPE_BOUND_LIST@[10; 22) + TYPE_BOUND@[10; 15) + PATH_TYPE@[10; 15) + PATH@[10; 15) + PATH_SEGMENT@[10; 15) + NAME_REF@[10; 15) + IDENT@[10; 15) "Clone" WHITESPACE@[15; 16) PLUS@[16; 17) WHITESPACE@[17; 18) - PATH_TYPE@[18; 22) - PATH@[18; 22) - PATH_SEGMENT@[18; 22) - NAME_REF@[18; 22) - IDENT@[18; 22) "Copy" + TYPE_BOUND@[18; 22) + PATH_TYPE@[18; 22) + PATH@[18; 22) + PATH_SEGMENT@[18; 22) + NAME_REF@[18; 22) + IDENT@[18; 22) "Copy" R_ANGLE@[22; 23) PARAM_LIST@[23; 25) L_PAREN@[23; 24) diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0007_type_param_bounds.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0007_type_param_bounds.txt index 745cf8798..81479d2ea 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0007_type_param_bounds.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0007_type_param_bounds.txt @@ -11,26 +11,30 @@ SOURCE_FILE@[0; 35) IDENT@[9; 10) "T" COLON@[10; 11) WHITESPACE@[11; 12) - LIFETIME@[12; 14) "'a" - WHITESPACE@[14; 15) - PLUS@[15; 16) - WHITESPACE@[16; 17) - QUESTION@[17; 18) - PATH_TYPE@[18; 32) - PATH@[18; 23) - PATH_SEGMENT@[18; 23) - NAME_REF@[18; 23) - IDENT@[18; 23) "Sized" + TYPE_BOUND_LIST@[12; 32) + TYPE_BOUND@[12; 14) + LIFETIME@[12; 14) "'a" + WHITESPACE@[14; 15) + PLUS@[15; 16) + WHITESPACE@[16; 17) + TYPE_BOUND@[17; 23) + QUESTION@[17; 18) + PATH_TYPE@[18; 23) + PATH@[18; 23) + PATH_SEGMENT@[18; 23) + NAME_REF@[18; 23) + IDENT@[18; 23) "Sized" WHITESPACE@[23; 24) PLUS@[24; 25) WHITESPACE@[25; 26) - L_PAREN@[26; 27) - PATH_TYPE@[27; 31) - PATH@[27; 31) - PATH_SEGMENT@[27; 31) - NAME_REF@[27; 31) - IDENT@[27; 31) "Copy" - R_PAREN@[31; 32) + TYPE_BOUND@[26; 32) + L_PAREN@[26; 27) + PATH_TYPE@[27; 31) + PATH@[27; 31) + PATH_SEGMENT@[27; 31) + NAME_REF@[27; 31) + IDENT@[27; 31) "Copy" + R_PAREN@[31; 32) R_ANGLE@[32; 33) SEMI@[33; 34) WHITESPACE@[34; 35) diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0012_type_item_where_clause.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0012_type_item_where_clause.txt index 9a5f46bab..c99a03155 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0012_type_item_where_clause.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0012_type_item_where_clause.txt @@ -16,11 +16,13 @@ SOURCE_FILE@[0; 31) IDENT@[15; 18) "Foo" COLON@[18; 19) WHITESPACE@[19; 20) - PATH_TYPE@[20; 24) - PATH@[20; 24) - PATH_SEGMENT@[20; 24) - NAME_REF@[20; 24) - IDENT@[20; 24) "Copy" + TYPE_BOUND_LIST@[20; 24) + TYPE_BOUND@[20; 24) + PATH_TYPE@[20; 24) + PATH@[20; 24) + PATH_SEGMENT@[20; 24) + NAME_REF@[20; 24) + IDENT@[20; 24) "Copy" WHITESPACE@[24; 25) EQ@[25; 26) WHITESPACE@[26; 27) diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0028_impl_trait_type.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0028_impl_trait_type.txt index 3b676fb4c..31dbbe96c 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0028_impl_trait_type.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0028_impl_trait_type.txt @@ -10,31 +10,34 @@ SOURCE_FILE@[0; 43) IMPL_TRAIT_TYPE@[9; 41) IMPL_KW@[9; 13) WHITESPACE@[13; 14) - PATH_TYPE@[14; 41) - PATH@[14; 36) - PATH_SEGMENT@[14; 36) - NAME_REF@[14; 22) - IDENT@[14; 22) "Iterator" - TYPE_ARG_LIST@[22; 36) - L_ANGLE@[22; 23) - ASSOC_TYPE_ARG@[23; 35) - NAME_REF@[23; 27) - IDENT@[23; 27) "Item" - EQ@[27; 28) - PATH_TYPE@[28; 35) - PATH@[28; 35) - PATH_SEGMENT@[28; 35) - NAME_REF@[28; 31) - IDENT@[28; 31) "Foo" - TYPE_ARG_LIST@[31; 35) - L_ANGLE@[31; 32) - LIFETIME_ARG@[32; 34) - LIFETIME@[32; 34) "'a" - R_ANGLE@[34; 35) - R_ANGLE@[35; 36) + TYPE_BOUND_LIST@[14; 41) + TYPE_BOUND@[14; 36) + PATH_TYPE@[14; 36) + PATH@[14; 36) + PATH_SEGMENT@[14; 36) + NAME_REF@[14; 22) + IDENT@[14; 22) "Iterator" + TYPE_ARG_LIST@[22; 36) + L_ANGLE@[22; 23) + ASSOC_TYPE_ARG@[23; 35) + NAME_REF@[23; 27) + IDENT@[23; 27) "Item" + EQ@[27; 28) + PATH_TYPE@[28; 35) + PATH@[28; 35) + PATH_SEGMENT@[28; 35) + NAME_REF@[28; 31) + IDENT@[28; 31) "Foo" + TYPE_ARG_LIST@[31; 35) + L_ANGLE@[31; 32) + LIFETIME_ARG@[32; 34) + LIFETIME@[32; 34) "'a" + R_ANGLE@[34; 35) + R_ANGLE@[35; 36) WHITESPACE@[36; 37) PLUS@[37; 38) WHITESPACE@[38; 39) - LIFETIME@[39; 41) "'a" + TYPE_BOUND@[39; 41) + LIFETIME@[39; 41) "'a" SEMI@[41; 42) WHITESPACE@[42; 43) diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0041_trait_item.rs b/crates/ra_syntax/tests/data/parser/inline/ok/0041_trait_item.rs index 4385afca9..32761dd03 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0041_trait_item.rs +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0041_trait_item.rs @@ -1 +1,2 @@ trait T: Hash + Clone where U: Copy {} +trait X: Hash + Clone where U: Copy {} diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0041_trait_item.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0041_trait_item.txt index 333a737ec..56cfea5b3 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0041_trait_item.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0041_trait_item.txt @@ -1,4 +1,4 @@ -SOURCE_FILE@[0; 42) +SOURCE_FILE@[0; 101) TRAIT_DEF@[0; 41) TRAIT_KW@[0; 5) WHITESPACE@[5; 6) @@ -12,19 +12,22 @@ SOURCE_FILE@[0; 42) R_ANGLE@[9; 10) COLON@[10; 11) WHITESPACE@[11; 12) - PATH_TYPE@[12; 24) - PATH@[12; 16) - PATH_SEGMENT@[12; 16) - NAME_REF@[12; 16) - IDENT@[12; 16) "Hash" + TYPE_BOUND_LIST@[12; 24) + TYPE_BOUND@[12; 16) + PATH_TYPE@[12; 16) + PATH@[12; 16) + PATH_SEGMENT@[12; 16) + NAME_REF@[12; 16) + IDENT@[12; 16) "Hash" WHITESPACE@[16; 17) PLUS@[17; 18) WHITESPACE@[18; 19) - PATH_TYPE@[19; 24) - PATH@[19; 24) - PATH_SEGMENT@[19; 24) - NAME_REF@[19; 24) - IDENT@[19; 24) "Clone" + TYPE_BOUND@[19; 24) + PATH_TYPE@[19; 24) + PATH@[19; 24) + PATH_SEGMENT@[19; 24) + NAME_REF@[19; 24) + IDENT@[19; 24) "Clone" WHITESPACE@[24; 25) WHERE_CLAUSE@[25; 38) WHERE_KW@[25; 30) @@ -37,13 +40,86 @@ SOURCE_FILE@[0; 42) IDENT@[31; 32) "U" COLON@[32; 33) WHITESPACE@[33; 34) - PATH_TYPE@[34; 38) - PATH@[34; 38) - PATH_SEGMENT@[34; 38) - NAME_REF@[34; 38) - IDENT@[34; 38) "Copy" + TYPE_BOUND_LIST@[34; 38) + TYPE_BOUND@[34; 38) + PATH_TYPE@[34; 38) + PATH@[34; 38) + PATH_SEGMENT@[34; 38) + NAME_REF@[34; 38) + IDENT@[34; 38) "Copy" WHITESPACE@[38; 39) ITEM_LIST@[39; 41) L_CURLY@[39; 40) R_CURLY@[40; 41) WHITESPACE@[41; 42) + TRAIT_DEF@[42; 100) + TRAIT_KW@[42; 47) + WHITESPACE@[47; 48) + NAME@[48; 49) + IDENT@[48; 49) "X" + TYPE_PARAM_LIST@[49; 69) + L_ANGLE@[49; 50) + TYPE_PARAM@[50; 68) + NAME@[50; 51) + IDENT@[50; 51) "U" + COLON@[51; 52) + WHITESPACE@[52; 53) + TYPE_BOUND_LIST@[53; 68) + TYPE_BOUND@[53; 58) + PATH_TYPE@[53; 58) + PATH@[53; 58) + PATH_SEGMENT@[53; 58) + NAME_REF@[53; 58) + IDENT@[53; 58) "Debug" + WHITESPACE@[58; 59) + PLUS@[59; 60) + WHITESPACE@[60; 61) + TYPE_BOUND@[61; 68) + PATH_TYPE@[61; 68) + PATH@[61; 68) + PATH_SEGMENT@[61; 68) + NAME_REF@[61; 68) + IDENT@[61; 68) "Display" + R_ANGLE@[68; 69) + COLON@[69; 70) + WHITESPACE@[70; 71) + TYPE_BOUND_LIST@[71; 83) + TYPE_BOUND@[71; 75) + PATH_TYPE@[71; 75) + PATH@[71; 75) + PATH_SEGMENT@[71; 75) + NAME_REF@[71; 75) + IDENT@[71; 75) "Hash" + WHITESPACE@[75; 76) + PLUS@[76; 77) + WHITESPACE@[77; 78) + TYPE_BOUND@[78; 83) + PATH_TYPE@[78; 83) + PATH@[78; 83) + PATH_SEGMENT@[78; 83) + NAME_REF@[78; 83) + IDENT@[78; 83) "Clone" + WHITESPACE@[83; 84) + WHERE_CLAUSE@[84; 97) + WHERE_KW@[84; 89) + WHITESPACE@[89; 90) + WHERE_PRED@[90; 97) + PATH_TYPE@[90; 91) + PATH@[90; 91) + PATH_SEGMENT@[90; 91) + NAME_REF@[90; 91) + IDENT@[90; 91) "U" + COLON@[91; 92) + WHITESPACE@[92; 93) + TYPE_BOUND_LIST@[93; 97) + TYPE_BOUND@[93; 97) + PATH_TYPE@[93; 97) + PATH@[93; 97) + PATH_SEGMENT@[93; 97) + NAME_REF@[93; 97) + IDENT@[93; 97) "Copy" + WHITESPACE@[97; 98) + ITEM_LIST@[98; 100) + L_CURLY@[98; 99) + R_CURLY@[99; 100) + WHITESPACE@[100; 101) diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0045_param_list_opt_patterns.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0045_param_list_opt_patterns.txt index 2ce7a6714..3786a787a 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0045_param_list_opt_patterns.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0045_param_list_opt_patterns.txt @@ -11,29 +11,31 @@ SOURCE_FILE@[0; 35) IDENT@[7; 8) "F" COLON@[8; 9) WHITESPACE@[9; 10) - PATH_TYPE@[10; 29) - PATH@[10; 29) - PATH_SEGMENT@[10; 29) - NAME_REF@[10; 15) - IDENT@[10; 15) "FnMut" - PARAM_LIST@[15; 29) - L_PAREN@[15; 16) - PARAM@[16; 28) - REFERENCE_TYPE@[16; 28) - AMP@[16; 17) - MUT_KW@[17; 20) - WHITESPACE@[20; 21) - PATH_TYPE@[21; 28) - PATH@[21; 28) - PATH_SEGMENT@[21; 28) - NAME_REF@[21; 24) - IDENT@[21; 24) "Foo" - TYPE_ARG_LIST@[24; 28) - L_ANGLE@[24; 25) - LIFETIME_ARG@[25; 27) - LIFETIME@[25; 27) "'a" - R_ANGLE@[27; 28) - R_PAREN@[28; 29) + TYPE_BOUND_LIST@[10; 29) + TYPE_BOUND@[10; 29) + PATH_TYPE@[10; 29) + PATH@[10; 29) + PATH_SEGMENT@[10; 29) + NAME_REF@[10; 15) + IDENT@[10; 15) "FnMut" + PARAM_LIST@[15; 29) + L_PAREN@[15; 16) + PARAM@[16; 28) + REFERENCE_TYPE@[16; 28) + AMP@[16; 17) + MUT_KW@[17; 20) + WHITESPACE@[20; 21) + PATH_TYPE@[21; 28) + PATH@[21; 28) + PATH_SEGMENT@[21; 28) + NAME_REF@[21; 24) + IDENT@[21; 24) "Foo" + TYPE_ARG_LIST@[24; 28) + L_ANGLE@[24; 25) + LIFETIME_ARG@[25; 27) + LIFETIME@[25; 27) "'a" + R_ANGLE@[27; 28) + R_PAREN@[28; 29) R_ANGLE@[29; 30) PARAM_LIST@[30; 32) L_PAREN@[30; 31) diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0048_path_type_with_bounds.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0048_path_type_with_bounds.txt index 911a27ea1..a0110f555 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0048_path_type_with_bounds.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0048_path_type_with_bounds.txt @@ -27,7 +27,9 @@ SOURCE_FILE@[0; 27) WHITESPACE@[17; 18) PLUS@[18; 19) WHITESPACE@[19; 20) - LIFETIME@[20; 22) "'f" + TYPE_BOUND_LIST@[20; 22) + TYPE_BOUND@[20; 22) + LIFETIME@[20; 22) "'f" R_ANGLE@[22; 23) WHITESPACE@[23; 24) BLOCK@[24; 26) diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0056_where_clause.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0056_where_clause.txt index 68485dc0b..e04b61eb3 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0056_where_clause.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0056_where_clause.txt @@ -30,22 +30,26 @@ SOURCE_FILE@[0; 116) IDENT@[34; 35) "T" COLON@[35; 36) WHITESPACE@[36; 37) - PATH_TYPE@[37; 59) - PATH@[37; 42) - PATH_SEGMENT@[37; 42) - NAME_REF@[37; 42) - IDENT@[37; 42) "Clone" + TYPE_BOUND_LIST@[37; 59) + TYPE_BOUND@[37; 42) + PATH_TYPE@[37; 42) + PATH@[37; 42) + PATH_SEGMENT@[37; 42) + NAME_REF@[37; 42) + IDENT@[37; 42) "Clone" WHITESPACE@[42; 43) PLUS@[43; 44) WHITESPACE@[44; 45) - PATH_TYPE@[45; 59) - PATH@[45; 49) - PATH_SEGMENT@[45; 49) - NAME_REF@[45; 49) - IDENT@[45; 49) "Copy" - WHITESPACE@[49; 50) - PLUS@[50; 51) - WHITESPACE@[51; 52) + TYPE_BOUND@[45; 49) + PATH_TYPE@[45; 49) + PATH@[45; 49) + PATH_SEGMENT@[45; 49) + NAME_REF@[45; 49) + IDENT@[45; 49) "Copy" + WHITESPACE@[49; 50) + PLUS@[50; 51) + WHITESPACE@[51; 52) + TYPE_BOUND@[52; 59) LIFETIME@[52; 59) "'static" COMMA@[59; 60) WHITESPACE@[60; 64) @@ -62,7 +66,9 @@ SOURCE_FILE@[0; 116) IDENT@[74; 78) "Item" COLON@[78; 79) WHITESPACE@[79; 80) - LIFETIME@[80; 82) "'a" + TYPE_BOUND_LIST@[80; 82) + TYPE_BOUND@[80; 82) + LIFETIME@[80; 82) "'a" COMMA@[82; 83) WHITESPACE@[83; 87) WHERE_PRED@[87; 112) @@ -91,7 +97,9 @@ SOURCE_FILE@[0; 116) IDENT@[104; 108) "Item" COLON@[108; 109) WHITESPACE@[109; 110) - LIFETIME@[110; 112) "'a" + TYPE_BOUND_LIST@[110; 112) + TYPE_BOUND@[110; 112) + LIFETIME@[110; 112) "'a" WHITESPACE@[112; 113) BLOCK@[113; 115) L_CURLY@[113; 114) diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0065_dyn_trait_type.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0065_dyn_trait_type.txt index f6a0967f2..e33d8ada1 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0065_dyn_trait_type.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0065_dyn_trait_type.txt @@ -10,31 +10,34 @@ SOURCE_FILE@[0; 42) DYN_TRAIT_TYPE@[9; 40) DYN_KW@[9; 12) WHITESPACE@[12; 13) - PATH_TYPE@[13; 40) - PATH@[13; 35) - PATH_SEGMENT@[13; 35) - NAME_REF@[13; 21) - IDENT@[13; 21) "Iterator" - TYPE_ARG_LIST@[21; 35) - L_ANGLE@[21; 22) - ASSOC_TYPE_ARG@[22; 34) - NAME_REF@[22; 26) - IDENT@[22; 26) "Item" - EQ@[26; 27) - PATH_TYPE@[27; 34) - PATH@[27; 34) - PATH_SEGMENT@[27; 34) - NAME_REF@[27; 30) - IDENT@[27; 30) "Foo" - TYPE_ARG_LIST@[30; 34) - L_ANGLE@[30; 31) - LIFETIME_ARG@[31; 33) - LIFETIME@[31; 33) "'a" - R_ANGLE@[33; 34) - R_ANGLE@[34; 35) + TYPE_BOUND_LIST@[13; 40) + TYPE_BOUND@[13; 35) + PATH_TYPE@[13; 35) + PATH@[13; 35) + PATH_SEGMENT@[13; 35) + NAME_REF@[13; 21) + IDENT@[13; 21) "Iterator" + TYPE_ARG_LIST@[21; 35) + L_ANGLE@[21; 22) + ASSOC_TYPE_ARG@[22; 34) + NAME_REF@[22; 26) + IDENT@[22; 26) "Item" + EQ@[26; 27) + PATH_TYPE@[27; 34) + PATH@[27; 34) + PATH_SEGMENT@[27; 34) + NAME_REF@[27; 30) + IDENT@[27; 30) "Foo" + TYPE_ARG_LIST@[30; 34) + L_ANGLE@[30; 31) + LIFETIME_ARG@[31; 33) + LIFETIME@[31; 33) "'a" + R_ANGLE@[33; 34) + R_ANGLE@[34; 35) WHITESPACE@[35; 36) PLUS@[36; 37) WHITESPACE@[37; 38) - LIFETIME@[38; 40) "'a" + TYPE_BOUND@[38; 40) + LIFETIME@[38; 40) "'a" SEMI@[40; 41) WHITESPACE@[41; 42) diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0076_function_where_clause.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0076_function_where_clause.txt index b58d09e35..1603b531e 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0076_function_where_clause.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0076_function_where_clause.txt @@ -25,11 +25,13 @@ SOURCE_FILE@[0; 29) IDENT@[18; 19) "T" COLON@[19; 20) WHITESPACE@[20; 21) - PATH_TYPE@[21; 25) - PATH@[21; 25) - PATH_SEGMENT@[21; 25) - NAME_REF@[21; 25) - IDENT@[21; 25) "Copy" + TYPE_BOUND_LIST@[21; 25) + TYPE_BOUND@[21; 25) + PATH_TYPE@[21; 25) + PATH@[21; 25) + PATH_SEGMENT@[21; 25) + NAME_REF@[21; 25) + IDENT@[21; 25) "Copy" WHITESPACE@[25; 26) BLOCK@[26; 28) L_CURLY@[26; 27) diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0081_for_type.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0081_for_type.txt index 568f61fb2..36c856cd7 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0081_for_type.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0081_for_type.txt @@ -80,11 +80,13 @@ SOURCE_FILE@[0; 135) IDENT@[65; 66) "T" COLON@[66; 67) WHITESPACE@[67; 68) - PATH_TYPE@[68; 76) - PATH@[68; 76) - PATH_SEGMENT@[68; 76) - NAME_REF@[68; 76) - IDENT@[68; 76) "Iterator" + TYPE_BOUND_LIST@[68; 76) + TYPE_BOUND@[68; 76) + PATH_TYPE@[68; 76) + PATH@[68; 76) + PATH_SEGMENT@[68; 76) + NAME_REF@[68; 76) + IDENT@[68; 76) "Iterator" WHITESPACE@[76; 77) BLOCK@[77; 79) L_CURLY@[77; 78) @@ -143,11 +145,13 @@ SOURCE_FILE@[0; 135) IDENT@[120; 121) "T" COLON@[121; 122) WHITESPACE@[122; 123) - PATH_TYPE@[123; 131) - PATH@[123; 131) - PATH_SEGMENT@[123; 131) - NAME_REF@[123; 131) - IDENT@[123; 131) "Iterator" + TYPE_BOUND_LIST@[123; 131) + TYPE_BOUND@[123; 131) + PATH_TYPE@[123; 131) + PATH@[123; 131) + PATH_SEGMENT@[123; 131) + NAME_REF@[123; 131) + IDENT@[123; 131) "Iterator" WHITESPACE@[131; 132) BLOCK@[132; 134) L_CURLY@[132; 133) diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0114_tuple_struct_where.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0114_tuple_struct_where.txt index 4f439f21c..dec038fc1 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0114_tuple_struct_where.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0114_tuple_struct_where.txt @@ -31,11 +31,13 @@ SOURCE_FILE@[0; 53) IDENT@[24; 25) "T" COLON@[25; 26) WHITESPACE@[26; 27) - PATH_TYPE@[27; 32) - PATH@[27; 32) - PATH_SEGMENT@[27; 32) - NAME_REF@[27; 32) - IDENT@[27; 32) "Clone" + TYPE_BOUND_LIST@[27; 32) + TYPE_BOUND@[27; 32) + PATH_TYPE@[27; 32) + PATH@[27; 32) + PATH_SEGMENT@[27; 32) + NAME_REF@[27; 32) + IDENT@[27; 32) "Clone" SEMI@[32; 33) WHITESPACE@[33; 34) STRUCT_DEF@[34; 52) diff --git a/crates/ra_syntax/tests/data/parser/ok/0001_struct_item.txt b/crates/ra_syntax/tests/data/parser/ok/0001_struct_item.txt index 12497e1a9..b49206d80 100644 --- a/crates/ra_syntax/tests/data/parser/ok/0001_struct_item.txt +++ b/crates/ra_syntax/tests/data/parser/ok/0001_struct_item.txt @@ -11,11 +11,13 @@ SOURCE_FILE@[0; 32) IDENT@[9; 10) "T" COLON@[10; 11) WHITESPACE@[11; 12) - PATH_TYPE@[12; 16) - PATH@[12; 16) - PATH_SEGMENT@[12; 16) - NAME_REF@[12; 16) - IDENT@[12; 16) "Copy" + TYPE_BOUND_LIST@[12; 16) + TYPE_BOUND@[12; 16) + PATH_TYPE@[12; 16) + PATH@[12; 16) + PATH_SEGMENT@[12; 16) + NAME_REF@[12; 16) + IDENT@[12; 16) "Copy" R_ANGLE@[16; 17) WHITESPACE@[17; 18) NAMED_FIELD_DEF_LIST@[18; 31) diff --git a/crates/ra_syntax/tests/data/parser/ok/0020_type_param_bounds.rs b/crates/ra_syntax/tests/data/parser/ok/0020_type_param_bounds.rs index a1b9f00a4..712898978 100644 --- a/crates/ra_syntax/tests/data/parser/ok/0020_type_param_bounds.rs +++ b/crates/ra_syntax/tests/data/parser/ok/0020_type_param_bounds.rs @@ -7,3 +7,4 @@ struct F; struct G; struct H; struct I; +struct K<'a: 'd, 'd: 'a + 'b, T: 'a + 'd + Clone>; \ No newline at end of file diff --git a/crates/ra_syntax/tests/data/parser/ok/0020_type_param_bounds.txt b/crates/ra_syntax/tests/data/parser/ok/0020_type_param_bounds.txt index b70a1d19a..04aaca4c4 100644 --- a/crates/ra_syntax/tests/data/parser/ok/0020_type_param_bounds.txt +++ b/crates/ra_syntax/tests/data/parser/ok/0020_type_param_bounds.txt @@ -1,4 +1,4 @@ -SOURCE_FILE@[0; 200) +SOURCE_FILE@[0; 250) STRUCT_DEF@[0; 12) STRUCT_KW@[0; 6) WHITESPACE@[6; 7) @@ -23,6 +23,7 @@ SOURCE_FILE@[0; 200) NAME@[22; 23) IDENT@[22; 23) "T" COLON@[23; 24) + TYPE_BOUND_LIST@[24; 24) R_ANGLE@[24; 25) SEMI@[25; 26) WHITESPACE@[26; 27) @@ -38,7 +39,9 @@ SOURCE_FILE@[0; 200) IDENT@[36; 37) "T" COLON@[37; 38) WHITESPACE@[38; 39) - LIFETIME@[39; 41) "'a" + TYPE_BOUND_LIST@[39; 41) + TYPE_BOUND@[39; 41) + LIFETIME@[39; 41) "'a" R_ANGLE@[41; 42) SEMI@[42; 43) WHITESPACE@[43; 44) @@ -54,9 +57,11 @@ SOURCE_FILE@[0; 200) IDENT@[53; 54) "T" COLON@[54; 55) WHITESPACE@[55; 56) - LIFETIME@[56; 58) "'a" - WHITESPACE@[58; 59) - PLUS@[59; 60) + TYPE_BOUND_LIST@[56; 60) + TYPE_BOUND@[56; 58) + LIFETIME@[56; 58) "'a" + WHITESPACE@[58; 59) + PLUS@[59; 60) WHITESPACE@[60; 61) R_ANGLE@[61; 62) SEMI@[62; 63) @@ -73,11 +78,14 @@ SOURCE_FILE@[0; 200) IDENT@[73; 74) "T" COLON@[74; 75) WHITESPACE@[75; 76) - LIFETIME@[76; 78) "'a" - WHITESPACE@[78; 79) - PLUS@[79; 80) - WHITESPACE@[80; 81) - LIFETIME@[81; 83) "'d" + TYPE_BOUND_LIST@[76; 83) + TYPE_BOUND@[76; 78) + LIFETIME@[76; 78) "'a" + WHITESPACE@[78; 79) + PLUS@[79; 80) + WHITESPACE@[80; 81) + TYPE_BOUND@[81; 83) + LIFETIME@[81; 83) "'d" WHITESPACE@[83; 84) R_ANGLE@[84; 85) SEMI@[85; 86) @@ -94,19 +102,23 @@ SOURCE_FILE@[0; 200) IDENT@[96; 97) "T" COLON@[97; 98) WHITESPACE@[98; 99) - LIFETIME@[99; 101) "'a" - WHITESPACE@[101; 102) - PLUS@[102; 103) - WHITESPACE@[103; 104) - LIFETIME@[104; 106) "'d" - WHITESPACE@[106; 107) - PLUS@[107; 108) - WHITESPACE@[108; 109) - PATH_TYPE@[109; 114) - PATH@[109; 114) - PATH_SEGMENT@[109; 114) - NAME_REF@[109; 114) - IDENT@[109; 114) "Clone" + TYPE_BOUND_LIST@[99; 114) + TYPE_BOUND@[99; 101) + LIFETIME@[99; 101) "'a" + WHITESPACE@[101; 102) + PLUS@[102; 103) + WHITESPACE@[103; 104) + TYPE_BOUND@[104; 106) + LIFETIME@[104; 106) "'d" + WHITESPACE@[106; 107) + PLUS@[107; 108) + WHITESPACE@[108; 109) + TYPE_BOUND@[109; 114) + PATH_TYPE@[109; 114) + PATH@[109; 114) + PATH_SEGMENT@[109; 114) + NAME_REF@[109; 114) + IDENT@[109; 114) "Clone" R_ANGLE@[114; 115) SEMI@[115; 116) WHITESPACE@[116; 117) @@ -122,19 +134,22 @@ SOURCE_FILE@[0; 200) IDENT@[126; 127) "T" COLON@[127; 128) WHITESPACE@[128; 129) - PATH_TYPE@[129; 141) - PATH@[129; 134) - PATH_SEGMENT@[129; 134) - NAME_REF@[129; 134) - IDENT@[129; 134) "Clone" + TYPE_BOUND_LIST@[129; 141) + TYPE_BOUND@[129; 134) + PATH_TYPE@[129; 134) + PATH@[129; 134) + PATH_SEGMENT@[129; 134) + NAME_REF@[129; 134) + IDENT@[129; 134) "Clone" WHITESPACE@[134; 135) PLUS@[135; 136) WHITESPACE@[136; 137) - PATH_TYPE@[137; 141) - PATH@[137; 141) - PATH_SEGMENT@[137; 141) - NAME_REF@[137; 141) - IDENT@[137; 141) "Copy" + TYPE_BOUND@[137; 141) + PATH_TYPE@[137; 141) + PATH@[137; 141) + PATH_SEGMENT@[137; 141) + NAME_REF@[137; 141) + IDENT@[137; 141) "Copy" R_ANGLE@[141; 142) SEMI@[142; 143) WHITESPACE@[143; 144) @@ -150,27 +165,31 @@ SOURCE_FILE@[0; 200) IDENT@[153; 154) "T" COLON@[154; 155) WHITESPACE@[155; 156) - PATH_TYPE@[156; 178) - PATH@[156; 161) - PATH_SEGMENT@[156; 161) - COLONCOLON@[156; 158) - NAME_REF@[158; 161) - IDENT@[158; 161) "Foo" + TYPE_BOUND_LIST@[156; 178) + TYPE_BOUND@[156; 161) + PATH_TYPE@[156; 161) + PATH@[156; 161) + PATH_SEGMENT@[156; 161) + COLONCOLON@[156; 158) + NAME_REF@[158; 161) + IDENT@[158; 161) "Foo" WHITESPACE@[161; 162) PLUS@[162; 163) WHITESPACE@[163; 164) - PATH_TYPE@[164; 178) - PATH@[164; 173) - PATH@[164; 168) - PATH_SEGMENT@[164; 168) - SELF_KW@[164; 168) - COLONCOLON@[168; 170) - PATH_SEGMENT@[170; 173) - NAME_REF@[170; 173) - IDENT@[170; 173) "Bar" - WHITESPACE@[173; 174) - PLUS@[174; 175) - WHITESPACE@[175; 176) + TYPE_BOUND@[164; 173) + PATH_TYPE@[164; 173) + PATH@[164; 173) + PATH@[164; 168) + PATH_SEGMENT@[164; 168) + SELF_KW@[164; 168) + COLONCOLON@[168; 170) + PATH_SEGMENT@[170; 173) + NAME_REF@[170; 173) + IDENT@[170; 173) "Bar" + WHITESPACE@[173; 174) + PLUS@[174; 175) + WHITESPACE@[175; 176) + TYPE_BOUND@[176; 178) LIFETIME@[176; 178) "'a" R_ANGLE@[178; 179) SEMI@[179; 180) @@ -186,13 +205,64 @@ SOURCE_FILE@[0; 200) NAME@[190; 191) IDENT@[190; 191) "T" COLON@[191; 192) + TYPE_BOUND_LIST@[192; 192) COMMA@[192; 193) WHITESPACE@[193; 194) TYPE_PARAM@[194; 196) NAME@[194; 195) IDENT@[194; 195) "U" COLON@[195; 196) + TYPE_BOUND_LIST@[196; 196) COMMA@[196; 197) R_ANGLE@[197; 198) SEMI@[198; 199) WHITESPACE@[199; 200) + STRUCT_DEF@[200; 250) + STRUCT_KW@[200; 206) + WHITESPACE@[206; 207) + NAME@[207; 208) + IDENT@[207; 208) "K" + TYPE_PARAM_LIST@[208; 249) + L_ANGLE@[208; 209) + LIFETIME_PARAM@[209; 215) + LIFETIME@[209; 211) "'a" + COLON@[211; 212) + WHITESPACE@[212; 213) + LIFETIME@[213; 215) "'d" + COMMA@[215; 216) + WHITESPACE@[216; 217) + LIFETIME_PARAM@[217; 228) + LIFETIME@[217; 219) "'d" + COLON@[219; 220) + WHITESPACE@[220; 221) + LIFETIME@[221; 223) "'a" + WHITESPACE@[223; 224) + PLUS@[224; 225) + WHITESPACE@[225; 226) + LIFETIME@[226; 228) "'b" + COMMA@[228; 229) + WHITESPACE@[229; 230) + TYPE_PARAM@[230; 248) + NAME@[230; 231) + IDENT@[230; 231) "T" + COLON@[231; 232) + WHITESPACE@[232; 233) + TYPE_BOUND_LIST@[233; 248) + TYPE_BOUND@[233; 235) + LIFETIME@[233; 235) "'a" + WHITESPACE@[235; 236) + PLUS@[236; 237) + WHITESPACE@[237; 238) + TYPE_BOUND@[238; 240) + LIFETIME@[238; 240) "'d" + WHITESPACE@[240; 241) + PLUS@[241; 242) + WHITESPACE@[242; 243) + TYPE_BOUND@[243; 248) + PATH_TYPE@[243; 248) + PATH@[243; 248) + PATH_SEGMENT@[243; 248) + NAME_REF@[243; 248) + IDENT@[243; 248) "Clone" + R_ANGLE@[248; 249) + SEMI@[249; 250) diff --git a/crates/ra_syntax/tests/data/parser/ok/0032_where_for.txt b/crates/ra_syntax/tests/data/parser/ok/0032_where_for.txt index 150a9e483..7236d9e62 100644 --- a/crates/ra_syntax/tests/data/parser/ok/0032_where_for.txt +++ b/crates/ra_syntax/tests/data/parser/ok/0032_where_for.txt @@ -25,43 +25,48 @@ SOURCE_FILE@[0; 116) IDENT@[39; 42) "SER" COLON@[42; 43) WHITESPACE@[43; 44) - PATH_TYPE@[44; 111) - PATH@[44; 53) - PATH_SEGMENT@[44; 53) - NAME_REF@[44; 53) - IDENT@[44; 53) "Serialize" + TYPE_BOUND_LIST@[44; 111) + TYPE_BOUND@[44; 53) + PATH_TYPE@[44; 53) + PATH@[44; 53) + PATH_SEGMENT@[44; 53) + NAME_REF@[44; 53) + IDENT@[44; 53) "Serialize" WHITESPACE@[53; 54) PLUS@[54; 55) WHITESPACE@[55; 56) - FOR_TYPE@[56; 81) - FOR_KW@[56; 59) - TYPE_PARAM_LIST@[59; 64) - L_ANGLE@[59; 60) - LIFETIME_PARAM@[60; 63) - LIFETIME@[60; 63) "'de" - R_ANGLE@[63; 64) - WHITESPACE@[64; 65) - PATH_TYPE@[65; 81) - PATH@[65; 81) - PATH_SEGMENT@[65; 81) - NAME_REF@[65; 76) - IDENT@[65; 76) "Deserialize" - TYPE_ARG_LIST@[76; 81) - L_ANGLE@[76; 77) - LIFETIME_ARG@[77; 80) - LIFETIME@[77; 80) "'de" - R_ANGLE@[80; 81) + TYPE_BOUND@[56; 81) + FOR_TYPE@[56; 81) + FOR_KW@[56; 59) + TYPE_PARAM_LIST@[59; 64) + L_ANGLE@[59; 60) + LIFETIME_PARAM@[60; 63) + LIFETIME@[60; 63) "'de" + R_ANGLE@[63; 64) + WHITESPACE@[64; 65) + PATH_TYPE@[65; 81) + PATH@[65; 81) + PATH_SEGMENT@[65; 81) + NAME_REF@[65; 76) + IDENT@[65; 76) "Deserialize" + TYPE_ARG_LIST@[76; 81) + L_ANGLE@[76; 77) + LIFETIME_ARG@[77; 80) + LIFETIME@[77; 80) "'de" + R_ANGLE@[80; 81) WHITESPACE@[81; 82) PLUS@[82; 83) WHITESPACE@[83; 84) - PATH_TYPE@[84; 111) - PATH@[84; 93) - PATH_SEGMENT@[84; 93) - NAME_REF@[84; 93) - IDENT@[84; 93) "PartialEq" - WHITESPACE@[93; 94) - PLUS@[94; 95) - WHITESPACE@[95; 96) + TYPE_BOUND@[84; 93) + PATH_TYPE@[84; 93) + PATH@[84; 93) + PATH_SEGMENT@[84; 93) + NAME_REF@[84; 93) + IDENT@[84; 93) "PartialEq" + WHITESPACE@[93; 94) + PLUS@[94; 95) + WHITESPACE@[95; 96) + TYPE_BOUND@[96; 111) PATH_TYPE@[96; 111) PATH@[96; 111) PATH@[96; 104) diff --git a/crates/ra_syntax/tests/data/parser/ok/0035_weird_exprs.txt b/crates/ra_syntax/tests/data/parser/ok/0035_weird_exprs.txt index f3987c3b7..580baaac5 100644 --- a/crates/ra_syntax/tests/data/parser/ok/0035_weird_exprs.txt +++ b/crates/ra_syntax/tests/data/parser/ok/0035_weird_exprs.txt @@ -1694,21 +1694,23 @@ SOURCE_FILE@[0; 3813) IMPL_TRAIT_TYPE@[3063; 3083) IMPL_KW@[3063; 3067) WHITESPACE@[3067; 3068) - PATH_TYPE@[3068; 3083) - PATH@[3068; 3083) - PATH@[3068; 3076) - PATH@[3068; 3071) - PATH_SEGMENT@[3068; 3071) - NAME_REF@[3068; 3071) - IDENT@[3068; 3071) "std" - COLONCOLON@[3071; 3073) - PATH_SEGMENT@[3073; 3076) - NAME_REF@[3073; 3076) - IDENT@[3073; 3076) "fmt" - COLONCOLON@[3076; 3078) - PATH_SEGMENT@[3078; 3083) - NAME_REF@[3078; 3083) - IDENT@[3078; 3083) "Debug" + TYPE_BOUND_LIST@[3068; 3083) + TYPE_BOUND@[3068; 3083) + PATH_TYPE@[3068; 3083) + PATH@[3068; 3083) + PATH@[3068; 3076) + PATH@[3068; 3071) + PATH_SEGMENT@[3068; 3071) + NAME_REF@[3068; 3071) + IDENT@[3068; 3071) "std" + COLONCOLON@[3071; 3073) + PATH_SEGMENT@[3073; 3076) + NAME_REF@[3073; 3076) + IDENT@[3073; 3076) "fmt" + COLONCOLON@[3076; 3078) + PATH_SEGMENT@[3078; 3083) + NAME_REF@[3078; 3083) + IDENT@[3078; 3083) "Debug" WHITESPACE@[3083; 3084) BLOCK@[3084; 3514) L_CURLY@[3084; 3085) diff --git a/crates/ra_syntax/tests/data/parser/ok/0036_fully_qualified.txt b/crates/ra_syntax/tests/data/parser/ok/0036_fully_qualified.txt index 208e5e51c..93e26aaf6 100644 --- a/crates/ra_syntax/tests/data/parser/ok/0036_fully_qualified.txt +++ b/crates/ra_syntax/tests/data/parser/ok/0036_fully_qualified.txt @@ -16,11 +16,13 @@ SOURCE_FILE@[0; 157) IDENT@[73; 74) "S" COLON@[74; 75) WHITESPACE@[75; 76) - PATH_TYPE@[76; 84) - PATH@[76; 84) - PATH_SEGMENT@[76; 84) - NAME_REF@[76; 84) - IDENT@[76; 84) "Iterator" + TYPE_BOUND_LIST@[76; 84) + TYPE_BOUND@[76; 84) + PATH_TYPE@[76; 84) + PATH@[76; 84) + PATH_SEGMENT@[76; 84) + NAME_REF@[76; 84) + IDENT@[76; 84) "Iterator" R_ANGLE@[84; 85) PARAM_LIST@[85; 87) L_PAREN@[85; 86) @@ -64,11 +66,13 @@ SOURCE_FILE@[0; 157) IDENT@[125; 129) "Item" COLON@[129; 130) WHITESPACE@[130; 131) - PATH_TYPE@[131; 133) - PATH@[131; 133) - PATH_SEGMENT@[131; 133) - NAME_REF@[131; 133) - IDENT@[131; 133) "Eq" + TYPE_BOUND_LIST@[131; 133) + TYPE_BOUND@[131; 133) + PATH_TYPE@[131; 133) + PATH@[131; 133) + PATH_SEGMENT@[131; 133) + NAME_REF@[131; 133) + IDENT@[131; 133) "Eq" COMMA@[133; 134) WHITESPACE@[134; 135) BLOCK@[135; 156) diff --git a/crates/ra_syntax/tests/data/parser/ok/0038_where_pred_type.txt b/crates/ra_syntax/tests/data/parser/ok/0038_where_pred_type.txt index 4842e9b90..fe3fca5cd 100644 --- a/crates/ra_syntax/tests/data/parser/ok/0038_where_pred_type.txt +++ b/crates/ra_syntax/tests/data/parser/ok/0038_where_pred_type.txt @@ -29,11 +29,13 @@ SOURCE_FILE@[0; 34) R_PAREN@[25; 26) COLON@[26; 27) WHITESPACE@[27; 28) - PATH_TYPE@[28; 31) - PATH@[28; 31) - PATH_SEGMENT@[28; 31) - NAME_REF@[28; 31) - IDENT@[28; 31) "Foo" + TYPE_BOUND_LIST@[28; 31) + TYPE_BOUND@[28; 31) + PATH_TYPE@[28; 31) + PATH@[28; 31) + PATH_SEGMENT@[28; 31) + NAME_REF@[28; 31) + IDENT@[28; 31) "Foo" WHITESPACE@[31; 32) BLOCK@[32; 34) L_CURLY@[32; 33) diff --git a/crates/ra_syntax/tests/data/parser/ok/0045_block_inner_attrs.txt b/crates/ra_syntax/tests/data/parser/ok/0045_block_inner_attrs.txt index a1ba645ef..eba587f18 100644 --- a/crates/ra_syntax/tests/data/parser/ok/0045_block_inner_attrs.txt +++ b/crates/ra_syntax/tests/data/parser/ok/0045_block_inner_attrs.txt @@ -116,32 +116,34 @@ SOURCE_FILE@[0; 686) IMPL_TRAIT_TYPE@[576; 600) IMPL_KW@[576; 580) WHITESPACE@[580; 581) - PATH_TYPE@[581; 600) - PATH@[581; 600) - PATH_SEGMENT@[581; 600) - NAME_REF@[581; 583) - IDENT@[581; 583) "Fn" - PARAM_LIST@[583; 585) - L_PAREN@[583; 584) - R_PAREN@[584; 585) - WHITESPACE@[585; 586) - RET_TYPE@[586; 600) - THIN_ARROW@[586; 588) - WHITESPACE@[588; 589) - PATH_TYPE@[589; 600) - PATH@[589; 600) - PATH_SEGMENT@[589; 600) - NAME_REF@[589; 594) - IDENT@[589; 594) "Event" - TYPE_ARG_LIST@[594; 600) - L_ANGLE@[594; 595) - TYPE_ARG@[595; 599) - PATH_TYPE@[595; 599) - PATH@[595; 599) - PATH_SEGMENT@[595; 599) - NAME_REF@[595; 599) - IDENT@[595; 599) "Self" - R_ANGLE@[599; 600) + TYPE_BOUND_LIST@[581; 600) + TYPE_BOUND@[581; 600) + PATH_TYPE@[581; 600) + PATH@[581; 600) + PATH_SEGMENT@[581; 600) + NAME_REF@[581; 583) + IDENT@[581; 583) "Fn" + PARAM_LIST@[583; 585) + L_PAREN@[583; 584) + R_PAREN@[584; 585) + WHITESPACE@[585; 586) + RET_TYPE@[586; 600) + THIN_ARROW@[586; 588) + WHITESPACE@[588; 589) + PATH_TYPE@[589; 600) + PATH@[589; 600) + PATH_SEGMENT@[589; 600) + NAME_REF@[589; 594) + IDENT@[589; 594) "Event" + TYPE_ARG_LIST@[594; 600) + L_ANGLE@[594; 595) + TYPE_ARG@[595; 599) + PATH_TYPE@[595; 599) + PATH@[595; 599) + PATH_SEGMENT@[595; 599) + NAME_REF@[595; 599) + IDENT@[595; 599) "Self" + R_ANGLE@[599; 600) R_PAREN@[600; 601) WHITESPACE@[601; 602) BLOCK@[602; 683) -- cgit v1.2.3 From e3f9d6555beec6fb4bebf6aef3e983149f7aee3a Mon Sep 17 00:00:00 2001 From: Ville Penttinen Date: Sat, 30 Mar 2019 17:23:54 +0200 Subject: Move parsing a single TYPE_BOUND to a separate function --- crates/ra_parser/src/grammar/type_params.rs | 45 +++++++++++++++++------------ 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/crates/ra_parser/src/grammar/type_params.rs b/crates/ra_parser/src/grammar/type_params.rs index e28c124cd..01175c0a3 100644 --- a/crates/ra_parser/src/grammar/type_params.rs +++ b/crates/ra_parser/src/grammar/type_params.rs @@ -80,29 +80,36 @@ fn lifetime_bounds(p: &mut Parser) { } pub(super) fn bounds_without_colon(p: &mut Parser) { - let outer = p.start(); - loop { - let inner = p.start(); - let has_paren = p.eat(L_PAREN); - p.eat(QUESTION); - match p.current() { - LIFETIME => p.bump(), - FOR_KW => types::for_type(p), - _ if paths::is_path_start(p) => types::path_type_(p, false), - _ => { - inner.abandon(p); - break; - } - } - if has_paren { - p.expect(R_PAREN); - } - inner.complete(p, TYPE_BOUND); + let m = p.start(); + + while type_bound(p) { if !p.eat(PLUS) { break; } } - outer.complete(p, TYPE_BOUND_LIST); + + m.complete(p, TYPE_BOUND_LIST); +} + +fn type_bound(p: &mut Parser) -> bool { + let m = p.start(); + let has_paren = p.eat(L_PAREN); + p.eat(QUESTION); + match p.current() { + LIFETIME => p.bump(), + FOR_KW => types::for_type(p), + _ if paths::is_path_start(p) => types::path_type_(p, false), + _ => { + m.abandon(p); + return false; + } + } + if has_paren { + p.expect(R_PAREN); + } + m.complete(p, TYPE_BOUND); + + true } // test where_clause -- cgit v1.2.3 From 98cff6ecec1b0af2cb9cead544526a0dbf2760f5 Mon Sep 17 00:00:00 2001 From: Ville Penttinen Date: Sun, 31 Mar 2019 10:35:55 +0300 Subject: Change parsing bounds in path_types Now bounds inside a path are parsed as DYN_TRAIT_TYPE, previously they would be parsed as `PATH_TYPE` followed by `TYPE_BOUND_LIST`. Basically this means `Box` is now parsed almost the same as `Box` with the exception of not having the `dyn` keyword. --- crates/ra_parser/src/grammar/type_params.rs | 11 +++++--- crates/ra_parser/src/grammar/types.rs | 40 ++++++++++++++++++++++++----- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/crates/ra_parser/src/grammar/type_params.rs b/crates/ra_parser/src/grammar/type_params.rs index 01175c0a3..42763fc87 100644 --- a/crates/ra_parser/src/grammar/type_params.rs +++ b/crates/ra_parser/src/grammar/type_params.rs @@ -79,16 +79,19 @@ fn lifetime_bounds(p: &mut Parser) { } } -pub(super) fn bounds_without_colon(p: &mut Parser) { - let m = p.start(); - +pub(super) fn bounds_without_colon_m(p: &mut Parser, marker: Marker) -> CompletedMarker { while type_bound(p) { if !p.eat(PLUS) { break; } } - m.complete(p, TYPE_BOUND_LIST); + marker.complete(p, TYPE_BOUND_LIST) +} + +pub(super) fn bounds_without_colon(p: &mut Parser) { + let m = p.start(); + bounds_without_colon_m(p, m); } fn type_bound(p: &mut Parser) -> bool { diff --git a/crates/ra_parser/src/grammar/types.rs b/crates/ra_parser/src/grammar/types.rs index fdd4f2c52..a46da9b44 100644 --- a/crates/ra_parser/src/grammar/types.rs +++ b/crates/ra_parser/src/grammar/types.rs @@ -261,21 +261,47 @@ fn path_or_macro_type_(p: &mut Parser, allow_bounds: bool) { PATH_TYPE }; - if allow_bounds && p.eat(PLUS) { - type_params::bounds_without_colon(p); - } + let path = m.complete(p, kind); - m.complete(p, kind); + if allow_bounds { + opt_path_type_bounds_as_dyn_trait_type(p, path); + } } pub(super) fn path_type_(p: &mut Parser, allow_bounds: bool) { assert!(paths::is_path_start(p) || p.at(L_ANGLE)); let m = p.start(); paths::type_path(p); + // test path_type_with_bounds // fn foo() -> Box {} - if allow_bounds && p.eat(PLUS) { - type_params::bounds_without_colon(p); + // fn foo() -> Box {} + let path = m.complete(p, PATH_TYPE); + if allow_bounds { + opt_path_type_bounds_as_dyn_trait_type(p, path); } - m.complete(p, PATH_TYPE); +} + +/// This turns a parsed PATH_TYPE optionally into a DYN_TRAIT_TYPE +/// with a TYPE_BOUND_LIST +fn opt_path_type_bounds_as_dyn_trait_type(p: &mut Parser, path_type_marker: CompletedMarker) { + if !p.at(PLUS) { + return; + } + + // First create a TYPE_BOUND from the completed PATH_TYPE + let m = path_type_marker.precede(p).complete(p, TYPE_BOUND); + + // Next setup a marker for the TYPE_BOUND_LIST + let m = m.precede(p); + + // This gets consumed here so it gets properly set + // in the TYPE_BOUND_LIST + p.eat(PLUS); + + // Parse rest of the bounds into the TYPE_BOUND_LIST + let m = type_params::bounds_without_colon_m(p, m); + + // Finally precede everything with DYN_TRAIT_TYPE + m.precede(p).complete(p, DYN_TRAIT_TYPE); } -- cgit v1.2.3 From 245c0d85840b3ef6e969e1a6786bdfb5285b0cea Mon Sep 17 00:00:00 2001 From: Ville Penttinen Date: Sun, 31 Mar 2019 10:39:23 +0300 Subject: Update tests --- .../data/parser/err/0024_many_type_parens.txt | 118 +++++++++++---------- .../parser/inline/ok/0048_path_type_with_bounds.rs | 1 + .../inline/ok/0048_path_type_with_bounds.txt | 63 +++++++++-- 3 files changed, 115 insertions(+), 67 deletions(-) diff --git a/crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.txt b/crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.txt index b353a5383..45fa70593 100644 --- a/crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.txt +++ b/crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.txt @@ -84,28 +84,30 @@ SOURCE_FILE@[0; 240) UNDERSCORE@[75; 76) COLON@[76; 77) WHITESPACE@[77; 78) - PATH_TYPE@[78; 121) - PATH@[78; 88) - PATH_SEGMENT@[78; 88) - NAME_REF@[78; 81) - IDENT@[78; 81) "Box" - TYPE_ARG_LIST@[81; 88) - L_ANGLE@[81; 82) - TYPE_ARG@[82; 88) - PAREN_TYPE@[82; 88) - L_PAREN@[82; 83) - PATH_TYPE@[83; 87) - PATH@[83; 87) - PATH_SEGMENT@[83; 87) - NAME_REF@[83; 87) - IDENT@[83; 87) "Copy" - R_PAREN@[87; 88) - err: `expected COMMA` - err: `expected R_ANGLE` - WHITESPACE@[88; 89) - PLUS@[89; 90) - WHITESPACE@[90; 91) - TYPE_BOUND_LIST@[91; 121) + DYN_TRAIT_TYPE@[78; 121) + TYPE_BOUND_LIST@[78; 121) + TYPE_BOUND@[78; 88) + PATH_TYPE@[78; 88) + PATH@[78; 88) + PATH_SEGMENT@[78; 88) + NAME_REF@[78; 81) + IDENT@[78; 81) "Box" + TYPE_ARG_LIST@[81; 88) + L_ANGLE@[81; 82) + TYPE_ARG@[82; 88) + PAREN_TYPE@[82; 88) + L_PAREN@[82; 83) + PATH_TYPE@[83; 87) + PATH@[83; 87) + PATH_SEGMENT@[83; 87) + NAME_REF@[83; 87) + IDENT@[83; 87) "Copy" + R_PAREN@[87; 88) + err: `expected COMMA` + err: `expected R_ANGLE` + WHITESPACE@[88; 89) + PLUS@[89; 90) + WHITESPACE@[90; 91) TYPE_BOUND@[91; 99) L_PAREN@[91; 92) QUESTION@[92; 93) @@ -254,41 +256,43 @@ SOURCE_FILE@[0; 240) UNDERSCORE@[189; 190) COLON@[190; 191) WHITESPACE@[191; 192) - PATH_TYPE@[192; 235) - PATH@[192; 215) - PATH_SEGMENT@[192; 215) - NAME_REF@[192; 195) - IDENT@[192; 195) "Box" - TYPE_ARG_LIST@[195; 215) - L_ANGLE@[195; 196) - TYPE_ARG@[196; 215) - PAREN_TYPE@[196; 215) - L_PAREN@[196; 197) - FOR_TYPE@[197; 214) - FOR_KW@[197; 200) - TYPE_PARAM_LIST@[200; 204) - L_ANGLE@[200; 201) - LIFETIME_PARAM@[201; 203) - LIFETIME@[201; 203) "'a" - R_ANGLE@[203; 204) - WHITESPACE@[204; 205) - PATH_TYPE@[205; 214) - PATH@[205; 214) - PATH_SEGMENT@[205; 214) - NAME_REF@[205; 210) - IDENT@[205; 210) "Trait" - TYPE_ARG_LIST@[210; 214) - L_ANGLE@[210; 211) - LIFETIME_ARG@[211; 213) - LIFETIME@[211; 213) "'a" - R_ANGLE@[213; 214) - R_PAREN@[214; 215) - err: `expected COMMA` - err: `expected R_ANGLE` - WHITESPACE@[215; 216) - PLUS@[216; 217) - WHITESPACE@[217; 218) - TYPE_BOUND_LIST@[218; 235) + DYN_TRAIT_TYPE@[192; 235) + TYPE_BOUND_LIST@[192; 235) + TYPE_BOUND@[192; 215) + PATH_TYPE@[192; 215) + PATH@[192; 215) + PATH_SEGMENT@[192; 215) + NAME_REF@[192; 195) + IDENT@[192; 195) "Box" + TYPE_ARG_LIST@[195; 215) + L_ANGLE@[195; 196) + TYPE_ARG@[196; 215) + PAREN_TYPE@[196; 215) + L_PAREN@[196; 197) + FOR_TYPE@[197; 214) + FOR_KW@[197; 200) + TYPE_PARAM_LIST@[200; 204) + L_ANGLE@[200; 201) + LIFETIME_PARAM@[201; 203) + LIFETIME@[201; 203) "'a" + R_ANGLE@[203; 204) + WHITESPACE@[204; 205) + PATH_TYPE@[205; 214) + PATH@[205; 214) + PATH_SEGMENT@[205; 214) + NAME_REF@[205; 210) + IDENT@[205; 210) "Trait" + TYPE_ARG_LIST@[210; 214) + L_ANGLE@[210; 211) + LIFETIME_ARG@[211; 213) + LIFETIME@[211; 213) "'a" + R_ANGLE@[213; 214) + R_PAREN@[214; 215) + err: `expected COMMA` + err: `expected R_ANGLE` + WHITESPACE@[215; 216) + PLUS@[216; 217) + WHITESPACE@[217; 218) TYPE_BOUND@[218; 224) L_PAREN@[218; 219) PATH_TYPE@[219; 223) diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0048_path_type_with_bounds.rs b/crates/ra_syntax/tests/data/parser/inline/ok/0048_path_type_with_bounds.rs index 215210e27..4bb0f63b7 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0048_path_type_with_bounds.rs +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0048_path_type_with_bounds.rs @@ -1 +1,2 @@ fn foo() -> Box {} +fn foo() -> Box {} diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0048_path_type_with_bounds.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0048_path_type_with_bounds.txt index a0110f555..6faf4d3b9 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0048_path_type_with_bounds.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0048_path_type_with_bounds.txt @@ -1,4 +1,4 @@ -SOURCE_FILE@[0; 27) +SOURCE_FILE@[0; 58) FN_DEF@[0; 26) FN_KW@[0; 2) WHITESPACE@[2; 3) @@ -19,15 +19,17 @@ SOURCE_FILE@[0; 27) TYPE_ARG_LIST@[15; 23) L_ANGLE@[15; 16) TYPE_ARG@[16; 22) - PATH_TYPE@[16; 22) - PATH@[16; 17) - PATH_SEGMENT@[16; 17) - NAME_REF@[16; 17) - IDENT@[16; 17) "T" - WHITESPACE@[17; 18) - PLUS@[18; 19) - WHITESPACE@[19; 20) - TYPE_BOUND_LIST@[20; 22) + DYN_TRAIT_TYPE@[16; 22) + TYPE_BOUND_LIST@[16; 22) + TYPE_BOUND@[16; 17) + PATH_TYPE@[16; 17) + PATH@[16; 17) + PATH_SEGMENT@[16; 17) + NAME_REF@[16; 17) + IDENT@[16; 17) "T" + WHITESPACE@[17; 18) + PLUS@[18; 19) + WHITESPACE@[19; 20) TYPE_BOUND@[20; 22) LIFETIME@[20; 22) "'f" R_ANGLE@[22; 23) @@ -36,3 +38,44 @@ SOURCE_FILE@[0; 27) L_CURLY@[24; 25) R_CURLY@[25; 26) WHITESPACE@[26; 27) + FN_DEF@[27; 57) + FN_KW@[27; 29) + WHITESPACE@[29; 30) + NAME@[30; 33) + IDENT@[30; 33) "foo" + PARAM_LIST@[33; 35) + L_PAREN@[33; 34) + R_PAREN@[34; 35) + WHITESPACE@[35; 36) + RET_TYPE@[36; 54) + THIN_ARROW@[36; 38) + WHITESPACE@[38; 39) + PATH_TYPE@[39; 54) + PATH@[39; 54) + PATH_SEGMENT@[39; 54) + NAME_REF@[39; 42) + IDENT@[39; 42) "Box" + TYPE_ARG_LIST@[42; 54) + L_ANGLE@[42; 43) + TYPE_ARG@[43; 53) + DYN_TRAIT_TYPE@[43; 53) + DYN_KW@[43; 46) + WHITESPACE@[46; 47) + TYPE_BOUND_LIST@[47; 53) + TYPE_BOUND@[47; 48) + PATH_TYPE@[47; 48) + PATH@[47; 48) + PATH_SEGMENT@[47; 48) + NAME_REF@[47; 48) + IDENT@[47; 48) "T" + WHITESPACE@[48; 49) + PLUS@[49; 50) + WHITESPACE@[50; 51) + TYPE_BOUND@[51; 53) + LIFETIME@[51; 53) "'f" + R_ANGLE@[53; 54) + WHITESPACE@[54; 55) + BLOCK@[55; 57) + L_CURLY@[55; 56) + R_CURLY@[56; 57) + WHITESPACE@[57; 58) -- cgit v1.2.3 From 55dcdb7d094f473c73f87ecf997b24f8e35f2a5e Mon Sep 17 00:00:00 2001 From: Ville Penttinen Date: Sun, 31 Mar 2019 10:56:48 +0300 Subject: Add trait ast::TypeBoundsOwner --- crates/ra_syntax/src/ast.rs | 6 ++++++ crates/ra_syntax/src/ast/generated.rs | 5 +++++ crates/ra_syntax/src/grammar.ron | 15 ++++++++++----- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/crates/ra_syntax/src/ast.rs b/crates/ra_syntax/src/ast.rs index a6fac07c4..4fddc00ea 100644 --- a/crates/ra_syntax/src/ast.rs +++ b/crates/ra_syntax/src/ast.rs @@ -110,6 +110,12 @@ pub trait TypeParamsOwner: AstNode { } } +pub trait TypeBoundsOwner: AstNode { + fn type_bound_list(&self) -> Option<&TypeBoundList> { + child_opt(self) + } +} + pub trait AttrsOwner: AstNode { fn attrs(&self) -> AstChildren { children(self) diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index faf80bc32..9ea423b40 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs @@ -685,6 +685,7 @@ impl ToOwned for DynTraitType { } +impl ast::TypeBoundsOwner for DynTraitType {} impl DynTraitType {} // EnumDef @@ -1581,6 +1582,7 @@ impl ToOwned for ImplTraitType { } +impl ast::TypeBoundsOwner for ImplTraitType {} impl ImplTraitType {} // IndexExpr @@ -4061,6 +4063,7 @@ impl ast::NameOwner for TraitDef {} impl ast::AttrsOwner for TraitDef {} impl ast::DocCommentsOwner for TraitDef {} impl ast::TypeParamsOwner for TraitDef {} +impl ast::TypeBoundsOwner for TraitDef {} impl TraitDef { pub fn item_list(&self) -> Option<&ItemList> { super::child_opt(self) @@ -4291,6 +4294,7 @@ impl ast::NameOwner for TypeAliasDef {} impl ast::TypeParamsOwner for TypeAliasDef {} impl ast::AttrsOwner for TypeAliasDef {} impl ast::DocCommentsOwner for TypeAliasDef {} +impl ast::TypeBoundsOwner for TypeAliasDef {} impl TypeAliasDef { pub fn type_ref(&self) -> Option<&TypeRef> { super::child_opt(self) @@ -4465,6 +4469,7 @@ impl ToOwned for TypeParam { impl ast::NameOwner for TypeParam {} impl ast::AttrsOwner for TypeParam {} +impl ast::TypeBoundsOwner for TypeParam {} impl TypeParam {} // TypeParamList diff --git a/crates/ra_syntax/src/grammar.ron b/crates/ra_syntax/src/grammar.ron index 660a2b207..18730a894 100644 --- a/crates/ra_syntax/src/grammar.ron +++ b/crates/ra_syntax/src/grammar.ron @@ -295,7 +295,7 @@ Grammar( "EnumVariantList": ( collections: [["variants", "EnumVariant"]] ), "EnumVariant": ( traits: ["NameOwner", "DocCommentsOwner", "AttrsOwner"], options: ["Expr"] ), "TraitDef": ( - traits: ["VisibilityOwner", "NameOwner", "AttrsOwner", "DocCommentsOwner", "TypeParamsOwner"], + traits: ["VisibilityOwner", "NameOwner", "AttrsOwner", "DocCommentsOwner", "TypeParamsOwner", "TypeBoundsOwner"], options: ["ItemList"] ), "Module": ( @@ -332,7 +332,8 @@ Grammar( "NameOwner", "TypeParamsOwner", "AttrsOwner", - "DocCommentsOwner" + "DocCommentsOwner", + "TypeBoundsOwner", ], options: ["TypeRef"] ), @@ -349,8 +350,12 @@ Grammar( "PlaceholderType": (), "FnPointerType": (options: ["ParamList", "RetType"]), "ForType": (options: ["TypeRef"]), - "ImplTraitType": (), - "DynTraitType": (), + "ImplTraitType": ( + traits: ["TypeBoundsOwner"], + ), + "DynTraitType": ( + traits: ["TypeBoundsOwner"], + ), "TypeRef": ( enum: [ "ParenType", @@ -573,7 +578,7 @@ Grammar( ["lifetime_params", "LifetimeParam" ], ] ), - "TypeParam": ( traits: ["NameOwner", "AttrsOwner"] ), + "TypeParam": ( traits: ["NameOwner", "AttrsOwner", "TypeBoundsOwner"] ), "LifetimeParam": ( options: [ "Lifetime"], traits: ["AttrsOwner"], -- cgit v1.2.3