From f1e62501c3de7932396d29c89588ff296bbcc50d Mon Sep 17 00:00:00 2001 From: Evgenii P Date: Sun, 11 Aug 2019 16:56:05 +0700 Subject: Fix for<'lifetime> for types specified by path --- crates/ra_parser/src/grammar/types.rs | 3 +- .../test_data/parser/inline/ok/0081_for_type.rs | 1 + .../test_data/parser/inline/ok/0081_for_type.txt | 83 +++++++++++++++++++++- 3 files changed, 85 insertions(+), 2 deletions(-) (limited to 'crates') diff --git a/crates/ra_parser/src/grammar/types.rs b/crates/ra_parser/src/grammar/types.rs index c0b722569..9acc00793 100644 --- a/crates/ra_parser/src/grammar/types.rs +++ b/crates/ra_parser/src/grammar/types.rs @@ -205,6 +205,7 @@ pub(super) fn for_binder(p: &mut Parser) { // type A = for<'a> fn() -> (); // fn foo(_t: &T) where for<'a> &'a T: Iterator {} // fn bar(_t: &T) where for<'a> &'a mut T: Iterator {} +// fn baz(_t: &T) where for<'a> <&'a T as Baz>::Foo: Iterator {} pub(super) fn for_type(p: &mut Parser) { assert!(p.at(T![for])); let m = p.start(); @@ -212,7 +213,7 @@ pub(super) fn for_type(p: &mut Parser) { match p.current() { T![fn] | T![unsafe] | T![extern] => fn_pointer_type(p), T![&] => reference_type(p), - _ if paths::is_path_start(p) => path_type_(p, false), + _ if paths::is_path_start(p) || p.at(T![<]) => path_type_(p, false), _ => p.error("expected a path"), } m.complete(p, FOR_TYPE); diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0081_for_type.rs b/crates/ra_syntax/test_data/parser/inline/ok/0081_for_type.rs index 7cde5c532..d6774d438 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0081_for_type.rs +++ b/crates/ra_syntax/test_data/parser/inline/ok/0081_for_type.rs @@ -1,3 +1,4 @@ type A = for<'a> fn() -> (); fn foo(_t: &T) where for<'a> &'a T: Iterator {} fn bar(_t: &T) where for<'a> &'a mut T: Iterator {} +fn baz(_t: &T) where for<'a> <&'a T as Baz>::Foo: Iterator {} diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0081_for_type.txt b/crates/ra_syntax/test_data/parser/inline/ok/0081_for_type.txt index 599cf9452..c12ce4ddb 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0081_for_type.txt +++ b/crates/ra_syntax/test_data/parser/inline/ok/0081_for_type.txt @@ -1,4 +1,4 @@ -SOURCE_FILE@[0; 135) +SOURCE_FILE@[0; 200) TYPE_ALIAS_DEF@[0; 28) TYPE_KW@[0; 4) "type" WHITESPACE@[4; 5) " " @@ -157,3 +157,84 @@ SOURCE_FILE@[0; 135) L_CURLY@[132; 133) "{" R_CURLY@[133; 134) "}" WHITESPACE@[134; 135) "\n" + FN_DEF@[135; 199) + FN_KW@[135; 137) "fn" + WHITESPACE@[137; 138) " " + NAME@[138; 141) + IDENT@[138; 141) "baz" + TYPE_PARAM_LIST@[141; 144) + L_ANGLE@[141; 142) "<" + TYPE_PARAM@[142; 143) + NAME@[142; 143) + IDENT@[142; 143) "T" + R_ANGLE@[143; 144) ">" + PARAM_LIST@[144; 152) + L_PAREN@[144; 145) "(" + PARAM@[145; 151) + BIND_PAT@[145; 147) + NAME@[145; 147) + IDENT@[145; 147) "_t" + COLON@[147; 148) ":" + WHITESPACE@[148; 149) " " + REFERENCE_TYPE@[149; 151) + AMP@[149; 150) "&" + PATH_TYPE@[150; 151) + PATH@[150; 151) + PATH_SEGMENT@[150; 151) + NAME_REF@[150; 151) + IDENT@[150; 151) "T" + R_PAREN@[151; 152) ")" + WHITESPACE@[152; 153) " " + WHERE_CLAUSE@[153; 196) + WHERE_KW@[153; 158) "where" + WHITESPACE@[158; 159) " " + WHERE_PRED@[159; 196) + FOR_TYPE@[159; 186) + FOR_KW@[159; 162) "for" + TYPE_PARAM_LIST@[162; 166) + L_ANGLE@[162; 163) "<" + LIFETIME_PARAM@[163; 165) + LIFETIME@[163; 165) "\'a" + R_ANGLE@[165; 166) ">" + WHITESPACE@[166; 167) " " + PATH_TYPE@[167; 186) + PATH@[167; 186) + PATH@[167; 181) + PATH_SEGMENT@[167; 181) + L_ANGLE@[167; 168) "<" + REFERENCE_TYPE@[168; 173) + AMP@[168; 169) "&" + LIFETIME@[169; 171) "\'a" + WHITESPACE@[171; 172) " " + PATH_TYPE@[172; 173) + PATH@[172; 173) + PATH_SEGMENT@[172; 173) + NAME_REF@[172; 173) + IDENT@[172; 173) "T" + WHITESPACE@[173; 174) " " + AS_KW@[174; 176) "as" + WHITESPACE@[176; 177) " " + PATH_TYPE@[177; 180) + PATH@[177; 180) + PATH_SEGMENT@[177; 180) + NAME_REF@[177; 180) + IDENT@[177; 180) "Baz" + R_ANGLE@[180; 181) ">" + COLONCOLON@[181; 183) "::" + PATH_SEGMENT@[183; 186) + NAME_REF@[183; 186) + IDENT@[183; 186) "Foo" + COLON@[186; 187) ":" + WHITESPACE@[187; 188) " " + TYPE_BOUND_LIST@[188; 196) + TYPE_BOUND@[188; 196) + PATH_TYPE@[188; 196) + PATH@[188; 196) + PATH_SEGMENT@[188; 196) + NAME_REF@[188; 196) + IDENT@[188; 196) "Iterator" + WHITESPACE@[196; 197) " " + BLOCK@[197; 199) + L_CURLY@[197; 198) "{" + R_CURLY@[198; 199) "}" + WHITESPACE@[199; 200) "\n" -- cgit v1.2.3