From 2c40835c21cd435f183da3d4754aff6beeaef9f6 Mon Sep 17 00:00:00 2001 From: Gregory Szorc Date: Mon, 14 May 2012 03:56:33 +0000 Subject: [PATCH] [clang.py] Implement Cursor.canonical git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156753 91177308-0d34-0410-b5e6-96231b3b80d8 --- bindings/python/clang/cindex.py | 19 +++++++++++++++++++ bindings/python/tests/cindex/test_cursor.py | 12 ++++++++++++ 2 files changed, 31 insertions(+) diff --git a/bindings/python/clang/cindex.py b/bindings/python/clang/cindex.py index d048fb60c4..54a3bfda4d 100644 --- a/bindings/python/clang/cindex.py +++ b/bindings/python/clang/cindex.py @@ -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 diff --git a/bindings/python/tests/cindex/test_cursor.py b/bindings/python/tests/cindex/test_cursor.py index 206d9c8521..c80cf10ebe 100644 --- a/bindings/python/tests/cindex/test_cursor.py +++ b/bindings/python/tests/cindex/test_cursor.py @@ -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') -- 2.40.0