1254721Semaste//===-- ExpressionSourceCode.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/Expression/ExpressionSourceCode.h"
11254721Semaste
12254721Semaste#include "lldb/Core/StreamString.h"
13254721Semaste
14254721Semasteusing namespace lldb_private;
15254721Semaste
16254721Semasteconst char *
17254721SemasteExpressionSourceCode::g_expression_prefix = R"(
18254721Semaste#undef NULL
19254721Semaste#undef Nil
20254721Semaste#undef nil
21254721Semaste#undef YES
22254721Semaste#undef NO
23254721Semaste#define NULL (__null)
24254721Semaste#define Nil (__null)
25254721Semaste#define nil (__null)
26254721Semaste#define YES ((BOOL)1)
27254721Semaste#define NO ((BOOL)0)
28254721Semastetypedef signed char BOOL;
29254721Semastetypedef signed __INT8_TYPE__ int8_t;
30254721Semastetypedef unsigned __INT8_TYPE__ uint8_t;
31254721Semastetypedef signed __INT16_TYPE__ int16_t;
32254721Semastetypedef unsigned __INT16_TYPE__ uint16_t;
33254721Semastetypedef signed __INT32_TYPE__ int32_t;
34254721Semastetypedef unsigned __INT32_TYPE__ uint32_t;
35254721Semastetypedef signed __INT64_TYPE__ int64_t;
36254721Semastetypedef unsigned __INT64_TYPE__ uint64_t;
37254721Semastetypedef signed __INTPTR_TYPE__ intptr_t;
38254721Semastetypedef unsigned __INTPTR_TYPE__ uintptr_t;
39254721Semastetypedef __SIZE_TYPE__ size_t;
40254721Semastetypedef __PTRDIFF_TYPE__ ptrdiff_t;
41254721Semastetypedef unsigned short unichar;
42254721Semaste)";
43254721Semaste
44254721Semaste
45254721Semastebool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrapping_language, bool const_object, bool static_method) const
46254721Semaste{
47254721Semaste    if (m_wrap)
48254721Semaste    {
49254721Semaste        switch (wrapping_language)
50254721Semaste        {
51254721Semaste        default:
52254721Semaste            return false;
53254721Semaste        case lldb::eLanguageTypeC:
54254721Semaste        case lldb::eLanguageTypeC_plus_plus:
55254721Semaste        case lldb::eLanguageTypeObjC:
56254721Semaste            break;
57254721Semaste        }
58254721Semaste
59254721Semaste        StreamString wrap_stream;
60254721Semaste
61254721Semaste        switch (wrapping_language)
62254721Semaste        {
63254721Semaste        default:
64254721Semaste            break;
65254721Semaste        case lldb::eLanguageTypeC:
66254721Semaste            wrap_stream.Printf("%s                             \n"
67254721Semaste                               "%s                             \n"
68254721Semaste                               "void                           \n"
69254721Semaste                               "%s(void *$__lldb_arg)          \n"
70254721Semaste                               "{                              \n"
71254721Semaste                               "    %s;                        \n"
72254721Semaste                               "}                              \n",
73254721Semaste                               g_expression_prefix,
74254721Semaste                               m_prefix.c_str(),
75254721Semaste                               m_name.c_str(),
76254721Semaste                               m_body.c_str());
77254721Semaste            break;
78254721Semaste        case lldb::eLanguageTypeC_plus_plus:
79254721Semaste            wrap_stream.Printf("%s                                     \n"
80254721Semaste                               "%s                                     \n"
81254721Semaste                               "void                                   \n"
82254721Semaste                               "$__lldb_class::%s(void *$__lldb_arg) %s\n"
83254721Semaste                               "{                                      \n"
84254721Semaste                               "    %s;                                \n"
85254721Semaste                               "}                                      \n",
86254721Semaste                               g_expression_prefix,
87254721Semaste                               m_prefix.c_str(),
88254721Semaste                               m_name.c_str(),
89254721Semaste                               (const_object ? "const" : ""),
90254721Semaste                               m_body.c_str());
91254721Semaste            break;
92254721Semaste        case lldb::eLanguageTypeObjC:
93254721Semaste            if (static_method)
94254721Semaste            {
95254721Semaste                wrap_stream.Printf("%s                                                      \n"
96254721Semaste                                   "%s                                                      \n"
97254721Semaste                                   "@interface $__lldb_objc_class ($__lldb_category)        \n"
98254721Semaste                                   "+(void)%s:(void *)$__lldb_arg;                          \n"
99254721Semaste                                   "@end                                                    \n"
100254721Semaste                                   "@implementation $__lldb_objc_class ($__lldb_category)   \n"
101254721Semaste                                   "+(void)%s:(void *)$__lldb_arg                           \n"
102254721Semaste                                   "{                                                       \n"
103254721Semaste                                   "    %s;                                                 \n"
104254721Semaste                                   "}                                                       \n"
105254721Semaste                                   "@end                                                    \n",
106254721Semaste                                   g_expression_prefix,
107254721Semaste                                   m_prefix.c_str(),
108254721Semaste                                   m_name.c_str(),
109254721Semaste                                   m_name.c_str(),
110254721Semaste                                   m_body.c_str());
111254721Semaste            }
112254721Semaste            else
113254721Semaste            {
114254721Semaste                wrap_stream.Printf("%s                                                     \n"
115254721Semaste                                   "%s                                                     \n"
116254721Semaste                                   "@interface $__lldb_objc_class ($__lldb_category)       \n"
117254721Semaste                                   "-(void)%s:(void *)$__lldb_arg;                         \n"
118254721Semaste                                   "@end                                                   \n"
119254721Semaste                                   "@implementation $__lldb_objc_class ($__lldb_category)  \n"
120254721Semaste                                   "-(void)%s:(void *)$__lldb_arg                          \n"
121254721Semaste                                   "{                                                      \n"
122254721Semaste                                   "    %s;                                                \n"
123254721Semaste                                   "}                                                      \n"
124254721Semaste                                   "@end                                                   \n",
125254721Semaste                                   g_expression_prefix,
126254721Semaste                                   m_prefix.c_str(),
127254721Semaste                                   m_name.c_str(),
128254721Semaste                                   m_name.c_str(),
129254721Semaste                                   m_body.c_str());
130254721Semaste            }
131254721Semaste            break;
132254721Semaste        }
133254721Semaste
134254721Semaste        text = wrap_stream.GetString();
135254721Semaste    }
136254721Semaste    else
137254721Semaste    {
138254721Semaste        text.append(m_body);
139254721Semaste    }
140254721Semaste
141254721Semaste    return true;
142254721Semaste}
143