blob: eafd69f7aeb118199a5972db78f72406d0126fc2 [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
Sean Callanane3737fd2011-10-18 16:46:55 +000081std::string ASTDumper::AsString()
82{
83 return m_dump;
Sean Callanan6e74dbb2011-02-01 23:43:26 +000084}
85
Sean Callanane3737fd2011-10-18 16:46:55 +000086void ASTDumper::ToSTDERR()
Sean Callanan6e74dbb2011-02-01 23:43:26 +000087{
Sean Callanane3737fd2011-10-18 16:46:55 +000088 fprintf(stderr, "%s\n", m_dump.c_str());
89}
90
91void ASTDumper::ToLog(lldb::LogSP &log, const char *prefix)
92{
93 size_t len = m_dump.length() + 1;
94
95 char *alloc = (char*)malloc(len);
96 char *str = alloc;
97
98 memcpy(str, m_dump.c_str(), len);
99
100 char *end = NULL;
101
102 end = strchr(str, '\n');
103
104 while (end)
Sean Callanan6e74dbb2011-02-01 23:43:26 +0000105 {
Sean Callanane3737fd2011-10-18 16:46:55 +0000106 *end = '\0';
Sean Callanan6e74dbb2011-02-01 23:43:26 +0000107
Sean Callanane3737fd2011-10-18 16:46:55 +0000108 log->Printf("%s%s", prefix, str);
109
110 *end = '\n';
111
112 str = end + 1;
113 end = strchr(str, '\n');
Sean Callanan6e74dbb2011-02-01 23:43:26 +0000114 }
115
Sean Callanane3737fd2011-10-18 16:46:55 +0000116 log->Printf("%s%s", prefix, str);
117
118 free(alloc);
Sean Callanan6e74dbb2011-02-01 23:43:26 +0000119}
120
Sean Callanane3737fd2011-10-18 16:46:55 +0000121void ASTDumper::ToStream(lldb::StreamSP &stream)
Sean Callanan6e74dbb2011-02-01 23:43:26 +0000122{
Sean Callanane3737fd2011-10-18 16:46:55 +0000123 stream->PutCString(m_dump.c_str());
Sean Callanan6e74dbb2011-02-01 23:43:26 +0000124}