]> granicus.if.org Git - clang/commitdiff
[clang.py] Implement Cursor.underlying_typedef_type
authorTobias Grosser <grosser@fim.uni-passau.de>
Sun, 5 Feb 2012 11:42:20 +0000 (11:42 +0000)
committerTobias Grosser <grosser@fim.uni-passau.de>
Sun, 5 Feb 2012 11:42:20 +0000 (11:42 +0000)
Contributed by: Gregory Szorc <gregory.szorc@gmail.com>

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

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

index 37ff5ffd4e94227e64ad47ab787235df19436b3d..4c819c26feccda921f84f9a9a6cdd39da8de93a6 100644 (file)
@@ -981,6 +981,19 @@ class Cursor(Structure):
             self._type = Cursor_type(self)
         return self._type
 
+    @property
+    def underlying_typedef_type(self):
+        """Return the underlying type of a typedef declaration.
+
+        Returns a type for the typedef this cursor is a declaration for. If
+        the current cursor is not a typedef, this raises.
+        """
+        if not hasattr(self, '_underlying_type'):
+            assert self.kind.is_declaration()
+            self._underlying_type = Cursor_underlying_type(self)
+
+        return self._underlying_type
+
     @property
     def hash(self):
         """Returns a hash of the cursor as an int."""
@@ -1800,6 +1813,11 @@ Cursor_type.argtypes = [Cursor]
 Cursor_type.restype = Type
 Cursor_type.errcheck = Type.from_result
 
+Cursor_underlying_type = lib.clang_getTypedefDeclUnderlyingType
+Cursor_underlying_type.argtypes = [Cursor]
+Cursor_underlying_type.restype = Type
+Cursor_underlying_type.errcheck = Type.from_result
+
 Cursor_visit_callback = CFUNCTYPE(c_int, Cursor, Cursor, py_object)
 Cursor_visit = lib.clang_visitChildren
 Cursor_visit.argtypes = [Cursor, Cursor_visit_callback, py_object]
index efcede9015405421514f6610adb3310801ac9b75..d86830334dd15bb9e52e77e086c414280fa4a0f3 100644 (file)
@@ -62,3 +62,18 @@ def test_get_children():
     assert tu_nodes[2].spelling == 'f0'
     assert tu_nodes[2].displayname == 'f0(int, int)'
     assert tu_nodes[2].is_definition() == True
+
+def test_underlying_type():
+    source = 'typedef int foo;'
+    index = Index.create()
+    tu = index.parse('test.c', unsaved_files=[('test.c', source)])
+    assert tu is not None
+
+    for cursor in tu.cursor.get_children():
+        if cursor.spelling == 'foo':
+            typedef = cursor
+            break
+
+    assert typedef.kind.is_declaration()
+    underlying = typedef.underlying_typedef_type
+    assert underlying.kind == TypeKind.INT