[clang-tools-extra] r284233 - [clang-move] Add header guard for the new header.

Haojian Wu via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 14 06:01:36 PDT 2016


Author: hokein
Date: Fri Oct 14 08:01:36 2016
New Revision: 284233

URL: http://llvm.org/viewvc/llvm-project?rev=284233&view=rev
Log:
[clang-move] Add header guard for the new header.

Summary:
The header guard generated by clang-move isn't always a perfect
style, just avoid getting the header included multiple times during
compiling period.

Also, we can use llvm-Header-guard clang-tidy check to correct the guard
automatically.

Reviewers: ioeric

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D25610

Modified:
    clang-tools-extra/trunk/clang-move/ClangMove.cpp
    clang-tools-extra/trunk/test/clang-move/move-class.cpp
    clang-tools-extra/trunk/test/clang-move/move-multiple-classes.cpp
    clang-tools-extra/trunk/unittests/clang-move/ClangMoveTests.cpp

Modified: clang-tools-extra/trunk/clang-move/ClangMove.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-move/ClangMove.cpp?rev=284233&r1=284232&r2=284233&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-move/ClangMove.cpp (original)
+++ clang-tools-extra/trunk/clang-move/ClangMove.cpp Fri Oct 14 08:01:36 2016
@@ -249,8 +249,22 @@ std::vector<std::string> GetNamespaces(c
 clang::tooling::Replacements
 createInsertedReplacements(const std::vector<std::string> &Includes,
                            const std::vector<ClangMoveTool::MovedDecl> &Decls,
-                           llvm::StringRef FileName) {
+                           llvm::StringRef FileName,
+                           bool IsHeader = false) {
   clang::tooling::Replacements InsertedReplacements;
+  std::string GuardName(FileName);
+  if (IsHeader) {
+    std::replace(GuardName.begin(), GuardName.end(), '/', '_');
+    std::replace(GuardName.begin(), GuardName.end(), '.', '_');
+    std::replace(GuardName.begin(), GuardName.end(), '-', '_');
+
+    GuardName = StringRef(GuardName).upper();
+    std::string HeaderGuard = "#ifndef " + GuardName + "\n";
+    HeaderGuard += "#define " + GuardName + "\n";
+    clang::tooling::Replacement HeaderGuardInclude(FileName, 0, 0,
+                                                   HeaderGuard);
+    addOrMergeReplacement(HeaderGuardInclude, &InsertedReplacements);
+  }
 
   // Add #Includes.
   std::string AllIncludesString;
@@ -308,6 +322,12 @@ createInsertedReplacements(const std::ve
         FileName, 0, 0, "} // namespace " + NS + "\n");
     addOrMergeReplacement(InsertedReplacement, &InsertedReplacements);
   }
+
+  if (IsHeader) {
+    clang::tooling::Replacement HeaderGuardEnd(FileName, 0, 0,
+                                               "#endif // " + GuardName + "\n");
+    addOrMergeReplacement(HeaderGuardEnd, &InsertedReplacements);
+  }
   return InsertedReplacements;
 }
 
@@ -500,7 +520,7 @@ void ClangMoveTool::moveClassDefinitionT
 
   if (!Spec.NewHeader.empty())
     FileToReplacements[Spec.NewHeader] = createInsertedReplacements(
-        HeaderIncludes, NewHeaderDecls, Spec.NewHeader);
+        HeaderIncludes, NewHeaderDecls, Spec.NewHeader, /*IsHeader=*/true);
   if (!Spec.NewCC.empty())
     FileToReplacements[Spec.NewCC] =
         createInsertedReplacements(CCIncludes, NewCCDecls, Spec.NewCC);

Modified: clang-tools-extra/trunk/test/clang-move/move-class.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-move/move-class.cpp?rev=284233&r1=284232&r2=284233&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-move/move-class.cpp (original)
+++ clang-tools-extra/trunk/test/clang-move/move-class.cpp Fri Oct 14 08:01:36 2016
@@ -21,6 +21,9 @@
 // RUN: FileCheck -input-file=%T/clang-move/src/test.cpp -check-prefix=CHECK-OLD-TEST-CPP %s
 // RUN: FileCheck -input-file=%T/clang-move/include/test.h %s -implicit-check-not='{{namespace.*}}'
 //
