From 337c19bd32cd5689d972c44845075018704d6f87 Mon Sep 17 00:00:00 2001 From: Joaquim Monteiro Date: Fri, 25 Apr 2025 05:40:00 +0100 Subject: [PATCH] Sort the first group in StdExternalCrate import grouping by their subset relation `core` is a subset of `alloc`, and `alloc` is a subset of `std`. This changes the ordering logic so that imports from `core` are placed first, imports from `alloc` second, and imports from `std` last. --- Configurations.md | 2 +- src/reorder.rs | 26 ++++++++++++++++++- .../StdExternalCrate-merge_imports.rs | 2 +- .../configs/group_imports/StdExternalCrate.rs | 2 +- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/Configurations.md b/Configurations.md index 58d7aac52ef..68e9c0b867c 100644 --- a/Configurations.md +++ b/Configurations.md @@ -2379,8 +2379,8 @@ Discard existing import groups, and create three groups for: 3. `self`, `super` and `crate` imports. ```rust -use alloc::alloc::Layout; use core::f32; +use alloc::alloc::Layout; use std::sync::Arc; use broker::database::PooledConnection; diff --git a/src/reorder.rs b/src/reorder.rs index e9d0fc059f8..192e93d9dac 100644 --- a/src/reorder.rs +++ b/src/reorder.rs @@ -137,7 +137,31 @@ fn rewrite_reorderable_or_regroupable_items( }; if context.config.reorder_imports() { - regrouped_items.iter_mut().for_each(|items| items.sort()) + if context.config.group_imports() == GroupImportsTactic::StdExternalCrate { + // Sort the first group by core -> alloc -> std. + regrouped_items[0].sort_by(|a, b| { + if let (UseSegmentKind::Ident(a_id, _), UseSegmentKind::Ident(b_id, _)) = + (&a.path[0].kind, &b.path[0].kind) + { + match (a_id.as_ref(), b_id.as_ref()) { + ("core", "alloc") | ("core", "std") | ("alloc", "std") => { + return Ordering::Less; + } + ("alloc", "core") | ("std", "core") | ("std", "alloc") => { + return Ordering::Greater; + } + _ => {} + } + } + a.cmp(b) + }); + regrouped_items + .iter_mut() + .skip(1) + .for_each(|items| items.sort()); + } else { + regrouped_items.iter_mut().for_each(|items| items.sort()); + } } // 4 = "use ", 1 = ";" diff --git a/tests/target/configs/group_imports/StdExternalCrate-merge_imports.rs b/tests/target/configs/group_imports/StdExternalCrate-merge_imports.rs index 5e4064dd811..dfc071f2752 100644 --- a/tests/target/configs/group_imports/StdExternalCrate-merge_imports.rs +++ b/tests/target/configs/group_imports/StdExternalCrate-merge_imports.rs @@ -1,7 +1,7 @@ // rustfmt-group_imports: StdExternalCrate // rustfmt-imports_granularity: Crate -use alloc::{alloc::Layout, vec::Vec}; use core::f32; +use alloc::{alloc::Layout, vec::Vec}; use std::sync::Arc; use broker::database::PooledConnection; diff --git a/tests/target/configs/group_imports/StdExternalCrate.rs b/tests/target/configs/group_imports/StdExternalCrate.rs index 08025796898..ff71eb3c58a 100644 --- a/tests/target/configs/group_imports/StdExternalCrate.rs +++ b/tests/target/configs/group_imports/StdExternalCrate.rs @@ -1,6 +1,6 @@ // rustfmt-group_imports: StdExternalCrate -use alloc::alloc::Layout; use core::f32; +use alloc::alloc::Layout; use std::sync::Arc; use broker::database::PooledConnection;