diff options
author | Eric Liu <ioeric@google.com> | 2017-02-24 11:54:45 +0000 |
---|---|---|
committer | Eric Liu <ioeric@google.com> | 2017-02-24 11:54:45 +0000 |
commit | d84de9aa80e4148631190dd70a6e9ee02b7ab669 (patch) | |
tree | 12a0b63bd5f66a28ee6f748298af2607dd54d956 /clang-tools-extra/change-namespace | |
parent | e744530b587cec946a799712ae5b462648519569 (diff) |
[change-namepsace] make it possible to whitelist symbols so they don't get updated.
Reviewers: hokein
Reviewed By: hokein
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D30328
Diffstat (limited to 'clang-tools-extra/change-namespace')
3 files changed, 39 insertions, 1 deletions
diff --git a/clang-tools-extra/change-namespace/ChangeNamespace.cpp b/clang-tools-extra/change-namespace/ChangeNamespace.cpp index ebd6daeebc5..ad1c22afcdb 100644 --- a/clang-tools-extra/change-namespace/ChangeNamespace.cpp +++ b/clang-tools-extra/change-namespace/ChangeNamespace.cpp @@ -290,6 +290,7 @@ AST_MATCHER(EnumDecl, isScoped) { ChangeNamespaceTool::ChangeNamespaceTool( llvm::StringRef OldNs, llvm::StringRef NewNs, llvm::StringRef FilePattern, + llvm::ArrayRef<std::string> WhiteListedSymbolPatterns, std::map<std::string, tooling::Replacements> *FileToReplacements, llvm::StringRef FallbackStyle) : FallbackStyle(FallbackStyle), FileToReplacements(*FileToReplacements), @@ -308,6 +309,9 @@ ChangeNamespaceTool::ChangeNamespaceTool( } DiffOldNamespace = joinNamespaces(OldNsSplitted); DiffNewNamespace = joinNamespaces(NewNsSplitted); + + for (const auto &Pattern : WhiteListedSymbolPatterns) + WhiteListedSymbolRegexes.emplace_back(Pattern); } void ChangeNamespaceTool::registerMatchers(ast_matchers::MatchFinder *Finder) { @@ -736,6 +740,9 @@ void ChangeNamespaceTool::replaceQualifiedSymbolInDeclContext( Result.SourceManager->getSpellingLoc(End)), *Result.SourceManager, Result.Context->getLangOpts()); std::string FromDeclName = FromDecl->getQualifiedNameAsString(); + for (llvm::Regex &RE : WhiteListedSymbolRegexes) + if (RE.match(FromDeclName)) + return; std::string ReplaceName = getShortestQualifiedNameInNamespace(FromDeclName, NewNs); // Checks if there is any using namespace declarations that can shorten the diff --git a/clang-tools-extra/change-namespace/ChangeNamespace.h b/clang-tools-extra/change-namespace/ChangeNamespace.h index 5161591db37..cfe3cbc729d 100644 --- a/clang-tools-extra/change-namespace/ChangeNamespace.h +++ b/clang-tools-extra/change-namespace/ChangeNamespace.h @@ -50,6 +50,7 @@ public: // files matching `FilePattern`. ChangeNamespaceTool( llvm::StringRef OldNs, llvm::StringRef NewNs, llvm::StringRef FilePattern, + llvm::ArrayRef<std::string> WhiteListedSymbolPatterns, std::map<std::string, tooling::Replacements> *FileToReplacements, llvm::StringRef FallbackStyle = "LLVM"); @@ -164,6 +165,9 @@ private: // CallExpr and one as DeclRefExpr), we record all DeclRefExpr's that have // been processed so that we don't handle them twice. llvm::SmallPtrSet<const clang::DeclRefExpr*, 16> ProcessedFuncRefs; + // Patterns of symbol names whose references are not expected to be updated + // when changing namespaces around them. + std::vector<llvm::Regex> WhiteListedSymbolRegexes; }; } // namespace change_namespace diff --git a/clang-tools-extra/change-namespace/tool/ClangChangeNamespace.cpp b/clang-tools-extra/change-namespace/tool/ClangChangeNamespace.cpp index b49a78d6e87..02a97839f15 100644 --- a/clang-tools-extra/change-namespace/tool/ClangChangeNamespace.cpp +++ b/clang-tools-extra/change-namespace/tool/ClangChangeNamespace.cpp @@ -73,6 +73,25 @@ cl::opt<std::string> Style("style", cl::desc("The style name used for reformatting."), cl::init("LLVM"), cl::cat(ChangeNamespaceCategory)); +cl::opt<std::string> WhiteListFile( + "whitelist_file", + cl::desc("A file containing regexes of symbol names that are not expected " + "to be updated when changing namespaces around them."), + cl::init(""), cl::cat(ChangeNamespaceCategory)); + +llvm::ErrorOr<std::vector<std::string>> GetWhiteListedSymbolPatterns() { + llvm::SmallVector<StringRef, 8> Lines; + if (!WhiteListFile.empty()) { + llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File = + llvm::MemoryBuffer::getFile(WhiteListFile); + if (!File) + return File.getError(); + llvm::StringRef Content = File.get()->getBuffer(); + Content.split(Lines, '\n', /*MaxSplit=*/-1, /*KeepEmpty=*/false); + } + return std::vector<std::string>(Lines.begin(), Lines.end()); +} + } // anonymous namespace int main(int argc, const char **argv) { @@ -81,8 +100,16 @@ int main(int argc, const char **argv) { ChangeNamespaceCategory); const auto &Files = OptionsParser.getSourcePathList(); tooling::RefactoringTool Tool(OptionsParser.getCompilations(), Files); + llvm::ErrorOr<std::vector<std::string>> WhiteListPatterns = + GetWhiteListedSymbolPatterns(); + if (!WhiteListPatterns) { + llvm::errs() << "Failed to open whitelist file " << WhiteListFile << ". " + << WhiteListPatterns.getError().message() << "\n"; + return 1; + } change_namespace::ChangeNamespaceTool NamespaceTool( - OldNamespace, NewNamespace, FilePattern, &Tool.getReplacements(), Style); + OldNamespace, NewNamespace, FilePattern, *WhiteListPatterns, + &Tool.getReplacements(), Style); ast_matchers::MatchFinder Finder; NamespaceTool.registerMatchers(&Finder); std::unique_ptr<tooling::FrontendActionFactory> Factory = |