[clang] [libclang/python] Derive library function types from annotations (PR #142120)

Jannick Kremer via cfe-commits cfe-commits at lists.llvm.org
Fri May 30 03:56:16 PDT 2025


https://github.com/DeinAlptraum created https://github.com/llvm/llvm-project/pull/142120

This is a PoC for now

>From 4669be22f731faf9ce0985aa634166c30c7025c6 Mon Sep 17 00:00:00 2001
From: Jannick Kremer <jannick.kremer at mailbox.org>
Date: Fri, 30 May 2025 19:54:15 +0900
Subject: [PATCH] [libclang/python] Derive library function types from
 annotations THis is a PoC for now

---
 clang/bindings/python/clang/cindex.py | 833 ++++++++++++++++++--------
 1 file changed, 583 insertions(+), 250 deletions(-)

diff --git a/clang/bindings/python/clang/cindex.py b/clang/bindings/python/clang/cindex.py
index 6f7243cdf80ac..889df2e2f0a87 100644
--- a/clang/bindings/python/clang/cindex.py
+++ b/clang/bindings/python/clang/cindex.py
@@ -78,6 +78,7 @@
     c_void_p,
     cast,
     cdll,
+    _Pointer,
     py_object,
 )
 
@@ -93,6 +94,7 @@
     Iterator,
     Literal,
     Optional,
+    Protocol,
     Sequence,
     Type as TType,
     TypeVar,
@@ -101,8 +103,7 @@
 )
 
 if TYPE_CHECKING:
