https://github.com/NyuB updated https://github.com/llvm/llvm-project/pull/181502
>From 51db4da0a1a4a6041b2872e2e142e639928ce315 Mon Sep 17 00:00:00 2001 From: Brice Decaestecker <[email protected]> Date: Sat, 14 Feb 2026 12:17:30 +0100 Subject: [PATCH] [clang-tidy] Avoid identifier-naming concatenating multiple (pre/su)ffixes, introducing an option to strip out any other known (pre/su)ffix before renaming --- .../readability/IdentifierNamingCheck.cpp | 41 ++++- .../readability/IdentifierNamingCheck.h | 5 +- .../checks/readability/identifier-naming.rst | 165 ++++++++++++++++++ .../readability/identifier-naming-trim.cpp | 28 +++ 4 files changed, 233 insertions(+), 6 deletions(-) create mode 100644 clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-trim.cpp diff --git a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp index 83fc3727cb5c8..8de8d7089288c 100644 --- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp @@ -238,9 +238,11 @@ static StringRef const HungarianNotationUserDefinedTypes[] = { IdentifierNamingCheck::NamingStyle::NamingStyle( std::optional<IdentifierNamingCheck::CaseType> Case, StringRef Prefix, - StringRef Suffix, StringRef IgnoredRegexpStr, HungarianPrefixType HPType) + StringRef Suffix, StringRef IgnoredRegexpStr, HungarianPrefixType HPType, + bool TrimPrefixSuffix) : Case(Case), Prefix(Prefix), Suffix(Suffix), - IgnoredRegexpStr(IgnoredRegexpStr), HPType(HPType) { + IgnoredRegexpStr(IgnoredRegexpStr), HPType(HPType), + TrimPrefixSuffix(TrimPrefixSuffix) { if (!IgnoredRegexpStr.empty()) { IgnoredRegexp = llvm::Regex(llvm::SmallString<128>({"^", IgnoredRegexpStr, "$"})); @@ -269,9 +271,13 @@ IdentifierNamingCheck::FileStyle IdentifierNamingCheck::getFileStyleFromOptions( if (HPTOpt && !HungarianNotation.checkOptionValid(I)) configurationDiag("invalid identifier naming option '%0'") << StyleString; + memcpy(&StyleString[StyleSize], "TrimPrefixSuffix", 16); + StyleString.truncate(StyleSize + 16); + const std::optional<bool> TrimPrefixSuffix = + Options.get<bool>(StyleString); memcpy(&StyleString[StyleSize], "IgnoredRegexp", 13); StyleString.truncate(StyleSize + 13); - const std::optional<StringRef> IgnoredRegexpStr = Options.get(StyleString); + std::optional<StringRef> IgnoredRegexpStr = Options.get(StyleString); memcpy(&StyleString[StyleSize], "Prefix", 6); StyleString.truncate(StyleSize + 6); const std::optional<StringRef> Prefix(Options.get(StyleString)); @@ -286,7 +292,8 @@ IdentifierNamingCheck::FileStyle IdentifierNamingCheck::getFileStyleFromOptions( if (CaseOptional || Prefix || Postfix || IgnoredRegexpStr || HPTOpt) Styles[I].emplace(std::move(CaseOptional), Prefix.value_or(""), Postfix.value_or(""), IgnoredRegexpStr.value_or(""), - HPTOpt.value_or(IdentifierNamingCheck::HPT_Off)); + HPTOpt.value_or(IdentifierNamingCheck::HPT_Off), + TrimPrefixSuffix.value_or(false)); } const bool IgnoreMainLike = Options.get("IgnoreMainLikeFunctions", false); const bool CheckAnonFieldInParent = @@ -1084,9 +1091,30 @@ bool IdentifierNamingCheck::isParamInMainLikeFunction( return Matcher.match(FDecl->getName()); } +static void trimPrefixesAndSuffixes( + StringRef &Mid, + ArrayRef<std::optional<IdentifierNamingCheck::NamingStyle>> NamingStyles) { + bool LoopWhileToRemove = true; + while (LoopWhileToRemove) { + LoopWhileToRemove = false; + for (unsigned I = 0; I < SK_Count; ++I) { + if (const std::optional<IdentifierNamingCheck::NamingStyle> &OtherStyle = + NamingStyles[I]) { + while (!OtherStyle->Prefix.empty() && + Mid.consume_front(OtherStyle->Prefix)) + LoopWhileToRemove = true; + + while (!OtherStyle->Suffix.empty() && Mid.consume_back(OtherStyle->Suffix)) + LoopWhileToRemove = true; + } + } + } +} + std::string IdentifierNamingCheck::fixupWithStyle( StringRef Type, StringRef Name, const IdentifierNamingCheck::NamingStyle &Style, + ArrayRef<std::optional<IdentifierNamingCheck::NamingStyle>> NamingStyles, const IdentifierNamingCheck::HungarianNotationOption &HNOption, const Decl *D) const { Name.consume_front(Style.Prefix); @@ -1108,6 +1136,8 @@ std::string IdentifierNamingCheck::fixupWithStyle( } } StringRef Mid = StringRef(Fixed).trim("_"); + if (Style.TrimPrefixSuffix) + trimPrefixesAndSuffixes(Mid, NamingStyles); if (Mid.empty()) Mid = "_"; @@ -1359,7 +1389,8 @@ IdentifierNamingCheck::getFailureInfo( IdentifierNamingCheck::CT_LowerCase); llvm::replace(KindName, '_', ' '); - std::string Fixup = fixupWithStyle(Type, Name, Style, HNOption, ND); + std::string Fixup = + fixupWithStyle(Type, Name, Style, NamingStyles, HNOption, ND); if (StringRef(Fixup) == Name) { if (!IgnoreFailedSplit) { LLVM_DEBUG(Location.print(llvm::dbgs(), SM); diff --git a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h index b016556cc2ab8..bdac7f5b1e8b9 100644 --- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h +++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h @@ -72,7 +72,7 @@ class IdentifierNamingCheck final : public RenamerClangTidyCheck { NamingStyle(std::optional<CaseType> Case, StringRef Prefix, StringRef Suffix, StringRef IgnoredRegexpStr, - HungarianPrefixType HPType); + HungarianPrefixType HPType, bool TrimPrefixSuffix); NamingStyle(const NamingStyle &O) = delete; NamingStyle &operator=(NamingStyle &&O) = default; NamingStyle(NamingStyle &&O) = default; @@ -86,6 +86,8 @@ class IdentifierNamingCheck final : public RenamerClangTidyCheck { std::string IgnoredRegexpStr; HungarianPrefixType HPType; + + bool TrimPrefixSuffix; }; struct HungarianNotation { @@ -176,6 +178,7 @@ class IdentifierNamingCheck final : public RenamerClangTidyCheck { std::string fixupWithStyle(StringRef Type, StringRef Name, const IdentifierNamingCheck::NamingStyle &Style, + ArrayRef<std::optional<IdentifierNamingCheck::NamingStyle>> NamingStyles, const IdentifierNamingCheck::HungarianNotationOption &HNOption, const Decl *D) const; diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability/identifier-naming.rst b/clang-tools-extra/docs/clang-tidy/checks/readability/identifier-naming.rst index c8f87dcba8c0a..34d440f45dae2 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/readability/identifier-naming.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/readability/identifier-naming.rst @@ -276,6 +276,11 @@ A detailed description of each option is presented below: When defined, the check will ensure all names by default will add the suffix with the given value (regardless of casing). +.. option:: DefaultTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: DefaultHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -301,6 +306,11 @@ A detailed description of each option is presented below: When defined, the check will ensure abstract class names will add the suffix with the given value (regardless of casing). +.. option:: AbstractClassTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: AbstractClassHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -438,6 +448,11 @@ and thus no warnings will be emitted. When defined, the check will ensure class names will add the suffix with the given value (regardless of casing). +.. option:: ClassTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: ClassHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -492,6 +507,11 @@ After: When defined, the check will ensure class ``constexpr`` names will add the suffix with the given value (regardless of casing). +.. option:: ClassConstexprTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: ClassConstexprHungarianPrefix When enabled, the check ensures that the declared identifier will have a @@ -544,6 +564,11 @@ After: When defined, the check will ensure class constant names will add the suffix with the given value (regardless of casing). +.. option:: ClassConstantTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: ClassConstantHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -596,6 +621,11 @@ After: When defined, the check will ensure class member names will add the suffix with the given value (regardless of casing). +.. option:: ClassMemberTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: ClassMemberHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -734,6 +764,11 @@ After: When defined, the check will ensure constant names will add the suffix with the given value (regardless of casing). +.. option:: ConstantTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: ConstantHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -780,6 +815,11 @@ After: When defined, the check will ensure constant member names will add the suffix with the given value (regardless of casing). +.. option:: ConstantMemberTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: ConstantMemberHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -830,6 +870,11 @@ After: When defined, the check will ensure constant parameter names will add the suffix with the given value (regardless of casing). +.. option:: ConstantParameterTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: ConstantParameterHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -876,6 +921,11 @@ After: When defined, the check will ensure constant pointer parameter names will add the suffix with the given value (regardless of casing). +.. option:: ConstantPointerParameterTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: ConstantPointerParameterHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -1008,6 +1058,11 @@ After: When defined, the check will ensure constexpr variable names will add the suffix with the given value (regardless of casing). +.. option:: ConstexprVariableTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: ConstexprVariableHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -1094,6 +1149,11 @@ After: When defined, the check will ensure enumeration constant names will add the suffix with the given value (regardless of casing). +.. option:: EnumConstantTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: EnumConstantHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -1187,6 +1247,11 @@ After: When defined, the check will ensure global ``constexpr`` variable names will add the suffix with the given value (regardless of casing). +.. option:: GlobalConstexprVariableTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: GlobalConstexprVariableHungarianPrefix When enabled, the check ensures that the declared identifier will have a @@ -1233,6 +1298,11 @@ After: When defined, the check will ensure global constant names will add the suffix with the given value (regardless of casing). +.. option:: GlobalConstantTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: GlobalConstantHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -1279,6 +1349,11 @@ After: When defined, the check will ensure global constant pointer names will add the suffix with the given value (regardless of casing). +.. option:: GlobalConstantPointerTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: GlobalConstantPointerHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -1365,6 +1440,11 @@ After: When defined, the check will ensure global pointer names will add the suffix with the given value (regardless of casing). +.. option:: GlobalPointerTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: GlobalPointerHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -1411,6 +1491,11 @@ After: When defined, the check will ensure global variable names will add the suffix with the given value (regardless of casing). +.. option:: GlobalVariableTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: GlobalVariableHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -1511,6 +1596,11 @@ After: When defined, the check will ensure local ``constexpr`` variable names will add the suffix with the given value (regardless of casing). +.. option:: LocalConstexprVariableTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: LocalConstexprVariableHungarianPrefix When enabled, the check ensures that the declared identifier will have a @@ -1557,6 +1647,11 @@ After: When defined, the check will ensure local constant names will add the suffix with the given value (regardless of casing). +.. option:: LocalConstantTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: LocalConstantHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -1603,6 +1698,11 @@ After: When defined, the check will ensure local constant pointer names will add the suffix with the given value (regardless of casing). +.. option:: LocalConstantPointerTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: LocalConstantPointerHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -1649,6 +1749,11 @@ After: When defined, the check will ensure local pointer names will add the suffix with the given value (regardless of casing). +.. option:: LocalPointerTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: LocalPointerHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -1703,6 +1808,11 @@ camel case check applied to other variables. When defined, the check will ensure local variable names will add the suffix with the given value (regardless of casing). +.. option:: LocalVariableTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: LocalVariableHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -1792,6 +1902,11 @@ command line using the ``-D`` flag. When defined, the check will ensure member names will add the suffix with the given value (regardless of casing). +.. option:: MemberTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: MemberHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -1930,6 +2045,11 @@ After: When defined, the check will ensure parameter names will add the suffix with the given value (regardless of casing). +.. option:: ParameterTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: ParameterHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -2020,6 +2140,11 @@ After: When defined, the check will ensure pointer parameter names will add the suffix with the given value (regardless of casing). +.. option:: PointerParameterTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: PointerParameterHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -2066,6 +2191,11 @@ After: When defined, the check will ensure private member names will add the suffix with the given value (regardless of casing). +.. option:: PrivateMemberTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: PrivateMemberHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -2164,6 +2294,11 @@ After: When defined, the check will ensure protected member names will add the suffix with the given value (regardless of casing). +.. option:: ProtectedMemberTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: ProtectedMemberHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -2262,6 +2397,11 @@ After: When defined, the check will ensure public member names will add the suffix with the given value (regardless of casing). +.. option:: PublicMemberTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: PublicMemberHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -2360,6 +2500,11 @@ After: When defined, the check will ensure scoped enum constant names will add the suffix with the given value (regardless of casing). +.. option:: ScopedEnumConstantTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: ScopedEnumConstantHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -2406,6 +2551,11 @@ After: When defined, the check will ensure static ``constexpr`` variable names will add the suffix with the given value (regardless of casing). +.. option:: StaticConstexprVariableTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: StaticConstexprVariableHungarianPrefix When enabled, the check ensures that the declared identifier will have a @@ -2452,6 +2602,11 @@ After: When defined, the check will ensure static constant names will add the suffix with the given value (regardless of casing). +.. option:: StaticConstantTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: StaticConstantHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -2498,6 +2653,11 @@ After: When defined, the check will ensure static variable names will add the suffix with the given value (regardless of casing). +.. option:: StaticVariableTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: StaticVariableHungarianPrefix When enabled, the check ensures that the declared identifier will @@ -2882,6 +3042,11 @@ After: When defined, the check will ensure variable names will add the suffix with the given value (regardless of casing). +.. option:: VariableTrimPrefixSuffix + + When enabled, the check ensures that the declared identifier does not + start or end with any other prefix or suffix defined for this check + .. option:: VariableHungarianPrefix When enabled, the check ensures that the declared identifier will diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-trim.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-trim.cpp new file mode 100644 index 0000000000000..58ee64b8a7b30 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-trim.cpp @@ -0,0 +1,28 @@ +// RUN: %check_clang_tidy -std=c++20 %s readability-identifier-naming %t -- \ +// RUN: -config='{CheckOptions: { \ +// RUN: readability-identifier-naming.MemberPrefix: 'm_', \ +// RUN: readability-identifier-naming.MemberSuffix: '_', \ +// RUN: readability-identifier-naming.MemberTrimPrefixSuffix: 1, \ +// RUN: readability-identifier-naming.ParameterPrefix: 'p_', \ +// RUN: readability-identifier-naming.ParameterTrimPrefixSuffix: 1, \ +// RUN: }}' \ +// RUN: -header-filter='' \ +// RUN: -- -fno-delayed-template-parsing -Dbad_macro \ +// RUN: -I%S/Inputs/identifier-naming \ +// RUN: -isystem %S/Inputs/identifier-naming/system + +// clang-format off + +struct Triple { + Triple(int m_wrong_, int missing, int p_ok): p_wrong_(m_wrong_), missing(missing), m_ok_(p_ok) {} + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: invalid case style for parameter 'm_wrong_' + // CHECK-MESSAGES: :[[@LINE-2]]:30: warning: invalid case style for parameter 'missing' + // CHECK-FIXES: Triple(int p_wrong, int p_missing, int p_ok): m_wrong_(p_wrong), m_missing_(p_missing), m_ok_(p_ok) {} + int p_wrong_; + // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: invalid case style for member 'p_wrong_' + // CHECK-FIXES: int m_wrong_; + int missing; + // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: invalid case style for member 'missing' + // CHECK-FIXES: int m_missing_; + int m_ok_; +}; \ No newline at end of file _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
