3 pub(super) const PATH_FIRST: TokenSet =
4 TokenSet::new(&[IDENT, T![self], T![super], T![crate], T![:], T![<]]);
6 pub(super) fn is_path_start(p: &Parser) -> bool {
7 is_use_path_start(p) || p.at(T![<])
10 pub(super) fn is_use_path_start(p: &Parser) -> bool {
12 IDENT | T![self] | T![super] | T![crate] => true,
13 T![:] if p.at(T![::]) => true,
18 pub(super) fn use_path(p: &mut Parser) {
22 pub(crate) fn type_path(p: &mut Parser) {
26 pub(super) fn expr_path(p: &mut Parser) {
30 #[derive(Clone, Copy, Eq, PartialEq)]
37 fn path(p: &mut Parser, mode: Mode) {
39 path_segment(p, mode, true);
40 let mut qual = path.complete(p, PATH);
42 let use_tree = matches!(p.nth(2), T![*] | T!['{']);
43 if p.at(T![::]) && !use_tree {
44 let path = qual.precede(p);
46 path_segment(p, mode, false);
47 let path = path.complete(p, PATH);
55 fn path_segment(p: &mut Parser, mode: Mode, first: bool) {
58 // type X = <A as B>::Output;
59 // fn foo() { <usize as Default>::default(); }
60 if first && p.eat(T![<]) {
63 if is_use_path_start(p) {
66 p.error("expected a trait");
79 opt_path_type_args(p, mode);
83 T![self] | T![super] | T![crate] => {
86 m.complete(p, NAME_REF);
89 p.err_recover("expected identifier", items::ITEM_RECOVERY_SET);
91 // test_err empty_segment
99 m.complete(p, PATH_SEGMENT);
102 fn opt_path_type_args(p: &mut Parser, mode: Mode) {
106 // test path_fn_trait_args
107 // type F = Box<Fn(i32) -> ()>;
109 params::param_list_fn_trait(p);
112 type_args::opt_generic_arg_list(p, false)
115 Mode::Expr => type_args::opt_generic_arg_list(p, true),