From e7489356c6e9d83a6978a837d5309b4015f88519 Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Wed, 8 Mar 2017 10:10:56 +1300 Subject: [PATCH] Format glob imports Fixes #1356 --- src/imports.rs | 53 ++++++++++++++++++++++------------------- tests/source/imports.rs | 4 ++++ tests/target/imports.rs | 4 ++++ 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/imports.rs b/src/imports.rs index 65d8366ea22..cafba0bb2c5 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -132,6 +132,26 @@ fn compare_use_items(a: &ast::Item, b: &ast::Item) -> Option { // TODO (some day) remove unused imports, expand globs, compress many single // imports into a list import. +fn rewrite_view_path_prefix(path: &ast::Path, + context: &RewriteContext, + shape: Shape) + -> Option { + let path_str = if path.segments + .last() + .unwrap() + .identifier + .to_string() == "self" && path.segments.len() > 1 { + let path = &ast::Path { + span: path.span.clone(), + segments: path.segments[..path.segments.len() - 1].to_owned(), + }; + try_opt!(rewrite_path(context, PathContext::Import, None, path, shape)) + } else { + try_opt!(rewrite_path(context, PathContext::Import, None, path, shape)) + }; + Some(path_str) +} + impl Rewrite for ast::ViewPath { // Returns an empty string when the ViewPath is empty (like foo::bar::{}) fn rewrite(&self, context: &RewriteContext, shape: Shape) -> Option { @@ -142,34 +162,17 @@ impl Rewrite for ast::ViewPath { ast::ViewPath_::ViewPathList(ref path, ref path_list) => { rewrite_use_list(shape, path, path_list, self.span, context) } - ast::ViewPath_::ViewPathGlob(_) => None, + ast::ViewPath_::ViewPathGlob(ref path) => { + // 4 = "::*".len() + let prefix_shape = try_opt!(shape.sub_width(3)); + let path_str = try_opt!(rewrite_view_path_prefix(path, context, prefix_shape)); + Some(format!("{}::*", path_str)) + } ast::ViewPath_::ViewPathSimple(ident, ref path) => { let ident_str = ident.to_string(); // 4 = " as ".len() - let budget = try_opt!(shape.width.checked_sub(ident_str.len() + 4)); - - let path_str = if path.segments - .last() - .unwrap() - .identifier - .to_string() == "self" && - path.segments.len() > 1 { - let path = &ast::Path { - span: path.span.clone(), - segments: path.segments[..path.segments.len() - 1].to_owned(), - }; - try_opt!(rewrite_path(context, - PathContext::Import, - None, - &path, - Shape::legacy(budget, shape.indent))) - } else { - try_opt!(rewrite_path(context, - PathContext::Import, - None, - path, - Shape::legacy(budget, shape.indent))) - }; + let prefix_shape = try_opt!(shape.sub_width(ident_str.len() + 4)); + let path_str = try_opt!(rewrite_view_path_prefix(path, context, prefix_shape)); Some(if path.segments .last() diff --git a/tests/source/imports.rs b/tests/source/imports.rs index 90cb78c2d1f..91016f8cb70 100644 --- a/tests/source/imports.rs +++ b/tests/source/imports.rs @@ -64,3 +64,7 @@ use ::foo::{Bar}; use ::foo::{Bar, Baz}; use ::{Foo}; use ::{Bar, Baz}; + +// spaces used to cause glob imports to disappear (#1356) +use super:: * ; +use foo::issue_1356:: * ; diff --git a/tests/target/imports.rs b/tests/target/imports.rs index 570b5225da7..1f4a692d0cc 100644 --- a/tests/target/imports.rs +++ b/tests/target/imports.rs @@ -59,3 +59,7 @@ use foo::Bar; use foo::{Bar, Baz}; use Foo; use {Bar, Baz}; + +// spaces used to cause glob imports to disappear (#1356) +use super::*; +use foo::issue_1356::*;