]> granicus.if.org Git - clang/commitdiff
convert ast printer and dumper ocver to ASTConsumer interface,
authorChris Lattner <sabre@nondot.org>
Sat, 15 Sep 2007 23:02:28 +0000 (23:02 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 15 Sep 2007 23:02:28 +0000 (23:02 +0000)
genericizing them and eliminating boilerplate code.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41992 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/ASTStreamers.cpp
Driver/ASTStreamers.h
Driver/clang.cpp

index b3517dfaef39d651295a1ff0fe2ca73be7fb8f88..72524f16bc76af12e8286114701616661047f550 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "ASTStreamers.h"
 #include "clang/AST/AST.h"
+#include "clang/AST/ASTConsumer.h"
 #include "clang/AST/CFG.h"
 #include "clang/Analysis/LiveVariables.h"
 #include "clang/Analysis/LocalCheckers.h"
@@ -80,68 +81,58 @@ static void PrintObjcInterfaceDecl(ObjcInterfaceDecl *OID) {
   // FIXME: implement the rest...
 }
 
-void clang::PrintASTs(Preprocessor &PP, unsigned MainFileID, bool Stats) {
-  ASTContext Context(PP.getSourceManager(), PP.getTargetInfo(),
-                     PP.getIdentifierTable());
-  ASTStreamerTy *Streamer = ASTStreamer_Init(PP, Context, MainFileID);
-  
-  while (Decl *D = ASTStreamer_ReadTopLevelDecl(Streamer)) {
-    if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
-      PrintFunctionDeclStart(FD);
-
-      if (FD->getBody()) {
-        fprintf(stderr, " ");
-        FD->getBody()->dumpPretty();
-        fprintf(stderr, "\n");
+namespace {
+  class ASTPrinter : public ASTConsumer {
+    virtual void HandleTopLevelDecl(Decl *D) {
+      if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
+        PrintFunctionDeclStart(FD);
+        
+        if (FD->getBody()) {
+          fprintf(stderr, " ");
+          FD->getBody()->dumpPretty();
+          fprintf(stderr, "\n");
+        }
+      } else if (TypedefDecl *TD = dyn_cast<TypedefDecl>(D)) {
+        PrintTypeDefDecl(TD);
+      } else if (ObjcInterfaceDecl *OID = dyn_cast<ObjcInterfaceDecl>(D)) {
+        PrintObjcInterfaceDecl(OID);
+      } else if (ScopedDecl *SD = dyn_cast<ScopedDecl>(D)) {
+        fprintf(stderr, "Read top-level variable decl: '%s'\n", SD->getName());
       }
-    } else if (TypedefDecl *TD = dyn_cast<TypedefDecl>(D)) {
-      PrintTypeDefDecl(TD);
-    } else if (ObjcInterfaceDecl *OID = dyn_cast<ObjcInterfaceDecl>(D)) {
-      PrintObjcInterfaceDecl(OID);
-    } else if (ScopedDecl *SD = dyn_cast<ScopedDecl>(D)) {
-      fprintf(stderr, "Read top-level variable decl: '%s'\n", SD->getName());
     }
-  }
-  
-  if (Stats) {
-    fprintf(stderr, "\nSTATISTICS:\n");
-    ASTStreamer_PrintStats(Streamer);
-    Context.PrintStats();
-  }
-  
-  ASTStreamer_Terminate(Streamer);
+  };
 }
 
-void clang::DumpASTs(Preprocessor &PP, unsigned MainFileID, bool Stats) {
-  ASTContext Context(PP.getSourceManager(), PP.getTargetInfo(),
-                     PP.getIdentifierTable());
-  ASTStreamerTy *Streamer = ASTStreamer_Init(PP, Context, MainFileID);
-  
-  while (Decl *D = ASTStreamer_ReadTopLevelDecl(Streamer)) {
-    if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
-      PrintFunctionDeclStart(FD);
-      
-      if (FD->getBody()) {
-        fprintf(stderr, "\n");
-        FD->getBody()->dumpAll(PP.getSourceManager());
-        fprintf(stderr, "\n");
+ASTConsumer *clang::CreateASTPrinter() { return new ASTPrinter(); }
+
+namespace {
+  class ASTDumper : public ASTConsumer {
+    SourceManager *SM;
+  public:
+    void Initialize(ASTContext &Context, unsigned MainFileID) {
+      SM = &Context.SourceMgr;
+    }
+    
+    virtual void HandleTopLevelDecl(Decl *D) {
+      if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
+        PrintFunctionDeclStart(FD);
+        
+        if (FD->getBody()) {
+          fprintf(stderr, "\n");
+          FD->getBody()->dumpAll(*SM);
+          fprintf(stderr, "\n");
+        }
+      } else if (TypedefDecl *TD = dyn_cast<TypedefDecl>(D)) {
+        PrintTypeDefDecl(TD);
+      } else if (ScopedDecl *SD = dyn_cast<ScopedDecl>(D)) {
+        fprintf(stderr, "Read top-level variable decl: '%s'\n", SD->getName());
       }
-    } else if (TypedefDecl *TD = dyn_cast<TypedefDecl>(D)) {
-      PrintTypeDefDecl(TD);
-    } else if (ScopedDecl *SD = dyn_cast<ScopedDecl>(D)) {
-      fprintf(stderr, "Read top-level variable decl: '%s'\n", SD->getName());
     }
-  }
-  
-  if (Stats) {
-    fprintf(stderr, "\nSTATISTICS:\n");
-    ASTStreamer_PrintStats(Streamer);
-    Context.PrintStats();
-  }
-  
-  ASTStreamer_Terminate(Streamer);
+  };
 }
 
+ASTConsumer *clang::CreateASTDumper() { return new ASTDumper(); }
+
 //===----------------------------------------------------------------------===//
 // CFGVisitor & VisitCFGs - Boilerplate interface and logic to visit
 //   the CFGs for all function definitions.
index e21c1c9aa0012ae5e955f9bdcde76d8d001283e0..09f1423e65916ef94c9d0cd2496c2fce4cdc7970 100644 (file)
@@ -21,8 +21,8 @@ class FunctionDecl;
 class TypedefDecl;
 class ASTConsumer;
 
-void PrintASTs(Preprocessor &PP, unsigned MainFileID, bool Stats);
-void DumpASTs(Preprocessor &PP, unsigned MainFileID, bool Stats);
+ASTConsumer *CreateASTPrinter();
+ASTConsumer *CreateASTDumper();
 
 void DumpCFGs(Preprocessor &PP, unsigned MainFileID,
               bool Stats, bool use_graphviz = false);  
index d6f4da8a8748d1d97a9cbac7e58f5c16f0c545fe..7c25a0a9b08ff531477a6d54cfdaa574b1513bf3 100644 (file)
@@ -844,12 +844,16 @@ static void ProcessInputFile(Preprocessor &PP, unsigned MainFileID,
     ParseAST(PP, MainFileID, NullConsumer, Stats);
     break;
   }
-  case ParseASTPrint:
-    PrintASTs(PP, MainFileID, Stats);
+  case ParseASTPrint: {
+    std::auto_ptr<ASTConsumer> C(CreateASTPrinter());
+    ParseAST(PP, MainFileID, *C.get(), Stats);
     break;
-  case ParseASTDump:
-    DumpASTs(PP, MainFileID, Stats);
+  }
+  case ParseASTDump: {
+    std::auto_ptr<ASTConsumer> C(CreateASTDumper());
+    ParseAST(PP, MainFileID, *C.get(), Stats);
     break;
+  }
   case ParseCFGDump:
     DumpCFGs(PP, MainFileID, Stats);
     break;