diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt index 4e7e660d0cc..f36e21a2040 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt @@ -574,7 +574,8 @@ private class ObjCPropertyStubBuilder( is ObjCClassOrProtocol -> null is ObjCCategory -> ClassifierStubType(context.getKotlinClassFor(container.clazz, isMeta = property.getter.isClass)) } - return listOf(PropertyStub(property.name, kotlinType.toStubIrType(), kind, modality, receiver)) + val origin = StubOrigin.ObjCProperty(property, container) + return listOf(PropertyStub(property.name, kotlinType.toStubIrType(), kind, modality, receiver, origin = origin)) } } diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIr.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIr.kt index f3cb78c9dad..9f743bd467d 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIr.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIr.kt @@ -88,6 +88,11 @@ sealed class StubOrigin { val container: ObjCContainer ) : StubOrigin() + class ObjCProperty( + val property: org.jetbrains.kotlin.native.interop.indexer.ObjCProperty, + val container: ObjCContainer + ) : StubOrigin() + class ObjCClass( val clazz: org.jetbrains.kotlin.native.interop.indexer.ObjCClass ) : StubOrigin() @@ -103,6 +108,10 @@ sealed class StubOrigin { class FunctionParameter(val parameter: Parameter) : StubOrigin() class Struct(val struct: StructDecl) : StubOrigin() + + class Constant(val constantDef: ConstantDef): StubOrigin() + + class Global(val global: GlobalDecl) : StubOrigin() } interface StubElementWithOrigin : StubIrElement { @@ -178,7 +187,8 @@ class PropertyStub( val kind: Kind, val modality: MemberStubModality = MemberStubModality.FINAL, val receiverType: StubType? = null, - override val annotations: List = emptyList() + override val annotations: List = emptyList(), + val origin: StubOrigin ) : StubIrElement, AnnotationHolder { sealed class Kind { class Val( diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrElementBuilders.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrElementBuilders.kt index f6532cd0128..9aff6dcfa66 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrElementBuilders.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrElementBuilders.kt @@ -13,16 +13,17 @@ internal class MacroConstantStubBuilder( ) : StubElementBuilder { override fun build(): List { val kotlinName = constant.name + val origin = StubOrigin.Constant(constant) val declaration = when (constant) { is IntegerConstantDef -> { val literal = context.tryCreateIntegralStub(constant.type, constant.value) ?: return emptyList() val kotlinType = context.mirror(constant.type).argType.toStubIrType() when (context.platform) { - KotlinPlatform.NATIVE -> PropertyStub(kotlinName, kotlinType, PropertyStub.Kind.Constant(literal)) + KotlinPlatform.NATIVE -> PropertyStub(kotlinName, kotlinType, PropertyStub.Kind.Constant(literal), origin = origin) // No reason to make it const val with backing field on Kotlin/JVM yet: KotlinPlatform.JVM -> { val getter = PropertyAccessor.Getter.SimpleGetter(constant = literal) - PropertyStub(kotlinName, kotlinType, PropertyStub.Kind.Val(getter)) + PropertyStub(kotlinName, kotlinType, PropertyStub.Kind.Val(getter), origin = origin) } } } @@ -30,13 +31,13 @@ internal class MacroConstantStubBuilder( val literal = context.tryCreateDoubleStub(constant.type, constant.value) ?: return emptyList() val kotlinType = context.mirror(constant.type).argType.toStubIrType() val getter = PropertyAccessor.Getter.SimpleGetter(constant = literal) - PropertyStub(kotlinName, kotlinType, PropertyStub.Kind.Val(getter)) + PropertyStub(kotlinName, kotlinType, PropertyStub.Kind.Val(getter), origin = origin) } is StringConstantDef -> { val literal = StringConstantStub(constant.value.quoteAsKotlinLiteral()) val kotlinType = KotlinTypes.string.toStubIrType() val getter = PropertyAccessor.Getter.SimpleGetter(constant = literal) - PropertyStub(kotlinName, kotlinType, PropertyStub.Kind.Val(getter)) + PropertyStub(kotlinName, kotlinType, PropertyStub.Kind.Val(getter), origin = origin) } else -> return emptyList() } @@ -72,6 +73,7 @@ internal class StructStubBuilder( val offset = field.offset / 8 val fieldRefType = context.mirror(field.type) val unwrappedFieldType = field.type.unwrapTypedefs() + val origin = StubOrigin.None if (unwrappedFieldType is ArrayType) { val type = (fieldRefType as TypeMirror.ByValue).valueType val annotations = if (platform == KotlinPlatform.JVM) { @@ -83,7 +85,7 @@ internal class StructStubBuilder( } val kind = PropertyStub.Kind.Val(PropertyAccessor.Getter.ArrayMemberAt(offset)) // TODO: Should receiver be added? - PropertyStub(field.name, type.toStubIrType(), kind, annotations = annotations) + PropertyStub(field.name, type.toStubIrType(), kind, annotations = annotations, origin = origin) } else { val pointedType = fieldRefType.pointedType.toStubIrType() val pointedTypeArgument = TypeArgumentStub(pointedType) @@ -92,10 +94,10 @@ internal class StructStubBuilder( PropertyAccessor.Getter.MemberAt(offset, typeArguments = listOf(pointedTypeArgument), hasValueAccessor = true), PropertyAccessor.Setter.MemberAt(offset, typeArguments = listOf(pointedTypeArgument)) ) - PropertyStub(field.name, fieldRefType.argType.toStubIrType(), kind) + PropertyStub(field.name, fieldRefType.argType.toStubIrType(), kind, origin = origin) } else { val kind = PropertyStub.Kind.Val(PropertyAccessor.Getter.MemberAt(offset, hasValueAccessor = false)) - PropertyStub(field.name, pointedType, kind) + PropertyStub(field.name, pointedType, kind, origin = origin) } } } catch (e: Throwable) { @@ -113,7 +115,7 @@ internal class StructStubBuilder( context.bridgeComponentsBuilder.getterToBridgeInfo[readBits] = BridgeGenerationInfo("", typeInfo) context.bridgeComponentsBuilder.setterToBridgeInfo[writeBits] = BridgeGenerationInfo("", typeInfo) val kind = PropertyStub.Kind.Var(readBits, writeBits) - PropertyStub(field.name, kotlinType.toStubIrType(), kind) + PropertyStub(field.name, kotlinType.toStubIrType(), kind, origin = StubOrigin.None) } val superClass = context.platform.getRuntimeType("CStructVar") @@ -276,7 +278,8 @@ internal class EnumStubBuilder( kotlinType.toStubIrType(), kind, MemberStubModality.FINAL, - null + null, + origin = StubOrigin.None ) } val container = SimpleStubContainer( @@ -436,6 +439,7 @@ internal class GlobalStubBuilder( override fun build(): List { val mirror = context.mirror(global.type) val unwrappedType = global.type.unwrapTypedefs() + val origin = StubOrigin.Global(global) val kotlinType: KotlinType val kind: PropertyStub.Kind @@ -490,7 +494,7 @@ internal class GlobalStubBuilder( } } } - return listOf(PropertyStub(global.name, kotlinType.toStubIrType(), kind)) + return listOf(PropertyStub(global.name, kotlinType.toStubIrType(), kind, origin = origin)) } }