1254721Semaste//===-- ASTDumper.cpp -------------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#include "lldb/Core/Log.h" 11254721Semaste#include "lldb/Expression/ASTDumper.h" 12254721Semaste#include "lldb/Symbol/ClangASTType.h" 13254721Semaste 14254721Semaste#include "llvm/Support/raw_ostream.h" 15254721Semaste 16254721Semasteusing namespace lldb_private; 17254721Semaste 18254721SemasteASTDumper::ASTDumper (clang::Decl *decl) 19254721Semaste{ 20254721Semaste clang::DeclContext *decl_ctx = llvm::dyn_cast<clang::DeclContext>(decl); 21254721Semaste 22254721Semaste bool has_external_lexical_storage; 23254721Semaste bool has_external_visible_storage; 24254721Semaste 25254721Semaste if (decl_ctx) 26254721Semaste { 27254721Semaste has_external_lexical_storage = decl_ctx->hasExternalLexicalStorage(); 28254721Semaste has_external_visible_storage = decl_ctx->hasExternalVisibleStorage(); 29254721Semaste decl_ctx->setHasExternalLexicalStorage(false); 30254721Semaste decl_ctx->setHasExternalVisibleStorage(false); 31254721Semaste } 32254721Semaste 33254721Semaste llvm::raw_string_ostream os(m_dump); 34254721Semaste decl->print (os); 35254721Semaste os.flush(); 36254721Semaste 37254721Semaste if (decl_ctx) 38254721Semaste { 39254721Semaste decl_ctx->setHasExternalLexicalStorage(has_external_lexical_storage); 40254721Semaste decl_ctx->setHasExternalVisibleStorage(has_external_visible_storage); 41254721Semaste } 42254721Semaste} 43254721Semaste 44254721SemasteASTDumper::ASTDumper (clang::DeclContext *decl_ctx) 45254721Semaste{ 46254721Semaste bool has_external_lexical_storage = decl_ctx->hasExternalLexicalStorage(); 47254721Semaste bool has_external_visible_storage = decl_ctx->hasExternalVisibleStorage(); 48254721Semaste 49254721Semaste decl_ctx->setHasExternalLexicalStorage(false); 50254721Semaste decl_ctx->setHasExternalVisibleStorage(false); 51254721Semaste 52254721Semaste if (clang::Decl *decl = llvm::dyn_cast<clang::Decl>(decl_ctx)) 53254721Semaste { 54254721Semaste llvm::raw_string_ostream os(m_dump); 55254721Semaste decl->print (os); 56254721Semaste os.flush(); 57254721Semaste } 58254721Semaste else 59254721Semaste { 60254721Semaste m_dump.assign("<DeclContext is not a Decl>"); 61254721Semaste } 62254721Semaste 63254721Semaste decl_ctx->setHasExternalLexicalStorage(has_external_lexical_storage); 64254721Semaste decl_ctx->setHasExternalVisibleStorage(has_external_visible_storage); 65254721Semaste} 66254721Semaste 67254721SemasteASTDumper::ASTDumper (const clang::Type *type) 68254721Semaste{ 69254721Semaste m_dump = clang::QualType(type, 0).getAsString(); 70254721Semaste} 71254721Semaste 72254721SemasteASTDumper::ASTDumper (clang::QualType type) 73254721Semaste{ 74254721Semaste m_dump = type.getAsString(); 75254721Semaste} 76254721Semaste 77254721SemasteASTDumper::ASTDumper (lldb::clang_type_t type) 78254721Semaste{ 79254721Semaste m_dump = clang::QualType::getFromOpaquePtr(type).getAsString(); 80254721Semaste} 81254721Semaste 82254721SemasteASTDumper::ASTDumper (const ClangASTType &clang_type) 83254721Semaste{ 84254721Semaste m_dump = clang_type.GetQualType().getAsString(); 85254721Semaste} 86254721Semaste 87254721Semaste 88254721Semasteconst char * 89254721SemasteASTDumper::GetCString() 90254721Semaste{ 91254721Semaste return m_dump.c_str(); 92254721Semaste} 93254721Semaste 94254721Semastevoid ASTDumper::ToSTDERR() 95254721Semaste{ 96254721Semaste fprintf(stderr, "%s\n", m_dump.c_str()); 97254721Semaste} 98254721Semaste 99254721Semastevoid ASTDumper::ToLog(Log *log, const char *prefix) 100254721Semaste{ 101254721Semaste size_t len = m_dump.length() + 1; 102254721Semaste 103254721Semaste char *alloc = (char*)malloc(len); 104254721Semaste char *str = alloc; 105254721Semaste 106254721Semaste memcpy(str, m_dump.c_str(), len); 107254721Semaste 108254721Semaste char *end = NULL; 109254721Semaste 110254721Semaste end = strchr(str, '\n'); 111254721Semaste 112254721Semaste while (end) 113254721Semaste { 114254721Semaste *end = '\0'; 115254721Semaste 116254721Semaste log->Printf("%s%s", prefix, str); 117254721Semaste 118254721Semaste *end = '\n'; 119254721Semaste 120254721Semaste str = end + 1; 121254721Semaste end = strchr(str, '\n'); 122254721Semaste } 123254721Semaste 124254721Semaste log->Printf("%s%s", prefix, str); 125254721Semaste 126254721Semaste free(alloc); 127254721Semaste} 128254721Semaste 129254721Semastevoid ASTDumper::ToStream(lldb::StreamSP &stream) 130254721Semaste{ 131254721Semaste stream->PutCString(m_dump.c_str()); 132254721Semaste} 133