diff --git a/src/formatting/imports.rs b/src/formatting/imports.rs index 7b688c2f11c..ae5482a167c 100644 --- a/src/formatting/imports.rs +++ b/src/formatting/imports.rs @@ -168,7 +168,19 @@ pub(crate) fn merge_use_trees(use_trees: Vec, merge_by: SharedPrefix) - continue; } - for flattened in use_tree.flatten() { + for mut flattened in use_tree.flatten() { + if merge_by == SharedPrefix::Module { + // If a path ends in `::self`, rewrite it to `::{self}`. + if let Some(UseSegment::Slf(..)) = flattened.path.last() { + let self_segment = flattened.path.pop().unwrap(); + flattened + .path + .push(UseSegment::List(vec![UseTree::from_path( + vec![self_segment], + DUMMY_SP, + )])); + } + } if let Some(tree) = result .iter_mut() .find(|tree| tree.share_prefix(&flattened, merge_by)) diff --git a/tests/source/issue-4681-imports_granularity_default.rs b/tests/source/issue-4681-imports_granularity_default.rs new file mode 100644 index 00000000000..cbb21a9f1b3 --- /dev/null +++ b/tests/source/issue-4681-imports_granularity_default.rs @@ -0,0 +1,6 @@ +use crate::lexer; +use crate::lexer::tokens::TokenData; +use crate::lexer::{tokens::TokenData}; +use crate::lexer::self; +use crate::lexer::{self}; +use crate::lexer::{self, tokens::TokenData}; diff --git a/tests/source/issue-4681-imports_granularity_module.rs b/tests/source/issue-4681-imports_granularity_module.rs new file mode 100644 index 00000000000..881a721261c --- /dev/null +++ b/tests/source/issue-4681-imports_granularity_module.rs @@ -0,0 +1,5 @@ +// rustfmt-imports_granularity: Module + +use crate::lexer; +use crate::lexer::self; +use crate::lexer::{self, tokens::TokenData}; diff --git a/tests/target/issue-4681-imports_granularity_default.rs b/tests/target/issue-4681-imports_granularity_default.rs new file mode 100644 index 00000000000..5da6d588e6d --- /dev/null +++ b/tests/target/issue-4681-imports_granularity_default.rs @@ -0,0 +1,6 @@ +use crate::lexer; +use crate::lexer; +use crate::lexer::tokens::TokenData; +use crate::lexer::tokens::TokenData; +use crate::lexer::{self}; +use crate::lexer::{self, tokens::TokenData}; diff --git a/tests/target/issue-4681-imports_granularity_module.rs b/tests/target/issue-4681-imports_granularity_module.rs new file mode 100644 index 00000000000..369743d437d --- /dev/null +++ b/tests/target/issue-4681-imports_granularity_module.rs @@ -0,0 +1,5 @@ +// rustfmt-imports_granularity: Module + +use crate::lexer; +use crate::lexer::tokens::TokenData; +use crate::lexer::{self};