Skip to content

Commit 173dd5e

Browse files
committed
new lint: source_item_ordering
1 parent 938f8ba commit 173dd5e

10 files changed

+1132
-1
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5296,6 +5296,7 @@ Released 2018-09-13
52965296
[`almost_complete_range`]: https://rust-lang.github.io/rust-clippy/master/index.html#almost_complete_range
52975297
[`almost_swapped`]: https://rust-lang.github.io/rust-clippy/master/index.html#almost_swapped
52985298
[`approx_constant`]: https://rust-lang.github.io/rust-clippy/master/index.html#approx_constant
5299+
[`arbitrary_source_item_ordering`]: https://rust-lang.github.io/rust-clippy/master/index.html#arbitrary_source_item_ordering
52995300
[`arc_with_non_send_sync`]: https://rust-lang.github.io/rust-clippy/master/index.html#arc_with_non_send_sync
53005301
[`arithmetic_side_effects`]: https://rust-lang.github.io/rust-clippy/master/index.html#arithmetic_side_effects
53015302
[`as_conversions`]: https://rust-lang.github.io/rust-clippy/master/index.html#as_conversions
@@ -6147,6 +6148,7 @@ Released 2018-09-13
61476148
[`disallowed-types`]: https://doc.rust-lang.org/clippy/lint_configuration.html#disallowed-types
61486149
[`doc-valid-idents`]: https://doc.rust-lang.org/clippy/lint_configuration.html#doc-valid-idents
61496150
[`enable-raw-pointer-heuristic-for-send`]: https://doc.rust-lang.org/clippy/lint_configuration.html#enable-raw-pointer-heuristic-for-send
6151+
[`enable-source-item-ordering-for`]: https://doc.rust-lang.org/clippy/lint_configuration.html#enable-source-item-ordering-for
61506152
[`enforce-iter-loop-reborrow`]: https://doc.rust-lang.org/clippy/lint_configuration.html#enforce-iter-loop-reborrow
61516153
[`enforced-import-renames`]: https://doc.rust-lang.org/clippy/lint_configuration.html#enforced-import-renames
61526154
[`enum-variant-name-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#enum-variant-name-threshold
@@ -6164,6 +6166,7 @@ Released 2018-09-13
61646166
[`max-trait-bounds`]: https://doc.rust-lang.org/clippy/lint_configuration.html#max-trait-bounds
61656167
[`min-ident-chars-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#min-ident-chars-threshold
61666168
[`missing-docs-in-crate-items`]: https://doc.rust-lang.org/clippy/lint_configuration.html#missing-docs-in-crate-items
6169+
[`module-item-order-groupings`]: https://doc.rust-lang.org/clippy/lint_configuration.html#module-item-order-groupings
61676170
[`msrv`]: https://doc.rust-lang.org/clippy/lint_configuration.html#msrv
61686171
[`pass-by-value-size-limit`]: https://doc.rust-lang.org/clippy/lint_configuration.html#pass-by-value-size-limit
61696172
[`pub-underscore-fields-behavior`]: https://doc.rust-lang.org/clippy/lint_configuration.html#pub-underscore-fields-behavior
@@ -6177,6 +6180,7 @@ Released 2018-09-13
61776180
[`too-large-for-stack`]: https://doc.rust-lang.org/clippy/lint_configuration.html#too-large-for-stack
61786181
[`too-many-arguments-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#too-many-arguments-threshold
61796182
[`too-many-lines-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#too-many-lines-threshold
6183+
[`trait-assoc-item-kinds-order`]: https://doc.rust-lang.org/clippy/lint_configuration.html#trait-assoc-item-kinds-order
61806184
[`trivial-copy-size-limit`]: https://doc.rust-lang.org/clippy/lint_configuration.html#trivial-copy-size-limit
61816185
[`type-complexity-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#type-complexity-threshold
61826186
[`unnecessary-box-size`]: https://doc.rust-lang.org/clippy/lint_configuration.html#unnecessary-box-size

book/src/lint_configuration.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,16 @@ Whether to apply the raw pointer heuristic to determine if a type is `Send`.
472472
* [`non_send_fields_in_send_ty`](https://rust-lang.github.io/rust-clippy/master/index.html#non_send_fields_in_send_ty)
473473

474474

475+
## `enable-source-item-ordering-for`
476+
Which kind of elements should be ordered internally, possible values being `enum`, `impl`, `module`, `struct`, `trait`.
477+
478+
**Default Value:** `["enum", "impl", "module", "struct", "trait"]`
479+
480+
---
481+
**Affected lints:**
482+
* [`arbitrary_source_item_ordering`](https://rust-lang.github.io/rust-clippy/master/index.html#arbitrary_source_item_ordering)
483+
484+
475485
## `enforce-iter-loop-reborrow`
476486
Whether to recommend using implicit into iter for reborrowed values.
477487

@@ -665,6 +675,16 @@ crate. For example, `pub(crate)` items.
665675
* [`missing_docs_in_private_items`](https://rust-lang.github.io/rust-clippy/master/index.html#missing_docs_in_private_items)
666676

667677

678+
## `module-item-order-groupings`
679+
The named groupings of different source item kinds within modules.
680+
681+
**Default Value:** `[["modules", ["mod", "foreign_mod"]], ["use", ["use"]], ["macros", ["macro"]], ["global_asm", ["global_asm"]], ["UPPER_SNAKE_CASE", ["static", "const"]], ["PascalCase", ["ty_alias", "opaque_ty", "enum", "struct", "union", "trait", "trait_alias", "impl"]], ["lower_snake_case", ["fn"]]]`
682+
683+
---
684+
**Affected lints:**
685+
* [`arbitrary_source_item_ordering`](https://rust-lang.github.io/rust-clippy/master/index.html#arbitrary_source_item_ordering)
686+
687+
668688
## `msrv`
669689
The minimum rust version that the project supports. Defaults to the `rust-version` field in `Cargo.toml`
670690

@@ -860,6 +880,16 @@ The maximum number of lines a function or method can have
860880
* [`too_many_lines`](https://rust-lang.github.io/rust-clippy/master/index.html#too_many_lines)
861881

862882

883+
## `trait-assoc-item-kinds-order`
884+
The order of associated items in traits.
885+
886+
**Default Value:** `["const", "type", "fn"]`
887+
888+
---
889+
**Affected lints:**
890+
* [`arbitrary_source_item_ordering`](https://rust-lang.github.io/rust-clippy/master/index.html#arbitrary_source_item_ordering)
891+
892+
863893
## `trivial-copy-size-limit`
864894
The maximum size (in bytes) to consider a `Copy` type for passing by value instead of by
865895
reference. By default there is no limit

clippy_config/src/conf.rs

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
use crate::msrvs::Msrv;
2-
use crate::types::{DisallowedPath, MacroMatcher, MatchLintBehaviour, PubUnderscoreFieldsBehaviour, Rename};
2+
use crate::types::{
3+
DisallowedPath, MacroMatcher, MatchLintBehaviour, PubUnderscoreFieldsBehaviour, Rename, SourceItemOrderingCategory,
4+
SourceItemOrderingEnableFor, SourceItemOrderingModuleItemGroupings, SourceItemOrderingModuleItemKind,
5+
SourceItemOrderingTraitAssocItemKind, SourceItemOrderingTraitAssocItemKinds,
6+
};
37
use crate::ClippyConfiguration;
48
use rustc_errors::Applicability;
59
use rustc_session::Session;
@@ -46,6 +50,32 @@ const DEFAULT_ALLOWED_IDENTS_BELOW_MIN_CHARS: &[&str] = &["i", "j", "x", "y", "z
4650
const DEFAULT_ALLOWED_PREFIXES: &[&str] = &["to", "as", "into", "from", "try_into", "try_from"];
4751
const DEFAULT_ALLOWED_TRAITS_WITH_RENAMED_PARAMS: &[&str] =
4852
&["core::convert::From", "core::convert::TryFrom", "core::str::FromStr"];
53+
const DEFAULT_MODULE_ITEM_ORDERING_GROUPS: &[(&str, &[SourceItemOrderingModuleItemKind])] = {
54+
#[allow(clippy::enum_glob_use)] // Very local glob use for legibility.
55+
use SourceItemOrderingModuleItemKind::*;
56+
&[
57+
("modules", &[Mod, ForeignMod]),
58+
("use", &[Use]),
59+
("macros", &[Macro]),
60+
("global_asm", &[GlobalAsm]),
61+
("UPPER_SNAKE_CASE", &[Static, Const]),
62+
(
63+
"PascalCase",
64+
&[TyAlias, OpaqueTy, Enum, Struct, Union, Trait, TraitAlias, Impl],
65+
),
66+
("lower_snake_case", &[Fn]),
67+
]
68+
};
69+
const DEFAULT_TRAIT_ASSOC_ITEM_KINDS_ORDER: &[SourceItemOrderingTraitAssocItemKind] = {
70+
#[allow(clippy::enum_glob_use)] // Very local glob use for legibility.
71+
use SourceItemOrderingTraitAssocItemKind::*;
72+
&[Const, Type, Fn]
73+
};
74+
const DEFAULT_ENABLE_SOURCE_ITEM_ORDERING_FOR: &[SourceItemOrderingCategory] = {
75+
#[allow(clippy::enum_glob_use)] // Very local glob use for legibility.
76+
use SourceItemOrderingCategory::*;
77+
&[Enum, Impl, Module, Struct, Trait]
78+
};
4979

5080
/// Conf with parse errors
5181
#[derive(Default)]
@@ -434,6 +464,9 @@ define_Conf! {
434464
/// Whether to apply the raw pointer heuristic to determine if a type is `Send`.
435465
#[lints(non_send_fields_in_send_ty)]
436466
enable_raw_pointer_heuristic_for_send: bool = true,
467+
/// Which kind of elements should be ordered internally, possible values being `enum`, `impl`, `module`, `struct`, `trait`.
468+
#[lints(arbitrary_source_item_ordering)]
469+
enable_source_item_ordering_for: SourceItemOrderingEnableFor = DEFAULT_ENABLE_SOURCE_ITEM_ORDERING_FOR.into(),
437470
/// Whether to recommend using implicit into iter for reborrowed values.
438471
///
439472
/// #### Example
@@ -505,6 +538,9 @@ define_Conf! {
505538
/// crate. For example, `pub(crate)` items.
506539
#[lints(missing_docs_in_private_items)]
507540
missing_docs_in_crate_items: bool = false,
541+
/// The named groupings of different source item kinds within modules.
542+
#[lints(arbitrary_source_item_ordering)]
543+
module_item_order_groupings: SourceItemOrderingModuleItemGroupings = DEFAULT_MODULE_ITEM_ORDERING_GROUPS.into(),
508544
/// The minimum rust version that the project supports. Defaults to the `rust-version` field in `Cargo.toml`
509545
#[default_text = "current version"]
510546
#[lints(
@@ -611,6 +647,9 @@ define_Conf! {
611647
/// The maximum number of lines a function or method can have
612648
#[lints(too_many_lines)]
613649
too_many_lines_threshold: u64 = 100,
650+
/// The order of associated items in traits.
651+
#[lints(arbitrary_source_item_ordering)]
652+
trait_assoc_item_kinds_order: SourceItemOrderingTraitAssocItemKinds = DEFAULT_TRAIT_ASSOC_ITEM_KINDS_ORDER.into(),
614653
/// The maximum size (in bytes) to consider a `Copy` type for passing by value instead of by
615654
/// reference. By default there is no limit
616655
#[default_text = "target_pointer_width * 2"]

0 commit comments

Comments
 (0)