From e1fe4eaed678fb791088e96672bd63c709f3a6bf Mon Sep 17 00:00:00 2001 From: Ruby Lazuli Date: Mon, 16 May 2022 12:03:39 -0500 Subject: [PATCH] group_imports: add `ExternalCrate` This is similar to the existing `StdExternalCrate`, but doesn't give `std`, `core`, and `alloc` their own group. Conceptually, `std` and friends are just external libraries (though they have some magical abilities thanks to lang items and `rustc_attrs`), so this is the style I naturally gravitated towards. I'm not sure how common this pattern is throughout the ecosystem, but I do hope this will be useful to someone other than me. --- Configurations.md | 22 ++++++++++++++- src/config/options.rs | 4 +++ src/reorder.rs | 7 ++--- .../ExternalCrate-merge_imports.rs | 17 ++++++++++++ .../group_imports/ExternalCrate-nested.rs | 7 +++++ .../group_imports/ExternalCrate-no_reorder.rs | 17 ++++++++++++ .../ExternalCrate-non_consecutive.rs | 27 +++++++++++++++++++ .../configs/group_imports/ExternalCrate.rs | 15 +++++++++++ .../ExternalCrate-merge_imports.rs | 15 +++++++++++ .../group_imports/ExternalCrate-nested.rs | 8 ++++++ .../group_imports/ExternalCrate-no_reorder.rs | 14 ++++++++++ .../ExternalCrate-non_consecutive.rs | 16 +++++++++++ .../configs/group_imports/ExternalCrate.rs | 12 +++++++++ 13 files changed, 177 insertions(+), 4 deletions(-) create mode 100644 tests/source/configs/group_imports/ExternalCrate-merge_imports.rs create mode 100644 tests/source/configs/group_imports/ExternalCrate-nested.rs create mode 100644 tests/source/configs/group_imports/ExternalCrate-no_reorder.rs create mode 100644 tests/source/configs/group_imports/ExternalCrate-non_consecutive.rs create mode 100644 tests/source/configs/group_imports/ExternalCrate.rs create mode 100644 tests/target/configs/group_imports/ExternalCrate-merge_imports.rs create mode 100644 tests/target/configs/group_imports/ExternalCrate-nested.rs create mode 100644 tests/target/configs/group_imports/ExternalCrate-no_reorder.rs create mode 100644 tests/target/configs/group_imports/ExternalCrate-non_consecutive.rs create mode 100644 tests/target/configs/group_imports/ExternalCrate.rs diff --git a/Configurations.md b/Configurations.md index 7afd4b5cd6a..7e3d3da5853 100644 --- a/Configurations.md +++ b/Configurations.md @@ -2066,7 +2066,7 @@ Controls the strategy for how consecutive imports are grouped together. Controls the strategy for grouping sets of consecutive imports. Imports may contain newlines between imports and still be grouped together as a single set, but other statements between imports will result in different grouping sets. - **Default value**: `Preserve` -- **Possible values**: `Preserve`, `StdExternalCrate`, `One` +- **Possible values**: `Preserve`, `StdExternalCrate`, `One`, `ExternalCrate` - **Stable**: No (tracking issue: [#5083](https://github.com/rust-lang/rustfmt/issues/5083)) Each set of imports (one or more `use` statements, optionally separated by newlines) will be formatted independently. Other statements such as `mod ...` or `extern crate ...` will cause imports to not be grouped together. @@ -2131,6 +2131,26 @@ use std::sync::Arc; use uuid::Uuid; ``` +#### `ExternalCrate`: + +Discard existing import groups, and create two groups for: +1. `std`, `core`, `alloc`, and external crates, +2. `self`, `super` and `crate` imports. + +```rust +use alloc::alloc::Layout; +use broker::database::PooledConnection; +use chrono::Utc; +use core::f32; +use juniper::{FieldError, FieldResult}; +use std::sync::Arc; +use uuid::Uuid; + +use super::schema::{Context, Payload}; +use super::update::convert_publish_payload; +use crate::models::Event; +``` + ## `reorder_modules` Reorder `mod` declarations alphabetically in group. diff --git a/src/config/options.rs b/src/config/options.rs index d857c29be29..82ba7e6eb24 100644 --- a/src/config/options.rs +++ b/src/config/options.rs @@ -114,6 +114,10 @@ pub enum GroupImportsTactic { StdExternalCrate, /// Discard existing groups, and create a single group for everything One, + /// Discard existing groups, and create new groups for + /// 1. imports from other crates + /// 2. `self` / `crate` / `super` imports + ExternalCrate, } #[config_type] diff --git a/src/reorder.rs b/src/reorder.rs index 8ae297de25b..066ee651c81 100644 --- a/src/reorder.rs +++ b/src/reorder.rs @@ -116,7 +116,8 @@ fn rewrite_reorderable_or_regroupable_items( GroupImportsTactic::Preserve | GroupImportsTactic::One => { vec![normalized_items] } - GroupImportsTactic::StdExternalCrate => group_imports(normalized_items), + GroupImportsTactic::StdExternalCrate => group_imports(normalized_items, true), + GroupImportsTactic::ExternalCrate => group_imports(normalized_items, false), }; if context.config.reorder_imports() { @@ -172,7 +173,7 @@ fn contains_macro_use_attr(item: &ast::Item) -> bool { /// Divides imports into three groups, corresponding to standard, external /// and local imports. Sorts each subgroup. -fn group_imports(uts: Vec) -> Vec> { +fn group_imports(uts: Vec, separate_std: bool) -> Vec> { let mut std_imports = Vec::new(); let mut external_imports = Vec::new(); let mut local_imports = Vec::new(); @@ -184,7 +185,7 @@ fn group_imports(uts: Vec) -> Vec> { } match &ut.path[0] { UseSegment::Ident(id, _) => match id.as_ref() { - "std" | "alloc" | "core" => std_imports.push(ut), + "std" | "alloc" | "core" if separate_std => std_imports.push(ut), _ => external_imports.push(ut), }, UseSegment::Slf(_) | UseSegment::Super(_) | UseSegment::Crate(_) => { diff --git a/tests/source/configs/group_imports/ExternalCrate-merge_imports.rs b/tests/source/configs/group_imports/ExternalCrate-merge_imports.rs new file mode 100644 index 00000000000..c5c013068f9 --- /dev/null +++ b/tests/source/configs/group_imports/ExternalCrate-merge_imports.rs @@ -0,0 +1,17 @@ +// rustfmt-group_imports: ExternalCrate +// rustfmt-imports_granularity: Crate +use chrono::Utc; +use super::update::convert_publish_payload; + +use juniper::{FieldError, FieldResult}; +use uuid::Uuid; +use alloc::alloc::Layout; + +use std::sync::Arc; +use alloc::vec::Vec; + +use broker::database::PooledConnection; + +use super::schema::{Context, Payload}; +use core::f32; +use crate::models::Event; diff --git a/tests/source/configs/group_imports/ExternalCrate-nested.rs b/tests/source/configs/group_imports/ExternalCrate-nested.rs new file mode 100644 index 00000000000..3d22baab47e --- /dev/null +++ b/tests/source/configs/group_imports/ExternalCrate-nested.rs @@ -0,0 +1,7 @@ +// rustfmt-group_imports: ExternalCrate +mod test { + use crate::foo::bar; + use std::path; + use crate::foo::bar2; + use chrono::Utc; +} diff --git a/tests/source/configs/group_imports/ExternalCrate-no_reorder.rs b/tests/source/configs/group_imports/ExternalCrate-no_reorder.rs new file mode 100644 index 00000000000..b762340c26a --- /dev/null +++ b/tests/source/configs/group_imports/ExternalCrate-no_reorder.rs @@ -0,0 +1,17 @@ +// rustfmt-group_imports: ExternalCrate +// rustfmt-reorder_imports: false + +use chrono::Utc; +use super::update::convert_publish_payload; + +use juniper::{FieldError, FieldResult}; +use uuid::Uuid; +use alloc::alloc::Layout; + +use std::sync::Arc; + +use broker::database::PooledConnection; + +use super::schema::{Context, Payload}; +use core::f32; +use crate::models::Event; diff --git a/tests/source/configs/group_imports/ExternalCrate-non_consecutive.rs b/tests/source/configs/group_imports/ExternalCrate-non_consecutive.rs new file mode 100644 index 00000000000..8ffecce9205 --- /dev/null +++ b/tests/source/configs/group_imports/ExternalCrate-non_consecutive.rs @@ -0,0 +1,27 @@ +// rustfmt-group_imports: ExternalCrate +use chrono::Utc; +use super::update::convert_publish_payload; + + + + + +use juniper::{FieldError, FieldResult}; + +use uuid::Uuid; +use alloc::alloc::Layout; + +extern crate uuid; + + + + + +use std::sync::Arc; + + +use broker::database::PooledConnection; + +use super::schema::{Context, Payload}; +use core::f32; +use crate::models::Event; diff --git a/tests/source/configs/group_imports/ExternalCrate.rs b/tests/source/configs/group_imports/ExternalCrate.rs new file mode 100644 index 00000000000..b209192f36d --- /dev/null +++ b/tests/source/configs/group_imports/ExternalCrate.rs @@ -0,0 +1,15 @@ +// rustfmt-group_imports: ExternalCrate +use chrono::Utc; +use super::update::convert_publish_payload; + +use juniper::{FieldError, FieldResult}; +use uuid::Uuid; +use alloc::alloc::Layout; + +use std::sync::Arc; + +use broker::database::PooledConnection; + +use super::schema::{Context, Payload}; +use core::f32; +use crate::models::Event; diff --git a/tests/target/configs/group_imports/ExternalCrate-merge_imports.rs b/tests/target/configs/group_imports/ExternalCrate-merge_imports.rs new file mode 100644 index 00000000000..cea05e76826 --- /dev/null +++ b/tests/target/configs/group_imports/ExternalCrate-merge_imports.rs @@ -0,0 +1,15 @@ +// rustfmt-group_imports: ExternalCrate +// rustfmt-imports_granularity: Crate +use alloc::{alloc::Layout, vec::Vec}; +use broker::database::PooledConnection; +use chrono::Utc; +use core::f32; +use juniper::{FieldError, FieldResult}; +use std::sync::Arc; +use uuid::Uuid; + +use super::{ + schema::{Context, Payload}, + update::convert_publish_payload, +}; +use crate::models::Event; diff --git a/tests/target/configs/group_imports/ExternalCrate-nested.rs b/tests/target/configs/group_imports/ExternalCrate-nested.rs new file mode 100644 index 00000000000..abedc157231 --- /dev/null +++ b/tests/target/configs/group_imports/ExternalCrate-nested.rs @@ -0,0 +1,8 @@ +// rustfmt-group_imports: ExternalCrate +mod test { + use chrono::Utc; + use std::path; + + use crate::foo::bar; + use crate::foo::bar2; +} diff --git a/tests/target/configs/group_imports/ExternalCrate-no_reorder.rs b/tests/target/configs/group_imports/ExternalCrate-no_reorder.rs new file mode 100644 index 00000000000..6673cc09097 --- /dev/null +++ b/tests/target/configs/group_imports/ExternalCrate-no_reorder.rs @@ -0,0 +1,14 @@ +// rustfmt-group_imports: ExternalCrate +// rustfmt-reorder_imports: false + +use chrono::Utc; +use juniper::{FieldError, FieldResult}; +use uuid::Uuid; +use alloc::alloc::Layout; +use std::sync::Arc; +use broker::database::PooledConnection; +use core::f32; + +use super::update::convert_publish_payload; +use super::schema::{Context, Payload}; +use crate::models::Event; diff --git a/tests/target/configs/group_imports/ExternalCrate-non_consecutive.rs b/tests/target/configs/group_imports/ExternalCrate-non_consecutive.rs new file mode 100644 index 00000000000..259d22a838a --- /dev/null +++ b/tests/target/configs/group_imports/ExternalCrate-non_consecutive.rs @@ -0,0 +1,16 @@ +// rustfmt-group_imports: ExternalCrate +use alloc::alloc::Layout; +use chrono::Utc; +use juniper::{FieldError, FieldResult}; +use uuid::Uuid; + +use super::update::convert_publish_payload; + +extern crate uuid; + +use broker::database::PooledConnection; +use core::f32; +use std::sync::Arc; + +use super::schema::{Context, Payload}; +use crate::models::Event; diff --git a/tests/target/configs/group_imports/ExternalCrate.rs b/tests/target/configs/group_imports/ExternalCrate.rs new file mode 100644 index 00000000000..8af9c1fd4a4 --- /dev/null +++ b/tests/target/configs/group_imports/ExternalCrate.rs @@ -0,0 +1,12 @@ +// rustfmt-group_imports: ExternalCrate +use alloc::alloc::Layout; +use broker::database::PooledConnection; +use chrono::Utc; +use core::f32; +use juniper::{FieldError, FieldResult}; +use std::sync::Arc; +use uuid::Uuid; + +use super::schema::{Context, Payload}; +use super::update::convert_publish_payload; +use crate::models::Event;