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