rust-clippy/tests/ui/struct_fields.rs
2024-02-27 13:34:01 +00:00

345 lines
7.2 KiB
Rust

//@aux-build:proc_macros.rs
#![warn(clippy::struct_field_names)]
#![allow(unused)]
#[macro_use]
extern crate proc_macros;
struct Data1 {
field_data1: u8,
//~^ ERROR: field name ends with the struct's name
another: u8,
foo: u8,
bar: u8,
}
struct Data2 {
another: u8,
foo: u8,
data2_field: u8,
//~^ ERROR: field name starts with the struct's name
bar: u8,
}
struct StructData {
//~^ ERROR: all fields have the same postfix: `data`
movable_data: u8,
fixed_data: u8,
invisible_data: u8,
}
struct DataStruct {
//~^ ERROR: all fields have the same prefix: `data`
data_movable: u8,
data_fixed: u8,
data_invisible: u8,
}
struct DoublePrefix {
//~^ ERROR: all fields have the same prefix: `some_data`
some_data_a: bool,
some_data_b: i8,
some_data_c: bool,
}
struct DoublePostfix {
//~^ ERROR: all fields have the same postfix: `some_data`
a_some_data: bool,
b_some_data: i8,
c_some_data: bool,
}
#[allow(non_snake_case)]
struct NotSnakeCase {
//~^ ERROR: all fields have the same postfix: `someData`
a_someData: bool,
b_someData: i8,
c_someData: bool,
}
#[allow(non_snake_case)]
struct NotSnakeCase2 {
//~^ ERROR: all fields have the same prefix: `someData`
someData_c: bool,
someData_b: i8,
someData_a_b: bool,
}
// no error, threshold is 3 fields by default
struct Fooo {
foo: u8,
bar: u8,
}
struct NonCaps {
//~^ ERROR: all fields have the same prefix: `prefix`
prefix_的: u8,
prefix_tea: u8,
prefix_cake: u8,
}
// should not lint
#[allow(clippy::struct_field_names)]
pub mod allowed {
pub struct PubAllowed {
some_this: u8,
some_that: u8,
some_other_what: u8,
}
}
// should not lint
struct SomeData {
foo: u8,
bar: bool,
path: u8,
answer: u8,
}
// should not lint
pub struct NetworkLayer {
layer1: Vec<u8>,
layer2: Vec<u8>,
layer3: Vec<u8>,
layer4: Vec<u8>,
}
//should not lint
struct North {
normal: u8,
no_left: u8,
no_right: u8,
}
mod issue8324_from_enum_variant_names {
// 8324: enum_variant_names warns even if removing the suffix would leave an empty string
struct Phase {
pre_lookup: u8,
lookup: u8,
post_lookup: u8,
}
}
mod issue9018_from_enum_variant_names {
struct DoLint {
//~^ ERROR: all fields have the same prefix: `_type`
_type_create: u8,
_type_read: u8,
_type_update: u8,
_type_destroy: u8,
}
struct DoLint2 {
//~^ ERROR: all fields have the same prefix: `__type`
__type_create: u8,
__type_read: u8,
__type_update: u8,
__type_destroy: u8,
}
struct DoLint3 {
//~^ ERROR: all fields have the same prefix: `___type`
___type_create: u8,
___type_read: u8,
___type_update: u8,
___type_destroy: u8,
}
struct DoLint4 {
//~^ ERROR: all fields have the same postfix: `_`
create_: u8,
read_: u8,
update_: u8,
destroy_: u8,
}
struct DoLint5 {
//~^ ERROR: all fields have the same postfix: `__`
create__: u8,
read__: u8,
update__: u8,
destroy__: u8,
}
struct DoLint6 {
//~^ ERROR: all fields have the same postfix: `___`
create___: u8,
read___: u8,
update___: u8,
destroy___: u8,
}
struct DoLintToo {
//~^ ERROR: all fields have the same postfix: `type`
_create_type: u8,
_update_type: u8,
_delete_type: u8,
}
struct DoNotLint {
_foo: u8,
_bar: u8,
_baz: u8,
}
struct DoNotLint2 {
__foo: u8,
__bar: u8,
__baz: u8,
}
}
mod allow_attributes_on_fields {
struct Struct {
#[allow(clippy::struct_field_names)]
struct_starts_with: u8,
#[allow(clippy::struct_field_names)]
ends_with_struct: u8,
foo: u8,
}
}
// food field should not lint
struct Foo {
food: i32,
a: i32,
b: i32,
}
struct Proxy {
proxy: i32,
//~^ ERROR: field name starts with the struct's name
unrelated1: bool,
unrelated2: bool,
}
// should not lint
pub struct RegexT {
__buffer: i32,
__allocated: i32,
__used: i32,
}
mod macro_tests {
macro_rules! mk_struct {
() => {
struct MacroStruct {
//~^ ERROR: all fields have the same prefix: `some`
some_a: i32,
some_b: i32,
some_c: i32,
}
};
}
mk_struct!();
macro_rules! mk_struct2 {
() => {
struct Macrobaz {
macrobaz_a: i32,
//~^ ERROR: field name starts with the struct's name
some_b: i32,
some_c: i32,
}
};
}
mk_struct2!();
macro_rules! mk_struct_with_names {
($struct_name:ident, $field:ident) => {
struct $struct_name {
$field: i32,
//~^ ERROR: field name starts with the struct's name
other_something: i32,
other_field: i32,
}
};
}
// expands to `struct Foo { foo: i32, ... }`
mk_struct_with_names!(Foo, foo);
// expands to a struct with all fields starting with `other` but should not
// be linted because some fields come from the macro definition and the other from the input
mk_struct_with_names!(Some, other_data);
// should not lint when names come from different places
macro_rules! mk_struct_with_field_name {
($field_name:ident) => {
struct Baz {
one: i32,
two: i32,
$field_name: i32,
}
};
}
mk_struct_with_field_name!(baz_three);
// should not lint when names come from different places
macro_rules! mk_struct_with_field_name {
($field_name:ident) => {
struct Bazilisk {
baz_one: i32,
baz_two: i32,
$field_name: i32,
}
};
}
mk_struct_with_field_name!(baz_three);
macro_rules! mk_struct_full_def {
($struct_name:ident, $field1:ident, $field2:ident, $field3:ident) => {
struct $struct_name {
//~^ ERROR: all fields have the same prefix: `some`
$field1: i32,
$field2: i32,
$field3: i32,
}
};
}
mk_struct_full_def!(PrefixData, some_data, some_meta, some_other);
}
// should not lint on external code
external! {
struct DataExternal {
field_data1: u8,
another: u8,
foo: u8,
bar: u8,
}
struct NotSnakeCaseExternal {
someData_c: bool,
someData_b: bool,
someData_a_b: bool,
}
struct DoublePrefixExternal {
some_data_a: bool,
some_data_b: bool,
some_data_c: bool,
}
struct StructDataExternal {
movable_data: u8,
fixed_data: u8,
invisible_data: u8,
}
}
// Should not warn
struct Config {
use_foo: bool,
use_bar: bool,
use_baz: bool,
}
struct Use {
use_foo: bool,
//~^ ERROR: field name starts with the struct's name
use_bar: bool,
use_baz: bool,
}
fn main() {}