+//
+// CHECK-NEW-TEST-H: #ifndef {{.*}}CLANG_MOVE_NEW_TEST_H
+// CHECK-NEW-TEST-H: #define {{.*}}CLANG_MOVE_NEW_TEST_H
 // CHECK-NEW-TEST-H: namespace a {
 // CHECK-NEW-TEST-H: class Foo {
 // CHECK-NEW-TEST-H: public:
@@ -28,6 +31,7 @@
 // CHECK-NEW-TEST-H:   int f2(int a, int b);
 // CHECK-NEW-TEST-H: };
 // CHECK-NEW-TEST-H: } // namespace a
+// CHECK-NEW-TEST-H: #endif // {{.*}}CLANG_MOVE_NEW_TEST_H
 //
 // CHECK-NEW-TEST-CPP: #include "{{.*}}new_test.h"
 // CHECK-NEW-TEST-CPP: #include "test2.h"

Modified: clang-tools-extra/trunk/test/clang-move/move-multiple-classes.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-move/move-multiple-classes.cpp?rev=284233&r1=284232&r2=284233&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-move/move-multiple-classes.cpp (original)
+++ clang-tools-extra/trunk/test/clang-move/move-multiple-classes.cpp Fri Oct 14 08:01:36 2016
@@ -24,6 +24,8 @@
 // CHECK-OLD-TEST-CPP: }
 // CHECK-OLD-TEST-CPP: } // namespace c
 
+// CHECK-NEW-TEST-H: #ifndef {{.*}}NEW_MULTIPLE_CLASS_TEST_H
+// CHECK-NEW-TEST-H: #define {{.*}}NEW_MULTIPLE_CLASS_TEST_H
 // CHECK-NEW-TEST-H: namespace a {
 // CHECK-NEW-TEST-H: class Move1 {
 // CHECK-NEW-TEST-H: public:
@@ -54,6 +56,7 @@
 // CHECK-NEW-TEST-H:   static int a;
 // CHECK-NEW-TEST-H: };
 // CHECK-NEW-TEST-H: } // namespace c
+// CHECK-NEW-TEST-H: #endif // {{.*}}NEW_MULTIPLE_CLASS_TEST_H
 
 // CHECK-NEW-TEST-CPP: #include "{{.*}}new_multiple_class_test.h"
 // CHECK-NEW-TEST-CPP: namespace a {

Modified: clang-tools-extra/trunk/unittests/clang-move/ClangMoveTests.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-move/ClangMoveTests.cpp?rev=284233&r1=284232&r2=284233&view=diff
==============================================================================
--- clang-tools-extra/trunk/unittests/clang-move/ClangMoveTests.cpp (original)
+++ clang-tools-extra/trunk/unittests/clang-move/ClangMoveTests.cpp Fri Oct 14 08:01:36 2016
@@ -123,7 +123,9 @@ const char ExpectedTestCC[] = "#include
                               "} // namespace b\n"
                               "} // namespace a\n";
 
-const char ExpectedNewHeader[] = "namespace a {\n"
+const char ExpectedNewHeader[] = "#ifndef NEW_FOO_H\n"
+                                 "#define NEW_FOO_H\n"
+                                 "namespace a {\n"
                                  "class C1; // test\n"
                                  "namespace b {\n"
                                  "// This is a Foo class\n"
@@ -138,7 +140,8 @@ const char ExpectedNewHeader[] = "namesp
                                  "  static int b;\n"
                                  "}; // abc\n"
                                  "} // namespace b\n"
-                                 "} // namespace a\n";
+                                 "} // namespace a\n"
+                                 "#endif // NEW_FOO_H\n";
 
 const char ExpectedNewCC[] = "namespace a {\n"
                              "namespace b {\n"




More information about the cfe-commits mailing list