MyDeveloperDay created this revision.
MyDeveloperDay added reviewers: michaelplatings, aaron.ballman, JonasToth, 
hokein.
MyDeveloperDay added a project: clang-tools-extra.
Herald added a subscriber: xazax.hun.
Herald added a project: clang.

Introduction of a new variable policy (as outlined in D57896: Variable names 
rule <https://reviews.llvm.org/D57896>) could lead to clang tidy complaining 
about 1000's of variables

Consider add a new casing style to `readability-identifier-naming` to support 
allowing either `camelBack` and `camelCase` styles which could be applied to 
the VariableCase option in the LLVM .clang-tidy files

Users wishing to convert their files to new policy would simply change this 
setting to `camelBack` and run with -fix

Depends on D57896 <https://reviews.llvm.org/D57896>


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D57966

Files:
  clang-tidy/readability/IdentifierNamingCheck.cpp
  clang-tidy/readability/IdentifierNamingCheck.h
  docs/ReleaseNotes.rst
  docs/clang-tidy/checks/readability-identifier-naming.rst
  test/clang-tidy/readability-identifier-naming-camelback-or-case.cpp

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
+  }
+};
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: docs/ReleaseNotes.rst
===================================================================
--- docs/ReleaseNotes.rst
+++ docs/ReleaseNotes.rst
@@ -98,6 +98,11 @@
   `CommentUserDefiniedLiterals`, `CommentStringLiterals`,
   `CommentCharacterLiterals` & `CommentNullPtrs` options.
 
+- The :doc:`readability-identifier-naming
+  <clang-tidy/checks/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: 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<ObjCIvarDecl>(D) && NamingStyles[SK_ObjcIvar])
     return SK_ObjcIvar;
-  
+
   if (isa<TypedefDecl>(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])
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to