mirror of
https://github.com/intel/llvm.git
synced 2026-01-25 10:55:58 +08:00
cindex.py: Allow to create a cursor from file/row/column
We add a constructor to create a SourceLocation from a position in a file and we use this SourceLocation to retrieve a cursor. llvm-svn: 143322
This commit is contained in:
@@ -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]
|
||||
|
||||
@@ -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)])
|
||||
|
||||
Reference in New Issue
Block a user