]> granicus.if.org Git - clang/commitdiff
Improve XML output for C++ classes, from Olaf Krzikalla!
authorDouglas Gregor <dgregor@apple.com>
Mon, 8 Mar 2010 18:51:03 +0000 (18:51 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 8 Mar 2010 18:51:03 +0000 (18:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97954 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Frontend/DeclXML.def
lib/Frontend/DeclXML.cpp

index c750492a270e1e8e16c86c333e5b0202c4e17494..e839a8c4c77284c0c44534bb0c192965e1b9a236 100644 (file)
@@ -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
index d7470d92a9463294315e5a80b817b6bdcfc6b9b7..8750b1efcab53aa1ab5e0ceee2e6b524da97065a 100644 (file)
@@ -29,6 +29,14 @@ class DocumentXML::DeclPrinter : public DeclVisitor<DocumentXML::DeclPrinter> {
     }
   }
 
+  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<DocumentXML::DeclPrinter> {
     }
   }
 
+  void addSubNodes(CXXRecordDecl* RD) {
+    addSubNodes(cast<RecordDecl>(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<FunctionDecl>(D)) {
-    if (Stmt *Body = FD->getBody()) {
-      addSubNode("Body");
-      PrintStmt(Body);
-      toParent();
-    }
-  }
   toParent();
 }