Skip to content

Commit

Permalink
bindings: add new C++ function attribute accessors
Browse files Browse the repository at this point in the history
Add methods to index Cursor to see if a cxx method is pure_virtual,
virtual or const methods.

Patch by Jonathan B Coe!

llvm-svn: 250008
  • Loading branch information
compnerd committed Oct 12, 2015
1 parent 7c6a3b4 commit d79eec9
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 0 deletions.
22 changes: 22 additions & 0 deletions clang/bindings/python/clang/cindex.py
Original file line number Diff line number Diff line change
Expand Up @@ -1164,12 +1164,30 @@ def is_definition(self):
"""
return conf.lib.clang_isCursorDefinition(self)

def is_const_method(self):
"""Returns True if the cursor refers to a C++ member function or member
function template that is declared 'const'.
"""
return conf.lib.clang_CXXMethod_isConst(self)

def is_pure_virtual_method(self):
"""Returns True if the cursor refers to a C++ member function or member
function template that is declared pure virtual.
"""
return conf.lib.clang_CXXMethod_isPureVirtual(self)

def is_static_method(self):
"""Returns True if the cursor refers to a C++ member function or member
function template that is declared 'static'.
"""
return conf.lib.clang_CXXMethod_isStatic(self)

def is_virtual_method(self):
"""Returns True if the cursor refers to a C++ member function or member
function template that is declared 'virtual'.
"""
return conf.lib.clang_CXXMethod_isVirtual(self)

def get_definition(self):
"""
If the cursor is a reference to a declaration or a declaration of
Expand Down Expand Up @@ -2879,6 +2897,10 @@ def cursor(self):
[Index, c_char_p],
c_object_p),

("clang_CXXMethod_isConst",
[Cursor],
bool),

("clang_CXXMethod_isPureVirtual",
[Cursor],
bool),
Expand Down
45 changes: 45 additions & 0 deletions clang/bindings/python/tests/cindex/test_cursor.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,21 @@ def test_canonical():
assert len(cursors) == 3
assert cursors[1].canonical == cursors[2].canonical

def test_is_const_method():
"""Ensure Cursor.is_const_method works."""
source = 'class X { void foo() const; void bar(); };'
tu = get_tu(source, lang='cpp')

cls = get_cursor(tu, 'X')
foo = get_cursor(tu, 'foo')
bar = get_cursor(tu, 'bar')
assert cls is not None
assert foo is not None
assert bar is not None

assert foo.is_const_method()
assert not bar.is_const_method()

def test_is_static_method():
"""Ensure Cursor.is_static_method works."""

Expand All @@ -113,6 +128,36 @@ def test_is_static_method():
assert foo.is_static_method()
assert not bar.is_static_method()

def test_is_pure_virtual_method():
"""Ensure Cursor.is_pure_virtual_method works."""
source = 'class X { virtual void foo() = 0; virtual void bar(); };'
tu = get_tu(source, lang='cpp')

cls = get_cursor(tu, 'X')
foo = get_cursor(tu, 'foo')
bar = get_cursor(tu, 'bar')
assert cls is not None
assert foo is not None
assert bar is not None

assert foo.is_pure_virtual_method()
assert not bar.is_pure_virtual_method()

def test_is_virtual_method():
"""Ensure Cursor.is_virtual_method works."""
source = 'class X { virtual void foo(); void bar(); };'
tu = get_tu(source, lang='cpp')

cls = get_cursor(tu, 'X')
foo = get_cursor(tu, 'foo')
bar = get_cursor(tu, 'bar')
assert cls is not None
assert foo is not None
assert bar is not None

assert foo.is_virtual_method()
assert not bar.is_virtual_method()

def test_underlying_type():
tu = get_tu('typedef int foo;')
typedef = get_cursor(tu, 'foo')
Expand Down

0 comments on commit d79eec9

Please sign in to comment.