]> granicus.if.org Git - clang/commitdiff
[clang.py] Implement Cursor.canonical
authorGregory Szorc <gregory.szorc@gmail.com>
Mon, 14 May 2012 03:56:33 +0000 (03:56 +0000)
committerGregory Szorc <gregory.szorc@gmail.com>
Mon, 14 May 2012 03:56:33 +0000 (03:56 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156753 91177308-0d34-0410-b5e6-96231b3b80d8

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

index d048fb60c4ed8c0f92376bb6542d10e8d1a14f8a..54a3bfda4d2cc0250e33713c513a72a5f36f848c 100644 (file)
@@ -1023,6 +1023,20 @@ class Cursor(Structure):
             self._type = Cursor_type(self)
         return self._type
 
+    @property
+    def canonical(self):
+        """Return the canonical Cursor corresponding to this Cursor.
+
+        The canonical cursor is the cursor which is representative for the
+        underlying entity. For example, if you have multiple forward
+        declarations for the same class, the canonical cursor for the forward
+        declarations will be identical.
+        """
+        if not hasattr(self, '_canonical'):
+            self._canonical = Cursor_canonical(self)
+
+        return self._canonical
+
     @property
     def result_type(self):
         """Retrieve the Type of the result for this Cursor."""
@@ -2150,6 +2164,11 @@ Cursor_ref.argtypes = [Cursor]
 Cursor_ref.restype = Cursor
 Cursor_ref.errcheck = Cursor.from_result
 
+Cursor_canonical = lib.clang_getCanonicalCursor
+Cursor_canonical.argtypes = [Cursor]
+Cursor_canonical.restype = Cursor
+Cursor_canonical.errcheck = Cursor.from_result
+
 Cursor_type = lib.clang_getCursorType
 Cursor_type.argtypes = [Cursor]
 Cursor_type.restype = Type
index 206d9c8521007485319d6107b01c6b8c081e9790..c80cf10ebecfa4e6cf6c55ad21070b135f4ea829 100644 (file)
@@ -67,6 +67,18 @@ def test_get_children():
     assert tu_nodes[2].displayname == 'f0(int, int)'
     assert tu_nodes[2].is_definition() == True
 
+def test_canonical():
+    source = 'struct X; struct X; struct X { int member; };'
+    tu = get_tu(source)
+
+    cursors = []
+    for cursor in tu.cursor.get_children():
+        if cursor.spelling == 'X':
+            cursors.append(cursor)
+
+    assert len(cursors) == 3
+    assert cursors[1].canonical == cursors[2].canonical
+
 def test_underlying_type():
     tu = get_tu('typedef int foo;')
     typedef = get_cursor(tu, 'foo')