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 pub(crate) fn type_path_for_qualifier(p: &mut Parser, qual: CompletedMarker) -> CompletedMarker {
31 path_for_qualifier(p, Mode::Type, qual)
34 #[derive(Clone, Copy, Eq, PartialEq)]
41 fn path(p: &mut Parser, mode: Mode) {
43 path_segment(p, mode, true);
44 let qual = path.complete(p, PATH);
45 path_for_qualifier(p, mode, qual);
48 fn path_for_qualifier(p: &mut Parser, mode: Mode, mut qual: CompletedMarker) -> CompletedMarker {
50 let use_tree = matches!(p.nth(2), T![*] | T!['{']);
51 if p.at(T![::]) && !use_tree {
52 let path = qual.precede(p);
54 path_segment(p, mode, false);
55 let path = path.complete(p, PATH);
63 fn path_segment(p: &mut Parser, mode: Mode, first: bool) {
66 // type X = <A as B>::Output;
67 // fn foo() { <usize as Default>::default(); }
68 if first && p.eat(T![<]) {
71 if is_use_path_start(p) {
74 p.error("expected a trait");
87 opt_path_type_args(p, mode);
91 T![self] | T![super] | T![crate] => {
94 m.complete(p, NAME_REF);
97 p.err_recover("expected identifier", items::ITEM_RECOVERY_SET);
99 // test_err empty_segment
107 m.complete(p, PATH_SEGMENT);
110 fn opt_path_type_args(p: &mut Parser, mode: Mode) {
114 // test path_fn_trait_args
115 // type F = Box<Fn(i32) -> ()>;
117 params::param_list_fn_trait(p);
120 generic_args::opt_generic_arg_list(p, false)
123 Mode::Expr => generic_args::opt_generic_arg_list(p, true),