diff --git a/clippy_lints/src/enum_variants.rs b/clippy_lints/src/enum_variants.rs index ea7a378de22..b3dd275f668 100644 --- a/clippy_lints/src/enum_variants.rs +++ b/clippy_lints/src/enum_variants.rs @@ -264,8 +264,17 @@ impl EarlyLintPass for EnumVariantNames { let matching = partial_match(mod_camel, &item_camel); let rmatching = partial_rmatch(mod_camel, &item_camel); let nchars = mod_camel.chars().count(); + + let is_word_beginning = |c: char| { + c == '_' || c.is_uppercase() || c.is_numeric() + }; + if matching == nchars { - span_lint(cx, STUTTER, item.span, "item name starts with its containing module's name"); + match item_camel.chars().nth(nchars) { + Some(c) if is_word_beginning(c) => + span_lint(cx, STUTTER, item.span, "item name starts with its containing module's name"), + _ => () + } } if rmatching == nchars { span_lint(cx, STUTTER, item.span, "item name ends with its containing module's name"); diff --git a/tests/ui/stutter.rs b/tests/ui/stutter.rs index 24612fd3b3e..761339b0a8e 100644 --- a/tests/ui/stutter.rs +++ b/tests/ui/stutter.rs @@ -9,6 +9,10 @@ mod foo { pub fn bar_foo() {} pub struct FooCake {} pub enum CakeFoo {} + pub struct Foo7Bar; + + // Should not warn + pub struct Foobar; } fn main() {} diff --git a/tests/ui/stutter.stderr b/tests/ui/stutter.stderr index 38cbcaa32f5..e6465a2bce9 100644 --- a/tests/ui/stutter.stderr +++ b/tests/ui/stutter.stderr @@ -24,3 +24,9 @@ error: item name ends with its containing module's name 11 | pub enum CakeFoo {} | ^^^^^^^^^^^^^^^^^^^ +error: item name starts with its containing module's name + --> $DIR/stutter.rs:12:5 + | +12 | pub struct Foo7Bar; + | ^^^^^^^^^^^^^^^^^^^ +