Index: clang-move/ClangMove.cpp =================================================================== --- clang-move/ClangMove.cpp +++ clang-move/ClangMove.cpp @@ -249,8 +249,22 @@ clang::tooling::Replacements createInsertedReplacements(const std::vector &Includes, const std::vector &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 @@ 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 @@ 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); Index: test/clang-move/move-class.cpp =================================================================== --- test/clang-move/move-class.cpp +++ test/clang-move/move-class.cpp @@ -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" Index: test/clang-move/move-multiple-classes.cpp =================================================================== --- test/clang-move/move-multiple-classes.cpp +++ test/clang-move/move-multiple-classes.cpp @@ -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 { Index: unittests/clang-move/ClangMoveTests.cpp =================================================================== --- unittests/clang-move/ClangMoveTests.cpp +++ unittests/clang-move/ClangMoveTests.cpp @@ -123,7 +123,9 @@ "} // 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 @@ " 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"