From 8a16769b61c77ebc6682435db2ed1823ae1be0f1 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Mon, 8 Mar 2010 18:51:03 +0000 Subject: [PATCH] Improve XML output for C++ classes, from Olaf Krzikalla! llvm-svn: 97954 --- clang/include/clang/Frontend/DeclXML.def | 19 +++++++++++------ clang/lib/Frontend/DeclXML.cpp | 26 +++++++++++++++++------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/clang/include/clang/Frontend/DeclXML.def b/clang/include/clang/Frontend/DeclXML.def index c750492a270e..e839a8c4c772 100644 --- a/clang/include/clang/Frontend/DeclXML.def +++ b/clang/include/clang/Frontend/DeclXML.def @@ -103,7 +103,7 @@ NODE_XML(FunctionDecl, "Function") //ATTRIBUTE_OPT_XML(isVariadic(), "variadic") // in the type reference ATTRIBUTE_XML(getNumParams(), "num_args") SUB_NODE_SEQUENCE_XML(ParmVarDecl) - //SUB_NODE_OPT_XML("Body") + SUB_NODE_FN_BODY_XML END_NODE_XML NODE_XML(CXXMethodDecl, "CXXMethodDecl") @@ -118,13 +118,9 @@ NODE_XML(CXXMethodDecl, "CXXMethodDecl") ATTRIBUTE_OPT_XML(isVirtual(), "virtual") ATTRIBUTE_XML(getNumParams(), "num_args") SUB_NODE_SEQUENCE_XML(ParmVarDecl) - //SUB_NODE_OPT_XML("Body") + SUB_NODE_FN_BODY_XML END_NODE_XML -//NODE_XML("Body") -// SUB_NODE_XML(Stmt) -//END_NODE_XML - NODE_XML(NamespaceDecl, "Namespace") ID_ATTRIBUTE_XML ATTRIBUTE_FILE_LOCATION_XML @@ -156,6 +152,16 @@ NODE_XML(RecordDecl, "Record") SUB_NODE_SEQUENCE_XML(FieldDecl) END_NODE_XML +NODE_XML(CXXRecordDecl, "CXXRecord") + ID_ATTRIBUTE_XML + ATTRIBUTE_FILE_LOCATION_XML + ATTRIBUTE_XML(getDeclContext(), "context") + ATTRIBUTE_XML(getNameAsString(), "name") + ATTRIBUTE_OPT_XML(isDefinition() == false, "forward") + ATTRIBUTE_XML(getTypeForDecl(), "type") // refers to the type this decl creates + SUB_NODE_SEQUENCE_XML(FieldDecl) +END_NODE_XML + NODE_XML(EnumDecl, "Enum") ID_ATTRIBUTE_XML ATTRIBUTE_FILE_LOCATION_XML @@ -248,3 +254,4 @@ END_NODE_XML #undef SUB_NODE_XML #undef SUB_NODE_SEQUENCE_XML #undef SUB_NODE_OPT_XML +#undef SUB_NODE_FN_BODY_XML diff --git a/clang/lib/Frontend/DeclXML.cpp b/clang/lib/Frontend/DeclXML.cpp index d7470d92a946..8750b1efcab5 100644 --- a/clang/lib/Frontend/DeclXML.cpp +++ b/clang/lib/Frontend/DeclXML.cpp @@ -29,6 +29,14 @@ class DocumentXML::DeclPrinter : public DeclVisitor { } } + void addFunctionBody(FunctionDecl* FD) { + if (FD->isThisDeclarationADefinition()) { + Doc.addSubNode("Body"); + Doc.PrintStmt(FD->getBody()); + Doc.toParent(); + } + } + void addSubNodes(RecordDecl* RD) { for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); i != e; ++i) { @@ -37,6 +45,15 @@ class DocumentXML::DeclPrinter : public DeclVisitor { } } + void addSubNodes(CXXRecordDecl* RD) { + addSubNodes(cast(RD)); + for (CXXRecordDecl::method_iterator i = RD->method_begin(), + e = RD->method_end(); i != e; ++i) { + Visit(*i); + Doc.toParent(); + } + } + void addSubNodes(EnumDecl* ED) { for (EnumDecl::enumerator_iterator i = ED->enumerator_begin(), e = ED->enumerator_end(); i != e; ++i) { @@ -115,6 +132,8 @@ public: #define SUB_NODE_SEQUENCE_XML( CLASS ) addSubNodes(T); #define SUB_NODE_OPT_XML( CLASS ) addSubNodes(T); +#define SUB_NODE_FN_BODY_XML addFunctionBody(T); + #include "clang/Frontend/DeclXML.def" }; @@ -122,13 +141,6 @@ public: //--------------------------------------------------------- void DocumentXML::writeDeclToXML(Decl *D) { DeclPrinter(*this).Visit(D); - if (FunctionDecl *FD = dyn_cast(D)) { - if (Stmt *Body = FD->getBody()) { - addSubNode("Body"); - PrintStmt(Body); - toParent(); - } - } toParent(); }