https://github.com/DeinAlptraum created https://github.com/llvm/llvm-project/pull/143264
Add tests to ensure that all C-enum variants are defined on Python side. >From cee0067c7a0b35d2e1f15fd3fa698ec2afd6de88 Mon Sep 17 00:00:00 2001 From: Jannick Kremer <jannick.kre...@mailbox.org> Date: Sat, 7 Jun 2025 21:57:17 +0900 Subject: [PATCH] [libclang/python] Add missing enum variants Add tests to ensure that all C-enum variants are defined on Python side. --- .../python/tests/cindex/test_enums.py | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/clang/bindings/python/tests/cindex/test_enums.py b/clang/bindings/python/tests/cindex/test_enums.py index 9e7f44fcf7867..54c0c77e4df29 100644 --- a/clang/bindings/python/tests/cindex/test_enums.py +++ b/clang/bindings/python/tests/cindex/test_enums.py @@ -1,4 +1,5 @@ import unittest +from pathlib import Path from clang.cindex import ( AccessSpecifier, @@ -12,6 +13,7 @@ TemplateArgumentKind, TLSKind, TokenKind, + TranslationUnit, TypeKind, ) @@ -44,8 +46,53 @@ def test_from_id(self): def test_duplicate_ids(self): """Check that no two kinds have the same id""" - # for enum in self.enums: for enum in self.enums: num_declared_variants = len(enum._member_map_.keys()) num_unique_variants = len(list(enum)) self.assertEqual(num_declared_variants, num_unique_variants) + + def test_all_variants(self): + """Check that all libclang enum values are also defined in cindex""" + cenum_to_pythonenum = { + "CX_CXXAccessSpecifier": AccessSpecifier, + "CXAvailabilityKind": AvailabilityKind, + "CXBinaryOperatorKind": BinaryOperator, + "CXCursorKind": CursorKind, + "CXCursor_ExceptionSpecificationKind": ExceptionSpecificationKind, + "CXLinkageKind": LinkageKind, + "CXRefQualifierKind": RefQualifierKind, + "CX_StorageClass": StorageClass, + "CXTemplateArgumentKind": TemplateArgumentKind, + "CXTLSKind": TLSKind, + "CXTokenKind": TokenKind, + "CXTypeKind": TypeKind, + } + + indexheader = ( + Path(__file__).parent.parent.parent.parent.parent + / "include/clang-c/Index.h" + ) + tu = TranslationUnit.from_source(indexheader, ["-x", "c++"]) + + enum_variant_map = {} + # For all enums in self.enums, extract all enum variants defined in Index.h + for cursor in tu.cursor.walk_preorder(): + type_class = cenum_to_pythonenum.get(cursor.type.spelling) + if ( + cursor.kind == CursorKind.ENUM_CONSTANT_DECL + and type_class in self.enums + ): + if type_class not in enum_variant_map: + enum_variant_map[type_class] = [] + enum_variant_map[type_class].append(cursor.enum_value) + + for enum in self.enums: + with self.subTest(enum): + python_kinds = set([kind.value for kind in enum]) + c_kinds = set(enum_variant_map[enum]) + missing_python_kinds = c_kinds - python_kinds + self.assertEqual( + missing_python_kinds, + set(), + f"Please ensure these variants are defined inside {enum} in cindex.py.", + ) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits