1 //! FIXME: write short doc here
5 pub(super) fn opt_generic_arg_list(p: &mut Parser, colon_colon_required: bool) {
7 if p.at(T![::]) && p.nth(2) == T![<] {
11 } else if !colon_colon_required && p.at(T![<]) && p.nth(1) != T![=] {
18 while !p.at(EOF) && !p.at(T![>]) {
20 if !p.at(T![>]) && !p.expect(T![,]) {
25 m.complete(p, GENERIC_ARG_LIST);
29 // type A = B<'static, i32, 1, { 2 }, Item=u64>;
30 fn generic_arg(p: &mut Parser) {
35 m.complete(p, LIFETIME_ARG);
37 // test associated_type_bounds
38 // fn print_all<T: Iterator<Item: Display>>(printables: T) {}
39 IDENT if p.nth(1) == T![:] && p.nth(2) != T![:] => {
41 type_params::bounds(p);
42 m.complete(p, ASSOC_TYPE_ARG);
44 IDENT if p.nth(1) == T![=] => {
48 m.complete(p, ASSOC_TYPE_ARG);
51 expressions::block_expr(p);
52 m.complete(p, CONST_ARG);
54 k if k.is_literal() => {
55 expressions::literal(p);
56 m.complete(p, CONST_ARG);
60 m.complete(p, TYPE_ARG);