]> granicus.if.org Git - clang/commitdiff
Improved -ast-print-xml for C++, from Sebastien Binet!
authorDouglas Gregor <dgregor@apple.com>
Mon, 10 May 2010 17:43:18 +0000 (17:43 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 10 May 2010 17:43:18 +0000 (17:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103412 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Frontend/DeclXML.def
include/clang/Frontend/DocumentXML.h
include/clang/Frontend/TypeXML.def
lib/Frontend/DeclXML.cpp
lib/Frontend/DocumentXML.cpp

index e839a8c4c77284c0c44534bb0c192965e1b9a236..16551ee03e1fe7fb3b90331b1642fb9bfa9dc45a 100644 (file)
@@ -84,6 +84,7 @@
 
 NODE_XML(Decl, "FIXME_Decl")
   ATTRIBUTE_FILE_LOCATION_XML
+  ATTRIBUTE_XML(getDeclKindName(), "unhandled_decl_name")
 END_NODE_XML
 
 NODE_XML(FunctionDecl, "Function")
@@ -106,7 +107,7 @@ NODE_XML(FunctionDecl, "Function")
   SUB_NODE_FN_BODY_XML
 END_NODE_XML
 
-NODE_XML(CXXMethodDecl, "CXXMethodDecl")
+NODE_XML(CXXMethodDecl, "CXXMethod")
   ID_ATTRIBUTE_XML
   ATTRIBUTE_FILE_LOCATION_XML
   ATTRIBUTE_XML(getDeclContext(), "context")
@@ -116,6 +117,79 @@ NODE_XML(CXXMethodDecl, "CXXMethodDecl")
   ATTRIBUTE_OPT_XML(isInlineSpecified(), "inline")
   ATTRIBUTE_OPT_XML(isStatic(), "static")
   ATTRIBUTE_OPT_XML(isVirtual(), "virtual")
+  ATTRIBUTE_ENUM_OPT_XML(getAccess(), "access")
+         ENUM_XML(AS_none,      "")
+         ENUM_XML(AS_public,    "public")
+         ENUM_XML(AS_protected, "protected")
+         ENUM_XML(AS_private,   "private")
+  END_ENUM_XML
+  ATTRIBUTE_XML(getNumParams(), "num_args")
+  SUB_NODE_SEQUENCE_XML(ParmVarDecl)
+  SUB_NODE_FN_BODY_XML
+END_NODE_XML
+
+NODE_XML(CXXConstructorDecl, "CXXConstructor")
+  ID_ATTRIBUTE_XML
+  ATTRIBUTE_FILE_LOCATION_XML
+  ATTRIBUTE_XML(getDeclContext(), "context")
+  ATTRIBUTE_XML(getNameAsString(), "name")
+  TYPE_ATTRIBUTE_XML(getType()->getAs<FunctionType>()->getResultType())
+  ATTRIBUTE_XML(getType()->getAs<FunctionType>(), "function_type")
+  ATTRIBUTE_OPT_XML(isExplicit(), "is_explicit")
+  ATTRIBUTE_OPT_XML(isDefaultConstructor(), "is_default_ctor")
+  ATTRIBUTE_OPT_XML(isCopyConstructor(), "is_copy_ctor")
+  ATTRIBUTE_OPT_XML(isInlineSpecified(), "inline")
+  ATTRIBUTE_OPT_XML(isStatic(), "static")
+  ATTRIBUTE_OPT_XML(isVirtual(), "virtual")
+  ATTRIBUTE_ENUM_OPT_XML(getAccess(), "access")
+         ENUM_XML(AS_none,      "")
+         ENUM_XML(AS_public,    "public")
+         ENUM_XML(AS_protected, "protected")
+         ENUM_XML(AS_private,   "private")
+  END_ENUM_XML
+  ATTRIBUTE_XML(getNumParams(), "num_args")
+  SUB_NODE_SEQUENCE_XML(ParmVarDecl)
+  SUB_NODE_FN_BODY_XML
+END_NODE_XML
+
+NODE_XML(CXXDestructorDecl, "CXXDestructor")
+  ID_ATTRIBUTE_XML
+  ATTRIBUTE_FILE_LOCATION_XML
+  ATTRIBUTE_XML(getDeclContext(), "context")
+  ATTRIBUTE_XML(getNameAsString(), "name")
+  TYPE_ATTRIBUTE_XML(getType()->getAs<FunctionType>()->getResultType())
+  ATTRIBUTE_XML(getType()->getAs<FunctionType>(), "function_type")
+  ATTRIBUTE_OPT_XML(isInlineSpecified(), "inline")
+  ATTRIBUTE_OPT_XML(isStatic(), "static")
+  ATTRIBUTE_OPT_XML(isVirtual(), "virtual")
+  ATTRIBUTE_ENUM_OPT_XML(getAccess(), "access")
+         ENUM_XML(AS_none,      "")
+         ENUM_XML(AS_public,    "public")
+         ENUM_XML(AS_protected, "protected")
+         ENUM_XML(AS_private,   "private")
+  END_ENUM_XML
+  ATTRIBUTE_XML(getNumParams(), "num_args")
+  SUB_NODE_SEQUENCE_XML(ParmVarDecl)
+  SUB_NODE_FN_BODY_XML
+END_NODE_XML
+
+NODE_XML(CXXConversionDecl, "CXXConversion")
+  ID_ATTRIBUTE_XML
+  ATTRIBUTE_FILE_LOCATION_XML
+  ATTRIBUTE_XML(getDeclContext(), "context")
+  ATTRIBUTE_XML(getNameAsString(), "name")
+  TYPE_ATTRIBUTE_XML(getType()->getAs<FunctionType>()->getResultType())
+  ATTRIBUTE_XML(getType()->getAs<FunctionType>(), "function_type")
+  ATTRIBUTE_OPT_XML(isExplicit(), "is_explicit")
+  ATTRIBUTE_OPT_XML(isInlineSpecified(), "inline")
+  ATTRIBUTE_OPT_XML(isStatic(), "static")
+  ATTRIBUTE_OPT_XML(isVirtual(), "virtual")
+  ATTRIBUTE_ENUM_OPT_XML(getAccess(), "access")
+         ENUM_XML(AS_none,      "")
+         ENUM_XML(AS_public,    "public")
+         ENUM_XML(AS_protected, "protected")
+         ENUM_XML(AS_private,   "private")
+  END_ENUM_XML
   ATTRIBUTE_XML(getNumParams(), "num_args")
   SUB_NODE_SEQUENCE_XML(ParmVarDecl)
   SUB_NODE_FN_BODY_XML
@@ -126,6 +200,7 @@ NODE_XML(NamespaceDecl, "Namespace")
   ATTRIBUTE_FILE_LOCATION_XML
   ATTRIBUTE_XML(getDeclContext(), "context")
   ATTRIBUTE_XML(getNameAsString(), "name")
+  SUB_NODE_SEQUENCE_XML(DeclContext)
 END_NODE_XML
 
 NODE_XML(UsingDirectiveDecl, "UsingDirective")
@@ -189,6 +264,12 @@ NODE_XML(FieldDecl, "Field")
   ATTRIBUTE_XML(getNameAsString(), "name")
   TYPE_ATTRIBUTE_XML(getType())
   ATTRIBUTE_OPT_XML(isMutable(), "mutable")
+  ATTRIBUTE_ENUM_OPT_XML(getAccess(), "access")
+         ENUM_XML(AS_none,      "")
+         ENUM_XML(AS_public,    "public")
+         ENUM_XML(AS_protected, "protected")
+         ENUM_XML(AS_private,   "private")
+  END_ENUM_XML
   ATTRIBUTE_OPT_XML(isBitField(), "bitfield")
   SUB_NODE_OPT_XML(Expr)                                      // init expr of a bit field
 END_NODE_XML
@@ -237,6 +318,35 @@ NODE_XML(LinkageSpecDecl, "LinkageSpec")
   END_ENUM_XML
 END_NODE_XML
 
+NODE_XML(TemplateDecl, "Template")
+  ID_ATTRIBUTE_XML
+  ATTRIBUTE_FILE_LOCATION_XML
+  ATTRIBUTE_XML(getDeclContext(), "context")
+  ATTRIBUTE_XML(getNameAsString(), "name")
+END_NODE_XML
+
+NODE_XML(TemplateTypeParmDecl, "TemplateTypeParm")
+  ID_ATTRIBUTE_XML
+  ATTRIBUTE_FILE_LOCATION_XML
+  ATTRIBUTE_XML(getDeclContext(), "context")
+  ATTRIBUTE_XML(getNameAsString(), "name")
+END_NODE_XML
+
+NODE_XML(UsingShadowDecl, "UsingShadow")
+  ID_ATTRIBUTE_XML
+  ATTRIBUTE_FILE_LOCATION_XML
+  ATTRIBUTE_XML(getDeclContext(), "context")
+  ATTRIBUTE_XML(getTargetDecl(), "target_decl")
+  ATTRIBUTE_XML(getUsingDecl(), "using_decl")
+END_NODE_XML
+
+NODE_XML(UsingDecl, "Using")
+  ID_ATTRIBUTE_XML
+  ATTRIBUTE_FILE_LOCATION_XML
+  ATTRIBUTE_XML(getDeclContext(), "context")
+  ATTRIBUTE_XML(getTargetNestedNameDecl(), "target_nested_namespace_decl")
+  ATTRIBUTE_XML(isTypeName(), "is_typename")
+END_NODE_XML
 
 //===----------------------------------------------------------------------===//
 #undef NODE_XML
index 6693ddbac57d5ed5a1902463d5d2198e588b25c4..5227c12c2ca885a0db507ca277af974ed70fc772 100644 (file)
@@ -114,6 +114,7 @@ private:
   void addPtrAttribute(const char* pName, const NamedDecl* D);
   void addPtrAttribute(const char* pName, const DeclContext* D);
   void addPtrAttribute(const char* pName, const NamespaceDecl* D);    // disambiguation
+  void addPtrAttribute(const char* pName, const NestedNameSpecifier* N);
   void addPtrAttribute(const char* pName, const LabelStmt* L);
   void addPtrAttribute(const char* pName, const char* text);
 
index 3845f32bf2dbaf5317f645acf0e72c007ce53895..802cc4297b9c1a555f9a10125e411498a1fca766 100644 (file)
 #  define CONTEXT_ATTRIBUTE_XML( FN )  ATTRIBUTE_XML(FN, "context")
 #endif
 
+NODE_XML(Type, "FIXME_Type")
+  ID_ATTRIBUTE_XML
+  ATTRIBUTE_XML(getTypeClassName(), "unhandled_type_name")
+END_NODE_XML
 
 NODE_XML(QualType, "CvQualifiedType")
   ID_ATTRIBUTE_XML
@@ -242,6 +246,10 @@ NODE_XML(QualifiedNameType, "QualifiedNameType")
   TYPE_ATTRIBUTE_XML(getNamedType())
 END_NODE_XML
 
+NODE_XML(InjectedClassNameType, "InjectedClassNameType")
+  ID_ATTRIBUTE_XML
+END_NODE_XML
+
 NODE_XML(DependentNameType, "DependentNameType")
   ID_ATTRIBUTE_XML
 END_NODE_XML
index 8750b1efcab53aa1ab5e0ceee2e6b524da97065a..3ae25f9b7da024fe4fbff048ca059bd0f1226e67 100644 (file)
@@ -47,11 +47,38 @@ 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();
+
+    if (RD->isDefinition()) {
+      Doc.addAttribute("num_bases", RD->getNumBases());
+
+      for (CXXRecordDecl::base_class_iterator 
+             base = RD->bases_begin(),
+             bend = RD->bases_end();
+           base != bend;
+           ++base) {
+        Doc.addSubNode("Base");
+        Doc.addAttribute("id", base->getType());
+        AccessSpecifier as = base->getAccessSpecifierAsWritten();
+        const char* as_name = "";
+        switch(as) {
+        case AS_none:      as_name = ""; break;
+        case AS_public:    as_name = "public"; break;
+        case AS_protected: as_name = "protected"; break;
+        case AS_private:   as_name = "private"; break;
+        }
+        Doc.addAttributeOptional("access", as_name);
+        Doc.addAttribute("is_virtual", base->isVirtual());
+        Doc.toParent();
+      }
+
+      for (CXXRecordDecl::method_iterator i = RD->method_begin(),
+             e = RD->method_end(); i != e; ++i) {
+        Visit(*i);
+        Doc.toParent();
+      }
+
     }
+
   }
 
   void addSubNodes(EnumDecl* ED) {
@@ -82,6 +109,18 @@ class DocumentXML::DeclPrinter : public DeclVisitor<DocumentXML::DeclPrinter> {
       Doc.PrintStmt(argDecl->getDefaultArg());
   }
 
+  void addSubNodes(NamespaceDecl* ns) {
+
+    for (DeclContext::decl_iterator 
+           d    = ns->decls_begin(), 
+           dend = ns->decls_end();
+         d != dend;
+         ++d) {
+      Visit(*d);
+      Doc.toParent();
+    }
+  }
+
   void addSpecialAttribute(const char* pName, EnumDecl* ED) {
     const QualType& enumType = ED->getIntegerType();
     if (!enumType.isNull())
index 0263c30bfd57a1bd86c56e88e9f96449edd7bd35..894f230216f6bd0f4a982b9e8cb8aeab7920e338 100644 (file)
@@ -198,6 +198,35 @@ void DocumentXML::addPtrAttribute(const char* pAttributeName,
   addAttribute(pAttributeName, getPrefixedId(BasicTypes[pType], ID_NORMAL));
 }
 
+//---------------------------------------------------------
+void DocumentXML::addPtrAttribute(const char* pAttributeName,
+                                  const NestedNameSpecifier* pNNS) {
+  switch (pNNS->getKind()) {
+  case NestedNameSpecifier::Identifier: {
+    IdentifierInfo *ii = pNNS->getAsIdentifier();
+    // FIXME how should we handle those ?
+    addPtrAttribute(pAttributeName, ii->getName().data());
+    break;
+  }
+  case NestedNameSpecifier::Namespace: {
+    addPtrAttribute(pAttributeName, pNNS->getAsNamespace());
+    break;
+  }
+  case NestedNameSpecifier::TypeSpec: {
+    addPtrAttribute(pAttributeName, pNNS->getAsType());
+    break;
+  }
+  case NestedNameSpecifier::TypeSpecWithTemplate: {
+    addPtrAttribute(pAttributeName, pNNS->getAsType());
+    break;
+  }
+  case NestedNameSpecifier::Global: {
+    addPtrAttribute(pAttributeName, "::");
+    break;
+  }
+  }
+}
+
 //---------------------------------------------------------
 void DocumentXML::addTypeRecursively(const QualType& pType)
 {