Index: clang-tools-extra/trunk/change-namespace/ChangeNamespace.h =================================================================== --- clang-tools-extra/trunk/change-namespace/ChangeNamespace.h +++ clang-tools-extra/trunk/change-namespace/ChangeNamespace.h @@ -13,6 +13,7 @@ #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/Format/Format.h" #include "clang/Tooling/Core/Replacement.h" +#include "llvm/Support/Regex.h" #include namespace clang { @@ -131,6 +132,7 @@ std::string DiffNewNamespace; // A regex pattern that matches files to be processed. std::string FilePattern; + llvm::Regex FilePatternRE; // Information about moved namespaces grouped by file. // Since we are modifying code in old namespaces (e.g. add namespace // spedifiers) as well as moving them, we store information about namespaces Index: clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp =================================================================== --- clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp +++ clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp @@ -41,7 +41,7 @@ return TLoc.getLocStart(); } -SourceLocation EndLocationForType(TypeLoc TLoc) { +SourceLocation endLocationForType(TypeLoc TLoc) { // Dig past any namespace or keyword qualifications. while (TLoc.getTypeLocClass() == TypeLoc::Elaborated || TLoc.getTypeLocClass() == TypeLoc::Qualified) @@ -249,7 +249,7 @@ llvm::StringRef FallbackStyle) : FallbackStyle(FallbackStyle), FileToReplacements(*FileToReplacements), OldNamespace(OldNs.ltrim(':')), NewNamespace(NewNs.ltrim(':')), - FilePattern(FilePattern) { + FilePattern(FilePattern), FilePatternRE(FilePattern) { FileToReplacements->clear(); llvm::SmallVector OldNsSplitted; llvm::SmallVector NewNsSplitted; @@ -407,7 +407,7 @@ Result.Nodes.getNodeAs( "nested_specifier_loc")) { SourceLocation Start = Specifier->getBeginLoc(); - SourceLocation End = EndLocationForType(Specifier->getTypeLoc()); + SourceLocation End = endLocationForType(Specifier->getTypeLoc()); fixTypeLoc(Result, Start, End, Specifier->getTypeLoc()); } else if (const auto *BaseInitializer = Result.Nodes.getNodeAs( @@ -415,7 +415,7 @@ BaseCtorInitializerTypeLocs.push_back( BaseInitializer->getTypeSourceInfo()->getTypeLoc()); } else if (const auto *TLoc = Result.Nodes.getNodeAs("type")) { - fixTypeLoc(Result, startLocationForType(*TLoc), EndLocationForType(*TLoc), + fixTypeLoc(Result, startLocationForType(*TLoc), endLocationForType(*TLoc), *TLoc); } else if (const auto *VarRef = Result.Nodes.getNodeAs("var_ref")) { @@ -667,8 +667,7 @@ return false; llvm::StringRef Filename = Result.SourceManager->getFilename(ExpansionLoc); - llvm::Regex RE(FilePattern); - return RE.match(Filename); + return FilePatternRE.match(Filename); }; // Don't fix the \p Type if it refers to a type alias decl in the moved // namespace since the alias decl will be moved along with the type @@ -779,6 +778,12 @@ } FileToReplacements[FilePath] = *CleanReplacements; } + + // Make sure we don't generate replacements for files that do not match + // FilePattern. + for (auto &Entry : FileToReplacements) + if (!FilePatternRE.match(Entry.first)) + Entry.second.clear(); } } // namespace change_namespace Index: clang-tools-extra/trunk/test/change-namespace/macro.cpp =================================================================== --- clang-tools-extra/trunk/test/change-namespace/macro.cpp +++ clang-tools-extra/trunk/test/change-namespace/macro.cpp @@ -0,0 +1,29 @@ +// RUN: cp %S/macro.cpp %T/macro.cpp +// RUN: echo "#define USING using na::nc::X" > %T/macro.h +// +// RUN: clang-change-namespace -old_namespace "na::nb" -new_namespace "x::y" --file_pattern "macro.cpp" --i %T/macro.cpp -- +// RUN: FileCheck -input-file=%T/macro.cpp -check-prefix=CHECK-CC %s +// RUN: FileCheck -input-file=%T/macro.h -check-prefix=CHECK-HEADER %s +// +// RUN: cp %S/macro.cpp %T/macro.cpp +// RUN: echo "#define USING using na::nc::X" > %T/macro.h +// RUN: clang-change-namespace -old_namespace "na::nb" -new_namespace "x::y" --file_pattern ".*" --i %T/macro.cpp -- +// RUN: FileCheck -input-file=%T/macro.cpp -check-prefix=CHECK-CC %s +// RUN: FileCheck -input-file=%T/macro.h -check-prefix=CHECK-CHANGED-HEADER %s +#include "macro.h" +namespace na { namespace nc { class X{}; } } + +namespace na { +namespace nb { +USING; +} +} +// CHECK-CC: namespace x { +// CHECK-CC: namespace y { +// CHECK-CC: USING; +// CHECK-CC: } // namespace y +// CHECK-CC: } // namespace x + +// CHECK-HEADER: #define USING using na::nc::X + +// CHECK-CHANGED-HEADER: #define USING using ::na::nc::X