From c265b02bec973ab3bea9311e271d32e9938f36e9 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 1 Dec 2016 17:25:55 +0000 Subject: [PATCH] [change-namespace] don't generate replacements for files that don't match file pattern. Reviewers: hokein Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D27302 llvm-svn: 288376 --- .../change-namespace/ChangeNamespace.cpp | 17 ++++++++----- .../change-namespace/ChangeNamespace.h | 2 ++ clang-tools-extra/test/change-namespace/macro.cpp | 29 ++++++++++++++++++++++ 3 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 clang-tools-extra/test/change-namespace/macro.cpp diff --git a/clang-tools-extra/change-namespace/ChangeNamespace.cpp b/clang-tools-extra/change-namespace/ChangeNamespace.cpp index 44eec1a..7de4690a 100644 --- a/clang-tools-extra/change-namespace/ChangeNamespace.cpp +++ b/clang-tools-extra/change-namespace/ChangeNamespace.cpp @@ -41,7 +41,7 @@ SourceLocation startLocationForType(TypeLoc TLoc) { 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 @@ ChangeNamespaceTool::ChangeNamespaceTool( 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 @@ void ChangeNamespaceTool::run( 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 @@ void ChangeNamespaceTool::run( 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 @@ void ChangeNamespaceTool::fixTypeLoc( 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 @@ void ChangeNamespaceTool::onEndOfTranslationUnit() { } 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 diff --git a/clang-tools-extra/change-namespace/ChangeNamespace.h b/clang-tools-extra/change-namespace/ChangeNamespace.h index e7521cb..300579d 100644 --- a/clang-tools-extra/change-namespace/ChangeNamespace.h +++ b/clang-tools-extra/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 @@ private: 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 diff --git a/clang-tools-extra/test/change-namespace/macro.cpp b/clang-tools-extra/test/change-namespace/macro.cpp new file mode 100644 index 0000000..ba47de6 --- /dev/null +++ b/clang-tools-extra/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 -- 2.7.4