-//! FIXME: write short doc here
-
use super::*;
pub(super) const PATH_FIRST: TokenSet =
}
pub(super) fn use_path(p: &mut Parser) {
- path(p, Mode::Use)
+ path(p, Mode::Use);
}
pub(crate) fn type_path(p: &mut Parser) {
- path(p, Mode::Type)
+ path(p, Mode::Type);
}
pub(super) fn expr_path(p: &mut Parser) {
- path(p, Mode::Expr)
+ path(p, Mode::Expr);
+}
+
+pub(crate) fn type_path_for_qualifier(p: &mut Parser, qual: CompletedMarker) -> CompletedMarker {
+ path_for_qualifier(p, Mode::Type, qual)
}
#[derive(Clone, Copy, Eq, PartialEq)]
fn path(p: &mut Parser, mode: Mode) {
let path = p.start();
path_segment(p, mode, true);
- let mut qual = path.complete(p, PATH);
+ let qual = path.complete(p, PATH);
+ path_for_qualifier(p, mode, qual);
+}
+
+fn path_for_qualifier(p: &mut Parser, mode: Mode, mut qual: CompletedMarker) -> CompletedMarker {
loop {
let use_tree = matches!(p.nth(2), T![*] | T!['{']);
if p.at(T![::]) && !use_tree {
let path = path.complete(p, PATH);
qual = path;
} else {
- break;
+ return qual;
}
}
}
}
// test crate_path
// use crate::foo;
- T![self] | T![super] | T![crate] => p.bump_any(),
+ T![self] | T![super] | T![crate] => {
+ let m = p.start();
+ p.bump_any();
+ m.complete(p, NAME_REF);
+ }
_ => {
p.err_recover("expected identifier", items::ITEM_RECOVERY_SET);
if empty {
params::param_list_fn_trait(p);
opt_ret_type(p);
} else {
- type_args::opt_generic_arg_list(p, false)
+ generic_args::opt_generic_arg_list(p, false);
}
}
- Mode::Expr => type_args::opt_generic_arg_list(p, true),
+ Mode::Expr => generic_args::opt_generic_arg_list(p, true),
}
}