aboutsummaryrefslogtreecommitdiff
path: root/clang/bindings
diff options
context:
space:
mode:
authorAlex Lorenz <arphaman@gmail.com>2017-12-14 22:01:50 +0000
committerAlex Lorenz <arphaman@gmail.com>2017-12-14 22:01:50 +0000
commit34ccadcea9eba33d2e410b2af843a3da602611bf (patch)
tree32e58c7ab7716fe7068b6d35a1ac9b5a0de6deeb /clang/bindings
parent5b0c3ad564ad8fae0b8b99a39469fc074c2592c3 (diff)
[libclang] Add support for checking abstractness of records
This patch allows checking whether a C++ record declaration is abstract through libclang and clang.cindex (Python). Patch by Johann Klähn! Differential Revision: https://reviews.llvm.org/D36952 llvm-svn: 320748
Diffstat (limited to 'clang/bindings')
-rw-r--r--clang/bindings/python/clang/cindex.py20
-rw-r--r--clang/bindings/python/tests/cindex/test_cursor.py22
2 files changed, 42 insertions, 0 deletions
diff --git a/clang/bindings/python/clang/cindex.py b/clang/bindings/python/clang/cindex.py
index d72dd14ef9f3..6cdb10ef081c 100644
--- a/clang/bindings/python/clang/cindex.py
+++ b/clang/bindings/python/clang/cindex.py
@@ -1479,6 +1479,18 @@ class Cursor(Structure):
"""
return conf.lib.clang_CXXMethod_isVirtual(self)
+ def is_abstract_record(self):
+ """Returns True if the cursor refers to a C++ record declaration
+ that has pure virtual member functions.
+ """
+ return conf.lib.clang_CXXRecord_isAbstract(self)
+
+ def is_abstract_record(self):
+ """Returns True if the cursor refers to a C++ record declaration
+ that has pure virtual member functions.
+ """
+ return conf.lib.clang_CXXRecord_isAbstract(self)
+
def is_scoped_enum(self):
"""Returns True if the cursor refers to a scoped enum declaration.
"""
@@ -3401,6 +3413,14 @@ functionList = [
[Cursor],
bool),
+ ("clang_CXXRecord_isAbstract",
+ [Cursor],
+ bool),
+
+ ("clang_CXXRecord_isAbstract",
+ [Cursor],
+ bool),
+
("clang_EnumDecl_isScoped",
[Cursor],
bool),
diff --git a/clang/bindings/python/tests/cindex/test_cursor.py b/clang/bindings/python/tests/cindex/test_cursor.py
index 41ef62757ac3..80f023912ac7 100644
--- a/clang/bindings/python/tests/cindex/test_cursor.py
+++ b/clang/bindings/python/tests/cindex/test_cursor.py
@@ -275,6 +275,28 @@ class TestCursor(unittest.TestCase):
self.assertTrue(foo.is_virtual_method())
self.assertFalse(bar.is_virtual_method())
+ def test_is_abstract_record(self):
+ """Ensure Cursor.is_abstract_record works."""
+ source = 'struct X { virtual void x() = 0; }; struct Y : X { void x(); };'
+ tu = get_tu(source, lang='cpp')
+
+ cls = get_cursor(tu, 'X')
+ self.assertTrue(cls.is_abstract_record())
+
+ cls = get_cursor(tu, 'Y')
+ self.assertFalse(cls.is_abstract_record())
+
+ def test_is_abstract_record(self):
+ """Ensure Cursor.is_abstract_record works."""
+ source = 'struct X { virtual void x() = 0; }; struct Y : X { void x(); };'
+ tu = get_tu(source, lang='cpp')
+
+ cls = get_cursor(tu, 'X')
+ self.assertTrue(cls.is_abstract_record())
+
+ cls = get_cursor(tu, 'Y')
+ self.assertFalse(cls.is_abstract_record())
+
def test_is_scoped_enum(self):
"""Ensure Cursor.is_scoped_enum works."""
source = 'class X {}; enum RegularEnum {}; enum class ScopedEnum {};'