blob: 1c819b1ff4c8555e09bdad7638c7e82d3e239bd4 [file] [log] [blame]
Sean Callanan6e74dbb2011-02-01 23:43:26 +00001//===-- ASTDumper.cpp -------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Sean Callanane3737fd2011-10-18 16:46:55 +000010#include "lldb/Core/Log.h"
Sean Callanan6e74dbb2011-02-01 23:43:26 +000011#include "lldb/Expression/ASTDumper.h"
12
Sean Callanane3737fd2011-10-18 16:46:55 +000013#include "llvm/Support/raw_ostream.h"
14
Sean Callanan6e74dbb2011-02-01 23:43:26 +000015using namespace lldb_private;
Sean Callanan6e74dbb2011-02-01 23:43:26 +000016
Sean Callanane3737fd2011-10-18 16:46:55 +000017ASTDumper::ASTDumper (clang::Decl *decl)
Sean Callanan6e74dbb2011-02-01 23:43:26 +000018{
Sean Callanane3737fd2011-10-18 16:46:55 +000019 clang::DeclContext *decl_ctx = llvm::dyn_cast<clang::DeclContext>(decl);
20
21 bool has_external_lexical_storage;
22 bool has_external_visible_storage;
23
24 if (decl_ctx)
25 {
26 has_external_lexical_storage = decl_ctx->hasExternalLexicalStorage();
27 has_external_visible_storage = decl_ctx->hasExternalVisibleStorage();
28 decl_ctx->setHasExternalLexicalStorage(false);
29 decl_ctx->setHasExternalVisibleStorage(false);
30 }
31
32 llvm::raw_string_ostream os(m_dump);
33 decl->print (os);
34 os.flush();
35
36 if (decl_ctx)
37 {
38 decl_ctx->setHasExternalLexicalStorage(has_external_lexical_storage);
39 decl_ctx->setHasExternalVisibleStorage(has_external_visible_storage);
40 }
Sean Callanan6e74dbb2011-02-01 23:43:26 +000041}
42
Sean Callanane3737fd2011-10-18 16:46:55 +000043ASTDumper::ASTDumper (clang::DeclContext *decl_ctx)
Sean Callanan6e74dbb2011-02-01 23:43:26 +000044{
Sean Callanane3737fd2011-10-18 16:46:55 +000045 bool has_external_lexical_storage = decl_ctx->hasExternalLexicalStorage();
46 bool has_external_visible_storage = decl_ctx->hasExternalVisibleStorage();
Sean Callanan6e74dbb2011-02-01 23:43:26 +000047
Sean Callanane3737fd2011-10-18 16:46:55 +000048 decl_ctx->setHasExternalLexicalStorage(false);
49 decl_ctx->setHasExternalVisibleStorage(false);
Sean Callanan6e74dbb2011-02-01 23:43:26 +000050
Sean Callanane3737fd2011-10-18 16:46:55 +000051 if (clang::Decl *decl = llvm::dyn_cast<clang::Decl>(decl_ctx))
Sean Callanan6e74dbb2011-02-01 23:43:26 +000052 {
Sean Callanane3737fd2011-10-18 16:46:55 +000053 llvm::raw_string_ostream os(m_dump);
54 decl->print (os);
55 os.flush();
Sean Callanan6e74dbb2011-02-01 23:43:26 +000056 }
57 else
58 {
Sean Callanane3737fd2011-10-18 16:46:55 +000059 m_dump.assign("<DeclContext is not a Decl>");
Sean Callanan6e74dbb2011-02-01 23:43:26 +000060 }
61
Sean Callanane3737fd2011-10-18 16:46:55 +000062 decl_ctx->setHasExternalLexicalStorage(has_external_lexical_storage);
63 decl_ctx->setHasExternalVisibleStorage(has_external_visible_storage);
Sean Callanan6e74dbb2011-02-01 23:43:26 +000064}
65
Sean Callanane3737fd2011-10-18 16:46:55 +000066ASTDumper::ASTDumper (clang::Type *type)
Sean Callanan6e74dbb2011-02-01 23:43:26 +000067{
Sean Callanane3737fd2011-10-18 16:46:55 +000068 m_dump = clang::QualType(type, 0).getAsString();
Sean Callanan6e74dbb2011-02-01 23:43:26 +000069}
70
Sean Callanane3737fd2011-10-18 16:46:55 +000071ASTDumper::ASTDumper (clang::QualType type)
Sean Callanan6e74dbb2011-02-01 23:43:26 +000072{
Sean Callanane3737fd2011-10-18 16:46:55 +000073 m_dump = type.getAsString();
Sean Callanan6e74dbb2011-02-01 23:43:26 +000074}
75
Sean Callanane3737fd2011-10-18 16:46:55 +000076ASTDumper::ASTDumper (lldb::clang_type_t type)
Sean Callanan6e74dbb2011-02-01 23:43:26 +000077{
Sean Callanane3737fd2011-10-18 16:46:55 +000078 m_dump = clang::QualType::getFromOpaquePtr(type).getAsString();
79}
Sean Callanan6e74dbb2011-02-01 23:43:26 +000080
Greg Claytona23ca422011-10-20 00:47:21 +000081const char *
82ASTDumper::GetCString()
Sean Callanane3737fd2011-10-18 16:46:55 +000083{
Greg Claytona23ca422011-10-20 00:47:21 +000084 return m_dump.c_str();
Sean Callanan6e74dbb2011-02-01 23:43:26 +000085}
86
Sean Callanane3737fd2011-10-18 16:46:55 +000087void ASTDumper::ToSTDERR()
Sean Callanan6e74dbb2011-02-01 23:43:26 +000088{
Sean Callanane3737fd2011-10-18 16:46:55 +000089 fprintf(stderr, "%s\n", m_dump.c_str());
90}
91
92void ASTDumper::ToLog(lldb::LogSP &log, const char *prefix)
93{
94 size_t len = m_dump.length() + 1;
95
96 char *alloc = (char*)malloc(len);
97 char *str = alloc;
98
99 memcpy(str, m_dump.c_str(), len);
100
101 char *end = NULL;
102
103 end = strchr(str, '\n');
104
105 while (end)
Sean Callanan6e74dbb2011-02-01 23:43:26 +0000106 {
Sean Callanane3737fd2011-10-18 16:46:55 +0000107 *end = '\0';
Sean Callanan6e74dbb2011-02-01 23:43:26 +0000108
Sean Callanane3737fd2011-10-18 16:46:55 +0000109 log->Printf("%s%s", prefix, str);
110
111 *end = '\n';
112
113 str = end + 1;
114 end = strchr(str, '\n');
Sean Callanan6e74dbb2011-02-01 23:43:26 +0000115 }
116
Sean Callanane3737fd2011-10-18 16:46:55 +0000117 log->Printf("%s%s", prefix, str);
118
119 free(alloc);
Sean Callanan6e74dbb2011-02-01 23:43:26 +0000120}
121
Sean Callanane3737fd2011-10-18 16:46:55 +0000122void ASTDumper::ToStream(lldb::StreamSP &stream)
Sean Callanan6e74dbb2011-02-01 23:43:26 +0000123{
Sean Callanane3737fd2011-10-18 16:46:55 +0000124 stream->PutCString(m_dump.c_str());
Sean Callanan6e74dbb2011-02-01 23:43:26 +0000125}