committed by
SvyatoslavScherbina
parent
0f20feb544
commit
8bd0bb63c9
-31
@@ -137,43 +137,12 @@ internal class NativeIndexImpl(val library: NativeLibrary) : NativeIndex() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun builtinVaListType(type: CValue<CXType>, name: String, underlying: Type): Type {
|
|
||||||
assert (type.kind == CXType_Typedef)
|
|
||||||
val declarationId = DeclarationID("c:@T@$name")
|
|
||||||
|
|
||||||
val structDeclaration = structById.getOrPut(declarationId) {
|
|
||||||
StructDeclImpl(name).apply {
|
|
||||||
val size = clang_Type_getSizeOf(type)
|
|
||||||
val align = clang_Type_getAlignOf(type).toInt()
|
|
||||||
val def = StructDefImpl(size, align, this, hasNaturalLayout = false)
|
|
||||||
this.def = def
|
|
||||||
}
|
|
||||||
}
|
|
||||||
assert (underlying is ConstArrayType)
|
|
||||||
// So the result must feel like array:
|
|
||||||
return ConstArrayType(RecordType(structDeclaration), 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getTypedef(type: CValue<CXType>): Type {
|
fun getTypedef(type: CValue<CXType>): Type {
|
||||||
val declCursor = clang_getTypeDeclaration(type)
|
val declCursor = clang_getTypeDeclaration(type)
|
||||||
val name = getCursorSpelling(declCursor)
|
val name = getCursorSpelling(declCursor)
|
||||||
|
|
||||||
val underlying = convertType(clang_getTypedefDeclUnderlyingType(declCursor))
|
val underlying = convertType(clang_getTypedefDeclUnderlyingType(declCursor))
|
||||||
|
|
||||||
if (name == "__builtin_va_list" && underlying is ConstArrayType) {
|
|
||||||
// On some platforms (e.g. macOS) libclang reports `__builtin_va_list` to be defined as array using
|
|
||||||
// typedef struct __va_list_tag __builtin_va_list[1]
|
|
||||||
// while `struct __va_list_tag` is incomplete.
|
|
||||||
// So `__builtin_va_list` gets declared as incorrect type, and requires some dirty hacks:
|
|
||||||
return builtinVaListType(type, name, underlying)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (name == "__gnuc_va_list" || name == "va_list" || name == "__va_list") {
|
|
||||||
// TODO: fix GNUC varargs support.
|
|
||||||
return UnsupportedType
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((underlying is RecordType && underlying.decl.spelling.split(' ').last() == name) ||
|
if ((underlying is RecordType && underlying.decl.spelling.split(' ').last() == name) ||
|
||||||
(underlying is EnumType && underlying.def.spelling.split(' ').last() == name)) {
|
(underlying is EnumType && underlying.def.spelling.split(' ').last() == name)) {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user