// Disallow `use $crate;`
if source.name == keywords::DollarCrate.name() && path.segments.len() == 1 {
- let crate_root = self.resolve_crate_root(source.span.ctxt(), true);
+ let crate_root = self.resolve_crate_root(source);
let crate_name = match crate_root.kind {
ModuleKind::Def(_, name) => name,
ModuleKind::Block(..) => unreachable!(),
result
}
- fn resolve_crate_root(&mut self, mut ctxt: SyntaxContext, legacy: bool) -> Module<'a> {
- let mark = if legacy {
+ fn resolve_crate_root(&mut self, ident: Ident) -> Module<'a> {
+ let mut ctxt = ident.span.ctxt();
+ let mark = if ident.name == keywords::DollarCrate.name() {
// When resolving `$crate` from a `macro_rules!` invoked in a `macro`,
// we don't want to pretend that the `macro_rules!` definition is in the `macro`
// as described in `SyntaxContext::apply_mark`, so we ignore prepended modern marks.
if ns == TypeNS {
if (i == 0 && name == keywords::CrateRoot.name()) ||
(i == 0 && name == keywords::Crate.name()) ||
+ (i == 0 && name == keywords::DollarCrate.name()) ||
(i == 1 && name == keywords::Crate.name() &&
path[0].name == keywords::CrateRoot.name()) {
- // `::a::b` or `::crate::a::b`
- module = Some(self.resolve_crate_root(ident.span.ctxt(), false));
- continue
- } else if i == 0 && name == keywords::DollarCrate.name() {
- // `$crate::a::b`
- module = Some(self.resolve_crate_root(ident.span.ctxt(), true));
+ // `::a::b`, `crate::a::b`, `::crate::a::b` or `$crate::a::b`
+ module = Some(self.resolve_crate_root(ident));
continue
} else if i == 1 && !ident.is_path_segment_keyword() {
let prev_name = path[0].name;
}
});
- let ident = path.segments[0].ident;
- if ident.name == keywords::DollarCrate.name() {
+ if path.segments[0].ident.name == keywords::DollarCrate.name() {
+ let module = self.0.resolve_crate_root(path.segments[0].ident);
path.segments[0].ident.name = keywords::CrateRoot.name();
- let module = self.0.resolve_crate_root(ident.span.ctxt(), true);
if !module.is_local() {
let span = path.segments[0].ident.span;
path.segments.insert(1, match module.kind {
"crate root imports need to be explicitly named: \
`use crate as name;`".to_string()));
} else {
- Some(self.resolve_crate_root(source.span.ctxt().modern(), false))
+ Some(self.resolve_crate_root(source))
}
} else if is_extern && !source.is_path_segment_keyword() {
let crate_id =