<rdar://problem/12462744> Implement a new SBDeclaration class to wrap an lldb_private::Declaration - make a GetDeclaration() API on SBValue to return a declaration. This will only work for vroot variables as they are they only objects for which we currently provide a valid Declaration

git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@165672 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/scripts/Python/build-swig-Python.sh b/scripts/Python/build-swig-Python.sh
index 386dde6..a38d2ff 100755
--- a/scripts/Python/build-swig-Python.sh
+++ b/scripts/Python/build-swig-Python.sh
@@ -117,6 +117,7 @@
 " ${SRC_ROOT}/scripts/Python/interface/SBCompileUnit.i"\
 " ${SRC_ROOT}/scripts/Python/interface/SBData.i"\
 " ${SRC_ROOT}/scripts/Python/interface/SBDebugger.i"\
+" ${SRC_ROOT}/scripts/Python/interface/SBDeclaration.i"\
 " ${SRC_ROOT}/scripts/Python/interface/SBError.i"\
 " ${SRC_ROOT}/scripts/Python/interface/SBEvent.i"\
 " ${SRC_ROOT}/scripts/Python/interface/SBFileSpec.i"\
diff --git a/scripts/Python/interface/SBDeclaration.i b/scripts/Python/interface/SBDeclaration.i
new file mode 100644
index 0000000..a3709ae
--- /dev/null
+++ b/scripts/Python/interface/SBDeclaration.i
@@ -0,0 +1,62 @@
+//===-- SWIG Interface for SBDeclaration --------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+namespace lldb {
+    
+    %feature("docstring",
+    "Specifies an association with a line and column for a variable."
+    ) SBDeclaration;
+    class SBDeclaration
+    {
+        public:
+        
+        SBDeclaration ();
+        
+        SBDeclaration (const lldb::SBDeclaration &rhs);
+        
+        ~SBDeclaration ();
+        
+        bool
+        IsValid () const;
+        
+        lldb::SBFileSpec
+        GetFileSpec () const;
+        
+        uint32_t
+        GetLine () const;
+        
+        uint32_t
+        GetColumn () const;
+        
+        bool
+        GetDescription (lldb::SBStream &description);
+        
+        void
+        SetFileSpec (lldb::SBFileSpec filespec);
+        
+        void
+        SetLine (uint32_t line);
+        
+        void
+        SetColumn (uint32_t column);
+        
+        %pythoncode %{
+            __swig_getmethods__["file"] = GetFileSpec
+            if _newclass: file = property(GetFileSpec, None, doc='''A read only property that returns an lldb object that represents the file (lldb.SBFileSpec) for this line entry.''')
+            
+            __swig_getmethods__["line"] = GetLine
+            if _newclass: ling = property(GetLine, None, doc='''A read only property that returns the 1 based line number for this line entry, a return value of zero indicates that no line information is available.''')
+            
+            __swig_getmethods__["column"] = GetColumn
+            if _newclass: column = property(GetColumn, None, doc='''A read only property that returns the 1 based column number for this line entry, a return value of zero indicates that no column information is available.''')
+            %}
+        
+    };
+    
+} // namespace lldb
diff --git a/scripts/Python/interface/SBValue.i b/scripts/Python/interface/SBValue.i
index c00276b..e316637 100644
--- a/scripts/Python/interface/SBValue.i
+++ b/scripts/Python/interface/SBValue.i
@@ -281,6 +281,9 @@
     lldb::SBValue
     GetValueForExpressionPath(const char* expr_path);
 
+    lldb::SBDeclaration
+    GetDeclaration ();
+    
     uint32_t
     GetNumChildren ();
 
diff --git a/scripts/Python/python-extensions.swig b/scripts/Python/python-extensions.swig
index 19868fb..89ad1b2 100644
--- a/scripts/Python/python-extensions.swig
+++ b/scripts/Python/python-extensions.swig
@@ -111,6 +111,20 @@
                     return PyString_FromString("");
         }
 }
+%extend lldb::SBDeclaration {
+        PyObject *lldb::SBDeclaration::__str__ (){
+                lldb::SBStream description;
+                $self->GetDescription (description);
+                const char *desc = description.GetData();
+                size_t desc_len = description.GetSize();
+                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+                    --desc_len;
+                if (desc_len > 0)
+                    return PyString_FromStringAndSize (desc, desc_len);
+                else
+                    return PyString_FromString("");
+        }
+}
 %extend lldb::SBError {
         PyObject *lldb::SBError::__str__ (){
                 lldb::SBStream description;