Merge pull request #3293 from scampi/issue-3241

Keep leading colons for global paths
This commit is contained in:
Seiichi Uchida 2019-01-27 23:14:57 +09:00 committed by GitHub
commit 36c9dc646c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 66 additions and 14 deletions

View file

@ -324,9 +324,8 @@ impl UseTree {
attrs,
};
let leading_modsep = context.config.edition() == Edition::Edition2018
&& a.prefix.to_string().len() > 2
&& a.prefix.to_string().starts_with("::");
let leading_modsep =
context.config.edition() == Edition::Edition2018 && a.prefix.is_global();
let mut modsep = leading_modsep;
@ -339,6 +338,10 @@ impl UseTree {
match a.kind {
UseTreeKind::Glob => {
// in case of a global path and the glob starts at the root, e.g., "::*"
if a.prefix.segments.len() == 1 && leading_modsep {
result.path.push(UseSegment::Ident("".to_owned(), None));
}
result.path.push(UseSegment::Glob);
}
UseTreeKind::Nested(ref list) => {
@ -357,6 +360,11 @@ impl UseTree {
false,
)
.collect();
// in case of a global path and the nested list starts at the root,
// e.g., "::{foo, bar}"
if a.prefix.segments.len() == 1 && leading_modsep {
result.path.push(UseSegment::Ident("".to_owned(), None));
}
result.path.push(UseSegment::List(
list.iter()
.zip(items.into_iter())
@ -367,7 +375,15 @@ impl UseTree {
));
}
UseTreeKind::Simple(ref rename, ..) => {
let name = rewrite_ident(context, path_to_imported_ident(&a.prefix)).to_owned();
// If the path has leading double colons and is composed of only 2 segments, then we
// bypass the call to path_to_imported_ident which would get only the ident and
// lose the path root, e.g., `that` in `::that`.
// The span of `a.prefix` contains the leading colons.
let name = if a.prefix.segments.len() == 2 && leading_modsep {
context.snippet(a.prefix.span).to_owned()
} else {
rewrite_ident(context, path_to_imported_ident(&a.prefix)).to_owned()
};
let alias = rename.and_then(|ident| {
if ident.name == "_" {
// for impl-only-use