Skip to content

Commit 97a3b24

Browse files
committed
new lint: source_item_ordering
1 parent 625d391 commit 97a3b24

32 files changed

+2257
-1
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -5331,6 +5331,7 @@ Released 2018-09-13
53315331
[`almost_complete_range`]: https://rust-lang.github.io/rust-clippy/master/index.html#almost_complete_range
53325332
[`almost_swapped`]: https://rust-lang.github.io/rust-clippy/master/index.html#almost_swapped
53335333
[`approx_constant`]: https://rust-lang.github.io/rust-clippy/master/index.html#approx_constant
5334+
[`arbitrary_source_item_ordering`]: https://rust-lang.github.io/rust-clippy/master/index.html#arbitrary_source_item_ordering
53345335
[`arc_with_non_send_sync`]: https://rust-lang.github.io/rust-clippy/master/index.html#arc_with_non_send_sync
53355336
[`arithmetic_side_effects`]: https://rust-lang.github.io/rust-clippy/master/index.html#arithmetic_side_effects
53365337
[`as_conversions`]: https://rust-lang.github.io/rust-clippy/master/index.html#as_conversions
@@ -6206,19 +6207,22 @@ Released 2018-09-13
62066207
[`max-trait-bounds`]: https://doc.rust-lang.org/clippy/lint_configuration.html#max-trait-bounds
62076208
[`min-ident-chars-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#min-ident-chars-threshold
62086209
[`missing-docs-in-crate-items`]: https://doc.rust-lang.org/clippy/lint_configuration.html#missing-docs-in-crate-items
6210+
[`module-item-order-groupings`]: https://doc.rust-lang.org/clippy/lint_configuration.html#module-item-order-groupings
62096211
[`msrv`]: https://doc.rust-lang.org/clippy/lint_configuration.html#msrv
62106212
[`pass-by-value-size-limit`]: https://doc.rust-lang.org/clippy/lint_configuration.html#pass-by-value-size-limit
62116213
[`pub-underscore-fields-behavior`]: https://doc.rust-lang.org/clippy/lint_configuration.html#pub-underscore-fields-behavior
62126214
[`semicolon-inside-block-ignore-singleline`]: https://doc.rust-lang.org/clippy/lint_configuration.html#semicolon-inside-block-ignore-singleline
62136215
[`semicolon-outside-block-ignore-multiline`]: https://doc.rust-lang.org/clippy/lint_configuration.html#semicolon-outside-block-ignore-multiline
62146216
[`single-char-binding-names-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#single-char-binding-names-threshold
6217+
[`source-item-ordering`]: https://doc.rust-lang.org/clippy/lint_configuration.html#source-item-ordering
62156218
[`stack-size-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#stack-size-threshold
62166219
[`standard-macro-braces`]: https://doc.rust-lang.org/clippy/lint_configuration.html#standard-macro-braces
62176220
[`struct-field-name-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#struct-field-name-threshold
62186221
[`suppress-restriction-lint-in-const`]: https://doc.rust-lang.org/clippy/lint_configuration.html#suppress-restriction-lint-in-const
62196222
[`too-large-for-stack`]: https://doc.rust-lang.org/clippy/lint_configuration.html#too-large-for-stack
62206223
[`too-many-arguments-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#too-many-arguments-threshold
62216224
[`too-many-lines-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#too-many-lines-threshold
6225+
[`trait-assoc-item-kinds-order`]: https://doc.rust-lang.org/clippy/lint_configuration.html#trait-assoc-item-kinds-order
62226226
[`trivial-copy-size-limit`]: https://doc.rust-lang.org/clippy/lint_configuration.html#trivial-copy-size-limit
62236227
[`type-complexity-threshold`]: https://doc.rust-lang.org/clippy/lint_configuration.html#type-complexity-threshold
62246228
[`unnecessary-box-size`]: https://doc.rust-lang.org/clippy/lint_configuration.html#unnecessary-box-size

book/src/lint_configuration.md

+30
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,16 @@ crate. For example, `pub(crate)` items.
666666
* [`missing_docs_in_private_items`](https://rust-lang.github.io/rust-clippy/master/index.html#missing_docs_in_private_items)
667667

668668

669+
## `module-item-order-groupings`
670+
The named groupings of different source item kinds within modules.
671+
672+
**Default Value:** `[["modules", ["extern_crate", "mod", "foreign_mod"]], ["use", ["use"]], ["macros", ["macro"]], ["global_asm", ["global_asm"]], ["UPPER_SNAKE_CASE", ["static", "const"]], ["PascalCase", ["ty_alias", "enum", "struct", "union", "trait", "trait_alias", "impl"]], ["lower_snake_case", ["fn"]]]`
673+
674+
---
675+
**Affected lints:**
676+
* [`arbitrary_source_item_ordering`](https://rust-lang.github.io/rust-clippy/master/index.html#arbitrary_source_item_ordering)
677+
678+
669679
## `msrv`
670680
The minimum rust version that the project supports. Defaults to the `rust-version` field in `Cargo.toml`
671681

@@ -783,6 +793,16 @@ The maximum number of single char bindings a scope may have
783793
* [`many_single_char_names`](https://rust-lang.github.io/rust-clippy/master/index.html#many_single_char_names)
784794

785795

796+
## `source-item-ordering`
797+
Which kind of elements should be ordered internally, possible values being `enum`, `impl`, `module`, `struct`, `trait`.
798+
799+
**Default Value:** `["enum", "impl", "module", "struct", "trait"]`
800+
801+
---
802+
**Affected lints:**
803+
* [`arbitrary_source_item_ordering`](https://rust-lang.github.io/rust-clippy/master/index.html#arbitrary_source_item_ordering)
804+
805+
786806
## `stack-size-threshold`
787807
The maximum allowed stack size for functions in bytes
788808

@@ -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

+37-1
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, SourceItemOrdering,
5+
SourceItemOrderingCategory, SourceItemOrderingModuleItemGroupings, SourceItemOrderingModuleItemKind,
6+
SourceItemOrderingTraitAssocItemKind, SourceItemOrderingTraitAssocItemKinds,
7+
};
48
use rustc_errors::Applicability;
59
use rustc_session::Session;
610
use rustc_span::edit_distance::edit_distance;
@@ -47,6 +51,29 @@ const DEFAULT_ALLOWED_IDENTS_BELOW_MIN_CHARS: &[&str] = &["i", "j", "x", "y", "z
4751
const DEFAULT_ALLOWED_PREFIXES: &[&str] = &["to", "as", "into", "from", "try_into", "try_from"];
4852
const DEFAULT_ALLOWED_TRAITS_WITH_RENAMED_PARAMS: &[&str] =
4953
&["core::convert::From", "core::convert::TryFrom", "core::str::FromStr"];
54+
const DEFAULT_MODULE_ITEM_ORDERING_GROUPS: &[(&str, &[SourceItemOrderingModuleItemKind])] = {
55+
#[allow(clippy::enum_glob_use)] // Very local glob use for legibility.
56+
use SourceItemOrderingModuleItemKind::*;
57+
&[
58+
("modules", &[ExternCrate, Mod, ForeignMod]),
59+
("use", &[Use]),
60+
("macros", &[Macro]),
61+
("global_asm", &[GlobalAsm]),
62+
("UPPER_SNAKE_CASE", &[Static, Const]),
63+
("PascalCase", &[TyAlias, Enum, Struct, Union, Trait, TraitAlias, Impl]),
64+
("lower_snake_case", &[Fn]),
65+
]
66+
};
67+
const DEFAULT_TRAIT_ASSOC_ITEM_KINDS_ORDER: &[SourceItemOrderingTraitAssocItemKind] = {
68+
#[allow(clippy::enum_glob_use)] // Very local glob use for legibility.
69+
use SourceItemOrderingTraitAssocItemKind::*;
70+
&[Const, Type, Fn]
71+
};
72+
const DEFAULT_SOURCE_ITEM_ORDERING: &[SourceItemOrderingCategory] = {
73+
#[allow(clippy::enum_glob_use)] // Very local glob use for legibility.
74+
use SourceItemOrderingCategory::*;
75+
&[Enum, Impl, Module, Struct, Trait]
76+
};
5077

5178
/// Conf with parse errors
5279
#[derive(Default)]
@@ -533,6 +560,9 @@ define_Conf! {
533560
/// crate. For example, `pub(crate)` items.
534561
#[lints(missing_docs_in_private_items)]
535562
missing_docs_in_crate_items: bool = false,
563+
/// The named groupings of different source item kinds within modules.
564+
#[lints(arbitrary_source_item_ordering)]
565+
module_item_order_groupings: SourceItemOrderingModuleItemGroupings = DEFAULT_MODULE_ITEM_ORDERING_GROUPS.into(),
536566
/// The minimum rust version that the project supports. Defaults to the `rust-version` field in `Cargo.toml`
537567
#[default_text = "current version"]
538568
#[lints(
@@ -611,6 +641,9 @@ define_Conf! {
611641
/// The maximum number of single char bindings a scope may have
612642
#[lints(many_single_char_names)]
613643
single_char_binding_names_threshold: u64 = 4,
644+
/// Which kind of elements should be ordered internally, possible values being `enum`, `impl`, `module`, `struct`, `trait`.
645+
#[lints(arbitrary_source_item_ordering)]
646+
source_item_ordering: SourceItemOrdering = DEFAULT_SOURCE_ITEM_ORDERING.into(),
614647
/// The maximum allowed stack size for functions in bytes
615648
#[lints(large_stack_frames)]
616649
stack_size_threshold: u64 = 512_000,
@@ -640,6 +673,9 @@ define_Conf! {
640673
/// The maximum number of lines a function or method can have
641674
#[lints(too_many_lines)]
642675
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(),
643679
/// The maximum size (in bytes) to consider a `Copy` type for passing by value instead of by
644680
/// reference. By default there is no limit
645681
#[default_text = "target_pointer_width * 2"]

0 commit comments

Comments
 (0)