Skip to content

group_imports: add ExternalCrate #5343

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion Configurations.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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.
Expand Down
4 changes: 4 additions & 0 deletions src/config/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
7 changes: 4 additions & 3 deletions src/reorder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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<UseTree>) -> Vec<Vec<UseTree>> {
fn group_imports(uts: Vec<UseTree>, separate_std: bool) -> Vec<Vec<UseTree>> {
let mut std_imports = Vec::new();
let mut external_imports = Vec::new();
let mut local_imports = Vec::new();
Expand All @@ -184,7 +185,7 @@ fn group_imports(uts: Vec<UseTree>) -> Vec<Vec<UseTree>> {
}
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(_) => {
Expand Down
17 changes: 17 additions & 0 deletions tests/source/configs/group_imports/ExternalCrate-merge_imports.rs
Original file line number Diff line number Diff line change
@@ -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;
7 changes: 7 additions & 0 deletions tests/source/configs/group_imports/ExternalCrate-nested.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// rustfmt-group_imports: ExternalCrate
mod test {
use crate::foo::bar;
use std::path;
use crate::foo::bar2;
use chrono::Utc;
}
17 changes: 17 additions & 0 deletions tests/source/configs/group_imports/ExternalCrate-no_reorder.rs
Original file line number Diff line number Diff line change
@@ -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;
Original file line number Diff line number Diff line change
@@ -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;
15 changes: 15 additions & 0 deletions tests/source/configs/group_imports/ExternalCrate.rs
Original file line number Diff line number Diff line change
@@ -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;
15 changes: 15 additions & 0 deletions tests/target/configs/group_imports/ExternalCrate-merge_imports.rs
Original file line number Diff line number Diff line change
@@ -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;
8 changes: 8 additions & 0 deletions tests/target/configs/group_imports/ExternalCrate-nested.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// rustfmt-group_imports: ExternalCrate
mod test {
use chrono::Utc;
use std::path;

use crate::foo::bar;
use crate::foo::bar2;
}
14 changes: 14 additions & 0 deletions tests/target/configs/group_imports/ExternalCrate-no_reorder.rs
Original file line number Diff line number Diff line change
@@ -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;
Original file line number Diff line number Diff line change
@@ -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;
12 changes: 12 additions & 0 deletions tests/target/configs/group_imports/ExternalCrate.rs
Original file line number Diff line number Diff line change
@@ -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;