-//! FIXME: write short doc here
-
use super::*;
pub(super) const PATH_FIRST: TokenSet =
- token_set![IDENT, T![self], T![super], T![crate], T![:], T![<]];
+ TokenSet::new(&[IDENT, T![self], T![super], T![crate], T![:], T![<]]);
pub(super) fn is_path_start(p: &Parser) -> bool {
is_use_path_start(p) || p.at(T![<])
}
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 {
// type F = Box<Fn(i32) -> ()>;
if p.at(T!['(']) {
params::param_list_fn_trait(p);
- opt_fn_ret_type(p);
+ opt_ret_type(p);
} else {
- type_args::opt_type_arg_list(p, false)
+ generic_args::opt_generic_arg_list(p, false);
}
}
- Mode::Expr => type_args::opt_type_arg_list(p, true),
+ Mode::Expr => generic_args::opt_generic_arg_list(p, true),
}
}