aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_syntax')
-rw-r--r--crates/ra_syntax/src/ast.rs6
-rw-r--r--crates/ra_syntax/src/ast/generated/nodes.rs2
-rw-r--r--crates/ra_syntax/test_data/parser/err/0027_incomplere_where_for.rast15
-rw-r--r--crates/ra_syntax/test_data/parser/err/0044_unexpected_for_type.rast240
-rw-r--r--crates/ra_syntax/test_data/parser/err/0044_unexpected_for_type.rs9
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0003_where_pred_for.rast117
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0003_where_pred_for.rs2
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0081_for_type.rast292
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0081_for_type.rs5
-rw-r--r--crates/ra_syntax/test_data/parser/ok/0067_where_for_pred.rast392
-rw-r--r--crates/ra_syntax/test_data/parser/ok/0067_where_for_pred.rs30
11 files changed, 828 insertions, 282 deletions
diff --git a/crates/ra_syntax/src/ast.rs b/crates/ra_syntax/src/ast.rs
index eddc807d5..9d02aeef3 100644
--- a/crates/ra_syntax/src/ast.rs
+++ b/crates/ra_syntax/src/ast.rs
@@ -285,6 +285,8 @@ where
285 let pred = predicates.next().unwrap(); 285 let pred = predicates.next().unwrap();
286 let mut bounds = pred.type_bound_list().unwrap().bounds(); 286 let mut bounds = pred.type_bound_list().unwrap().bounds();
287 287
288 assert!(pred.for_token().is_none());
289 assert!(pred.type_param_list().is_none());
288 assert_eq!("T", pred.type_ref().unwrap().syntax().text().to_string()); 290 assert_eq!("T", pred.type_ref().unwrap().syntax().text().to_string());
289 assert_bound("Clone", bounds.next()); 291 assert_bound("Clone", bounds.next());
290 assert_bound("Copy", bounds.next()); 292 assert_bound("Copy", bounds.next());
@@ -322,6 +324,8 @@ where
322 let pred = predicates.next().unwrap(); 324 let pred = predicates.next().unwrap();
323 let mut bounds = pred.type_bound_list().unwrap().bounds(); 325 let mut bounds = pred.type_bound_list().unwrap().bounds();
324 326
325 assert_eq!("for<'a> F", pred.type_ref().unwrap().syntax().text().to_string()); 327 assert!(pred.for_token().is_some());
328 assert_eq!("<'a>", pred.type_param_list().unwrap().syntax().text().to_string());
329 assert_eq!("F", pred.type_ref().unwrap().syntax().text().to_string());
326 assert_bound("Fn(&'a str)", bounds.next()); 330 assert_bound("Fn(&'a str)", bounds.next());
327} 331}
diff --git a/crates/ra_syntax/src/ast/generated/nodes.rs b/crates/ra_syntax/src/ast/generated/nodes.rs
index cb430ca01..40081ebb1 100644
--- a/crates/ra_syntax/src/ast/generated/nodes.rs
+++ b/crates/ra_syntax/src/ast/generated/nodes.rs
@@ -2052,6 +2052,8 @@ pub struct WherePred {
2052} 2052}
2053impl ast::TypeBoundsOwner for WherePred {} 2053impl ast::TypeBoundsOwner for WherePred {}
2054impl WherePred { 2054impl WherePred {
2055 pub fn for_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![for]) }
2056 pub fn type_param_list(&self) -> Option<TypeParamList> { support::child(&self.syntax) }
2055 pub fn lifetime_token(&self) -> Option<SyntaxToken> { 2057 pub fn lifetime_token(&self) -> Option<SyntaxToken> {
2056 support::token(&self.syntax, T![lifetime]) 2058 support::token(&self.syntax, T![lifetime])
2057 } 2059 }
diff --git a/crates/ra_syntax/test_data/parser/err/0027_incomplere_where_for.rast b/crates/ra_syntax/test_data/parser/err/0027_incomplere_where_for.rast
index 568a4cc02..4d6461d1e 100644
--- a/crates/ra_syntax/test_data/parser/err/0027_incomplere_where_for.rast
+++ b/crates/ra_syntax/test_data/parser/err/0027_incomplere_where_for.rast
@@ -12,17 +12,16 @@ SOURCE_FILE@0..30
12 WHERE_KW@13..18 "where" 12 WHERE_KW@13..18 "where"
13 WHITESPACE@18..19 " " 13 WHITESPACE@18..19 " "
14 WHERE_PRED@19..26 14 WHERE_PRED@19..26
15 FOR_TYPE@19..26 15 FOR_KW@19..22 "for"
16 FOR_KW@19..22 "for" 16 TYPE_PARAM_LIST@22..26
17 TYPE_PARAM_LIST@22..26 17 L_ANGLE@22..23 "<"
18 L_ANGLE@22..23 "<" 18 LIFETIME_PARAM@23..25
19 LIFETIME_PARAM@23..25 19 LIFETIME@23..25 "\'a"
20 LIFETIME@23..25 "\'a" 20 R_ANGLE@25..26 ">"
21 R_ANGLE@25..26 ">"
22 WHITESPACE@26..27 "\n" 21 WHITESPACE@26..27 "\n"
23 BLOCK_EXPR@27..29 22 BLOCK_EXPR@27..29
24 L_CURLY@27..28 "{" 23 L_CURLY@27..28 "{"
25 R_CURLY@28..29 "}" 24 R_CURLY@28..29 "}"
26 WHITESPACE@29..30 "\n" 25 WHITESPACE@29..30 "\n"
27error 26..26: expected a path 26error 26..26: expected type
28error 26..26: expected colon 27error 26..26: expected colon
diff --git a/crates/ra_syntax/test_data/parser/err/0044_unexpected_for_type.rast b/crates/ra_syntax/test_data/parser/err/0044_unexpected_for_type.rast
new file mode 100644
index 000000000..cb90f28bc
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/err/0044_unexpected_for_type.rast
@@ -0,0 +1,240 @@
1SOURCE_FILE@0..239
2 TYPE_ALIAS_DEF@0..30
3 TYPE_KW@0..4 "type"
4 WHITESPACE@4..5 " "
5 NAME@5..11
6 IDENT@5..11 "ForRef"
7 WHITESPACE@11..12 " "
8 EQ@12..13 "="
9 WHITESPACE@13..14 " "
10 FOR_TYPE@14..29
11 FOR_KW@14..17 "for"
12 TYPE_PARAM_LIST@17..21
13 L_ANGLE@17..18 "<"
14 LIFETIME_PARAM@18..20
15 LIFETIME@18..20 "\'a"
16 R_ANGLE@20..21 ">"
17 WHITESPACE@21..22 " "
18 REFERENCE_TYPE@22..29
19 AMP@22..23 "&"
20 LIFETIME@23..25 "\'a"
21 WHITESPACE@25..26 " "
22 PATH_TYPE@26..29
23 PATH@26..29
24 PATH_SEGMENT@26..29
25 NAME_REF@26..29
26 IDENT@26..29 "u32"
27 SEMICOLON@29..30 ";"
28 WHITESPACE@30..31 "\n"
29 TYPE_ALIAS_DEF@31..64
30 TYPE_KW@31..35 "type"
31 WHITESPACE@35..36 " "
32 NAME@36..42
33 IDENT@36..42 "ForTup"
34 WHITESPACE@42..43 " "
35 EQ@43..44 "="
36 WHITESPACE@44..45 " "
37 FOR_TYPE@45..63
38 FOR_KW@45..48 "for"
39 TYPE_PARAM_LIST@48..52
40 L_ANGLE@48..49 "<"
41 LIFETIME_PARAM@49..51
42 LIFETIME@49..51 "\'a"
43 R_ANGLE@51..52 ">"
44 WHITESPACE@52..53 " "
45 TUPLE_TYPE@53..63
46 L_PAREN@53..54 "("
47 REFERENCE_TYPE@54..61
48 AMP@54..55 "&"
49 LIFETIME@55..57 "\'a"
50 WHITESPACE@57..58 " "
51 PATH_TYPE@58..61
52 PATH@58..61
53 PATH_SEGMENT@58..61
54 NAME_REF@58..61
55 IDENT@58..61 "u32"
56 COMMA@61..62 ","
57 R_PAREN@62..63 ")"
58 SEMICOLON@63..64 ";"
59 WHITESPACE@64..65 "\n"
60 TYPE_ALIAS_DEF@65..95
61 TYPE_KW@65..69 "type"
62 WHITESPACE@69..70 " "
63 NAME@70..78
64 IDENT@70..78 "ForSlice"
65 WHITESPACE@78..79 " "
66 EQ@79..80 "="
67 WHITESPACE@80..81 " "
68 FOR_TYPE@81..94
69 FOR_KW@81..84 "for"
70 TYPE_PARAM_LIST@84..88
71 L_ANGLE@84..85 "<"
72 LIFETIME_PARAM@85..87
73 LIFETIME@85..87 "\'a"
74 R_ANGLE@87..88 ">"
75 WHITESPACE@88..89 " "
76 SLICE_TYPE@89..94
77 L_BRACK@89..90 "["
78 PATH_TYPE@90..93
79 PATH@90..93
80 PATH_SEGMENT@90..93
81 NAME_REF@90..93
82 IDENT@90..93 "u32"
83 R_BRACK@93..94 "]"
84 SEMICOLON@94..95 ";"
85 WHITESPACE@95..96 "\n"
86 TYPE_ALIAS_DEF@96..149
87 TYPE_KW@96..100 "type"
88 WHITESPACE@100..101 " "
89 NAME@101..109
90 IDENT@101..109 "ForForFn"
91 WHITESPACE@109..110 " "
92 EQ@110..111 "="
93 WHITESPACE@111..112 " "
94 FOR_TYPE@112..148
95 FOR_KW@112..115 "for"
96 TYPE_PARAM_LIST@115..119
97 L_ANGLE@115..116 "<"
98 LIFETIME_PARAM@116..118
99 LIFETIME@116..118 "\'a"
100 R_ANGLE@118..119 ">"
101 WHITESPACE@119..120 " "
102 FOR_TYPE@120..148
103 FOR_KW@120..123 "for"
104 TYPE_PARAM_LIST@123..127
105 L_ANGLE@123..124 "<"
106 LIFETIME_PARAM@124..126
107 LIFETIME@124..126 "\'b"
108 R_ANGLE@126..127 ">"
109 WHITESPACE@127..128 " "
110 FN_POINTER_TYPE@128..148
111 FN_KW@128..130 "fn"
112 PARAM_LIST@130..148
113 L_PAREN@130..131 "("
114 PARAM@131..138
115 REFERENCE_TYPE@131..138
116 AMP@131..132 "&"
117 LIFETIME@132..134 "\'a"
118 WHITESPACE@134..135 " "
119 PATH_TYPE@135..138
120 PATH@135..138
121 PATH_SEGMENT@135..138
122 NAME_REF@135..138
123 IDENT@135..138 "i32"
124 COMMA@138..139 ","
125 WHITESPACE@139..140 " "
126 PARAM@140..147
127 REFERENCE_TYPE@140..147
128 AMP@140..141 "&"
129 LIFETIME@141..143 "\'b"
130 WHITESPACE@143..144 " "
131 PATH_TYPE@144..147
132 PATH@144..147
133 PATH_SEGMENT@144..147
134 NAME_REF@144..147
135 IDENT@144..147 "i32"
136 R_PAREN@147..148 ")"
137 SEMICOLON@148..149 ";"
138 WHITESPACE@149..150 "\n"
139 FN_DEF@150..238
140 FN_KW@150..152 "fn"
141 WHITESPACE@152..153 " "
142 NAME@153..164
143 IDENT@153..164 "for_for_for"
144 TYPE_PARAM_LIST@164..167
145 L_ANGLE@164..165 "<"
146 TYPE_PARAM@165..166
147 NAME@165..166
148 IDENT@165..166 "T"
149 R_ANGLE@166..167 ">"
150 PARAM_LIST@167..169
151 L_PAREN@167..168 "("
152 R_PAREN@168..169 ")"
153 WHITESPACE@169..170 "\n"
154 WHERE_CLAUSE@170..234
155 WHERE_KW@170..175 "where"
156 WHITESPACE@175..180 "\n "
157 WHERE_PRED@180..233
158 FOR_KW@180..183 "for"
159 TYPE_PARAM_LIST@183..187
160 L_ANGLE@183..184 "<"
161 LIFETIME_PARAM@184..186
162 LIFETIME@184..186 "\'a"
163 R_ANGLE@186..187 ">"
164 WHITESPACE@187..188 " "
165 FOR_TYPE@188..227
166 FOR_KW@188..191 "for"
167 TYPE_PARAM_LIST@191..195
168 L_ANGLE@191..192 "<"
169 LIFETIME_PARAM@192..194
170 LIFETIME@192..194 "\'b"
171 R_ANGLE@194..195 ">"
172 WHITESPACE@195..196 " "
173 FOR_TYPE@196..227
174 FOR_KW@196..199 "for"
175 TYPE_PARAM_LIST@199..203
176 L_ANGLE@199..200 "<"
177 LIFETIME_PARAM@200..202
178 LIFETIME@200..202 "\'c"
179 R_ANGLE@202..203 ">"
180 WHITESPACE@203..204 " "
181 FN_POINTER_TYPE@204..227
182 FN_KW@204..206 "fn"
183 PARAM_LIST@206..227
184 L_PAREN@206..207 "("
185 PARAM@207..212
186 REFERENCE_TYPE@207..212
187 AMP@207..208 "&"
188 LIFETIME@208..210 "\'a"
189 WHITESPACE@210..211 " "
190 PATH_TYPE@211..212
191 PATH@211..212
192 PATH_SEGMENT@211..212
193 NAME_REF@211..212
194 IDENT@211..212 "T"
195 COMMA@212..213 ","
196 WHITESPACE@213..214 " "
197 PARAM@214..219
198 REFERENCE_TYPE@214..219
199 AMP@214..215 "&"
200 LIFETIME@215..217 "\'b"
201 WHITESPACE@217..218 " "
202 PATH_TYPE@218..219
203 PATH@218..219
204 PATH_SEGMENT@218..219
205 NAME_REF@218..219
206 IDENT@218..219 "T"
207 COMMA@219..220 ","
208 WHITESPACE@220..221 " "
209 PARAM@221..226
210 REFERENCE_TYPE@221..226
211 AMP@221..222 "&"
212 LIFETIME@222..224 "\'c"
213 WHITESPACE@224..225 " "
214 PATH_TYPE@225..226
215 PATH@225..226
216 PATH_SEGMENT@225..226
217 NAME_REF@225..226
218 IDENT@225..226 "T"
219 R_PAREN@226..227 ")"
220 COLON@227..228 ":"
221 WHITESPACE@228..229 " "
222 TYPE_BOUND_LIST@229..233
223 TYPE_BOUND@229..233
224 PATH_TYPE@229..233
225 PATH@229..233
226 PATH_SEGMENT@229..233
227 NAME_REF@229..233
228 IDENT@229..233 "Copy"
229 COMMA@233..234 ","
230 WHITESPACE@234..235 "\n"
231 BLOCK_EXPR@235..238
232 L_CURLY@235..236 "{"
233 WHITESPACE@236..237 "\n"
234 R_CURLY@237..238 "}"
235 WHITESPACE@238..239 "\n"
236error 21..21: expected a function pointer or path
237error 52..52: expected a function pointer or path
238error 88..88: expected a function pointer or path
239error 119..119: expected a function pointer or path
240error 195..195: expected a function pointer or path
diff --git a/crates/ra_syntax/test_data/parser/err/0044_unexpected_for_type.rs b/crates/ra_syntax/test_data/parser/err/0044_unexpected_for_type.rs
new file mode 100644
index 000000000..0e9f8ccb4
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/err/0044_unexpected_for_type.rs
@@ -0,0 +1,9 @@
1type ForRef = for<'a> &'a u32;
2type ForTup = for<'a> (&'a u32,);
3type ForSlice = for<'a> [u32];
4type ForForFn = for<'a> for<'b> fn(&'a i32, &'b i32);
5fn for_for_for<T>()
6where
7 for<'a> for<'b> for<'c> fn(&'a T, &'b T, &'c T): Copy,
8{
9}
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0003_where_pred_for.rast b/crates/ra_syntax/test_data/parser/inline/ok/0003_where_pred_for.rast
index 9dc473e43..cd0892451 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0003_where_pred_for.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0003_where_pred_for.rast
@@ -1,61 +1,60 @@
1SOURCE_FILE@0..49 1SOURCE_FILE@0..54
2 FN_DEF@0..48 2 FN_DEF@0..53
3 FN_KW@0..2 "fn" 3 FN_KW@0..2 "fn"
4 WHITESPACE@2..3 " " 4 WHITESPACE@2..3 " "
5 NAME@3..7 5 NAME@3..12
6 IDENT@3..7 "test" 6 IDENT@3..12 "for_trait"
7 TYPE_PARAM_LIST@7..10 7 TYPE_PARAM_LIST@12..15
8 L_ANGLE@7..8 "<" 8 L_ANGLE@12..13 "<"
9 TYPE_PARAM@8..9 9 TYPE_PARAM@13..14
10 NAME@8..9 10 NAME@13..14
11 IDENT@8..9 "F" 11 IDENT@13..14 "F"
12 R_ANGLE@9..10 ">" 12 R_ANGLE@14..15 ">"
13 PARAM_LIST@10..12 13 PARAM_LIST@15..17
14 L_PAREN@10..11 "(" 14 L_PAREN@15..16 "("
15 R_PAREN@11..12 ")" 15 R_PAREN@16..17 ")"
16 WHITESPACE@12..13 "\n" 16 WHITESPACE@17..18 "\n"
17 WHERE_CLAUSE@13..44 17 WHERE_CLAUSE@18..49
18 WHERE_KW@13..18 "where" 18 WHERE_KW@18..23 "where"
19 WHITESPACE@18..22 "\n " 19 WHITESPACE@23..27 "\n "
20 WHERE_PRED@22..44 20 WHERE_PRED@27..49
21 FOR_TYPE@22..31 21 FOR_KW@27..30 "for"
22 FOR_KW@22..25 "for" 22 TYPE_PARAM_LIST@30..34
23 TYPE_PARAM_LIST@25..29 23 L_ANGLE@30..31 "<"
24 L_ANGLE@25..26 "<" 24 LIFETIME_PARAM@31..33
25 LIFETIME_PARAM@26..28 25 LIFETIME@31..33 "\'a"
26 LIFETIME@26..28 "\'a" 26 R_ANGLE@33..34 ">"
27 R_ANGLE@28..29 ">" 27 WHITESPACE@34..35 " "
28 WHITESPACE@29..30 " " 28 PATH_TYPE@35..36
29 PATH_TYPE@30..31 29 PATH@35..36
30 PATH@30..31 30 PATH_SEGMENT@35..36
31 PATH_SEGMENT@30..31 31 NAME_REF@35..36
32 NAME_REF@30..31 32 IDENT@35..36 "F"
33 IDENT@30..31 "F" 33 COLON@36..37 ":"
34 COLON@31..32 ":" 34 WHITESPACE@37..38 " "
35 WHITESPACE@32..33 " " 35 TYPE_BOUND_LIST@38..49
36 TYPE_BOUND_LIST@33..44 36 TYPE_BOUND@38..49
37 TYPE_BOUND@33..44 37 PATH_TYPE@38..49
38 PATH_TYPE@33..44 38 PATH@38..49
39 PATH@33..44 39 PATH_SEGMENT@38..49
40 PATH_SEGMENT@33..44 40 NAME_REF@38..40
41 NAME_REF@33..35 41 IDENT@38..40 "Fn"
42 IDENT@33..35 "Fn" 42 PARAM_LIST@40..49
43 PARAM_LIST@35..44 43 L_PAREN@40..41 "("
44 L_PAREN@35..36 "(" 44 PARAM@41..48
45 PARAM@36..43 45 REFERENCE_TYPE@41..48
46 REFERENCE_TYPE@36..43 46 AMP@41..42 "&"
47 AMP@36..37 "&" 47 LIFETIME@42..44 "\'a"
48 LIFETIME@37..39 "\'a" 48 WHITESPACE@44..45 " "
49 WHITESPACE@39..40 " " 49 PATH_TYPE@45..48
50 PATH_TYPE@40..43 50 PATH@45..48
51 PATH@40..43 51 PATH_SEGMENT@45..48
52 PATH_SEGMENT@40..43 52 NAME_REF@45..48
53 NAME_REF@40..43 53 IDENT@45..48 "str"
54 IDENT@40..43 "str" 54 R_PAREN@48..49 ")"
55 R_PAREN@43..44 ")" 55 WHITESPACE@49..50 "\n"
56 WHITESPACE@44..45 "\n" 56 BLOCK_EXPR@50..53
57 BLOCK_EXPR@45..48 57 L_CURLY@50..51 "{"
58 L_CURLY@45..46 "{" 58 WHITESPACE@51..52 " "
59 WHITESPACE@46..47 " " 59 R_CURLY@52..53 "}"
60 R_CURLY@47..48 "}" 60 WHITESPACE@53..54 "\n"
61 WHITESPACE@48..49 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0003_where_pred_for.rs b/crates/ra_syntax/test_data/parser/inline/ok/0003_where_pred_for.rs
index b448c6178..423bc105b 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0003_where_pred_for.rs
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0003_where_pred_for.rs
@@ -1,4 +1,4 @@
1fn test<F>() 1fn for_trait<F>()
2where 2where
3 for<'a> F: Fn(&'a str) 3 for<'a> F: Fn(&'a str)
4{ } 4{ }
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0081_for_type.rast b/crates/ra_syntax/test_data/parser/inline/ok/0081_for_type.rast
index dfb8d57ad..b26ac2d36 100644
--- a/crates/ra_syntax/test_data/parser/inline/ok/0081_for_type.rast
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0081_for_type.rast
@@ -1,4 +1,4 @@
1SOURCE_FILE@0..200 1SOURCE_FILE@0..121
2 TYPE_ALIAS_DEF@0..28 2 TYPE_ALIAS_DEF@0..28
3 TYPE_KW@0..4 "type" 3 TYPE_KW@0..4 "type"
4 WHITESPACE@4..5 " " 4 WHITESPACE@4..5 " "
@@ -29,212 +29,84 @@ SOURCE_FILE@0..200
29 R_PAREN@26..27 ")" 29 R_PAREN@26..27 ")"
30 SEMICOLON@27..28 ";" 30 SEMICOLON@27..28 ";"
31 WHITESPACE@28..29 "\n" 31 WHITESPACE@28..29 "\n"
32 FN_DEF@29..79 32 TYPE_ALIAS_DEF@29..81
33 FN_KW@29..31 "fn" 33 TYPE_KW@29..33 "type"
34 WHITESPACE@31..32 " " 34 WHITESPACE@33..34 " "
35 NAME@32..35 35 NAME@34..35
36 IDENT@32..35 "foo" 36 IDENT@34..35 "B"
37 TYPE_PARAM_LIST@35..38 37 WHITESPACE@35..36 " "
38 L_ANGLE@35..36 "<" 38 EQ@36..37 "="
39 TYPE_PARAM@36..37 39 WHITESPACE@37..38 " "
40 NAME@36..37 40 FOR_TYPE@38..80
41 IDENT@36..37 "T" 41 FOR_KW@38..41 "for"
42 R_ANGLE@37..38 ">" 42 TYPE_PARAM_LIST@41..45
43 PARAM_LIST@38..46 43 L_ANGLE@41..42 "<"
44 L_PAREN@38..39 "(" 44 LIFETIME_PARAM@42..44
45 PARAM@39..45 45 LIFETIME@42..44 "\'a"
46 BIND_PAT@39..41 46 R_ANGLE@44..45 ">"
47 NAME@39..41 47 WHITESPACE@45..46 " "
48 IDENT@39..41 "_t" 48 FN_POINTER_TYPE@46..80
49 COLON@41..42 ":" 49 UNSAFE_KW@46..52 "unsafe"
50 WHITESPACE@42..43 " " 50 WHITESPACE@52..53 " "
51 REFERENCE_TYPE@43..45 51 ABI@53..63
52 AMP@43..44 "&" 52 EXTERN_KW@53..59 "extern"
53 PATH_TYPE@44..45 53 WHITESPACE@59..60 " "
54 PATH@44..45 54 STRING@60..63 "\"C\""
55 PATH_SEGMENT@44..45 55 WHITESPACE@63..64 " "
56 NAME_REF@44..45 56 FN_KW@64..66 "fn"
57 IDENT@44..45 "T" 57 PARAM_LIST@66..74
58 R_PAREN@45..46 ")" 58 L_PAREN@66..67 "("
59 WHITESPACE@46..47 " " 59 PARAM@67..73
60 WHERE_CLAUSE@47..76 60 REFERENCE_TYPE@67..73
61 WHERE_KW@47..52 "where" 61 AMP@67..68 "&"
62 WHITESPACE@52..53 " " 62 LIFETIME@68..70 "\'a"
63 WHERE_PRED@53..76 63 WHITESPACE@70..71 " "
64 FOR_TYPE@53..66 64 TUPLE_TYPE@71..73
65 FOR_KW@53..56 "for" 65 L_PAREN@71..72 "("
66 TYPE_PARAM_LIST@56..60 66 R_PAREN@72..73 ")"
67 L_ANGLE@56..57 "<" 67 R_PAREN@73..74 ")"
68 LIFETIME_PARAM@57..59 68 WHITESPACE@74..75 " "
69 LIFETIME@57..59 "\'a" 69 RET_TYPE@75..80
70 R_ANGLE@59..60 ">" 70 THIN_ARROW@75..77 "->"
71 WHITESPACE@60..61 " " 71 WHITESPACE@77..78 " "
72 REFERENCE_TYPE@61..66 72 TUPLE_TYPE@78..80
73 AMP@61..62 "&" 73 L_PAREN@78..79 "("
74 LIFETIME@62..64 "\'a" 74 R_PAREN@79..80 ")"
75 WHITESPACE@64..65 " " 75 SEMICOLON@80..81 ";"
76 PATH_TYPE@65..66 76 WHITESPACE@81..82 "\n"
77 PATH@65..66 77 TYPE_ALIAS_DEF@82..120
78 PATH_SEGMENT@65..66 78 TYPE_KW@82..86 "type"
79 NAME_REF@65..66 79 WHITESPACE@86..87 " "
80 IDENT@65..66 "T" 80 NAME@87..90
81 COLON@66..67 ":" 81 IDENT@87..90 "Obj"
82 WHITESPACE@67..68 " " 82 WHITESPACE@90..91 " "
83 TYPE_BOUND_LIST@68..76 83 EQ@91..92 "="
84 TYPE_BOUND@68..76 84 WHITESPACE@92..93 " "
85 PATH_TYPE@68..76 85 FOR_TYPE@93..119
86 PATH@68..76 86 FOR_KW@93..96 "for"
87 PATH_SEGMENT@68..76 87 TYPE_PARAM_LIST@96..100
88 NAME_REF@68..76 88 L_ANGLE@96..97 "<"
89 IDENT@68..76 "Iterator" 89 LIFETIME_PARAM@97..99
90 WHITESPACE@76..77 " " 90 LIFETIME@97..99 "\'a"
91 BLOCK_EXPR@77..79 91 R_ANGLE@99..100 ">"
92 L_CURLY@77..78 "{" 92 WHITESPACE@100..101 " "
93 R_CURLY@78..79 "}" 93 PATH_TYPE@101..119
94 WHITESPACE@79..80 "\n" 94 PATH@101..119
95 FN_DEF@80..134 95 PATH_SEGMENT@101..119
96 FN_KW@80..82 "fn" 96 NAME_REF@101..110
97 WHITESPACE@82..83 " " 97 IDENT@101..110 "PartialEq"
98 NAME@83..86 98 TYPE_ARG_LIST@110..119
99 IDENT@83..86 "bar" 99 L_ANGLE@110..111 "<"
100 TYPE_PARAM_LIST@86..89 100 TYPE_ARG@111..118
101 L_ANGLE@86..87 "<" 101 REFERENCE_TYPE@111..118
102 TYPE_PARAM@87..88 102 AMP@111..112 "&"
103 NAME@87..88 103 LIFETIME@112..114 "\'a"
104 IDENT@87..88 "T" 104 WHITESPACE@114..115 " "
105 R_ANGLE@88..89 ">" 105 PATH_TYPE@115..118
106 PARAM_LIST@89..97 106 PATH@115..118
107 L_PAREN@89..90 "(" 107 PATH_SEGMENT@115..118
108 PARAM@90..96 108 NAME_REF@115..118
109 BIND_PAT@90..92 109 IDENT@115..118 "i32"
110 NAME@90..92 110 R_ANGLE@118..119 ">"
111 IDENT@90..92 "_t" 111 SEMICOLON@119..120 ";"
112 COLON@92..93 ":" 112 WHITESPACE@120..121 "\n"
113 WHITESPACE@93..94 " "
114 REFERENCE_TYPE@94..96
115 AMP@94..95 "&"
116 PATH_TYPE@95..96
117 PATH@95..96
118 PATH_SEGMENT@95..96
119 NAME_REF@95..96
120 IDENT@95..96 "T"
121 R_PAREN@96..97 ")"
122 WHITESPACE@97..98 " "
123 WHERE_CLAUSE@98..131
124 WHERE_KW@98..103 "where"
125 WHITESPACE@103..104 " "
126 WHERE_PRED@104..131
127 FOR_TYPE@104..121
128 FOR_KW@104..107 "for"
129 TYPE_PARAM_LIST@107..111
130 L_ANGLE@107..108 "<"
131 LIFETIME_PARAM@108..110
132 LIFETIME@108..110 "\'a"
133 R_ANGLE@110..111 ">"
134 WHITESPACE@111..112 " "
135 REFERENCE_TYPE@112..121
136 AMP@112..113 "&"
137 LIFETIME@113..115 "\'a"
138 WHITESPACE@115..116 " "
139 MUT_KW@116..119 "mut"
140 WHITESPACE@119..120 " "
141 PATH_TYPE@120..121
142 PATH@120..121
143 PATH_SEGMENT@120..121
144 NAME_REF@120..121
145 IDENT@120..121 "T"
146 COLON@121..122 ":"
147 WHITESPACE@122..123 " "
148 TYPE_BOUND_LIST@123..131
149 TYPE_BOUND@123..131
150 PATH_TYPE@123..131
151 PATH@123..131
152 PATH_SEGMENT@123..131
153 NAME_REF@123..131
154 IDENT@123..131 "Iterator"
155 WHITESPACE@131..132 " "
156 BLOCK_EXPR@132..134
157 L_CURLY@132..133 "{"
158 R_CURLY@133..134 "}"
159 WHITESPACE@134..135 "\n"
160 FN_DEF@135..199
161 FN_KW@135..137 "fn"
162 WHITESPACE@137..138 " "
163 NAME@138..141
164 IDENT@138..141 "baz"
165 TYPE_PARAM_LIST@141..144
166 L_ANGLE@141..142 "<"
167 TYPE_PARAM@142..143
168 NAME@142..143
169 IDENT@142..143 "T"
170 R_ANGLE@143..144 ">"
171 PARAM_LIST@144..152
172 L_PAREN@144..145 "("
173 PARAM@145..151
174 BIND_PAT@145..147
175 NAME@145..147
176 IDENT@145..147 "_t"
177 COLON@147..148 ":"
178 WHITESPACE@148..149 " "
179 REFERENCE_TYPE@149..151
180 AMP@149..150 "&"
181 PATH_TYPE@150..151
182 PATH@150..151
183 PATH_SEGMENT@150..151
184 NAME_REF@150..151
185 IDENT@150..151 "T"
186 R_PAREN@151..152 ")"
187 WHITESPACE@152..153 " "
188 WHERE_CLAUSE@153..196
189 WHERE_KW@153..158 "where"
190 WHITESPACE@158..159 " "
191 WHERE_PRED@159..196
192 FOR_TYPE@159..186
193 FOR_KW@159..162 "for"
194 TYPE_PARAM_LIST@162..166
195 L_ANGLE@162..163 "<"
196 LIFETIME_PARAM@163..165
197 LIFETIME@163..165 "\'a"
198 R_ANGLE@165..166 ">"
199 WHITESPACE@166..167 " "
200 PATH_TYPE@167..186
201 PATH@167..186
202 PATH@167..181
203 PATH_SEGMENT@167..181
204 L_ANGLE@167..168 "<"
205 REFERENCE_TYPE@168..173
206 AMP@168..169 "&"
207 LIFETIME@169..171 "\'a"
208 WHITESPACE@171..172 " "
209 PATH_TYPE@172..173
210 PATH@172..173
211 PATH_SEGMENT@172..173
212 NAME_REF@172..173
213 IDENT@172..173 "T"
214 WHITESPACE@173..174 " "
215 AS_KW@174..176 "as"
216 WHITESPACE@176..177 " "
217 PATH_TYPE@177..180
218 PATH@177..180
219 PATH_SEGMENT@177..180
220 NAME_REF@177..180
221 IDENT@177..180 "Baz"
222 R_ANGLE@180..181 ">"
223 COLON2@181..183 "::"
224 PATH_SEGMENT@183..186
225 NAME_REF@183..186
226 IDENT@183..186 "Foo"
227 COLON@186..187 ":"
228 WHITESPACE@187..188 " "
229 TYPE_BOUND_LIST@188..196
230 TYPE_BOUND@188..196
231 PATH_TYPE@188..196
232 PATH@188..196
233 PATH_SEGMENT@188..196
234 NAME_REF@188..196
235 IDENT@188..196 "Iterator"
236 WHITESPACE@196..197 " "
237 BLOCK_EXPR@197..199
238 L_CURLY@197..198 "{"
239 R_CURLY@198..199 "}"
240 WHITESPACE@199..200 "\n"
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 d6774d438..8ac7b9e10 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,4 +1,3 @@
1type A = for<'a> fn() -> (); 1type A = for<'a> fn() -> ();
2fn foo<T>(_t: &T) where for<'a> &'a T: Iterator {} 2type B = for<'a> unsafe extern "C" fn(&'a ()) -> ();
3fn bar<T>(_t: &T) where for<'a> &'a mut T: Iterator {} 3type Obj = for<'a> PartialEq<&'a i32>;
4fn baz<T>(_t: &T) where for<'a> <&'a T as Baz>::Foo: Iterator {}
diff --git a/crates/ra_syntax/test_data/parser/ok/0067_where_for_pred.rast b/crates/ra_syntax/test_data/parser/ok/0067_where_for_pred.rast
new file mode 100644
index 000000000..503585103
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/ok/0067_where_for_pred.rast
@@ -0,0 +1,392 @@
1SOURCE_FILE@0..374
2 FN_DEF@0..55
3 FN_KW@0..2 "fn"
4 WHITESPACE@2..3 " "
5 NAME@3..12
6 IDENT@3..12 "for_trait"
7 TYPE_PARAM_LIST@12..15
8 L_ANGLE@12..13 "<"
9 TYPE_PARAM@13..14
10 NAME@13..14
11 IDENT@13..14 "F"
12 R_ANGLE@14..15 ">"
13 PARAM_LIST@15..17
14 L_PAREN@15..16 "("
15 R_PAREN@16..17 ")"
16 WHITESPACE@17..18 "\n"
17 WHERE_CLAUSE@18..51
18 WHERE_KW@18..23 "where"
19 WHITESPACE@23..28 "\n "
20 WHERE_PRED@28..50
21 FOR_KW@28..31 "for"
22 TYPE_PARAM_LIST@31..35
23 L_ANGLE@31..32 "<"
24 LIFETIME_PARAM@32..34
25 LIFETIME@32..34 "\'a"
26 R_ANGLE@34..35 ">"
27 WHITESPACE@35..36 " "
28 PATH_TYPE@36..37
29 PATH@36..37
30 PATH_SEGMENT@36..37
31 NAME_REF@36..37
32 IDENT@36..37 "F"
33 COLON@37..38 ":"
34 WHITESPACE@38..39 " "
35 TYPE_BOUND_LIST@39..50
36 TYPE_BOUND@39..50
37 PATH_TYPE@39..50
38 PATH@39..50
39 PATH_SEGMENT@39..50
40 NAME_REF@39..41
41 IDENT@39..41 "Fn"
42 PARAM_LIST@41..50
43 L_PAREN@41..42 "("
44 PARAM@42..49
45 REFERENCE_TYPE@42..49
46 AMP@42..43 "&"
47 LIFETIME@43..45 "\'a"
48 WHITESPACE@45..46 " "
49 PATH_TYPE@46..49
50 PATH@46..49
51 PATH_SEGMENT@46..49
52 NAME_REF@46..49
53 IDENT@46..49 "str"
54 R_PAREN@49..50 ")"
55 COMMA@50..51 ","
56 WHITESPACE@51..52 "\n"
57 BLOCK_EXPR@52..55
58 L_CURLY@52..53 "{"
59 WHITESPACE@53..54 "\n"
60 R_CURLY@54..55 "}"
61 WHITESPACE@55..56 "\n"
62 FN_DEF@56..107
63 FN_KW@56..58 "fn"
64 WHITESPACE@58..59 " "
65 NAME@59..66
66 IDENT@59..66 "for_ref"
67 TYPE_PARAM_LIST@66..69
68 L_ANGLE@66..67 "<"
69 TYPE_PARAM@67..68
70 NAME@67..68
71 IDENT@67..68 "F"
72 R_ANGLE@68..69 ">"
73 PARAM_LIST@69..71
74 L_PAREN@69..70 "("
75 R_PAREN@70..71 ")"
76 WHITESPACE@71..72 "\n"
77 WHERE_CLAUSE@72..103
78 WHERE_KW@72..77 "where"
79 WHITESPACE@77..82 "\n "
80 WHERE_PRED@82..102
81 FOR_KW@82..85 "for"
82 TYPE_PARAM_LIST@85..89
83 L_ANGLE@85..86 "<"
84 LIFETIME_PARAM@86..88
85 LIFETIME@86..88 "\'a"
86 R_ANGLE@88..89 ">"
87 WHITESPACE@89..90 " "
88 REFERENCE_TYPE@90..95
89 AMP@90..91 "&"
90 LIFETIME@91..93 "\'a"
91 WHITESPACE@93..94 " "
92 PATH_TYPE@94..95
93 PATH@94..95
94 PATH_SEGMENT@94..95
95 NAME_REF@94..95
96 IDENT@94..95 "F"
97 COLON@95..96 ":"
98 WHITESPACE@96..97 " "
99 TYPE_BOUND_LIST@97..102
100 TYPE_BOUND@97..102
101 PATH_TYPE@97..102
102 PATH@97..102
103 PATH_SEGMENT@97..102
104 NAME_REF@97..102
105 IDENT@97..102 "Debug"
106 COMMA@102..103 ","
107 WHITESPACE@103..104 "\n"
108 BLOCK_EXPR@104..107
109 L_CURLY@104..105 "{"
110 WHITESPACE@105..106 "\n"
111 R_CURLY@106..107 "}"
112 WHITESPACE@107..108 "\n"
113 FN_DEF@108..170
114 FN_KW@108..110 "fn"
115 WHITESPACE@110..111 " "
116 NAME@111..121
117 IDENT@111..121 "for_parens"
118 TYPE_PARAM_LIST@121..124
119 L_ANGLE@121..122 "<"
120 TYPE_PARAM@122..123
121 NAME@122..123
122 IDENT@122..123 "F"
123 R_ANGLE@123..124 ">"
124 PARAM_LIST@124..126
125 L_PAREN@124..125 "("
126 R_PAREN@125..126 ")"
127 WHITESPACE@126..127 "\n"
128 WHERE_CLAUSE@127..166
129 WHERE_KW@127..132 "where"
130 WHITESPACE@132..137 "\n "
131 WHERE_PRED@137..165
132 FOR_KW@137..140 "for"
133 TYPE_PARAM_LIST@140..144
134 L_ANGLE@140..141 "<"
135 LIFETIME_PARAM@141..143
136 LIFETIME@141..143 "\'a"
137 R_ANGLE@143..144 ">"
138 WHITESPACE@144..145 " "
139 PAREN_TYPE@145..152
140 L_PAREN@145..146 "("
141 REFERENCE_TYPE@146..151
142 AMP@146..147 "&"
143 LIFETIME@147..149 "\'a"
144 WHITESPACE@149..150 " "
145 PATH_TYPE@150..151
146 PATH@150..151
147 PATH_SEGMENT@150..151
148 NAME_REF@150..151
149 IDENT@150..151 "F"
150 R_PAREN@151..152 ")"
151 COLON@152..153 ":"
152 WHITESPACE@153..154 " "
153 TYPE_BOUND_LIST@154..165
154 TYPE_BOUND@154..165
155 PATH_TYPE@154..165
156 PATH@154..165
157 PATH_SEGMENT@154..165
158 NAME_REF@154..156
159 IDENT@154..156 "Fn"
160 PARAM_LIST@156..165
161 L_PAREN@156..157 "("
162 PARAM@157..164
163 REFERENCE_TYPE@157..164
164 AMP@157..158 "&"
165 LIFETIME@158..160 "\'a"
166 WHITESPACE@160..161 " "
167 PATH_TYPE@161..164
168 PATH@161..164
169 PATH_SEGMENT@161..164
170 NAME_REF@161..164
171 IDENT@161..164 "str"
172 R_PAREN@164..165 ")"
173 COMMA@165..166 ","
174 WHITESPACE@166..167 "\n"
175 BLOCK_EXPR@167..170
176 L_CURLY@167..168 "{"
177 WHITESPACE@168..169 "\n"
178 R_CURLY@169..170 "}"
179 WHITESPACE@170..171 "\n"
180 FN_DEF@171..223
181 FN_KW@171..173 "fn"
182 WHITESPACE@173..174 " "
183 NAME@174..183
184 IDENT@174..183 "for_slice"
185 TYPE_PARAM_LIST@183..186
186 L_ANGLE@183..184 "<"
187 TYPE_PARAM@184..185
188 NAME@184..185
189 IDENT@184..185 "F"
190 R_ANGLE@185..186 ">"
191 PARAM_LIST@186..188
192 L_PAREN@186..187 "("
193 R_PAREN@187..188 ")"
194 WHITESPACE@188..189 "\n"
195 WHERE_CLAUSE@189..219
196 WHERE_KW@189..194 "where"
197 WHITESPACE@194..199 "\n "
198 WHERE_PRED@199..218
199 FOR_KW@199..202 "for"
200 TYPE_PARAM_LIST@202..206
201 L_ANGLE@202..203 "<"
202 LIFETIME_PARAM@203..205
203 LIFETIME@203..205 "\'a"
204 R_ANGLE@205..206 ">"
205 WHITESPACE@206..207 " "
206 SLICE_TYPE@207..214
207 L_BRACK@207..208 "["
208 REFERENCE_TYPE@208..213
209 AMP@208..209 "&"
210 LIFETIME@209..211 "\'a"
211 WHITESPACE@211..212 " "
212 PATH_TYPE@212..213
213 PATH@212..213
214 PATH_SEGMENT@212..213
215 NAME_REF@212..213
216 IDENT@212..213 "F"
217 R_BRACK@213..214 "]"
218 COLON@214..215 ":"
219 WHITESPACE@215..216 " "
220 TYPE_BOUND_LIST@216..218
221 TYPE_BOUND@216..218
222 PATH_TYPE@216..218
223 PATH@216..218
224 PATH_SEGMENT@216..218
225 NAME_REF@216..218
226 IDENT@216..218 "Eq"
227 COMMA@218..219 ","
228 WHITESPACE@219..220 "\n"
229 BLOCK_EXPR@220..223
230 L_CURLY@220..221 "{"
231 WHITESPACE@221..222 "\n"
232 R_CURLY@222..223 "}"
233 WHITESPACE@223..224 "\n"
234 FN_DEF@224..300
235 FN_KW@224..226 "fn"
236 WHITESPACE@226..227 " "
237 NAME@227..236
238 IDENT@227..236 "for_qpath"
239 TYPE_PARAM_LIST@236..239
240 L_ANGLE@236..237 "<"
241 TYPE_PARAM@237..238
242 NAME@237..238
243 IDENT@237..238 "T"
244 R_ANGLE@238..239 ">"
245 PARAM_LIST@239..247
246 L_PAREN@239..240 "("
247 PARAM@240..246
248 BIND_PAT@240..242
249 NAME@240..242
250 IDENT@240..242 "_t"
251 COLON@242..243 ":"
252 WHITESPACE@243..244 " "
253 REFERENCE_TYPE@244..246
254 AMP@244..245 "&"
255 PATH_TYPE@245..246
256 PATH@245..246
257 PATH_SEGMENT@245..246
258 NAME_REF@245..246
259 IDENT@245..246 "T"
260 R_PAREN@246..247 ")"
261 WHITESPACE@247..248 "\n"
262 WHERE_CLAUSE@248..296
263 WHERE_KW@248..253 "where"
264 WHITESPACE@253..258 "\n "
265 WHERE_PRED@258..295
266 FOR_KW@258..261 "for"
267 TYPE_PARAM_LIST@261..265
268 L_ANGLE@261..262 "<"
269 LIFETIME_PARAM@262..264
270 LIFETIME@262..264 "\'a"
271 R_ANGLE@264..265 ">"
272 WHITESPACE@265..266 " "
273 PATH_TYPE@266..285
274 PATH@266..285
275 PATH@266..280
276 PATH_SEGMENT@266..280
277 L_ANGLE@266..267 "<"
278 REFERENCE_TYPE@267..272
279 AMP@267..268 "&"
280 LIFETIME@268..270 "\'a"
281 WHITESPACE@270..271 " "
282 PATH_TYPE@271..272
283 PATH@271..272
284 PATH_SEGMENT@271..272
285 NAME_REF@271..272
286 IDENT@271..272 "T"
287 WHITESPACE@272..273 " "
288 AS_KW@273..275 "as"
289 WHITESPACE@275..276 " "
290 PATH_TYPE@276..279
291 PATH@276..279
292 PATH_SEGMENT@276..279
293 NAME_REF@276..279
294 IDENT@276..279 "Baz"
295 R_ANGLE@279..280 ">"
296 COLON2@280..282 "::"
297 PATH_SEGMENT@282..285
298 NAME_REF@282..285
299 IDENT@282..285 "Foo"
300 COLON@285..286 ":"
301 WHITESPACE@286..287 " "
302 TYPE_BOUND_LIST@287..295
303 TYPE_BOUND@287..295
304 PATH_TYPE@287..295
305 PATH@287..295
306 PATH_SEGMENT@287..295
307 NAME_REF@287..295
308 IDENT@287..295 "Iterator"
309 COMMA@295..296 ","
310 WHITESPACE@296..297 "\n"
311 BLOCK_EXPR@297..300
312 L_CURLY@297..298 "{"
313 WHITESPACE@298..299 "\n"
314 R_CURLY@299..300 "}"
315 WHITESPACE@300..301 "\n"
316 FN_DEF@301..373
317 FN_KW@301..303 "fn"
318 WHITESPACE@303..304 " "
319 NAME@304..314
320 IDENT@304..314 "for_for_fn"
321 TYPE_PARAM_LIST@314..317
322 L_ANGLE@314..315 "<"
323 TYPE_PARAM@315..316
324 NAME@315..316
325 IDENT@315..316 "T"
326 R_ANGLE@316..317 ">"
327 PARAM_LIST@317..319
328 L_PAREN@317..318 "("
329 R_PAREN@318..319 ")"
330 WHITESPACE@319..320 "\n"
331 WHERE_CLAUSE@320..369
332 WHERE_KW@320..325 "where"
333 WHITESPACE@325..330 "\n "
334 WHERE_PRED@330..368
335 FOR_KW@330..333 "for"
336 TYPE_PARAM_LIST@333..337
337 L_ANGLE@333..334 "<"
338 LIFETIME_PARAM@334..336
339 LIFETIME@334..336 "\'a"
340 R_ANGLE@336..337 ">"
341 WHITESPACE@337..338 " "
342 FOR_TYPE@338..362
343 FOR_KW@338..341 "for"
344 TYPE_PARAM_LIST@341..345
345 L_ANGLE@341..342 "<"
346 LIFETIME_PARAM@342..344
347 LIFETIME@342..344 "\'b"
348 R_ANGLE@344..345 ">"
349 WHITESPACE@345..346 " "
350 FN_POINTER_TYPE@346..362
351 FN_KW@346..348 "fn"
352 PARAM_LIST@348..362
353 L_PAREN@348..349 "("
354 PARAM@349..354
355 REFERENCE_TYPE@349..354
356 AMP@349..350 "&"
357 LIFETIME@350..352 "\'a"
358 WHITESPACE@352..353 " "
359 PATH_TYPE@353..354
360 PATH@353..354
361 PATH_SEGMENT@353..354
362 NAME_REF@353..354
363 IDENT@353..354 "T"
364 COMMA@354..355 ","
365 WHITESPACE@355..356 " "
366 PARAM@356..361
367 REFERENCE_TYPE@356..361
368 AMP@356..357 "&"
369 LIFETIME@357..359 "\'b"
370 WHITESPACE@359..360 " "
371 PATH_TYPE@360..361
372 PATH@360..361
373 PATH_SEGMENT@360..361
374 NAME_REF@360..361
375 IDENT@360..361 "T"
376 R_PAREN@361..362 ")"
377 COLON@362..363 ":"
378 WHITESPACE@363..364 " "
379 TYPE_BOUND_LIST@364..368
380 TYPE_BOUND@364..368
381 PATH_TYPE@364..368
382 PATH@364..368
383 PATH_SEGMENT@364..368
384 NAME_REF@364..368
385 IDENT@364..368 "Copy"
386 COMMA@368..369 ","
387 WHITESPACE@369..370 "\n"
388 BLOCK_EXPR@370..373
389 L_CURLY@370..371 "{"
390 WHITESPACE@371..372 "\n"
391 R_CURLY@372..373 "}"
392 WHITESPACE@373..374 "\n"
diff --git a/crates/ra_syntax/test_data/parser/ok/0067_where_for_pred.rs b/crates/ra_syntax/test_data/parser/ok/0067_where_for_pred.rs
new file mode 100644
index 000000000..9058c4619
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/ok/0067_where_for_pred.rs
@@ -0,0 +1,30 @@
1fn for_trait<F>()
2where
3 for<'a> F: Fn(&'a str),
4{
5}
6fn for_ref<F>()
7where
8 for<'a> &'a F: Debug,
9{
10}
11fn for_parens<F>()
12where
13 for<'a> (&'a F): Fn(&'a str),
14{
15}
16fn for_slice<F>()
17where
18 for<'a> [&'a F]: Eq,
19{
20}
21fn for_qpath<T>(_t: &T)
22where
23 for<'a> <&'a T as Baz>::Foo: Iterator,
24{
25}
26fn for_for_fn<T>()
27where
28 for<'a> for<'b> fn(&'a T, &'b T): Copy,
29{
30}