Factored out handling of the source code for an
expression into a separate class.  This class
encapsulates wrapping the function as needed.  I
am also moving from using booleans to indicate
what the expression's language should be to using
lldb::LanguageType instead.


git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@140545 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Expression/ExpressionSourceCode.cpp b/source/Expression/ExpressionSourceCode.cpp
new file mode 100644
index 0000000..4b749b5
--- /dev/null
+++ b/source/Expression/ExpressionSourceCode.cpp
@@ -0,0 +1,88 @@
+//===-- ExpressionSourceCode.cpp --------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/Expression/ExpressionSourceCode.h"
+
+#include "lldb/Core/StreamString.h"
+
+using namespace lldb_private;
+
+bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrapping_language, bool const_object) const
+{
+    if (m_wrap)
+    {
+        switch (wrapping_language) 
+        {
+        default:
+            return false;
+        case lldb::eLanguageTypeC:
+        case lldb::eLanguageTypeC_plus_plus:
+        case lldb::eLanguageTypeObjC:
+            break;
+        }
+        
+        StreamString wrap_stream;
+        
+        switch (wrapping_language) 
+        {
+        default:
+            break;
+        case lldb::eLanguageTypeC:
+            wrap_stream.Printf("%s                             \n"
+                               "typedef unsigned short unichar;\n"
+                               "void                           \n"
+                               "%s(void *$__lldb_arg)          \n"
+                               "{                              \n"
+                               "    %s;                        \n" 
+                               "}                              \n",
+                               m_prefix.c_str(),
+                               m_name.c_str(),
+                               m_body.c_str());
+            break;
+        case lldb::eLanguageTypeC_plus_plus:
+            wrap_stream.Printf("%s                                     \n"
+                               "typedef unsigned short unichar;        \n"
+                               "void                                   \n"
+                               "$__lldb_class::%s(void *$__lldb_arg) %s\n"
+                               "{                                      \n"
+                               "    %s;                                \n" 
+                               "}                                      \n",
+                               m_prefix.c_str(),
+                               m_name.c_str(),
+                               (const_object ? "const" : ""),
+                               m_body.c_str());
+            break;
+        case lldb::eLanguageTypeObjC:
+            wrap_stream.Printf("%s                                                      \n"
+                                "typedef unsigned short unichar;                        \n"
+                                "@interface $__lldb_objc_class ($__lldb_category)       \n"
+                                "-(void)%s:(void *)$__lldb_arg;                         \n"
+                                "@end                                                   \n"
+                                "@implementation $__lldb_objc_class ($__lldb_category)  \n"
+                                "-(void)%s:(void *)$__lldb_arg                          \n"
+                                "{                                                      \n"
+                                "    %s;                                                \n"
+                                "}                                                      \n"
+                                "@end                                                   \n",
+                                m_prefix.c_str(),
+                                m_name.c_str(),
+                                m_name.c_str(),
+                                m_body.c_str());
+            break;
+        }
+        
+        text = wrap_stream.GetString();
+    }
+    else
+    {
+        text.append(m_body);
+    }
+    
+    return true;
+}