- Decluttering Transform.h
    - Removing old override calls and adding some docs.

Hi arielbernal, tareqsiraj,

http://llvm-reviews.chandlerc.com/D956

CHANGE SINCE LAST DIFF
  http://llvm-reviews.chandlerc.com/D956?vs=2356&id=2359#toc

Files:
  cpp11-migrate/AddOverride/AddOverride.cpp
  cpp11-migrate/Core/Transform.cpp
  cpp11-migrate/Core/Transform.h
  cpp11-migrate/LoopConvert/LoopConvert.cpp
  cpp11-migrate/UseAuto/UseAuto.cpp
  cpp11-migrate/UseNullptr/UseNullptr.cpp
Index: cpp11-migrate/AddOverride/AddOverride.cpp
===================================================================
--- cpp11-migrate/AddOverride/AddOverride.cpp
+++ cpp11-migrate/AddOverride/AddOverride.cpp
@@ -37,12 +37,6 @@
                                 FileContentsByPath &ResultStates) {
   RefactoringTool AddOverrideTool(Database, SourcePaths);
 
-  for (FileContentsByPath::const_iterator I = InputStates.begin(),
-       E = InputStates.end();
-       I != E; ++I) {
-    AddOverrideTool.mapVirtualFile(I->first, I->second);
-  }
-
   unsigned AcceptedChanges = 0;
 
   MatchFinder Finder;
@@ -53,8 +47,8 @@
 
   Finder.addMatcher(makeCandidateForOverrideAttrMatcher(), &Fixer);
 
-  if (int result = AddOverrideTool.run(
-          newFrontendActionFactory(&Finder, /*Callbacks=*/ this))) {
+  if (int result =
+          AddOverrideTool.run(createActionFactory(Finder, InputStates))) {
     llvm::errs() << "Error encountered during translation.\n";
     return result;
   }
Index: cpp11-migrate/Core/Transform.cpp
===================================================================
--- cpp11-migrate/Core/Transform.cpp
+++ cpp11-migrate/Core/Transform.cpp
@@ -1,11 +1,97 @@
 #include "Core/Transform.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/Basic/FileManager.h"
 #include "clang/Basic/SourceManager.h"
+#include "clang/Frontend/CompilerInstance.h"
 #include "clang/Rewrite/Core/Rewriter.h"
 #include "llvm/Support/raw_ostream.h"
 
 using namespace clang;
 
+namespace {
+
+using namespace tooling;
+using namespace ast_matchers;
+
+/// \brief Custom FrontendActionFactory to produce FrontendActions that handle
+/// overriding source file contents before parsing.
+///
+/// The nested class FactoryAdaptor overrides BeginSourceFileAction to override
+/// source file contents before parsing happens. Both Begin and
+/// EndSourceFileAction call corresponding callbacks provided by
+/// SourceFileCallbacks.
+class ActionFactory : public clang::tooling::FrontendActionFactory {
+public:
+  ActionFactory(MatchFinder &Finder, const FileContentsByPath &Overrides,
+                SourceFileCallbacks &Callbacks)
+  : Finder(Finder), Overrides(Overrides), Callbacks(Callbacks) {}
+
+  virtual FrontendAction *create() LLVM_OVERRIDE {
+    return new FactoryAdaptor(Finder, Overrides, Callbacks);
+  }
+
+private:
+  class FactoryAdaptor : public ASTFrontendAction {
+  public:
+    FactoryAdaptor(MatchFinder &Finder, const FileContentsByPath &Overrides,
+                  SourceFileCallbacks &Callbacks)
+        : Finder(Finder), Overrides(Overrides), Callbacks(Callbacks) {}
+
+    ASTConsumer *CreateASTConsumer(CompilerInstance &, StringRef) {
+      return Finder.newASTConsumer();
+    }
+
+    virtual bool BeginSourceFileAction(CompilerInstance &CI,
+                                       StringRef Filename) LLVM_OVERRIDE {
+      if (!ASTFrontendAction::BeginSourceFileAction(CI, Filename))
+        return false;
+
+      FileContentsByPath::const_iterator I = Overrides.find(Filename.str());
+      if (I != Overrides.end())
+        // If an override exists, use it.
+        CI.getSourceManager()
+            .overrideFileContents(CI.getFileManager().getFile(I->first),
+                                  llvm::MemoryBuffer::getMemBuffer(I->second));
+
+      return Callbacks.handleBeginSource(CI, Filename);
+    }
+
+    virtual void EndSourceFileAction() LLVM_OVERRIDE {
+      Callbacks.handleEndSource();
+      return ASTFrontendAction::EndSourceFileAction();
+    }
+
+  private:
+    MatchFinder &Finder;
+    const FileContentsByPath &Overrides;
+    SourceFileCallbacks &Callbacks;
+  };
+
+  MatchFinder &Finder;
+  const FileContentsByPath &Overrides;
+  SourceFileCallbacks &Callbacks;
+};
+
+} // namespace
+
+RewriterContainer::RewriterContainer(clang::FileManager &Files,
+                                     const FileContentsByPath &InputStates)
+    : DiagOpts(new clang::DiagnosticOptions()),
+      DiagnosticPrinter(llvm::errs(), DiagOpts.getPtr()),
+      Diagnostics(llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs>(
+                      new clang::DiagnosticIDs()),
+                  DiagOpts.getPtr(), &DiagnosticPrinter, false),
+      Sources(Diagnostics, Files), Rewrite(Sources, DefaultLangOptions) {
+
+  // Overwrite source manager's file contents with data from InputStates
+  for (FileContentsByPath::const_iterator I = InputStates.begin(),
+                                          E = InputStates.end();
+       I != E; ++I) {
+    Sources.overrideFileContents(Files.getFile(I->first),
+                                 llvm::MemoryBuffer::getMemBuffer(I->second));
+  }
+}
+
 void collectResults(clang::Rewriter &Rewrite,
                     const FileContentsByPath &InputStates,
                     FileContentsByPath &Results) {
@@ -55,3 +141,9 @@
 void Transform::addTiming(llvm::StringRef Label, llvm::TimeRecord Duration) {
   Timings.push_back(std::make_pair(Label.str(), Duration));
 }
+
+FrontendActionFactory *
+Transform::createActionFactory(MatchFinder &Finder,
+                               const FileContentsByPath &InputStates) {
+  return new ActionFactory(Finder, InputStates, *this);
+}
Index: cpp11-migrate/Core/Transform.h
===================================================================
--- cpp11-migrate/Core/Transform.h
+++ cpp11-migrate/Core/Transform.h
@@ -49,6 +49,9 @@
 namespace tooling {
 class CompilationDatabase;
 } // namespace tooling
+namespace ast_matchers {
+class MatchFinder;
+} // namespace ast_matchers
 } // namespace clang
 
 /// \brief The key is the path of a file, which is mapped to a
@@ -77,23 +80,7 @@
 class RewriterContainer {
 public:
   RewriterContainer(clang::FileManager &Files,
-                    const FileContentsByPath &InputStates)
-    : DiagOpts(new clang::DiagnosticOptions()),
-      DiagnosticPrinter(llvm::errs(), DiagOpts.getPtr()),
-      Diagnostics(llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs>(
-                    new clang::DiagnosticIDs()),
-                  DiagOpts.getPtr(), &DiagnosticPrinter, false),
-      Sources(Diagnostics, Files),
-      Rewrite(Sources, DefaultLangOptions) {
-
-    // Overwrite source manager's file contents with data from InputStates
-    for (FileContentsByPath::const_iterator I = InputStates.begin(),
-                                            E = InputStates.end();
-         I != E; ++I) {
-      Sources.overrideFileContents(Files.getFile(I->first),
-                                   llvm::MemoryBuffer::getMemBuffer(I->second));
-    }
-  }
+                    const FileContentsByPath &InputStates);
 
   clang::Rewriter &getRewriter() { return Rewrite; }
 
@@ -233,6 +220,13 @@
 
   const TransformOptions &Options() { return GlobalOptions; }
 
+  /// \brief Subclasses call this function to create a FrontendActionFactory to
+  /// pass to ClangTool. The factory returned by this function is responsible
+  /// for overriding source file contents with results of previous transforms.
+  clang::tooling::FrontendActionFactory *
+      createActionFactory(clang::ast_matchers::MatchFinder &Finder,
+                          const FileContentsByPath &InputStates);
+
 private:
   const std::string Name;
   const TransformOptions &GlobalOptions;
Index: cpp11-migrate/LoopConvert/LoopConvert.cpp
===================================================================
--- cpp11-migrate/LoopConvert/LoopConvert.cpp
+++ cpp11-migrate/LoopConvert/LoopConvert.cpp
@@ -31,12 +31,6 @@
                                 FileContentsByPath &ResultStates) {
   RefactoringTool LoopTool(Database, SourcePaths);
 
-  for (FileContentsByPath::const_iterator I = InputStates.begin(),
-       E = InputStates.end();
-       I != E; ++I) {
-    LoopTool.mapVirtualFile(I->first, I->second);
-  }
-
   StmtAncestorASTVisitor ParentFinder;
   StmtGeneratedVarNameMap GeneratedDecls;
   ReplacedVarsMap ReplacedVars;
@@ -63,8 +57,7 @@
                                   Options().MaxRiskLevel, LFK_PseudoArray);
   Finder.addMatcher(makePseudoArrayLoopMatcher(), &PseudoarrrayLoopFixer);
 
-  if (int result = LoopTool.run(
-          newFrontendActionFactory(&Finder, /*Callbacks=*/ this))) {
+  if (int result = LoopTool.run(createActionFactory(Finder, InputStates))) {
     llvm::errs() << "Error encountered during translation.\n";
     return result;
   }
Index: cpp11-migrate/UseAuto/UseAuto.cpp
===================================================================
--- cpp11-migrate/UseAuto/UseAuto.cpp
+++ cpp11-migrate/UseAuto/UseAuto.cpp
@@ -26,11 +26,6 @@
                             FileContentsByPath &ResultStates) {
   RefactoringTool UseAutoTool(Database, SourcePaths);
 
-  for (FileContentsByPath::const_iterator I = InputStates.begin(),
-                                          E = InputStates.end();
-       I != E; ++I)
-    UseAutoTool.mapVirtualFile(I->first, I->second);
-
   unsigned AcceptedChanges = 0;
 
   MatchFinder Finder;
@@ -42,8 +37,7 @@
   Finder.addMatcher(makeIteratorDeclMatcher(), &ReplaceIterators);
   Finder.addMatcher(makeDeclWithNewMatcher(), &ReplaceNew);
 
-  if (int Result = UseAutoTool.run(
-          newFrontendActionFactory(&Finder, /*Callbacks=*/ this))) {
+  if (int Result = UseAutoTool.run(createActionFactory(Finder, InputStates))) {
     llvm::errs() << "Error encountered during translation.\n";
     return Result;
   }
Index: cpp11-migrate/UseNullptr/UseNullptr.cpp
===================================================================
--- cpp11-migrate/UseNullptr/UseNullptr.cpp
+++ cpp11-migrate/UseNullptr/UseNullptr.cpp
@@ -31,12 +31,6 @@
                                FileContentsByPath &ResultStates) {
   RefactoringTool UseNullptrTool(Database, SourcePaths);
 
-  for (FileContentsByPath::const_iterator I = InputStates.begin(),
-       E = InputStates.end();
-       I != E; ++I) {
-    UseNullptrTool.mapVirtualFile(I->first, I->second);
-  }
-
   unsigned AcceptedChanges = 0;
 
   MatchFinder Finder;
@@ -46,8 +40,8 @@
 
   Finder.addMatcher(makeCastSequenceMatcher(), &Fixer);
 
-  if (int result = UseNullptrTool.run(
-          newFrontendActionFactory(&Finder, /*Callbacks=*/ this))) {
+  if (int result =
+          UseNullptrTool.run(createActionFactory(Finder, InputStates))) {
     llvm::errs() << "Error encountered during translation.\n";
     return result;
   }
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to