From 2ede2bff6c22ffdf7297a37da1423f586691a48e Mon Sep 17 00:00:00 2001 From: Jimmy Z Date: Sun, 10 Aug 2025 07:20:28 +0000 Subject: [PATCH 1/2] [libclang/python] Expose clang_getCursorLanguage --- clang/bindings/python/clang/cindex.py | 21 +++++++++++++++ .../tests/cindex/test_cursor_language.py | 27 +++++++++++++++++++ clang/docs/ReleaseNotes.rst | 1 + 3 files changed, 49 insertions(+) create mode 100644 clang/bindings/python/tests/cindex/test_cursor_language.py diff --git a/clang/bindings/python/clang/cindex.py b/clang/bindings/python/clang/cindex.py index 824674309d262..812ad2cd2dc13 100644 --- a/clang/bindings/python/clang/cindex.py +++ b/clang/bindings/python/clang/cindex.py @@ -1907,6 +1907,15 @@ def linkage(self) -> LinkageKind: return LinkageKind.from_id(self._linkage) + @property + @cursor_null_guard + def language(self) -> LanguageKind: + """Determine the "language" of the entity referred to by a given cursor.""" + if not hasattr(self, "_language"): + self._language = conf.lib.clang_getCursorLanguage(self) + + return LanguageKind.from_id(self._language) + @property @cursor_null_guard def tls_kind(self) -> TLSKind: @@ -2584,6 +2593,17 @@ class LinkageKind(BaseEnumeration): EXTERNAL = 4 +class LanguageKind(BaseEnumeration): + """ + Describe the "language" of the entity referred to by a cursor. + """ + + INVALID = 0 + C = 1 + OBJ_C = 2 + C_PLUS_PLUS = 3 + + class TLSKind(BaseEnumeration): """Describes the kind of thread-local storage (TLS) of a cursor.""" @@ -4084,6 +4104,7 @@ def set_property(self, property, value): ("clang_getCursorDisplayName", [Cursor], _CXString), ("clang_getCursorExceptionSpecificationType", [Cursor], c_int), ("clang_getCursorExtent", [Cursor], SourceRange), + ("clang_getCursorLanguage", [Cursor], c_int), ("clang_getCursorLexicalParent", [Cursor], Cursor), ("clang_getCursorLinkage", [Cursor], c_int), ("clang_getCursorLocation", [Cursor], SourceLocation), diff --git a/clang/bindings/python/tests/cindex/test_cursor_language.py b/clang/bindings/python/tests/cindex/test_cursor_language.py new file mode 100644 index 0000000000000..de07a7bdeef40 --- /dev/null +++ b/clang/bindings/python/tests/cindex/test_cursor_language.py @@ -0,0 +1,27 @@ +import os + +from clang.cindex import Config, LanguageKind + +if "CLANG_LIBRARY_PATH" in os.environ: + Config.set_library_path(os.environ["CLANG_LIBRARY_PATH"]) + +import unittest + +from .util import get_cursor, get_tu + + +class TestCursorLanguage(unittest.TestCase): + def test_c(self): + tu = get_tu("int a;", lang="c") + main_func = get_cursor(tu.cursor, "a") + self.assertEqual(main_func.language, LanguageKind.C) + + def test_c(self): + tu = get_tu("class Cls {};", lang="cpp") + main_func = get_cursor(tu.cursor, "Cls") + self.assertEqual(main_func.language, LanguageKind.C_PLUS_PLUS) + + def test_obj_c(self): + tu = get_tu("@interface If : NSObject", lang="objc") + main_func = get_cursor(tu.cursor, "If") + self.assertEqual(main_func.language, LanguageKind.OBJ_C) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index a8b7a29933945..6b31238c279d8 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -309,6 +309,7 @@ Sanitizers Python Binding Changes ---------------------- +- Exposed `clang_getCursorLanguage` via `Cursor.language`. OpenMP Support -------------- From 36999d20b93d7626383894259826f54a26841f9c Mon Sep 17 00:00:00 2001 From: Jimmy Z Date: Mon, 11 Aug 2025 05:54:25 +0000 Subject: [PATCH 2/2] add new enum to test_enums --- clang/bindings/python/tests/cindex/test_enums.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clang/bindings/python/tests/cindex/test_enums.py b/clang/bindings/python/tests/cindex/test_enums.py index 9e7f44fcf7867..48452fd4f82d0 100644 --- a/clang/bindings/python/tests/cindex/test_enums.py +++ b/clang/bindings/python/tests/cindex/test_enums.py @@ -6,6 +6,7 @@ BinaryOperator, CursorKind, ExceptionSpecificationKind, + LanguageKind, LinkageKind, RefQualifierKind, StorageClass, @@ -26,6 +27,7 @@ class TestEnums(unittest.TestCase): AccessSpecifier, TypeKind, RefQualifierKind, + LanguageKind, LinkageKind, TLSKind, StorageClass,