zcov: / lib/Frontend/DeclXML.cpp


Files: 1 Branches Taken: 80.0% 16 / 20
Generated: 2010-02-10 01:31 Branches Executed: 100.0% 20 / 20
Line Coverage: 88.9% 48 / 54


Programs: 1 Runs 2897


       1                 : //===--- DeclXML.cpp - XML implementation for Decl ASTs -------------------===//
       2                 : //
       3                 : //                     The LLVM Compiler Infrastructure
       4                 : //
       5                 : // This file is distributed under the University of Illinois Open Source
       6                 : // License. See LICENSE.TXT for details.
       7                 : //
       8                 : //===----------------------------------------------------------------------===//
       9                 : //
      10                 : // This file implements the XML document class, which provides the means to
      11                 : // dump out the AST in a XML form that exposes type details and other fields.
      12                 : //
      13                 : //===----------------------------------------------------------------------===//
      14                 : 
      15                 : #include "clang/Frontend/DocumentXML.h"
      16                 : #include "clang/AST/DeclVisitor.h"
      17                 : #include "clang/AST/Expr.h"
      18                 : 
      19                 : namespace clang {
      20                 : 
      21                 : //---------------------------------------------------------
      22                 : class DocumentXML::DeclPrinter : public DeclVisitor<DocumentXML::DeclPrinter> {
      23                 :   DocumentXML& Doc;
      24                 : 
      25               17:   void addSubNodes(FunctionDecl* FD) {
                       17: branch 1 taken
                       17: branch 2 taken
      26               34:     for (unsigned i = 0, e = FD->getNumParams(); i != e; ++i) {
      27               17:       Visit(FD->getParamDecl(i));
      28               17:       Doc.toParent();
      29                 :     }
      30               17:   }
      31                 : 
      32                7:   void addSubNodes(RecordDecl* RD) {
                        8: branch 3 taken
                        7: branch 4 taken
      33               22:     for (RecordDecl::field_iterator i = RD->field_begin(),
      34                7:                                     e = RD->field_end(); i != e; ++i) {
      35                8:       Visit(*i);
      36                8:       Doc.toParent();
      37                 :     }
      38                7:   }
      39                 : 
      40                1:   void addSubNodes(EnumDecl* ED) {
                        1: branch 3 taken
                        1: branch 4 taken
      41                3:     for (EnumDecl::enumerator_iterator i = ED->enumerator_begin(),
      42                1:                                        e = ED->enumerator_end(); i != e; ++i) {
      43                1:       Visit(*i);
      44                1:       Doc.toParent();
      45                 :     }
      46                1:   }
      47                 : 
      48                1:   void addSubNodes(EnumConstantDecl* ECD) {
                        0: branch 1 not taken
                        1: branch 2 taken
      49                1:     if (ECD->getInitExpr())
      50                0:       Doc.PrintStmt(ECD->getInitExpr());
      51                1:   }
      52                 : 
      53                8:   void addSubNodes(FieldDecl* FdD)  {
                        0: branch 1 not taken
                        8: branch 2 taken
      54                8:     if (FdD->isBitField())
      55                0:       Doc.PrintStmt(FdD->getBitWidth());
      56                8:   }
      57                 : 
      58               63:   void addSubNodes(VarDecl* V) {
                       37: branch 1 taken
                       26: branch 2 taken
      59               63:     if (V->getInit())
      60               37:       Doc.PrintStmt(V->getInit());
      61               63:   }
      62                 : 
      63               17:   void addSubNodes(ParmVarDecl* argDecl) {
                        0: branch 1 not taken
                       17: branch 2 taken
      64               17:     if (argDecl->getDefaultArg())
      65                0:       Doc.PrintStmt(argDecl->getDefaultArg());
      66               17:   }
      67                 : 
      68                1:   void addSpecialAttribute(const char* pName, EnumDecl* ED) {
      69                1:     const QualType& enumType = ED->getIntegerType();
                        1: branch 1 taken
                        0: branch 2 not taken
      70                1:     if (!enumType.isNull())
      71                1:       Doc.addAttribute(pName, enumType);
      72                1:   }
      73                 : 
      74                0:   void addIdAttribute(LinkageSpecDecl* ED) {
      75                0:     Doc.addAttribute("id", ED);
      76                0:   }
      77                 : 
      78              121:   void addIdAttribute(NamedDecl* ND) {
      79              121:     Doc.addAttribute("id", ND);
      80              121:   }
      81                 : 
      82                 : public:
      83               96:   DeclPrinter(DocumentXML& doc) : Doc(doc) {}
      84                 : 
      85                 : #define NODE_XML( CLASS, NAME )          \
      86                 :   void Visit##CLASS(CLASS* T)            \
      87                 :   {                                      \
      88                 :     Doc.addSubNode(NAME);
      89                 : 
      90                 : #define ID_ATTRIBUTE_XML                  addIdAttribute(T);
      91                 : #define ATTRIBUTE_XML( FN, NAME )         Doc.addAttribute(NAME, T->FN);
      92                 : #define ATTRIBUTE_OPT_XML( FN, NAME )     Doc.addAttributeOptional(NAME, T->FN);
      93                 : #define ATTRIBUTE_FILE_LOCATION_XML       Doc.addLocation(T->getLocation());
      94                 : #define ATTRIBUTE_SPECIAL_XML( FN, NAME ) addSpecialAttribute(NAME, T);
      95                 : 
      96                 : #define ATTRIBUTE_ENUM_XML( FN, NAME )  \
      97                 :   {                                     \
      98                 :     const char* pAttributeName = NAME;  \
      99                 :     const bool optional = false;             \
     100                 :     switch (T->FN) {                    \
     101                 :     default: assert(0 && "unknown enum value");
     102                 : 
     103                 : #define ATTRIBUTE_ENUM_OPT_XML( FN, NAME )  \
     104                 :   {                                     \
     105                 :     const char* pAttributeName = NAME;  \
     106                 :     const bool optional = true;              \
     107                 :     switch (T->FN) {                    \
     108                 :     default: assert(0 && "unknown enum value");
     109                 : 
     110                 : #define ENUM_XML( VALUE, NAME )         case VALUE: if ((!optional) || NAME[0]) Doc.addAttribute(pAttributeName, NAME); break;
     111                 : #define END_ENUM_XML                    } }
     112                 : #define END_NODE_XML                    }
     113                 : 
     114                 : #define SUB_NODE_XML( CLASS )           addSubNodes(T);
     115                 : #define SUB_NODE_SEQUENCE_XML( CLASS )  addSubNodes(T);
     116                 : #define SUB_NODE_OPT_XML( CLASS )       addSubNodes(T);
     117                 : 
     118                 : #include "clang/Frontend/DeclXML.def"
     119                 : };
     120                 : 
     121                 : 
     122                 : //---------------------------------------------------------
     123               96: void DocumentXML::writeDeclToXML(Decl *D) {
     124               96:   DeclPrinter(*this).Visit(D);
                       17: branch 1 taken
                       79: branch 2 taken
     125               96:   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
                       11: branch 1 taken
                        6: branch 2 taken
     126               17:     if (Stmt *Body = FD->getBody()) {
     127               11:       addSubNode("Body");
     128               11:       PrintStmt(Body);
     129               11:       toParent();
     130                 :     }
     131                 :   }
     132               96:   toParent();
     133               96: }
     134                 : 
     135                 : //---------------------------------------------------------
     136                 : } // NS clang
     137                 : 

Generated: 2010-02-10 01:31 by zcov