-    from ctypes import _Pointer
-    from typing_extensions import Protocol, TypeAlias
+    from typing_extensions import TypeAlias
 
     StrPath: TypeAlias = TUnion[str, os.PathLike[str]]
     LibFunc: TypeAlias = TUnion[
@@ -3986,256 +3987,588 @@ def set_property(self, property, value):
 # Now comes the plumbing to hook up the C library.
 
 # Register callback types
-translation_unit_includes_callback = CFUNCTYPE(
+translation_unit_includes_callback: TypeAlias = CFUNCTYPE(  # type: ignore [valid-type]
     None, c_object_p, POINTER(SourceLocation), c_uint, py_object
 )
-cursor_visit_callback = CFUNCTYPE(c_int, Cursor, Cursor, py_object)
-fields_visit_callback = CFUNCTYPE(c_int, Cursor, py_object)
+cursor_visit_callback: TypeAlias = CFUNCTYPE(c_int, Cursor, Cursor, py_object)  # type: ignore [valid-type]
+fields_visit_callback: TypeAlias = CFUNCTYPE(c_int, Cursor, py_object)  # type: ignore [valid-type]
+
+
+def _get_annotations() -> list[LibFunc]:
+    def str_to_type(typename: str) -> type:
+        # The _Pointer types are instantiated dynamically at runtime
+        # so convert manually accordingly
+        if typename.startswith("_Pointer[") and typename.endswith("]"):
+            inner_type = typename[9:-1]
+            inner_mapped_type = str_to_type(inner_type)
+            return POINTER(inner_mapped_type)
+        return globals_flat[typename]
+
+    # Get all globally available names and flatten the builtins onto the
+    # top level of the dict. In the case of duplicates the builtin is
+    # overwritten with the non-builtin
+    gl = globals()
+    builtins = gl.pop("__builtins__")
+    globals_flat: dict[str, type] = {**builtins, **gl}
+
+    func_names = {attr for attr in vars(ClangLib) if attr.startswith("clang_")}
+    annotation_types: list[LibFunc] = []
+    for func_name in func_names:
+        annotation = getattr(ClangLib, func_name).__annotations__
+        ret_type = str_to_type(annotation.pop("return"))
+        arg_types = [str_to_type(annotation[key]) for key in annotation.keys()]
+        annotation_types.append((func_name, arg_types, ret_type))
+    return annotation_types
+
 
 # Functions strictly alphabetical order.
-FUNCTION_LIST: list[LibFunc] = [
-    (
-        "clang_annotateTokens",
-        [TranslationUnit, POINTER(Token), c_uint, POINTER(Cursor)],
-    ),
-    ("clang_CompilationDatabase_dispose", [c_object_p]),
-    (
-        "clang_CompilationDatabase_fromDirectory",
-        [c_interop_string, POINTER(c_uint)],
-        c_object_p,
-    ),
-    ("clang_CompilationDatabase_getAllCompileCommands", [c_object_p], c_object_p),
-    (
-        "clang_CompilationDatabase_getCompileCommands",
-        [c_object_p, c_interop_string],
-        c_object_p,
-    ),
-    ("clang_CompileCommands_dispose", [c_object_p]),
-    ("clang_CompileCommands_getCommand", [c_object_p, c_uint], c_object_p),
-    ("clang_CompileCommands_getSize", [c_object_p], c_uint),
-    ("clang_CompileCommand_getArg", [c_object_p, c_uint], _CXString),
-    ("clang_CompileCommand_getDirectory", [c_object_p], _CXString),
-    ("clang_CompileCommand_getFilename", [c_object_p], _CXString),
-    ("clang_CompileCommand_getNumArgs", [c_object_p], c_uint),
-    (
-        "clang_codeCompleteAt",
-        [TranslationUnit, c_interop_string, c_int, c_int, c_void_p, c_int, c_int],
-        POINTER(CCRStructure),
-    ),
-    ("clang_codeCompleteGetDiagnostic", [CodeCompletionResults, c_int], Diagnostic),
-    ("clang_codeCompleteGetNumDiagnostics", [CodeCompletionResults], c_int),
-    ("clang_createIndex", [c_int, c_int], c_object_p),
-    ("clang_createTranslationUnit", [Index, c_interop_string], c_object_p),
-    ("clang_CXRewriter_create", [TranslationUnit], c_object_p),
-    ("clang_CXRewriter_dispose", [Rewriter]),
-    ("clang_CXRewriter_insertTextBefore", [Rewriter, SourceLocation, c_interop_string]),
-    ("clang_CXRewriter_overwriteChangedFiles", [Rewriter], c_int),
-    ("clang_CXRewriter_removeText", [Rewriter, SourceRange]),
-    ("clang_CXRewriter_replaceText", [Rewriter, SourceRange, c_interop_string]),
-    ("clang_CXRewriter_writeMainFileToStdOut", [Rewriter]),
-    ("clang_CXXConstructor_isConvertingConstructor", [Cursor], bool),
-    ("clang_CXXConstructor_isCopyConstructor", [Cursor], bool),
-    ("clang_CXXConstructor_isDefaultConstructor", [Cursor], bool),
-    ("clang_CXXConstructor_isMoveConstructor", [Cursor], bool),
-    ("clang_CXXField_isMutable", [Cursor], bool),
-    ("clang_CXXMethod_isConst", [Cursor], bool),
-    ("clang_CXXMethod_isDefaulted", [Cursor], bool),
-    ("clang_CXXMethod_isDeleted", [Cursor], bool),
-    ("clang_CXXMethod_isCopyAssignmentOperator", [Cursor], bool),
-    ("clang_CXXMethod_isMoveAssignmentOperator", [Cursor], bool),
-    ("clang_CXXMethod_isExplicit", [Cursor], bool),
-    ("clang_CXXMethod_isPureVirtual", [Cursor], bool),
-    ("clang_CXXMethod_isStatic", [Cursor], bool),
-    ("clang_CXXMethod_isVirtual", [Cursor], bool),
-    ("clang_CXXRecord_isAbstract", [Cursor], bool),
-    ("clang_EnumDecl_isScoped", [Cursor], bool),
-    ("clang_defaultDiagnosticDisplayOptions", [], c_uint),
-    ("clang_defaultSaveOptions", [TranslationUnit], c_uint),
-    ("clang_disposeCodeCompleteResults", [CodeCompletionResults]),
-    # ("clang_disposeCXTUResourceUsage",
-    #  [CXTUResourceUsage]),
-    ("clang_disposeDiagnostic", [Diagnostic]),
-    ("clang_disposeIndex", [Index]),
-    ("clang_disposeString", [_CXString]),
-    ("clang_disposeTokens", [TranslationUnit, POINTER(Token), c_uint]),
-    ("clang_disposeTranslationUnit", [TranslationUnit]),
-    ("clang_equalCursors", [Cursor, Cursor], bool),
-    ("clang_equalLocations", [SourceLocation, SourceLocation], bool),
-    ("clang_equalRanges", [SourceRange, SourceRange], bool),
-    ("clang_equalTypes", [Type, Type], bool),
-    ("clang_formatDiagnostic", [Diagnostic, c_uint], _CXString),
-    ("clang_getAddressSpace", [Type], c_uint),
-    ("clang_getArgType", [Type, c_uint], Type),
-    ("clang_getArrayElementType", [Type], Type),
-    ("clang_getArraySize", [Type], c_longlong),
-    ("clang_getFieldDeclBitWidth", [Cursor], c_int),
-    ("clang_getCanonicalCursor", [Cursor], Cursor),
-    ("clang_getCanonicalType", [Type], Type),
-    ("clang_getChildDiagnostics", [Diagnostic], c_object_p),
-    ("clang_getCompletionAvailability", [c_void_p], c_int),
-    ("clang_getCompletionBriefComment", [c_void_p], _CXString),
-    ("clang_getCompletionChunkCompletionString", [c_void_p, c_int], c_object_p),
-    ("clang_getCompletionChunkKind", [c_void_p, c_int], c_int),
-    ("clang_getCompletionChunkText", [c_void_p, c_int], _CXString),
-    ("clang_getCompletionPriority", [c_void_p], c_int),
-    ("clang_getCString", [_CXString], c_interop_string),
-    ("clang_getCursor", [TranslationUnit, SourceLocation], Cursor),
-    ("clang_getCursorAvailability", [Cursor], c_int),
-    ("clang_getCursorDefinition", [Cursor], Cursor),
-    ("clang_getCursorDisplayName", [Cursor], _CXString),
-    ("clang_getCursorExceptionSpecificationType", [Cursor], c_int),
-    ("clang_getCursorExtent", [Cursor], SourceRange),
-    ("clang_getCursorLexicalParent", [Cursor], Cursor),
-    ("clang_getCursorLinkage", [Cursor], c_int),
-    ("clang_getCursorLocation", [Cursor], SourceLocation),
-    ("clang_getCursorPrettyPrinted", [Cursor, PrintingPolicy], _CXString),
-    ("clang_getCursorPrintingPolicy", [Cursor], c_object_p),
-    ("clang_getCursorReferenced", [Cursor], Cursor),
-    ("clang_getCursorReferenceNameRange", [Cursor, c_uint, c_uint], SourceRange),
-    ("clang_getCursorResultType", [Cursor], Type),
-    ("clang_getCursorSemanticParent", [Cursor], Cursor),
-    ("clang_getCursorSpelling", [Cursor], _CXString),
-    ("clang_getCursorTLSKind", [Cursor], c_int),
-    ("clang_getCursorType", [Cursor], Type),
-    ("clang_getCursorUSR", [Cursor], _CXString),
-    ("clang_Cursor_getMangling", [Cursor], _CXString),
-    ("clang_Cursor_hasAttrs", [Cursor], c_uint),
-    # ("clang_getCXTUResourceUsage",
-    #  [TranslationUnit],
-    #  CXTUResourceUsage),
-    ("clang_getCXXAccessSpecifier", [Cursor], c_uint),
-    ("clang_getDeclObjCTypeEncoding", [Cursor], _CXString),
-    ("clang_getDiagnostic", [c_object_p, c_uint], c_object_p),
-    ("clang_getDiagnosticCategory", [Diagnostic], c_uint),
-    ("clang_getDiagnosticCategoryText", [Diagnostic], _CXString),
-    ("clang_getDiagnosticFixIt", [Diagnostic, c_uint, POINTER(SourceRange)], _CXString),
-    ("clang_getDiagnosticInSet", [c_object_p, c_uint], c_object_p),
-    ("clang_getDiagnosticLocation", [Diagnostic], SourceLocation),
-    ("clang_getDiagnosticNumFixIts", [Diagnostic], c_uint),
-    ("clang_getDiagnosticNumRanges", [Diagnostic], c_uint),
-    ("clang_getDiagnosticOption", [Diagnostic, POINTER(_CXString)], _CXString),
-    ("clang_getDiagnosticRange", [Diagnostic, c_uint], SourceRange),
-    ("clang_getDiagnosticSeverity", [Diagnostic], c_int),
-    ("clang_getDiagnosticSpelling", [Diagnostic], _CXString),
-    ("clang_getElementType", [Type], Type),
-    ("clang_getEnumConstantDeclUnsignedValue", [Cursor], c_ulonglong),
-    ("clang_getEnumConstantDeclValue", [Cursor], c_longlong),
-    ("clang_getEnumDeclIntegerType", [Cursor], Type),
-    ("clang_getExceptionSpecificationType", [Type], c_int),
-    ("clang_getFile", [TranslationUnit, c_interop_string], c_object_p),
-    ("clang_getFileName", [File], _CXString),
-    ("clang_getFileTime", [File], c_uint),
-    ("clang_File_isEqual", [File, File], bool),
-    ("clang_getIBOutletCollectionType", [Cursor], Type),
-    ("clang_getIncludedFile", [Cursor], c_object_p),
-    (
-        "clang_getInclusions",
-        [TranslationUnit, translation_unit_includes_callback, py_object],
-    ),
-    (
-        "clang_getInstantiationLocation",
-        [
-            SourceLocation,
-            POINTER(c_object_p),
-            POINTER(c_uint),
-            POINTER(c_uint),
-            POINTER(c_uint),
-        ],
-    ),
-    ("clang_getLocation", [TranslationUnit, File, c_uint, c_uint], SourceLocation),
-    ("clang_getLocationForOffset", [TranslationUnit, File, c_uint], SourceLocation),
-    ("clang_getNullCursor", None, Cursor),
-    ("clang_getNumArgTypes", [Type], c_uint),
-    ("clang_getNumCompletionChunks", [c_void_p], c_int),
-    ("clang_getNumDiagnostics", [c_object_p], c_uint),
-    ("clang_getNumDiagnosticsInSet", [c_object_p], c_uint),
-    ("clang_getNumElements", [Type], c_longlong),
-    ("clang_getNumOverloadedDecls", [Cursor], c_uint),
-    ("clang_getOffsetOfBase", [Cursor, Cursor], c_longlong),
-    ("clang_getOverloadedDecl", [Cursor, c_uint], Cursor),
-    ("clang_getPointeeType", [Type], Type),
-    ("clang_getRange", [SourceLocation, SourceLocation], SourceRange),
-    ("clang_getRangeEnd", [SourceRange], SourceLocation),
-    ("clang_getRangeStart", [SourceRange], SourceLocation),
-    ("clang_getResultType", [Type], Type),
-    ("clang_getSpecializedCursorTemplate", [Cursor], Cursor),
-    ("clang_getTemplateCursorKind", [Cursor], c_uint),
-    ("clang_getTokenExtent", [TranslationUnit, Token], SourceRange),
-    ("clang_getTokenKind", [Token], c_uint),
-    ("clang_getTokenLocation", [TranslationUnit, Token], SourceLocation),
-    ("clang_getTokenSpelling", [TranslationUnit, Token], _CXString),
-    ("clang_getTranslationUnitCursor", [TranslationUnit], Cursor),
-    ("clang_getTranslationUnitSpelling", [TranslationUnit], _CXString),
-    ("clang_getTUResourceUsageName", [c_uint], c_interop_string),
-    ("clang_getTypeDeclaration", [Type], Cursor),
-    ("clang_getTypedefDeclUnderlyingType", [Cursor], Type),
-    ("clang_getTypedefName", [Type], _CXString),
-    ("clang_getTypeKindSpelling", [c_uint], _CXString),
-    ("clang_getTypePrettyPrinted", [Type, PrintingPolicy], _CXString),
-    ("clang_getTypeSpelling", [Type], _CXString),
-    ("clang_hashCursor", [Cursor], c_uint),
-    ("clang_isAttribute", [CursorKind], bool),
-    ("clang_getFullyQualifiedName", [Type, PrintingPolicy, c_uint], _CXString),
-    ("clang_isConstQualifiedType", [Type], bool),
-    ("clang_isCursorDefinition", [Cursor], bool),
-    ("clang_isDeclaration", [CursorKind], bool),
-    ("clang_isExpression", [CursorKind], bool),
-    ("clang_isFileMultipleIncludeGuarded", [TranslationUnit, File], bool),
-    ("clang_isFunctionTypeVariadic", [Type], bool),
-    ("clang_isInvalid", [CursorKind], bool),
-    ("clang_isPODType", [Type], bool),
-    ("clang_isPreprocessing", [CursorKind], bool),
-    ("clang_isReference", [CursorKind], bool),
-    ("clang_isRestrictQualifiedType", [Type], bool),
-    ("clang_isStatement", [CursorKind], bool),
-    ("clang_isTranslationUnit", [CursorKind], bool),
-    ("clang_isUnexposed", [CursorKind], bool),
-    ("clang_isVirtualBase", [Cursor], bool),
-    ("clang_isVolatileQualifiedType", [Type], bool),
-    ("clang_isBeforeInTranslationUnit", [SourceLocation, SourceLocation], bool),
-    (
-        "clang_parseTranslationUnit",
-        [Index, c_interop_string, c_void_p, c_int, c_void_p, c_int, c_int],
-        c_object_p,
-    ),
-    ("clang_reparseTranslationUnit", [TranslationUnit, c_int, c_void_p, c_int], c_int),
-    ("clang_saveTranslationUnit", [TranslationUnit, c_interop_string, c_uint], c_int),
-    (
-        "clang_tokenize",
-        [TranslationUnit, SourceRange, POINTER(POINTER(Token)), POINTER(c_uint)],
-    ),
-    ("clang_visitChildren", [Cursor, cursor_visit_callback, py_object], c_uint),
-    ("clang_visitCXXBaseClasses", [Type, fields_visit_callback, py_object], c_uint),
-    ("clang_visitCXXMethods", [Type, fields_visit_callback, py_object], c_uint),
-    ("clang_Cursor_getNumArguments", [Cursor], c_int),
-    ("clang_Cursor_getArgument", [Cursor, c_uint], Cursor),
-    ("clang_Cursor_getNumTemplateArguments", [Cursor], c_int),
-    ("clang_Cursor_getTemplateArgumentKind", [Cursor, c_uint], c_uint),
-    ("clang_Cursor_getTemplateArgumentType", [Cursor, c_uint], Type),
-    ("clang_Cursor_getTemplateArgumentValue", [Cursor, c_uint], c_longlong),
-    ("clang_Cursor_getTemplateArgumentUnsignedValue", [Cursor, c_uint], c_ulonglong),
-    ("clang_getCursorBinaryOperatorKind", [Cursor], c_int),
-    ("clang_Cursor_getBriefCommentText", [Cursor], _CXString),
-    ("clang_Cursor_getRawCommentText", [Cursor], _CXString),
-    ("clang_Cursor_getOffsetOfField", [Cursor], c_longlong),
-    ("clang_Cursor_getStorageClass", [Cursor], c_int),
-    ("clang_Cursor_isAnonymous", [Cursor], bool),
-    ("clang_Cursor_isAnonymousRecordDecl", [Cursor], bool),
-    ("clang_Cursor_isBitField", [Cursor], bool),
-    ("clang_Location_isInSystemHeader", [SourceLocation], bool),
-    ("clang_PrintingPolicy_dispose", [PrintingPolicy]),
-    ("clang_PrintingPolicy_getProperty", [PrintingPolicy, c_int], c_uint),
-    ("clang_PrintingPolicy_setProperty", [PrintingPolicy, c_int, c_uint]),
-    ("clang_Type_getAlignOf", [Type], c_longlong),
-    ("clang_Type_getClassType", [Type], Type),
-    ("clang_Type_getNumTemplateArguments", [Type], c_int),
-    ("clang_Type_getTemplateArgumentAsType", [Type, c_uint], Type),
-    ("clang_Type_getOffsetOf", [Type, c_interop_string], c_longlong),
-    ("clang_Type_getSizeOf", [Type], c_longlong),
-    ("clang_Type_getCXXRefQualifier", [Type], c_uint),
-    ("clang_Type_getNamedType", [Type], Type),
-    ("clang_Type_visitFields", [Type, fields_visit_callback, py_object], c_uint),
-]
+class ClangLib(Protocol):
+
+    def clang_annotateTokens(
+        self,
+        arg1: TranslationUnit,
+        arg2: _Pointer[Token],
+        arg3: c_uint,
+        arg4: _Pointer[Cursor],
+    ) -> None: ...
+
+    def clang_CompilationDatabase_dispose(self, arg1: _Pointer[c_void_p]) -> None: ...
+
+    def clang_CompilationDatabase_fromDirectory(
+        self, arg1: c_interop_string, arg2: _Pointer[c_uint]
+    ) -> _Pointer[c_void_p]: ...
+
+    def clang_CompilationDatabase_getAllCompileCommands(
+        self, arg1: _Pointer[c_void_p]
+    ) -> _Pointer[c_void_p]: ...
+
+    def clang_CompilationDatabase_getCompileCommands(
+        self, arg1: _Pointer[c_void_p], arg2: c_interop_string
+    ) -> _Pointer[c_void_p]: ...
+
+    def clang_CompileCommands_dispose(self, arg1: _Pointer[c_void_p]) -> None: ...
+
+    def clang_CompileCommands_getCommand(
+        self, arg1: _Pointer[c_void_p], arg2: c_uint
+    ) -> _Pointer[c_void_p]: ...
+
+    def clang_CompileCommands_getSize(self, arg1: _Pointer[c_void_p]) -> c_uint: ...
+
+    def clang_CompileCommand_getArg(
+        self, arg1: _Pointer[c_void_p], arg2: c_uint
+    ) -> _CXString: ...
+
+    def clang_CompileCommand_getDirectory(
+        self, arg1: _Pointer[c_void_p]
+    ) -> _CXString: ...
+
+    def clang_CompileCommand_getFilename(
+        self, arg1: _Pointer[c_void_p]
+    ) -> _CXString: ...
+
+    def clang_CompileCommand_getNumArgs(self, arg1: _Pointer[c_void_p]) -> c_uint: ...
+
+    def clang_codeCompleteAt(
+        self,
+        arg1: TranslationUnit,
+        arg2: c_interop_string,
+        arg3: c_int,
+        arg4: c_int,
+        arg5: c_void_p,
+        arg6: c_int,
+        arg7: c_int,
+    ) -> _Pointer[CCRStructure]: ...
+
+    def clang_codeCompleteGetDiagnostic(
+        self, arg1: CodeCompletionResults, arg2: c_int
+    ) -> Diagnostic: ...
+
+    def clang_codeCompleteGetNumDiagnostics(
+        self, arg1: CodeCompletionResults
+    ) -> c_int: ...
+
+    def clang_createIndex(self, arg1: c_int, arg2: c_int) -> _Pointer[c_void_p]: ...
+
+    def clang_createTranslationUnit(
+        self, arg1: Index, arg2: c_interop_string
+    ) -> _Pointer[c_void_p]: ...
+
+    def clang_CXRewriter_create(self, arg1: TranslationUnit) -> _Pointer[c_void_p]: ...
+
+    def clang_CXRewriter_dispose(self, arg1: Rewriter) -> None: ...
+
+    def clang_CXRewriter_insertTextBefore(
+        self, arg1: Rewriter, arg2: SourceLocation, arg3: c_interop_string
+    ) -> None: ...
+
+    def clang_CXRewriter_overwriteChangedFiles(self, arg1: Rewriter) -> c_int: ...
+
+    def clang_CXRewriter_removeText(
+        self, arg1: Rewriter, arg2: SourceRange
+    ) -> None: ...
+
+    def clang_CXRewriter_replaceText(
+        self, arg1: Rewriter, arg2: SourceRange, arg3: c_interop_string
+    ) -> None: ...
+
+    def clang_CXRewriter_writeMainFileToStdOut(self, arg1: Rewriter) -> None: ...
+
+    def clang_CXXConstructor_isConvertingConstructor(self, arg1: Cursor) -> bool: ...
+
+    def clang_CXXConstructor_isCopyConstructor(self, arg1: Cursor) -> bool: ...
+
+    def clang_CXXConstructor_isDefaultConstructor(self, arg1: Cursor) -> bool: ...
+
+    def clang_CXXConstructor_isMoveConstructor(self, arg1: Cursor) -> bool: ...
+
+    def clang_CXXField_isMutable(self, arg1: Cursor) -> bool: ...
+
+    def clang_CXXMethod_isConst(self, arg1: Cursor) -> bool: ...
+
+    def clang_CXXMethod_isDefaulted(self, arg1: Cursor) -> bool: ...
+
+    def clang_CXXMethod_isDeleted(self, arg1: Cursor) -> bool: ...
+
+    def clang_CXXMethod_isCopyAssignmentOperator(self, arg1: Cursor) -> bool: ...
+
+    def clang_CXXMethod_isMoveAssignmentOperator(self, arg1: Cursor) -> bool: ...
+
+    def clang_CXXMethod_isExplicit(self, arg1: Cursor) -> bool: ...
+
+    def clang_CXXMethod_isPureVirtual(self, arg1: Cursor) -> bool: ...
+
+    def clang_CXXMethod_isStatic(self, arg1: Cursor) -> bool: ...
+
+    def clang_CXXMethod_isVirtual(self, arg1: Cursor) -> bool: ...
+
+    def clang_CXXRecord_isAbstract(self, arg1: Cursor) -> bool: ...
+
+    def clang_EnumDecl_isScoped(self, arg1: Cursor) -> bool: ...
+
+    def clang_defaultDiagnosticDisplayOptions(self) -> c_uint: ...
+
+    def clang_defaultSaveOptions(self, arg1: TranslationUnit) -> c_uint: ...
+
+    def clang_disposeCodeCompleteResults(self, arg1: CodeCompletionResults) -> None: ...
+
+    def clang_disposeDiagnostic(self, arg1: Diagnostic) -> None: ...
+
+    def clang_disposeIndex(self, arg1: Index) -> None: ...
+
+    def clang_disposeString(self, arg1: _CXString) -> None: ...
+
+    def clang_disposeTokens(
+        self, arg1: TranslationUnit, arg2: _Pointer[Token], arg3: c_uint
+    ) -> None: ...
+
+    def clang_disposeTranslationUnit(self, arg1: TranslationUnit) -> None: ...
+
+    def clang_equalCursors(self, arg1: Cursor, arg2: Cursor) -> bool: ...
+
+    def clang_equalLocations(
+        self, arg1: SourceLocation, arg2: SourceLocation
+    ) -> bool: ...
+
+    def clang_equalRanges(self, arg1: SourceRange, arg2: SourceRange) -> bool: ...
+
+    def clang_equalTypes(self, arg1: Type, arg2: Type) -> bool: ...
+
+    def clang_formatDiagnostic(self, arg1: Diagnostic, arg2: c_uint) -> _CXString: ...
+
+    def clang_getAddressSpace(self, arg1: Type) -> c_uint: ...
+
+    def clang_getArgType(self, arg1: Type, arg2: c_uint) -> Type: ...
+
+    def clang_getArrayElementType(self, arg1: Type) -> Type: ...
+
+    def clang_getArraySize(self, arg1: Type) -> c_longlong: ...
+
+    def clang_getFieldDeclBitWidth(self, arg1: Cursor) -> c_int: ...
+
+    def clang_getCanonicalCursor(self, arg1: Cursor) -> Cursor: ...
+
+    def clang_getCanonicalType(self, arg1: Type) -> Type: ...
+
+    def clang_getChildDiagnostics(self, arg1: Diagnostic) -> _Pointer[c_void_p]: ...
+
+    def clang_getCompletionAvailability(self, arg1: c_void_p) -> c_int: ...
+
+    def clang_getCompletionBriefComment(self, arg1: c_void_p) -> _CXString: ...
+
+    def clang_getCompletionChunkCompletionString(
+        self, arg1: c_void_p, arg2: c_int
+    ) -> _Pointer[c_void_p]: ...
+
+    def clang_getCompletionChunkKind(self, arg1: c_void_p, arg2: c_int) -> c_int: ...
+
+    def clang_getCompletionChunkText(
+        self, arg1: c_void_p, arg2: c_int
+    ) -> _CXString: ...
+
+    def clang_getCompletionPriority(self, arg1: c_void_p) -> c_int: ...
+
+    def clang_getCString(self, arg1: _CXString) -> c_interop_string: ...
+
+    def clang_getCursor(
+        self, arg1: TranslationUnit, arg2: SourceLocation
+    ) -> Cursor: ...
+
+    def clang_getCursorAvailability(self, arg1: Cursor) -> c_int: ...
+
+    def clang_getCursorDefinition(self, arg1: Cursor) -> Cursor: ...
+
+    def clang_getCursorDisplayName(self, arg1: Cursor) -> _CXString: ...
+
+    def clang_getCursorExceptionSpecificationType(self, arg1: Cursor) -> c_int: ...
+
+    def clang_getCursorExtent(self, arg1: Cursor) -> SourceRange: ...
+
+    def clang_getCursorLexicalParent(self, arg1: Cursor) -> Cursor: ...
+
+    def clang_getCursorLinkage(self, arg1: Cursor) -> c_int: ...
+
+    def clang_getCursorLocation(self, arg1: Cursor) -> SourceLocation: ...
+
+    def clang_getCursorPrettyPrinted(
+        self, arg1: Cursor, arg2: PrintingPolicy
+    ) -> _CXString: ...
+
+    def clang_getCursorPrintingPolicy(self, arg1: Cursor) -> _Pointer[c_void_p]: ...
+
+    def clang_getCursorReferenced(self, arg1: Cursor) -> Cursor: ...
+
+    def clang_getCursorReferenceNameRange(
+        self, arg1: Cursor, arg2: c_uint, arg3: c_uint
+    ) -> SourceRange: ...
+
+    def clang_getCursorResultType(self, arg1: Cursor) -> Type: ...
+
+    def clang_getCursorSemanticParent(self, arg1: Cursor) -> Cursor: ...
+
+    def clang_getCursorSpelling(self, arg1: Cursor) -> _CXString: ...
+
+    def clang_getCursorTLSKind(self, arg1: Cursor) -> c_int: ...
+
+    def clang_getCursorType(self, arg1: Cursor) -> Type: ...
+
+    def clang_getCursorUSR(self, arg1: Cursor) -> _CXString: ...
+
+    def clang_Cursor_getMangling(self, arg1: Cursor) -> _CXString: ...
+
+    def clang_Cursor_hasAttrs(self, arg1: Cursor) -> c_uint: ...
+
+    def clang_getCXXAccessSpecifier(self, arg1: Cursor) -> c_uint: ...
+
+    def clang_getDeclObjCTypeEncoding(self, arg1: Cursor) -> _CXString: ...
+
+    def clang_getDiagnostic(
+        self, arg1: _Pointer[c_void_p], arg2: c_uint
+    ) -> _Pointer[c_void_p]: ...
+
+    def clang_getDiagnosticCategory(self, arg1: Diagnostic) -> c_uint: ...
+
+    def clang_getDiagnosticCategoryText(self, arg1: Diagnostic) -> _CXString: ...
+
+    def clang_getDiagnosticFixIt(
+        self, arg1: Diagnostic, arg2: c_uint, arg3: _Pointer[SourceRange]
+    ) -> _CXString: ...
+
+    def clang_getDiagnosticInSet(
+        self, arg1: _Pointer[c_void_p], arg2: c_uint
+    ) -> _Pointer[c_void_p]: ...
+
+    def clang_getDiagnosticLocation(self, arg1: Diagnostic) -> SourceLocation: ...
+
+    def clang_getDiagnosticNumFixIts(self, arg1: Diagnostic) -> c_uint: ...
+
+    def clang_getDiagnosticNumRanges(self, arg1: Diagnostic) -> c_uint: ...
+
+    def clang_getDiagnosticOption(
+        self, arg1: Diagnostic, arg2: _Pointer[_CXString]
+    ) -> _CXString: ...
+
+    def clang_getDiagnosticRange(
+        self, arg1: Diagnostic, arg2: c_uint
+    ) -> SourceRange: ...
+
+    def clang_getDiagnosticSeverity(self, arg1: Diagnostic) -> c_int: ...
+
+    def clang_getDiagnosticSpelling(self, arg1: Diagnostic) -> _CXString: ...
+
+    def clang_getElementType(self, arg1: Type) -> Type: ...
+
+    def clang_getEnumConstantDeclUnsignedValue(self, arg1: Cursor) -> c_ulonglong: ...
+
+    def clang_getEnumConstantDeclValue(self, arg1: Cursor) -> c_longlong: ...
+
+    def clang_getEnumDeclIntegerType(self, arg1: Cursor) -> Type: ...
+
+    def clang_getExceptionSpecificationType(self, arg1: Type) -> c_int: ...
+
+    def clang_getFile(
+        self, arg1: TranslationUnit, arg2: c_interop_string
+    ) -> _Pointer[c_void_p]: ...
+
+    def clang_getFileName(self, arg1: File) -> _CXString: ...
+
+    def clang_getFileTime(self, arg1: File) -> c_uint: ...
+
+    def clang_File_isEqual(self, arg1: File, arg2: File) -> bool: ...
+
+    def clang_getIBOutletCollectionType(self, arg1: Cursor) -> Type: ...
+
+    def clang_getIncludedFile(self, arg1: Cursor) -> _Pointer[c_void_p]: ...
+
+    def clang_getInclusions(
+        self,
+        arg1: TranslationUnit,
+        arg2: translation_unit_includes_callback,
+        arg3: py_object,
+    ) -> None: ...
+
+    def clang_getInstantiationLocation(
+        self,
+        arg1: SourceLocation,
+        arg2: _Pointer[_Pointer[c_void_p]],
+        arg3: _Pointer[c_uint],
+        arg4: _Pointer[c_uint],
+        arg5: _Pointer[c_uint],
+    ) -> None: ...
+
+    def clang_getLocation(
+        self, arg1: TranslationUnit, arg2: File, arg3: c_uint, arg4: c_uint
+    ) -> SourceLocation: ...
+
+    def clang_getLocationForOffset(
+        self, arg1: TranslationUnit, arg2: File, arg3: c_uint
+    ) -> SourceLocation: ...
+
+    def clang_getNullCursor(self) -> Cursor: ...
+
+    def clang_getNumArgTypes(self, arg1: Type) -> c_uint: ...
+
+    def clang_getNumCompletionChunks(self, arg1: c_void_p) -> c_int: ...
+
+    def clang_getNumDiagnostics(self, arg1: _Pointer[c_void_p]) -> c_uint: ...
+
+    def clang_getNumDiagnosticsInSet(self, arg1: _Pointer[c_void_p]) -> c_uint: ...
+
+    def clang_getNumElements(self, arg1: Type) -> c_longlong: ...
+
+    def clang_getNumOverloadedDecls(self, arg1: Cursor) -> c_uint: ...
+
+    def clang_getOffsetOfBase(self, arg1: Cursor, arg2: Cursor) -> c_longlong: ...
+
+    def clang_getOverloadedDecl(self, arg1: Cursor, arg2: c_uint) -> Cursor: ...
+
+    def clang_getPointeeType(self, arg1: Type) -> Type: ...
+
+    def clang_getRange(
+        self, arg1: SourceLocation, arg2: SourceLocation
+    ) -> SourceRange: ...
+
+    def clang_getRangeEnd(self, arg1: SourceRange) -> SourceLocation: ...
+
+    def clang_getRangeStart(self, arg1: SourceRange) -> SourceLocation: ...
+
+    def clang_getResultType(self, arg1: Type) -> Type: ...
+
+    def clang_getSpecializedCursorTemplate(self, arg1: Cursor) -> Cursor: ...
+
+    def clang_getTemplateCursorKind(self, arg1: Cursor) -> c_uint: ...
+
+    def clang_getTokenExtent(
+        self, arg1: TranslationUnit, arg2: Token
+    ) -> SourceRange: ...
+
+    def clang_getTokenKind(self, arg1: Token) -> c_uint: ...
+
+    def clang_getTokenLocation(
+        self, arg1: TranslationUnit, arg2: Token
+    ) -> SourceLocation: ...
+
+    def clang_getTokenSpelling(
+        self, arg1: TranslationUnit, arg2: Token
+    ) -> _CXString: ...
+
+    def clang_getTranslationUnitCursor(self, arg1: TranslationUnit) -> Cursor: ...
+
+    def clang_getTranslationUnitSpelling(self, arg1: TranslationUnit) -> _CXString: ...
+
+    def clang_getTUResourceUsageName(self, arg1: c_uint) -> c_interop_string: ...
+
+    def clang_getTypeDeclaration(self, arg1: Type) -> Cursor: ...
+
+    def clang_getTypedefDeclUnderlyingType(self, arg1: Cursor) -> Type: ...
+
+    def clang_getTypedefName(self, arg1: Type) -> _CXString: ...
+
+    def clang_getTypeKindSpelling(self, arg1: c_uint) -> _CXString: ...
+
+    def clang_getTypePrettyPrinted(
+        self, arg1: Type, arg2: PrintingPolicy
+    ) -> _CXString: ...
+
+    def clang_getTypeSpelling(self, arg1: Type) -> _CXString: ...
+
+    def clang_hashCursor(self, arg1: Cursor) -> c_uint: ...
+
+    def clang_isAttribute(self, arg1: CursorKind) -> bool: ...
+
+    def clang_getFullyQualifiedName(
+        self, arg1: Type, arg2: PrintingPolicy, arg3: c_uint
+    ) -> _CXString: ...
+
+    def clang_isConstQualifiedType(self, arg1: Type) -> bool: ...
+
+    def clang_isCursorDefinition(self, arg1: Cursor) -> bool: ...
+
+    def clang_isDeclaration(self, arg1: CursorKind) -> bool: ...
+
+    def clang_isExpression(self, arg1: CursorKind) -> bool: ...
+
+    def clang_isFileMultipleIncludeGuarded(
+        self, arg1: TranslationUnit, arg2: File
+    ) -> bool: ...
+
+    def clang_isFunctionTypeVariadic(self, arg1: Type) -> bool: ...
+
+    def clang_isInvalid(self, arg1: CursorKind) -> bool: ...
+
+    def clang_isPODType(self, arg1: Type) -> bool: ...
+
+    def clang_isPreprocessing(self, arg1: CursorKind) -> bool: ...
+
+    def clang_isReference(self, arg1: CursorKind) -> bool: ...
+
+    def clang_isRestrictQualifiedType(self, arg1: Type) -> bool: ...
+
+    def clang_isStatement(self, arg1: CursorKind) -> bool: ...
+
+    def clang_isTranslationUnit(self, arg1: CursorKind) -> bool: ...
+
+    def clang_isUnexposed(self, arg1: CursorKind) -> bool: ...
+
+    def clang_isVirtualBase(self, arg1: Cursor) -> bool: ...
+
+    def clang_isVolatileQualifiedType(self, arg1: Type) -> bool: ...
+
+    def clang_isBeforeInTranslationUnit(
+        self, arg1: SourceLocation, arg2: SourceLocation
+    ) -> bool: ...
+
+    def clang_parseTranslationUnit(
+        self,
+        arg1: Index,
+        arg2: c_interop_string,
+        arg3: c_void_p,
+        arg4: c_int,
+        arg5: c_void_p,
+        arg6: c_int,
+        arg7: c_int,
+    ) -> _Pointer[c_void_p]: ...
+
+    def clang_reparseTranslationUnit(
+        self, arg1: TranslationUnit, arg2: c_int, arg3: c_void_p, arg4: c_int
+    ) -> c_int: ...
+
+    def clang_saveTranslationUnit(
+        self, arg1: TranslationUnit, arg2: c_interop_string, arg3: c_uint
+    ) -> c_int: ...
+
+    def clang_tokenize(
+        self,
+        arg1: TranslationUnit,
+        arg2: SourceRange,
+        arg3: _Pointer[_Pointer[Token]],
+        arg4: _Pointer[c_uint],
+    ) -> None: ...
+
+    def clang_visitChildren(
+        self, arg1: Cursor, arg2: cursor_visit_callback, arg3: py_object
+    ) -> c_uint: ...
+
+    def clang_visitCXXBaseClasses(
+        self, arg1: Type, arg2: fields_visit_callback, arg3: py_object
+    ) -> c_uint: ...
+
+    def clang_visitCXXMethods(
+        self, arg1: Type, arg2: fields_visit_callback, arg3: py_object
+    ) -> c_uint: ...
+
+    def clang_Cursor_getNumArguments(self, arg1: Cursor) -> c_int: ...
+
+    def clang_Cursor_getArgument(self, arg1: Cursor, arg2: c_uint) -> Cursor: ...
+
+    def clang_Cursor_getNumTemplateArguments(self, arg1: Cursor) -> c_int: ...
+
+    def clang_Cursor_getTemplateArgumentKind(
+        self, arg1: Cursor, arg2: c_uint
+    ) -> c_uint: ...
+
+    def clang_Cursor_getTemplateArgumentType(
+        self, arg1: Cursor, arg2: c_uint
+    ) -> Type: ...
+
+    def clang_Cursor_getTemplateArgumentValue(
+        self, arg1: Cursor, arg2: c_uint
+    ) -> c_longlong: ...
+
+    def clang_Cursor_getTemplateArgumentUnsignedValue(
+        self, arg1: Cursor, arg2: c_uint
+    ) -> c_ulonglong: ...
+
+    def clang_getCursorBinaryOperatorKind(self, arg1: Cursor) -> c_int: ...
+
+    def clang_Cursor_getBriefCommentText(self, arg1: Cursor) -> _CXString: ...
+
+    def clang_Cursor_getRawCommentText(self, arg1: Cursor) -> _CXString: ...
+
+    def clang_Cursor_getOffsetOfField(self, arg1: Cursor) -> c_longlong: ...
+
+    def clang_Cursor_getStorageClass(self, arg1: Cursor) -> c_int: ...
+
+    def clang_Cursor_isAnonymous(self, arg1: Cursor) -> bool: ...
+
+    def clang_Cursor_isAnonymousRecordDecl(self, arg1: Cursor) -> bool: ...
+
+    def clang_Cursor_isBitField(self, arg1: Cursor) -> bool: ...
+
+    def clang_Location_isInSystemHeader(self, arg1: SourceLocation) -> bool: ...
+
+    def clang_PrintingPolicy_dispose(self, arg1: PrintingPolicy) -> None: ...
+
+    def clang_PrintingPolicy_getProperty(
+        self, arg1: PrintingPolicy, arg2: c_int
+    ) -> c_uint: ...
+
+    def clang_PrintingPolicy_setProperty(
+        self, arg1: PrintingPolicy, arg2: c_int, arg3: c_uint
+    ) -> None: ...
+
+    def clang_Type_getAlignOf(self, arg1: Type) -> c_longlong: ...
+
+    def clang_Type_getClassType(self, arg1: Type) -> Type: ...
+
+    def clang_Type_getNumTemplateArguments(self, arg1: Type) -> c_int: ...
+
+    def clang_Type_getTemplateArgumentAsType(
+        self, arg1: Type, arg2: c_uint
+    ) -> Type: ...
+
+    def clang_Type_getOffsetOf(
+        self, arg1: Type, arg2: c_interop_string
+    ) -> c_longlong: ...
+
+    def clang_Type_getSizeOf(self, arg1: Type) -> c_longlong: ...
+
+    def clang_Type_getCXXRefQualifier(self, arg1: Type) -> c_uint: ...
+
+    def clang_Type_getNamedType(self, arg1: Type) -> Type: ...
+
+    def clang_Type_visitFields(
+        self, arg1: Type, arg2: fields_visit_callback, arg3: py_object
+    ) -> c_uint: ...
 
 
 class LibclangError(Exception):
@@ -4280,7 +4613,7 @@ def register_functions(lib: CDLL, ignore_errors: bool) -> None:
     def register(item: LibFunc) -> None:
         register_function(lib, item, ignore_errors)
 
-    for f in FUNCTION_LIST:
+    for f in _get_annotations():
         register(f)
 
 
@@ -4339,7 +4672,7 @@ def set_compatibility_check(check_status: bool) -> None:
         Config.compatibility_check = check_status
 
     @CachedProperty
-    def lib(self) -> CDLL:
+    def lib(self) -> ClangLib:
         lib = self.get_cindex_library()
         register_functions(lib, not Config.compatibility_check)
         self.null_cursor = lib.clang_getNullCursor()



More information about the cfe-commits mailing list