diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-05-21 20:55:50 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-05-21 20:55:50 +0000 |
commit | ee75c05c1a0218369cac26ab1c847d9a04e4db88 (patch) | |
tree | 97fb3783a873f8fa37d6d3b7b843dcf46cb93225 /include/clang/Frontend/DocumentXML.h | |
parent | 36bb03b86ab6f905b336ee9ec11f288291b22b45 (diff) |
AST XML dump, from Olaf Krzikalla!
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72224 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang/Frontend/DocumentXML.h')
-rw-r--r-- | include/clang/Frontend/DocumentXML.h | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/include/clang/Frontend/DocumentXML.h b/include/clang/Frontend/DocumentXML.h new file mode 100644 index 0000000000..99db717190 --- /dev/null +++ b/include/clang/Frontend/DocumentXML.h @@ -0,0 +1,128 @@ +//===--- DocumentXML.h - XML document for ASTs ------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the XML document class, which provides the means to +// dump out the AST in a XML form that exposes type details and other fields. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_FRONTEND_DOCUMENTXML_H +#define LLVM_CLANG_FRONTEND_DOCUMENTXML_H + +#include <string> +#include <map> +#include "clang/AST/Type.h" +#include "clang/AST/TypeOrdering.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/ADT/DenseMap.h" + +namespace clang { + +//--------------------------------------------------------- forwards +class DeclContext; +class Decl; +class NamedDecl; +class FunctionDecl; +class ASTContext; + +//--------------------------------------------------------- +namespace XML +{ + // id maps: + template<class T> + struct IdMap : llvm::DenseMap<T, unsigned> {}; + + template<> + struct IdMap<QualType> : std::map<QualType, unsigned, QualTypeOrdering> {}; + + template<> + struct IdMap<std::string> : std::map<std::string, unsigned> {}; +} + +//--------------------------------------------------------- +class DocumentXML +{ +public: + DocumentXML(const std::string& rootName, llvm::raw_ostream& out); + ~DocumentXML(); + + void initialize(ASTContext &Context); + void PrintDecl(Decl *D); + void PrintStmt(const Stmt *S); // defined in StmtXML.cpp + + void finalize(); + + + DocumentXML& addSubNode(const std::string& name); // also enters the sub node, returns *this + DocumentXML& toParent(); // returns *this + + template<class T> + void addAttribute(const char* pName, const T& value); + + void addTypeAttribute(const QualType& pType); + void addRefAttribute(const NamedDecl* D); + + enum tContextUsage { CONTEXT_AS_CONTEXT, CONTEXT_AS_ID }; + void addContextAttribute(const DeclContext *DC, tContextUsage usage = CONTEXT_AS_CONTEXT); + void addSourceFileAttribute(const std::string& fileName); + + PresumedLoc addLocation(const SourceLocation& Loc); + void addLocationRange(const SourceRange& R); + + static std::string escapeString(const char* pStr, std::string::size_type len); + +private: + DocumentXML(const DocumentXML&); // not defined + DocumentXML& operator=(const DocumentXML&); // not defined + + struct NodeXML; + + NodeXML* Root; + NodeXML* CurrentNode; // always after Root + llvm::raw_ostream& Out; + ASTContext *Ctx; + int CurrentIndent; + bool HasCurrentNodeSubNodes; + + + XML::IdMap<QualType> Types; + XML::IdMap<const DeclContext*> Contexts; + XML::IdMap<const Type*> BasicTypes; + XML::IdMap<std::string> SourceFiles; + XML::IdMap<const NamedDecl*> Decls; + + void addContextsRecursively(const DeclContext *DC); + void addBasicTypeRecursively(const Type* pType); + void addTypeRecursively(const QualType& pType); + + void PrintFunctionDecl(FunctionDecl *FD); + void addDeclIdAttribute(const NamedDecl* D); + void addTypeIdAttribute(const Type* pType); + void Indent(); +}; + +//--------------------------------------------------------- inlines + +inline void DocumentXML::initialize(ASTContext &Context) +{ + Ctx = &Context; +} + +//--------------------------------------------------------- +template<class T> +inline void DocumentXML::addAttribute(const char* pName, const T& value) +{ + Out << ' ' << pName << "=\"" << value << "\""; +} + +//--------------------------------------------------------- + +} //namespace clang + +#endif //LLVM_CLANG_DOCUMENTXML_H |