Index: tools/clang/BindMigrate/Transform.cpp |
diff --git a/tools/clang/BindMigrate/Transform.cpp b/tools/clang/BindMigrate/Transform.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..710482f7c77e8b28af1f59995af1f6d4761ea6f9 |
--- /dev/null |
+++ b/tools/clang/BindMigrate/Transform.cpp |
@@ -0,0 +1,99 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "Transform.h" |
+ |
+#include "clang/Basic/FileManager.h" |
+ |
+namespace clang { |
+ |
+TransformApplier::TransformApplier(const Transform::TransformList& transforms) |
+ : transforms_(transforms) { |
+} |
+ |
+bool TransformApplier::VisitStmt(Stmt *statement) { |
+ for (Transform::TransformList::iterator it = transforms_.begin(), |
+ end = transforms_.end(); it != end; ++it) { |
+ if ((*it)->WouldTransformStmt(statement)) { |
+ (*it)->TransformStmt(statement); |
+ } |
+ } |
+ |
+ return RecursiveASTVisitor<TransformApplier>::VisitStmt(statement); |
+} |
+ |
+bool TransformApplier::VisitDecl(Decl *decl) { |
+ for (Transform::TransformList::iterator it = transforms_.begin(), |
+ end = transforms_.end(); it != end; ++it) { |
+ if ((*it)->WouldTransformDecl(decl)) { |
+ (*it)->TransformDecl(decl); |
+ } |
+ } |
+ |
+ return RecursiveASTVisitor<TransformApplier>::VisitDecl(decl); |
+} |
+ |
+bool TransformApplier::VisitType(Type* type) { |
+ for (Transform::TransformList::iterator it = transforms_.begin(), |
+ end = transforms_.end(); it != end; ++it) { |
+ if ((*it)->WouldTransformType(type)) { |
+ (*it)->TransformType(type); |
+ } |
+ } |
+ |
+ return RecursiveASTVisitor<TransformApplier>::VisitType(type); |
+} |
+ |
+TransformCandidatePrinter::TransformCandidatePrinter( |
+ const Transform::TransformList& transforms, |
+ SourceManager* source_manager) |
+ : transforms_(transforms), |
+ source_manager_(source_manager) { |
+} |
+ |
+TransformCandidatePrinter::~TransformCandidatePrinter() { |
+ for (std::set<std::string>::const_iterator it = filenames_.begin(); |
+ it != filenames_.end(); ++it) { |
+ llvm::outs() << *it << "\n"; |
+ } |
+} |
+ |
+bool TransformCandidatePrinter::VisitStmt(Stmt *statement) { |
+ for (Transform::TransformList::iterator it = transforms_.begin(), |
+ end = transforms_.end(); it != end; ++it) { |
+ if ((*it)->WouldTransformStmt(statement)) { |
+ AddFileForLocation(statement->getLocStart()); |
+ } |
+ } |
+ |
+ return RecursiveASTVisitor<TransformCandidatePrinter>::VisitStmt( |
+ statement); |
+} |
+ |
+bool TransformCandidatePrinter::VisitDecl(Decl *decl) { |
+ for (Transform::TransformList::iterator it = transforms_.begin(), |
+ end = transforms_.end(); it != end; ++it) { |
+ if ((*it)->WouldTransformDecl(decl)) { |
+ AddFileForLocation(decl->getLocStart()); |
+ } |
+ } |
+ |
+ return RecursiveASTVisitor<TransformCandidatePrinter>::VisitDecl(decl); |
+} |
+ |
+bool TransformCandidatePrinter::VisitType(Type* type) { |
+ // We will find it in Decls and Statements already. |
+ return RecursiveASTVisitor<TransformCandidatePrinter>::VisitType(type); |
+} |
+ |
+void TransformCandidatePrinter::AddFileForLocation(SourceLocation location) { |
+ const FileEntry* file_entry = GetValidFile(*source_manager_, location); |
+ if (!file_entry) { |
+ return; |
+ } |
+ |
+ filenames_.insert(file_entry->getName()); |
+} |
+ |
+} // namespace clang |