зеркало из https://github.com/microsoft/clang-1.git
[clang.py] Implement __eq__ and __ne__ on SourceLocation and SourceRange
There is no type checking in __eq__, so ctypes will throw if the wrong Python type is passed in to the C function. Personally, I feel garbage in means garbage out and it isn't worth testing for this explicitly. Contributed by: Gregory Szorc <gregory.szorc@gmail.com> git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149824 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
b919815a0c
Коммит
74858335a1
|
@ -146,6 +146,12 @@ class SourceLocation(Structure):
|
||||||
"""Get the file offset represented by this source location."""
|
"""Get the file offset represented by this source location."""
|
||||||
return self._get_instantiation()[3]
|
return self._get_instantiation()[3]
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return SourceLocation_equalLocations(self, other)
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not self.__eq__(other)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
if self.file:
|
if self.file:
|
||||||
filename = self.file.name
|
filename = self.file.name
|
||||||
|
@ -186,6 +192,12 @@ class SourceRange(Structure):
|
||||||
"""
|
"""
|
||||||
return SourceRange_end(self)
|
return SourceRange_end(self)
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return SourceRange_equalRanges(self, other)
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not self.__eq__(other)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<SourceRange start %r, end %r>" % (self.start, self.end)
|
return "<SourceRange start %r, end %r>" % (self.start, self.end)
|
||||||
|
|
||||||
|
@ -1613,6 +1625,10 @@ SourceLocation_getLocation = lib.clang_getLocation
|
||||||
SourceLocation_getLocation.argtypes = [TranslationUnit, File, c_uint, c_uint]
|
SourceLocation_getLocation.argtypes = [TranslationUnit, File, c_uint, c_uint]
|
||||||
SourceLocation_getLocation.restype = SourceLocation
|
SourceLocation_getLocation.restype = SourceLocation
|
||||||
|
|
||||||
|
SourceLocation_equalLocations = lib.clang_equalLocations
|
||||||
|
SourceLocation_equalLocations.argtypes = [SourceLocation, SourceLocation]
|
||||||
|
SourceLocation_equalLocations.restype = bool
|
||||||
|
|
||||||
# Source Range Functions
|
# Source Range Functions
|
||||||
SourceRange_getRange = lib.clang_getRange
|
SourceRange_getRange = lib.clang_getRange
|
||||||
SourceRange_getRange.argtypes = [SourceLocation, SourceLocation]
|
SourceRange_getRange.argtypes = [SourceLocation, SourceLocation]
|
||||||
|
@ -1626,6 +1642,10 @@ SourceRange_end = lib.clang_getRangeEnd
|
||||||
SourceRange_end.argtypes = [SourceRange]
|
SourceRange_end.argtypes = [SourceRange]
|
||||||
SourceRange_end.restype = SourceLocation
|
SourceRange_end.restype = SourceLocation
|
||||||
|
|
||||||
|
SourceRange_equalRanges = lib.clang_equalRanges
|
||||||
|
SourceRange_equalRanges.argtypes = [SourceRange, SourceRange]
|
||||||
|
SourceRange_equalRanges.restype = bool
|
||||||
|
|
||||||
# CursorKind Functions
|
# CursorKind Functions
|
||||||
CursorKind_is_decl = lib.clang_isDeclaration
|
CursorKind_is_decl = lib.clang_isDeclaration
|
||||||
CursorKind_is_decl.argtypes = [CursorKind]
|
CursorKind_is_decl.argtypes = [CursorKind]
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from clang.cindex import Index, File, SourceLocation, Cursor
|
from clang.cindex import Index, File, SourceLocation, SourceRange, Cursor
|
||||||
|
|
||||||
baseInput="int one;\nint two;\n"
|
baseInput="int one;\nint two;\n"
|
||||||
|
|
||||||
|
@ -47,6 +47,12 @@ def test_location():
|
||||||
if n.spelling == 'one':
|
if n.spelling == 'one':
|
||||||
assert n == cursor
|
assert n == cursor
|
||||||
|
|
||||||
|
# Ensure locations referring to the same entity are equivalent.
|
||||||
|
location2 = SourceLocation.from_position(tu, file, 1, 5)
|
||||||
|
assert location == location2
|
||||||
|
location3 = SourceLocation.from_position(tu, file, 1, 4)
|
||||||
|
assert location2 != location3
|
||||||
|
|
||||||
def test_extent():
|
def test_extent():
|
||||||
index = Index.create()
|
index = Index.create()
|
||||||
tu = index.parse('t.c', unsaved_files = [('t.c',baseInput)])
|
tu = index.parse('t.c', unsaved_files = [('t.c',baseInput)])
|
||||||
|
@ -60,3 +66,15 @@ def test_extent():
|
||||||
assert_location(n.extent.start,line=2,column=1,offset=9)
|
assert_location(n.extent.start,line=2,column=1,offset=9)
|
||||||
assert_location(n.extent.end,line=2,column=8,offset=16)
|
assert_location(n.extent.end,line=2,column=8,offset=16)
|
||||||
assert baseInput[n.extent.start.offset:n.extent.end.offset] == "int two"
|
assert baseInput[n.extent.start.offset:n.extent.end.offset] == "int two"
|
||||||
|
|
||||||
|
file = File.from_name(tu, 't.c')
|
||||||
|
location1 = SourceLocation.from_position(tu, file, 1, 1)
|
||||||
|
location2 = SourceLocation.from_position(tu, file, 1, 8)
|
||||||
|
|
||||||
|
range1 = SourceRange.from_locations(location1, location2)
|
||||||
|
range2 = SourceRange.from_locations(location1, location2)
|
||||||
|
assert range1 == range2
|
||||||
|
|
||||||
|
location3 = SourceLocation.from_position(tu, file, 1, 6)
|
||||||
|
range3 = SourceRange.from_locations(location1, location3)
|
||||||
|
assert range1 != range3
|
||||||
|
|
Загрузка…
Ссылка в новой задаче