Skip to content

Commit 3b4d398

Browse files
committed
new lint: source_item_ordering
1 parent 43e99e5 commit 3b4d398

File tree

10 files changed

+1132
-1
lines changed

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
@@ -6152,6 +6153,7 @@ Released 2018-09-13
61526153
[`disallowed-types`]: https://doc.rust-lang.org/clippy/lint_configuration.html#disallowed-types
61536154
[`doc-valid-idents`]: https://doc.rust-lang.org/clippy/lint_configuration.html#doc-valid-idents
61546155
[`enable-raw-pointer-heuristic-for-send`]: https://doc.rust-lang.org/clippy/lint_configuration.html#enable-raw-pointer-heuristic-for-send
6156+
[`enable-source-item-ordering-for`]: https://doc.rust-lang.org/clippy/lint_configuration.html#enable-source-item-ordering-for
61556157
[`enforce-iter-loop-reborrow`]: https://doc.rust-lang.org/clippy/lint_configuration.html#enforce-iter-loop-reborrow
61566158
[`enforced-import-renames`]: https://doc.rust-lang.org/clippy/lint_configuration.html#enforced-import-renames
61576159
[`enum-variant-name-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#enum-variant-name-threshold
@@ -6169,6 +6171,7 @@ Released 2018-09-13
61696171
[`max-trait-bounds`]: https://doc.rust-lang.org/clippy/lint_configuration.html#max-trait-bounds
61706172
[`min-ident-chars-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#min-ident-chars-threshold
61716173
[`missing-docs-in-crate-items`]: https://doc.rust-lang.org/clippy/lint_configuration.html#missing-docs-in-crate-items
6174+
[`module-item-order-groupings`]: https://doc.rust-lang.org/clippy/lint_configuration.html#module-item-order-groupings
61726175
[`msrv`]: https://doc.rust-lang.org/clippy/lint_configuration.html#msrv
61736176
[`pass-by-value-size-limit`]: https://doc.rust-lang.org/clippy/lint_configuration.html#pass-by-value-size-limit
61746177
[`pub-underscore-fields-behavior`]: https://doc.rust-lang.org/clippy/lint_configuration.html#pub-underscore-fields-behavior
@@ -6182,6 +6185,7 @@ Released 2018-09-13
61826185
[`too-large-for-stack`]: https://doc.rust-lang.org/clippy/lint_configuration.html#too-large-for-stack
61836186
[`too-many-arguments-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#too-many-arguments-threshold
61846187
[`too-many-lines-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#too-many-lines-threshold
6188+
[`trait-assoc-item-kinds-order`]: https://doc.rust-lang.org/clippy/lint_configuration.html#trait-assoc-item-kinds-order
61856189
[`trivial-copy-size-limit`]: https://doc.rust-lang.org/clippy/lint_configuration.html#trivial-copy-size-limit
61866190
[`type-complexity-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#type-complexity-threshold
61876191
[`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
@@ -473,6 +473,16 @@ Whether to apply the raw pointer heuristic to determine if a type is `Send`.
473473
* [`non_send_fields_in_send_ty`](https://rust-lang.github.io/rust-clippy/master/index.html#non_send_fields_in_send_ty)
474474

475475

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

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

668678

679+
## `module-item-order-groupings`
680+
The named groupings of different source item kinds within modules.
681+
682+
**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"]]]`
683+
684+
---
685+
**Affected lints:**
686+
* [`arbitrary_source_item_ordering`](https://rust-lang.github.io/rust-clippy/master/index.html#arbitrary_source_item_ordering)
687+
688+
669689
## `msrv`
670690
The minimum rust version that the project supports. Defaults to the `rust-version` field in `Cargo.toml`
671691

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

864884

885+
## `trait-assoc-item-kinds-order`
886+
The order of associated items in traits.
887+
888+
**Default Value:** `["const", "type", "fn"]`
889+
890+
---
891+
**Affected lints:**
892+
* [`arbitrary_source_item_ordering`](https://rust-lang.github.io/rust-clippy/master/index.html#arbitrary_source_item_ordering)
893+
894+
865895
## `trivial-copy-size-limit`
866896
The maximum size (in bytes) to consider a `Copy` type for passing by value instead of by
867897
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,6 +1,10 @@
11
use crate::ClippyConfiguration;
22
use crate::msrvs::Msrv;
3-
use crate::types::{DisallowedPath, MacroMatcher, MatchLintBehaviour, PubUnderscoreFieldsBehaviour, Rename};
3+
use crate::types::{
4+
DisallowedPath, MacroMatcher, MatchLintBehaviour, PubUnderscoreFieldsBehaviour, Rename, SourceItemOrderingCategory,
5+
SourceItemOrderingEnableFor, SourceItemOrderingModuleItemGroupings, SourceItemOrderingModuleItemKind,
6+
SourceItemOrderingTraitAssocItemKind, SourceItemOrderingTraitAssocItemKinds,
7+
};
48
use rustc_errors::Applicability;
59
use rustc_session::Session;
610
use rustc_span::edit_distance::edit_distance;
@@ -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)]
@@ -459,6 +489,9 @@ define_Conf! {
459489
/// Whether to apply the raw pointer heuristic to determine if a type is `Send`.
460490
#[lints(non_send_fields_in_send_ty)]
461491
enable_raw_pointer_heuristic_for_send: bool = true,
492+
/// Which kind of elements should be ordered internally, possible values being `enum`, `impl`, `module`, `struct`, `trait`.
493+
#[lints(arbitrary_source_item_ordering)]
494+
enable_source_item_ordering_for: SourceItemOrderingEnableFor = DEFAULT_ENABLE_SOURCE_ITEM_ORDERING_FOR.into(),
462495
/// Whether to recommend using implicit into iter for reborrowed values.
463496
///
464497
/// #### Example
@@ -530,6 +563,9 @@ define_Conf! {
530563
/// crate. For example, `pub(crate)` items.
531564
#[lints(missing_docs_in_private_items)]
532565
missing_docs_in_crate_items: bool = false,
566+
/// The named groupings of different source item kinds within modules.
567+
#[lints(arbitrary_source_item_ordering)]
568+
module_item_order_groupings: SourceItemOrderingModuleItemGroupings = DEFAULT_MODULE_ITEM_ORDERING_GROUPS.into(),
533569
/// The minimum rust version that the project supports. Defaults to the `rust-version` field in `Cargo.toml`
534570
#[default_text = "current version"]
535571
#[lints(
@@ -637,6 +673,9 @@ define_Conf! {
637673
/// The maximum number of lines a function or method can have
638674
#[lints(too_many_lines)]
639675
too_many_lines_threshold: u64 = 100,
676+
/// The order of associated items in traits.
677+
#[lints(arbitrary_source_item_ordering)]
678+
trait_assoc_item_kinds_order: SourceItemOrderingTraitAssocItemKinds = DEFAULT_TRAIT_ASSOC_ITEM_KINDS_ORDER.into(),
640679
/// The maximum size (in bytes) to consider a `Copy` type for passing by value instead of by
641680
/// reference. By default there is no limit
642681
#[default_text = "target_pointer_width * 2"]

0 commit comments

Comments
 (0)