diff --git a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt index 254cbbdd4fa..326556021ad 100644 --- a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt +++ b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt @@ -520,7 +520,17 @@ internal class NativeIndexImpl(val library: NativeLibrary) : NativeIndex() { CXCursorKind.CXCursor_ObjCInterfaceDecl -> ObjCObjectPointer(getObjCClassAt(declaration), nullability, getProtocols(type)) - else -> TODO(declarationKind.toString()) + CXCursorKind.CXCursor_TypedefDecl -> + // typedef to Objective-C class itself, e.g. `typedef NSObject Object;`, + // (as opposed to `typedef NSObject* Object;`). + // Note: it is not yet represented as Kotlin `typealias`. + ObjCObjectPointer( + getObjCClassAt(getTypedefUnderlyingObjCClass(declaration)), + nullability, + getProtocols(type) + ) + + else -> TODO("${declarationKind.toString()} ${clang_getTypeSpelling(type).convertAndDispose()}") } } @@ -536,6 +546,22 @@ internal class NativeIndexImpl(val library: NativeLibrary) : NativeIndex() { } } + private tailrec fun getTypedefUnderlyingObjCClass(typedefDecl: CValue): CValue { + assert(typedefDecl.kind == CXCursorKind.CXCursor_TypedefDecl) + val underlyingType = clang_getTypedefDeclUnderlyingType(typedefDecl) + val underlyingTypeDecl = clang_getTypeDeclaration(underlyingType) + + return when (underlyingTypeDecl.kind) { + CXCursorKind.CXCursor_TypedefDecl -> getTypedefUnderlyingObjCClass(underlyingTypeDecl) + CXCursorKind.CXCursor_ObjCInterfaceDecl -> underlyingTypeDecl + else -> TODO( + """typedef = ${getCursorSpelling(typedefDecl)} + |underlying decl kind = ${underlyingTypeDecl.kind} + |underlying = ${clang_getTypeSpelling(underlyingType).convertAndDispose()}""".trimMargin() + ) + } + } + private fun getNullability( type: CValue, typeAttributes: CValue? ): ObjCPointer.Nullability { diff --git a/backend.native/tests/interop/objc/smoke.h b/backend.native/tests/interop/objc/smoke.h index 19007e38c87..d5c43e0fb48 100644 --- a/backend.native/tests/interop/objc/smoke.h +++ b/backend.native/tests/interop/objc/smoke.h @@ -5,8 +5,10 @@ -(void)print:(const char*)string; @end; +typedef NSString NSStringTypedef; + @interface Foo : NSObject -@property NSString* name; +@property NSStringTypedef* name; -(void)helloWithPrinter:(id )printer; @end;