[libclang/python] Expose clang_getCursorLanguage via Cursor.language (#152897)

This commit is contained in:
Jimmy Z 2025-08-11 12:50:29 +00:00 committed by GitHub
parent e72335192d
commit e20dd94bb3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 51 additions and 0 deletions

View File

@ -1907,6 +1907,15 @@ class Cursor(Structure):
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 @@ FUNCTION_LIST: list[LibFunc] = [
("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),

View File

@ -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)

View File

@ -6,6 +6,7 @@ from clang.cindex import (
BinaryOperator,
CursorKind,
ExceptionSpecificationKind,
LanguageKind,
LinkageKind,
RefQualifierKind,
StorageClass,
@ -26,6 +27,7 @@ class TestEnums(unittest.TestCase):
AccessSpecifier,
TypeKind,
RefQualifierKind,
LanguageKind,
LinkageKind,
TLSKind,
StorageClass,

View File

@ -309,6 +309,7 @@ Sanitizers
Python Binding Changes
----------------------
- Exposed `clang_getCursorLanguage` via `Cursor.language`.
OpenMP Support
--------------