 |
|
 |
|
| 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 |
| |
 |
|
 |
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