From 15a28f79b8fc16f28aab5f7cc45b3e14ff7f7e47 Mon Sep 17 00:00:00 2001 From: Valentine Valyaeff Date: Wed, 4 Sep 2019 17:02:10 +0300 Subject: [PATCH] Another fix for `merge_imports` (#3769) --- src/imports.rs | 45 +++++++++++++------ .../configs/imports_layout/merge_mixed.rs | 5 +-- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/imports.rs b/src/imports.rs index 9fd541c61d875..61a359a498b79 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -166,23 +166,16 @@ pub(crate) fn merge_use_trees(use_trees: Vec) -> Vec { } for flattened in use_tree.flatten() { - merge_use_trees_inner(&mut result, flattened); + if let Some(tree) = result.iter_mut().find(|tree| tree.share_prefix(&flattened)) { + tree.merge(&flattened); + } else { + result.push(flattened); + } } } result } -fn merge_use_trees_inner(trees: &mut Vec, use_tree: UseTree) { - for tree in trees.iter_mut() { - if tree.share_prefix(&use_tree) { - tree.merge(&use_tree); - return; - } - } - - trees.push(use_tree); -} - impl fmt::Debug for UseTree { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Display::fmt(self, f) @@ -595,7 +588,6 @@ fn merge_rest(a: &[UseSegment], b: &[UseSegment], mut len: usize) -> Option Option, use_tree: UseTree) { + let similar_trees = trees.iter_mut().filter(|tree| tree.share_prefix(&use_tree)); + if use_tree.path.len() == 1 { + if let Some(tree) = similar_trees.min_by_key(|tree| tree.path.len()) { + if tree.path.len() == 1 { + return; + } + } + } else { + if let Some(tree) = similar_trees.max_by_key(|tree| tree.path.len()) { + if tree.path.len() > 1 { + tree.merge(&use_tree); + return; + } + } + } + trees.push(use_tree); + trees.sort(); +} + impl PartialOrd for UseSegment { fn partial_cmp(&self, other: &UseSegment) -> Option { Some(self.cmp(other)) @@ -988,7 +1000,12 @@ mod test { test_merge!(["a::b::{c, d}", "a::b::{e, f}"], ["a::b::{c, d, e, f}"]); test_merge!(["a::b::c", "a::b"], ["a::{b, b::c}"]); test_merge!(["a::b", "a::b"], ["a::b"]); - test_merge!(["a", "a::b", "a::b::c"], ["a::{self, b::{self, c}}"]); + test_merge!(["a", "a::b", "a::b::c"], ["a::{self, b, b::c}"]); + test_merge!( + ["a", "a::b", "a::b::c", "a::b::c::d"], + ["a::{self, b, b::{c, c::d}}"] + ); + test_merge!(["a", "a::b", "a::b::c", "a::b"], ["a::{self, b, b::c}"]); test_merge!( ["a::{b::{self, c}, d::e}", "a::d::f"], ["a::{b::{self, c}, d::{e, f}}"] diff --git a/tests/target/configs/imports_layout/merge_mixed.rs b/tests/target/configs/imports_layout/merge_mixed.rs index 415a11211a12d..2200d7dec6d53 100644 --- a/tests/target/configs/imports_layout/merge_mixed.rs +++ b/tests/target/configs/imports_layout/merge_mixed.rs @@ -2,7 +2,4 @@ // rustfmt-merge_imports: true // rustfmt-imports_layout: Mixed -use std::{ - fmt, io, - str::{self, FromStr}, -}; +use std::{fmt, io, str, str::FromStr};