Author: ioeric Date: Thu Dec 1 11:25:55 2016 New Revision: 288376 URL: http://llvm.org/viewvc/llvm-project?rev=288376&view=rev Log: [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 Added: clang-tools-extra/trunk/test/change-namespace/macro.cpp Modified: clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp clang-tools-extra/trunk/change-namespace/ChangeNamespace.h Modified: clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp?rev=288376&r1=288375&r2=288376&view=diff ============================================================================== --- clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp (original) +++ clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp Thu Dec 1 11:25:55 2016 @@ -41,7 +41,7 @@ SourceLocation startLocationForType(Type 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<llvm::StringRef, 4> OldNsSplitted; llvm::SmallVector<llvm::StringRef, 4> NewNsSplitted; @@ -407,7 +407,7 @@ void ChangeNamespaceTool::run( Result.Nodes.getNodeAs<NestedNameSpecifierLoc>( "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<CXXCtorInitializer>( @@ -415,7 +415,7 @@ void ChangeNamespaceTool::run( BaseCtorInitializerTypeLocs.push_back( BaseInitializer->getTypeSourceInfo()->getTypeLoc()); } else if (const auto *TLoc = Result.Nodes.getNodeAs<TypeLoc>("type")) { - fixTypeLoc(Result, startLocationForType(*TLoc), EndLocationForType(*TLoc), + fixTypeLoc(Result, startLocationForType(*TLoc), endLocationForType(*TLoc), *TLoc); } else if (const auto *VarRef = Result.Nodes.getNodeAs<DeclRefExpr>("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::onEndOfTransla } 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 Modified: clang-tools-extra/trunk/change-namespace/ChangeNamespace.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/change-namespace/ChangeNamespace.h?rev=288376&r1=288375&r2=288376&view=diff ============================================================================== --- clang-tools-extra/trunk/change-namespace/ChangeNamespace.h (original) +++ clang-tools-extra/trunk/change-namespace/ChangeNamespace.h Thu Dec 1 11:25:55 2016 @@ -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 <string> 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 Added: clang-tools-extra/trunk/test/change-namespace/macro.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/change-namespace/macro.cpp?rev=288376&view=auto ============================================================================== --- clang-tools-extra/trunk/test/change-namespace/macro.cpp (added) +++ clang-tools-extra/trunk/test/change-namespace/macro.cpp Thu Dec 1 11:25:55 2016 @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits