Author: Dominik Kaszewski Date: 2025-12-22T01:05:20+03:00 New Revision: 2ffaf9d676e6ed2cffc5312d3306f8345bc5a4e5
URL: https://github.com/llvm/llvm-project/commit/2ffaf9d676e6ed2cffc5312d3306f8345bc5a4e5 DIFF: https://github.com/llvm/llvm-project/commit/2ffaf9d676e6ed2cffc5312d3306f8345bc5a4e5.diff LOG: readability-identifier-naming should add universal default options (#171686) Adds a `DefaultCase` (and other options, but `DefaultPrefix/Suffix` is probably not useful), which is used as a base in the override hierarchy. Resolves #75688 Added: clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-lower.cpp clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-none.cpp clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-override.cpp Modified: clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/docs/clang-tidy/checks/readability/identifier-naming.rst Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp index ae251a8bec0f4..9cee6ddb93d4d 100644 --- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp @@ -70,6 +70,7 @@ namespace readability { // clang-format off #define NAMING_KEYS(m) \ + m(Default) \ m(Namespace) \ m(InlineNamespace) \ m(EnumConstant) \ @@ -1155,7 +1156,7 @@ StyleKind IdentifierNamingCheck::findStyleKind( if (NamingStyles[SK_Constant]) return SK_Constant; - return SK_Invalid; + return undefinedStyle(NamingStyles); } if (const auto *Decl = dyn_cast<RecordDecl>(D)) { @@ -1187,7 +1188,7 @@ StyleKind IdentifierNamingCheck::findStyleKind( return SK_Enum; } - return SK_Invalid; + return undefinedStyle(NamingStyles); } if (const auto *Decl = dyn_cast<FieldDecl>(D)) { @@ -1230,7 +1231,7 @@ StyleKind IdentifierNamingCheck::findStyleKind( if (NamingStyles[SK_Parameter]) return SK_Parameter; - return SK_Invalid; + return undefinedStyle(NamingStyles); } if (const auto *Decl = dyn_cast<VarDecl>(D)) @@ -1275,7 +1276,7 @@ StyleKind IdentifierNamingCheck::findStyleKind( if (NamingStyles[SK_Function]) return SK_Function; - return SK_Invalid; + return undefinedStyle(NamingStyles); } if (const auto *Decl = dyn_cast<FunctionDecl>(D)) { @@ -1299,7 +1300,7 @@ StyleKind IdentifierNamingCheck::findStyleKind( if (NamingStyles[SK_TemplateParameter]) return SK_TemplateParameter; - return SK_Invalid; + return undefinedStyle(NamingStyles); } if (isa<NonTypeTemplateParmDecl>(D)) { @@ -1309,7 +1310,7 @@ StyleKind IdentifierNamingCheck::findStyleKind( if (NamingStyles[SK_TemplateParameter]) return SK_TemplateParameter; - return SK_Invalid; + return undefinedStyle(NamingStyles); } if (isa<TemplateTemplateParmDecl>(D)) { @@ -1319,13 +1320,13 @@ StyleKind IdentifierNamingCheck::findStyleKind( if (NamingStyles[SK_TemplateParameter]) return SK_TemplateParameter; - return SK_Invalid; + return undefinedStyle(NamingStyles); } if (isa<ConceptDecl>(D) && NamingStyles[SK_Concept]) return SK_Concept; - return SK_Invalid; + return undefinedStyle(NamingStyles); } std::optional<RenamerClangTidyCheck::FailureInfo> @@ -1346,8 +1347,10 @@ IdentifierNamingCheck::getFailureInfo( return std::nullopt; std::string KindName = - fixupWithCase(Type, StyleNames[SK], ND, Style, HNOption, - IdentifierNamingCheck::CT_LowerCase); + SK == SK_Default + ? "identifier" + : fixupWithCase(Type, StyleNames[SK], ND, Style, HNOption, + IdentifierNamingCheck::CT_LowerCase); llvm::replace(KindName, '_', ' '); std::string Fixup = fixupWithStyle(Type, Name, Style, HNOption, ND); @@ -1392,9 +1395,14 @@ IdentifierNamingCheck::getMacroFailureInfo(const Token &MacroNameTok, if (!Style.isActive()) return std::nullopt; + const auto &Styles = Style.getStyles(); + const StyleKind UsedKind = !Styles[SK_MacroDefinition] && Styles[SK_Default] + ? SK_Default + : SK_MacroDefinition; + return getFailureInfo("", MacroNameTok.getIdentifierInfo()->getName(), nullptr, Loc, Style.getStyles(), Style.getHNOption(), - SK_MacroDefinition, SM, IgnoreFailedSplit); + UsedKind, SM, IgnoreFailedSplit); } RenamerClangTidyCheck::DiagInfo @@ -1456,7 +1464,7 @@ StyleKind IdentifierNamingCheck::findStyleKindForAnonField( if (const auto *V = IFD->getVarDecl()) return findStyleKindForVar(V, Type, NamingStyles); - return SK_Invalid; + return undefinedStyle(NamingStyles); } StyleKind IdentifierNamingCheck::findStyleKindForField( @@ -1482,7 +1490,7 @@ StyleKind IdentifierNamingCheck::findStyleKindForField( if (NamingStyles[SK_Member]) return SK_Member; - return SK_Invalid; + return undefinedStyle(NamingStyles); } StyleKind IdentifierNamingCheck::findStyleKindForVar( @@ -1559,7 +1567,12 @@ StyleKind IdentifierNamingCheck::findStyleKindForVar( if (NamingStyles[SK_Variable]) return SK_Variable; - return SK_Invalid; + return undefinedStyle(NamingStyles); +} + +StyleKind IdentifierNamingCheck::undefinedStyle( + ArrayRef<std::optional<NamingStyle>> NamingStyles) const { + return NamingStyles[SK_Default] ? SK_Default : SK_Invalid; } } // namespace readability diff --git a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h index 0b17af88810c2..87735808dff39 100644 --- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h +++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h @@ -220,6 +220,9 @@ class IdentifierNamingCheck final : public RenamerClangTidyCheck { findStyleKindForVar(const VarDecl *Var, QualType Type, ArrayRef<std::optional<NamingStyle>> NamingStyles) const; + StyleKind + undefinedStyle(ArrayRef<std::optional<NamingStyle>> NamingStyles) const; + /// Stores the style options as a vector, indexed by the specified \ref /// StyleKind, for a given directory. mutable llvm::StringMap<FileStyle> NamingStylesCache; diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 924b2c03cfd18..f68a2cb751f30 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -607,7 +607,9 @@ Changes in existing checks <clang-tidy/checks/readability/identifier-naming>` check by ignoring declarations and macros in system headers. The documentation is also improved to diff erentiate the general options from the specific ones. Options for - fine-grained control over ``constexpr`` variables were added. + fine-grained control over ``constexpr`` variables were added. Added default + options which simplify configs by removing the need to specify each + identifier kind separately. - Improved :doc:`readability-implicit-bool-conversion <clang-tidy/checks/readability/implicit-bool-conversion>` check by correctly 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 e9d46b730fe69..c8f87dcba8c0a 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 @@ -44,6 +44,36 @@ settings. The options and their corresponding values are: - ``LowerCase`` - example: ``int i_Variable`` - ``CamelCase`` - example: ``int IVariable`` +The check only enforces style on kinds of identifiers which have been +configured, so an empty config effectively disables it. +The :option:`DefaultCase` option can be used to enforce style on all kinds of +identifiers, then optionally overriden for specific kinds which are desired +with a diff erent case. + +For example using values of: + + - DefaultCase of ``lower_case`` + - MacroDefinitionCase of ``UPPER_CASE`` + - TemplateParameterCase of ``CamelCase`` + +Identifies and transforms names as follows: + +Before: + +.. code-block:: c++ + + #define macroDefinition + template <typename typenameParameter> + int functionDeclaration(typenameParameter paramVal, int paramCount); + +After: + +.. code-block:: c++ + + #define MACRO_DEFINITION + template <typename TypenameParameter> + int function_declarations(TypenameParameter param_val, int param_count); + Options summary --------------- @@ -58,6 +88,9 @@ The available options are summarized below: **Specific options** + - :option:`DefaultCase`, :option:`DefaultPrefix`, + :option:`DefaultSuffix`, :option:`DefaultIgnoredRegexp`, + :option:`DefaultHungarianPrefix` - :option:`AbstractClassCase`, :option:`AbstractClassPrefix`, :option:`AbstractClassSuffix`, :option:`AbstractClassIgnoredRegexp`, :option:`AbstractClassHungarianPrefix` @@ -223,6 +256,31 @@ Options description A detailed description of each option is presented below: +.. option:: DefaultCase + + When defined, the check will ensure all names by default conform to the + selected casing. + +.. option:: DefaultPrefix + + When defined, the check will ensure all names by default will add the + prefix with the given value (regardless of casing). + +.. option:: DefaultIgnoredRegexp + + Identifier naming checks won't be enforced for all names by default + matching this regular expression. + +.. option:: DefaultSuffix + + When defined, the check will ensure all names by default will add the + suffix with the given value (regardless of casing). + +.. option:: DefaultHungarianPrefix + + When enabled, the check ensures that the declared identifier will + have a Hungarian notation prefix based on the declared type. + .. option:: AbstractClassCase When defined, the check will ensure abstract class names conform to the diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-lower.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-lower.cpp new file mode 100644 index 0000000000000..31026aca5c3e0 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-lower.cpp @@ -0,0 +1,71 @@ +// RUN: %check_clang_tidy %s readability-identifier-naming %t -- \ +// RUN: -config='{CheckOptions: { \ +// RUN: readability-identifier-naming.DefaultCase: "lower_case", \ +// RUN: }}' \ +// RUN: -- -fno-delayed-template-parsing + +// DefaultCase enables every type of identifier to be checked with same case +#define MyMacro +// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: invalid case style for identifier 'MyMacro' [readability-identifier-naming] +// CHECK-FIXES: #define my_macro + +namespace MyNamespace { +// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: invalid case style for identifier 'MyNamespace' [readability-identifier-naming] +// CHECK-FIXES: namespace my_namespace { + +using MyAlias = int; +// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for identifier 'MyAlias' [readability-identifier-naming] +// CHECK-FIXES: using my_alias = int; + +int MyGlobal; +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: invalid case style for identifier 'MyGlobal' [readability-identifier-naming] +// CHECK-FIXES: int my_global; + +struct MyStruct { +// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: invalid case style for identifier 'MyStruct' [readability-identifier-naming] +// CHECK-FIXES: struct my_struct { + int MyField; +// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for identifier 'MyField' [readability-identifier-naming] +// CHECK-FIXES: int my_field; +}; + +template <typename MyTypename> +// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: invalid case style for identifier 'MyTypename' [readability-identifier-naming] +// CHECK-FIXES: template <typename my_typename> +int MyFunction(int MyArgument) { +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: invalid case style for identifier 'MyFunction' [readability-identifier-naming] +// CHECK-MESSAGES: :[[@LINE-2]]:20: warning: invalid case style for identifier 'MyArgument' [readability-identifier-naming] +// CHECK-FIXES: int my_function(int my_argument) { + int MyVariable = MyArgument; +// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for identifier 'MyVariable' [readability-identifier-naming] +// CHECK-FIXES: int my_variable = my_argument; + return MyVariable; +// CHECK-FIXES: return my_variable; +} + +template int MyFunction<int>(int); + +} // namespace MyNamespace + +// These are all already formatted as desired. +#define my_macro_2 + +namespace my_namespace_2 { + +using my_alias = int; + +my_alias my_global; + +struct my_struct { + int my_field; +}; + +template <typename my_typename> +int my_function(int my_argument) { + int my_variable = my_argument; + return my_variable; +} + +template int my_function<int>(int); + +} // namespace my_namespace_2 diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-none.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-none.cpp new file mode 100644 index 0000000000000..7b1d64f450e0a --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-none.cpp @@ -0,0 +1,49 @@ +// RUN: %check_clang_tidy %s readability-identifier-naming %t -- \ +// RUN: -config='{CheckOptions: {}}' \ +// RUN: -- -fno-delayed-template-parsing + +// Empty options effectively disable the check, allowing PascalCase... +#define MyMacro + +namespace MyNamespace { + +using MyAlias = int; + +int MyGlobal; + +struct MyStruct { + int MyField; +}; + +template <typename MyTypename> +int MyFunction(int MyArgument) { + int MyVariable = MyArgument; + return MyVariable; +} + +template int MyFunction<int>(int); + +} // namespace MyNamespace + +// ...or lower_case for the same set of symbol types. +#define my_macro_2 + +namespace my_namespace_2 { + +using my_alias = int; + +my_alias my_global; + +struct my_struct { + int my_field; +}; + +template <typename my_typename> +int my_function(int my_argument) { + int my_variable = my_argument; + return my_variable; +} + +template int my_function<int>(int); + +} // namespace my_namespace_2 diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-override.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-override.cpp new file mode 100644 index 0000000000000..3a6f98951fefa --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-override.cpp @@ -0,0 +1,75 @@ +// RUN: %check_clang_tidy %s readability-identifier-naming %t -- \ +// RUN: -config='{CheckOptions: { \ +// RUN: readability-identifier-naming.DefaultCase: "lower_case", \ +// RUN: readability-identifier-naming.MacroDefinitionCase: "UPPER_CASE", \ +// RUN: readability-identifier-naming.TemplateParameterCase: "UPPER_CASE", \ +// RUN: }}' \ +// RUN: -- -fno-delayed-template-parsing + +#define MyMacro +// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: invalid case style for macro definition 'MyMacro' [readability-identifier-naming] +// CHECK-FIXES: #define MY_MACRO + +namespace MyNamespace { +// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: invalid case style for identifier 'MyNamespace' [readability-identifier-naming] +// CHECK-FIXES: namespace my_namespace { + +using MyAlias = int; +// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for identifier 'MyAlias' [readability-identifier-naming] +// CHECK-FIXES: using my_alias = int; + +int MyGlobal; +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: invalid case style for identifier 'MyGlobal' [readability-identifier-naming] +// CHECK-FIXES: int my_global; + +struct MyStruct { +// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: invalid case style for identifier 'MyStruct' [readability-identifier-naming] +// CHECK-FIXES: struct my_struct { + int MyField; +// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for identifier 'MyField' [readability-identifier-naming] +// CHECK-FIXES: int my_field; +}; + +template <typename MyTypename> +// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: invalid case style for template parameter 'MyTypename' [readability-identifier-naming] +// CHECK-FIXES: template <typename MY_TYPENAME> +int MyFunction(int MyArgument) { +// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: invalid case style for identifier 'MyFunction' [readability-identifier-naming] +// CHECK-MESSAGES: :[[@LINE-2]]:20: warning: invalid case style for identifier 'MyArgument' [readability-identifier-naming] +// CHECK-FIXES: int my_function(int my_argument) { + int MyVariable = MyArgument; +// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for identifier 'MyVariable' [readability-identifier-naming] +// CHECK-FIXES: int my_variable = my_argument; + return MyVariable; +// CHECK-FIXES: return my_variable; +} + +template int MyFunction<int>(int); + +} // namespace MyNamespace + +#define my_macro_2 +// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: invalid case style for macro definition 'my_macro_2' [readability-identifier-naming] +// CHECK-FIXES: #define MY_MACRO_2 + +namespace my_namespace_2 { + +using my_alias = int; + +my_alias my_global; + +struct my_struct { + int my_field; +}; + +template <typename my_typename> +// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: invalid case style for template parameter 'my_typename' [readability-identifier-naming] +// CHECK-FIXES: template <typename MY_TYPENAME> +int my_function(int my_argument) { + int my_variable = my_argument; + return my_variable; +} + +template int my_function<int>(int); + +} // namespace my_namespace_2 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
