]> granicus.if.org Git - clang/commitdiff
cindex.py: Allow to create a cursor from file/row/column
authorTobias Grosser <grosser@fim.uni-passau.de>
Mon, 31 Oct 2011 00:31:32 +0000 (00:31 +0000)
committerTobias Grosser <grosser@fim.uni-passau.de>
Mon, 31 Oct 2011 00:31:32 +0000 (00:31 +0000)
We add a constructor to create a SourceLocation from a position in
a file and we use this SourceLocation to retrieve a cursor.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@143322 91177308-0d34-0410-b5e6-96231b3b80d8

bindings/python/clang/cindex.py
bindings/python/tests/cindex/test_location.py

index c66e3563c93dd10939113445ce6d07ba3d1b14d8..9ab9ae8a17c9f304569e677e0695f2af6eb79201 100644 (file)
@@ -115,6 +115,14 @@ class SourceLocation(Structure):
             self._data = (f, int(l.value), int(c.value), int(o.value))
         return self._data
 
+    @staticmethod
+    def from_position(tu, file, line, column):
+        """
+        Retrieve the source location associated with a given file/line/column in
+        a particular translation unit.
+        """
+        return SourceLocation_getLocation(tu, file, line, column)
+
     @property
     def file(self):
         """Get the file represented by this source location."""
@@ -817,6 +825,10 @@ class Cursor(Structure):
     """
     _fields_ = [("_kind_id", c_int), ("xdata", c_int), ("data", c_void_p * 3)]
 
+    @staticmethod
+    def from_location(tu, location):
+        return Cursor_get(tu, location)
+
     def __eq__(self, other):
         return Cursor_eq(self, other)
 
@@ -1580,6 +1592,10 @@ SourceLocation_loc.argtypes = [SourceLocation, POINTER(c_object_p),
                                POINTER(c_uint), POINTER(c_uint),
                                POINTER(c_uint)]
 
+SourceLocation_getLocation = lib.clang_getLocation
+SourceLocation_getLocation.argtypes = [TranslationUnit, File, c_uint, c_uint]
+SourceLocation_getLocation.restype = SourceLocation
+
 # Source Range Functions
 SourceRange_getRange = lib.clang_getRange
 SourceRange_getRange.argtypes = [SourceLocation, SourceLocation]
index 47c1c6021f554ccab1309dfd7b7d58cf659d757c..300136f0cdc9f702bf0f72238e7b3ded57242eba 100644 (file)
@@ -1,4 +1,4 @@
-from clang.cindex import Index
+from clang.cindex import Index, File, SourceLocation, Cursor
 
 baseInput="int one;\nint two;\n"
 
@@ -35,6 +35,18 @@ def test_location():
         if n.spelling == 'two':
             assert_location(n.location,line=2,column=5,offset=14)
 
+    # define the expected location ourselves and see if it matches
+    # the returned location
+    tu = index.parse('t.c', unsaved_files = [('t.c',baseInput)])
+
+    file = File.from_name(tu, 't.c')
+    location = SourceLocation.from_position(tu, file, 1, 5)
+    cursor = Cursor.from_location(tu, location)
+
+    for n in tu.cursor.get_children():
+        if n.spelling == 'one':
+            assert n == cursor
+
 def test_extent():
     index = Index.create()
     tu = index.parse('t.c', unsaved_files = [('t.c',baseInput)])