Index: clang-tidy/readability/IdentifierNamingCheck.h =================================================================== --- clang-tidy/readability/IdentifierNamingCheck.h +++ clang-tidy/readability/IdentifierNamingCheck.h @@ -48,7 +48,8 @@ CT_UpperCase, CT_CamelCase, CT_CamelSnakeCase, - CT_CamelSnakeBack + CT_CamelSnakeBack, + CT_CamelBackOrCase }; struct NamingStyle { Index: clang-tidy/readability/IdentifierNamingCheck.cpp =================================================================== --- clang-tidy/readability/IdentifierNamingCheck.cpp +++ clang-tidy/readability/IdentifierNamingCheck.cpp @@ -173,6 +173,7 @@ .Case("CamelCase", CT_CamelCase) .Case("Camel_Snake_Case", CT_CamelSnakeCase) .Case("camel_Snake_Back", CT_CamelSnakeBack) + .Case("camelBackOrCase", CT_CamelBackOrCase) .Default(llvm::None); }; @@ -209,6 +210,8 @@ return "Camel_Snake_Case"; case CT_CamelSnakeBack: return "camel_Snake_Back"; + case CT_CamelBackOrCase: + return "camelBackOrCase"; } llvm_unreachable("Unknown Case Type"); @@ -256,6 +259,7 @@ llvm::Regex("^[A-Z][a-zA-Z0-9]*$"), llvm::Regex("^[A-Z]([a-z0-9]*(_[A-Z])?)*"), llvm::Regex("^[a-z]([a-z0-9]*(_[A-Z])?)*"), + llvm::Regex("^[a-zA-Z][a-zA-Z0-9]*$"), }; bool Matches = true; @@ -371,6 +375,17 @@ Fixup += Word.substr(1).lower(); } break; + + case IdentifierNamingCheck::CT_CamelBackOrCase: + for (auto const &Word : Words) { + if (&Word == &Words.front()) { + Fixup += Word.lower(); + } else { + Fixup += Word.substr(0, 1).upper(); + Fixup += Word.substr(1).lower(); + } + } + break; } return Fixup; @@ -396,7 +411,7 @@ if (isa(D) && NamingStyles[SK_ObjcIvar]) return SK_ObjcIvar; - + if (isa(D) && NamingStyles[SK_Typedef]) return SK_Typedef; @@ -492,7 +507,8 @@ return SK_ConstexprVariable; if (!Type.isNull() && Type.isConstQualified()) { - if (Type.getTypePtr()->isAnyPointerType() && NamingStyles[SK_ConstantPointerParameter]) + if (Type.getTypePtr()->isAnyPointerType() && + NamingStyles[SK_ConstantPointerParameter]) return SK_ConstantPointerParameter; if (NamingStyles[SK_ConstantParameter]) @@ -505,8 +521,9 @@ if (Decl->isParameterPack() && NamingStyles[SK_ParameterPack]) return SK_ParameterPack; - if (!Type.isNull() && Type.getTypePtr()->isAnyPointerType() && NamingStyles[SK_PointerParameter]) - return SK_PointerParameter; + if (!Type.isNull() && Type.getTypePtr()->isAnyPointerType() && + NamingStyles[SK_PointerParameter]) + return SK_PointerParameter; if (NamingStyles[SK_Parameter]) return SK_Parameter; @@ -524,7 +541,8 @@ if (Decl->isStaticDataMember() && NamingStyles[SK_ClassConstant]) return SK_ClassConstant; - if (Decl->isFileVarDecl() && Type.getTypePtr()->isAnyPointerType() && NamingStyles[SK_GlobalConstantPointer]) + if (Decl->isFileVarDecl() && Type.getTypePtr()->isAnyPointerType() && + NamingStyles[SK_GlobalConstantPointer]) return SK_GlobalConstantPointer; if (Decl->isFileVarDecl() && NamingStyles[SK_GlobalConstant]) @@ -533,7 +551,8 @@ if (Decl->isStaticLocal() && NamingStyles[SK_StaticConstant]) return SK_StaticConstant; - if (Decl->isLocalVarDecl() && Type.getTypePtr()->isAnyPointerType() && NamingStyles[SK_LocalConstantPointer]) + if (Decl->isLocalVarDecl() && Type.getTypePtr()->isAnyPointerType() && + NamingStyles[SK_LocalConstantPointer]) return SK_LocalConstantPointer; if (Decl->isLocalVarDecl() && NamingStyles[SK_LocalConstant]) @@ -549,7 +568,8 @@ if (Decl->isStaticDataMember() && NamingStyles[SK_ClassMember]) return SK_ClassMember; - if (Decl->isFileVarDecl() && Type.getTypePtr()->isAnyPointerType() && NamingStyles[SK_GlobalPointer]) + if (Decl->isFileVarDecl() && Type.getTypePtr()->isAnyPointerType() && + NamingStyles[SK_GlobalPointer]) return SK_GlobalPointer; if (Decl->isFileVarDecl() && NamingStyles[SK_GlobalVariable]) @@ -557,8 +577,9 @@ if (Decl->isStaticLocal() && NamingStyles[SK_StaticVariable]) return SK_StaticVariable; - - if (Decl->isLocalVarDecl() && Type.getTypePtr()->isAnyPointerType() && NamingStyles[SK_LocalPointer]) + + if (Decl->isLocalVarDecl() && Type.getTypePtr()->isAnyPointerType() && + NamingStyles[SK_LocalPointer]) return SK_LocalPointer; if (Decl->isLocalVarDecl() && NamingStyles[SK_LocalVariable]) Index: docs/ReleaseNotes.rst =================================================================== --- docs/ReleaseNotes.rst +++ docs/ReleaseNotes.rst @@ -98,6 +98,11 @@ `CommentUserDefiniedLiterals`, `CommentStringLiterals`, `CommentCharacterLiterals` & `CommentNullPtrs` options. +- The :doc:`readability-identifier-naming + ` now supports + `camelBackOrCase` as a new casing type to support allowing both `camelBack` + and `CamelCase` variables in LLVM code. + Improvements to include-fixer ----------------------------- Index: docs/clang-tidy/checks/readability-identifier-naming.rst =================================================================== --- docs/clang-tidy/checks/readability-identifier-naming.rst +++ docs/clang-tidy/checks/readability-identifier-naming.rst @@ -17,6 +17,7 @@ - ``CamelCase``, - ``camel_Snake_Back``, - ``Camel_Snake_Case``, + - ``camelBackOrCase``, - ``aNy_CasE``. It also supports a fixed prefix and suffix that will be prepended or appended @@ -26,6 +27,9 @@ different rules for different kinds of identifiers. In general, the rules are falling back to a more generic rule if the specific case is not configured. +``camelBackOrCase`` allows for both `camelBack` or `CamelCase` cased +identifiers to be used to match prior LLVM code style + Options ------- Index: test/clang-tidy/readability-identifier-naming-camelback-or-case.cpp =================================================================== --- /dev/null +++ test/clang-tidy/readability-identifier-naming-camelback-or-case.cpp @@ -0,0 +1,117 @@ +// Remove UNSUPPORTED for powerpc64le when the problem introduced by +// r288563 is resolved. +// UNSUPPORTED: powerpc64le +// RUN: %check_clang_tidy %s readability-identifier-naming %t -- \ +// RUN: -config='{CheckOptions: [ \ +// RUN: {key: readability-identifier-naming.AbstractClassCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.ClassCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.ClassConstantCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.ClassMemberCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.ClassMethodCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.ConstantCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.ConstexprFunctionCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.ConstexprMethodCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.ConstexprVariableCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.EnumCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.EnumConstantCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.FunctionCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.GlobalConstantCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.GlobalFunctionCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.GlobalVariableCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.InlineNamespaceCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.LocalConstantCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.LocalVariableCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.MemberCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.ConstantMemberCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.PublicMemberCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.MethodCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.NamespaceCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.ParameterCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.ConstantParameterCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.ParameterPackCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.PureFunctionCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.PureMethodCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.StaticConstantCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.StaticVariableCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.StructCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.TemplateParameterCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.TemplateTemplateParameterCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.TemplateUsingCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.TypeTemplateParameterCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.TypedefCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.UnionCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.UsingCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.ValueTemplateParameterCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.VariableCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.VirtualMethodCase, value: Camel_Snake_Case}, \ +// RUN: {key: readability-identifier-naming.MacroDefinitionCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.TypeAliasCase, value: camel_Snake_Back}, \ +// RUN: {key: readability-identifier-naming.IgnoreFailedSplit, value: 0}, \ +// RUN: {key: readability-identifier-naming.GlobalPointerCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.GlobalConstantPointerCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.PointerParameterCase, value: camelCaseOrBack}, \ +// RUN: {key: readability-identifier-naming.ConstantPointerParameterCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.LocalPointerCase, value: camelBackOrCase}, \ +// RUN: {key: readability-identifier-naming.LocalConstantPointerCase, value: camelBackOrCase}, \ +// RUN: ]}' -- -std=c++11 -fno-delayed-template-parsing \ +// RUN: -I%S/Inputs/readability-identifier-naming \ +// RUN: -isystem %S/Inputs/readability-identifier-naming/system + +// clang-format off + +class AbcDef { +public: + int VariablePublic; + +private: + int VariablePrivate; + +protected: + int VariableProtected; + + void fooProtected() { + int Var1; + int Var2; + static int Var3; + } +}; + +class abcDef { +public: + int variablePublic; + +private: + int variablePrivate; + +protected: + int variableProtected; + + void fooProtected() { + int var1; + int var2; + static int var3; + } +}; + +class aB_def +// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style +{ +public: + int Variable_Public; + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style +private: + int Variable_Private; + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style +protected: + int Variable_Protected; + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style + + void fooProtected() { + int var_1; + // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: invalid case style + int var_2; + // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: invalid case style + static int var_3; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: invalid case style + } +};