[StubIr] StubOrigin improvements
1. Add `isMeta` to StubOrigin.ObjCClass and StubOrigin.ObjCProtocol. It allows to provide proper UniqId to corresponding ClassStubs. 2. Rename StubOrigin.None to StubOrigin.Synthetic because it is makes name self-explaining.
This commit is contained in:
committed by
Sergey Bogolepov
parent
0438c7cf85
commit
47fe152748
+7
-4
@@ -166,7 +166,7 @@ private class ObjCMethodStubBuilder(
|
|||||||
context.configuration.disableDesignatedInitializerChecks
|
context.configuration.disableDesignatedInitializerChecks
|
||||||
|
|
||||||
val annotations = listOf(AnnotationStub.ObjC.Constructor(method.selector, designated))
|
val annotations = listOf(AnnotationStub.ObjC.Constructor(method.selector, designated))
|
||||||
val constructor = ConstructorStub(parameters, annotations, isPrimary = false)
|
val constructor = ConstructorStub(parameters, annotations, isPrimary = false, origin = origin)
|
||||||
constructor
|
constructor
|
||||||
}
|
}
|
||||||
is ObjCCategory -> {
|
is ObjCCategory -> {
|
||||||
@@ -206,7 +206,7 @@ private class ObjCMethodStubBuilder(
|
|||||||
receiver = receiver,
|
receiver = receiver,
|
||||||
typeParameters = listOf(typeParameter),
|
typeParameters = listOf(typeParameter),
|
||||||
external = true,
|
external = true,
|
||||||
origin = StubOrigin.Synthetic,
|
origin = StubOrigin.ObjCCategoryInitMethod(method),
|
||||||
annotations = annotations,
|
annotations = annotations,
|
||||||
modality = MemberStubModality.FINAL
|
modality = MemberStubModality.FINAL
|
||||||
)
|
)
|
||||||
@@ -434,7 +434,10 @@ internal abstract class ObjCContainerStubBuilder(
|
|||||||
val defaultConstructor = if (container is ObjCClass && methodToStub.values.none { it.isDefaultConstructor() }) {
|
val defaultConstructor = if (container is ObjCClass && methodToStub.values.none { it.isDefaultConstructor() }) {
|
||||||
// Always generate default constructor.
|
// Always generate default constructor.
|
||||||
// If it is not produced for an init method, then include it manually:
|
// If it is not produced for an init method, then include it manually:
|
||||||
ConstructorStub(isPrimary = false, visibility = VisibilityModifier.PROTECTED)
|
ConstructorStub(
|
||||||
|
isPrimary = false,
|
||||||
|
visibility = VisibilityModifier.PROTECTED,
|
||||||
|
origin = StubOrigin.SyntheticDefaultConstructor)
|
||||||
} else null
|
} else null
|
||||||
|
|
||||||
return Pair(
|
return Pair(
|
||||||
@@ -482,7 +485,7 @@ internal class ObjCProtocolStubBuilder(
|
|||||||
private val protocol: ObjCProtocol
|
private val protocol: ObjCProtocol
|
||||||
) : ObjCClassOrProtocolStubBuilder(context, protocol), StubElementBuilder {
|
) : ObjCClassOrProtocolStubBuilder(context, protocol), StubElementBuilder {
|
||||||
override fun build(): List<StubIrElement> {
|
override fun build(): List<StubIrElement> {
|
||||||
val classStub = buildClassStub(StubOrigin.ObjCProtocol(protocol))
|
val classStub = buildClassStub(StubOrigin.ObjCProtocol(protocol, isMeta = false))
|
||||||
return listOf(*metaContainerStub!!.build().toTypedArray(), classStub)
|
return listOf(*metaContainerStub!!.build().toTypedArray(), classStub)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+19
-6
@@ -91,7 +91,17 @@ sealed class StubOrigin {
|
|||||||
/**
|
/**
|
||||||
* Special case when element of IR was generated.
|
* Special case when element of IR was generated.
|
||||||
*/
|
*/
|
||||||
object None : StubOrigin()
|
// TODO: All "synthetic" cases should be handled separately.
|
||||||
|
object Synthetic : StubOrigin()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Denotes default constructor that was generated and has no real origin.
|
||||||
|
*/
|
||||||
|
object SyntheticDefaultConstructor : StubOrigin()
|
||||||
|
|
||||||
|
class ObjCCategoryInitMethod(
|
||||||
|
val method: org.jetbrains.kotlin.native.interop.indexer.ObjCMethod
|
||||||
|
) : StubOrigin()
|
||||||
|
|
||||||
class ObjCMethod(
|
class ObjCMethod(
|
||||||
val method: org.jetbrains.kotlin.native.interop.indexer.ObjCMethod,
|
val method: org.jetbrains.kotlin.native.interop.indexer.ObjCMethod,
|
||||||
@@ -104,11 +114,13 @@ sealed class StubOrigin {
|
|||||||
) : StubOrigin()
|
) : StubOrigin()
|
||||||
|
|
||||||
class ObjCClass(
|
class ObjCClass(
|
||||||
val clazz: org.jetbrains.kotlin.native.interop.indexer.ObjCClass
|
val clazz: org.jetbrains.kotlin.native.interop.indexer.ObjCClass,
|
||||||
|
val isMeta: Boolean
|
||||||
) : StubOrigin()
|
) : StubOrigin()
|
||||||
|
|
||||||
class ObjCProtocol(
|
class ObjCProtocol(
|
||||||
val protocol: org.jetbrains.kotlin.native.interop.indexer.ObjCProtocol
|
val protocol: org.jetbrains.kotlin.native.interop.indexer.ObjCProtocol,
|
||||||
|
val isMeta: Boolean
|
||||||
) : StubOrigin()
|
) : StubOrigin()
|
||||||
|
|
||||||
class Enum(val enum: EnumDef) : StubOrigin()
|
class Enum(val enum: EnumDef) : StubOrigin()
|
||||||
@@ -270,7 +282,7 @@ sealed class ClassStub : StubContainer(), StubElementWithOrigin, AnnotationHolde
|
|||||||
override val superClassInit: SuperClassInit? = null,
|
override val superClassInit: SuperClassInit? = null,
|
||||||
override val interfaces: List<StubType> = emptyList(),
|
override val interfaces: List<StubType> = emptyList(),
|
||||||
override val properties: List<PropertyStub> = emptyList(),
|
override val properties: List<PropertyStub> = emptyList(),
|
||||||
override val origin: StubOrigin = StubOrigin.None,
|
override val origin: StubOrigin = StubOrigin.Synthetic,
|
||||||
override val annotations: List<AnnotationStub> = emptyList(),
|
override val annotations: List<AnnotationStub> = emptyList(),
|
||||||
override val childrenClasses: List<ClassStub> = emptyList(),
|
override val childrenClasses: List<ClassStub> = emptyList(),
|
||||||
override val simpleContainers: List<SimpleStubContainer> = emptyList()
|
override val simpleContainers: List<SimpleStubContainer> = emptyList()
|
||||||
@@ -316,7 +328,7 @@ class FunctionParameterStub(
|
|||||||
val type: StubType,
|
val type: StubType,
|
||||||
override val annotations: List<AnnotationStub> = emptyList(),
|
override val annotations: List<AnnotationStub> = emptyList(),
|
||||||
val isVararg: Boolean = false,
|
val isVararg: Boolean = false,
|
||||||
val origin: StubOrigin = StubOrigin.None
|
val origin: StubOrigin = StubOrigin.Synthetic
|
||||||
) : AnnotationHolder
|
) : AnnotationHolder
|
||||||
|
|
||||||
enum class MemberStubModality {
|
enum class MemberStubModality {
|
||||||
@@ -430,7 +442,8 @@ class ConstructorStub(
|
|||||||
override val parameters: List<FunctionParameterStub> = emptyList(),
|
override val parameters: List<FunctionParameterStub> = emptyList(),
|
||||||
override val annotations: List<AnnotationStub> = emptyList(),
|
override val annotations: List<AnnotationStub> = emptyList(),
|
||||||
val isPrimary: Boolean,
|
val isPrimary: Boolean,
|
||||||
val visibility: VisibilityModifier = VisibilityModifier.PUBLIC
|
val visibility: VisibilityModifier = VisibilityModifier.PUBLIC,
|
||||||
|
val origin: StubOrigin
|
||||||
) : FunctionalStub {
|
) : FunctionalStub {
|
||||||
|
|
||||||
override fun <T, R> accept(visitor: StubIrVisitor<T, R>, data: T) =
|
override fun <T, R> accept(visitor: StubIrVisitor<T, R>, data: T) =
|
||||||
|
|||||||
+2
-1
@@ -73,7 +73,8 @@ class StubIrBridgeBuilder(
|
|||||||
|
|
||||||
override fun visitClass(element: ClassStub, owner: StubContainer?) {
|
override fun visitClass(element: ClassStub, owner: StubContainer?) {
|
||||||
element.annotations.filterIsInstance<AnnotationStub.ObjC.ExternalClass>().firstOrNull()?.let {
|
element.annotations.filterIsInstance<AnnotationStub.ObjC.ExternalClass>().firstOrNull()?.let {
|
||||||
if (it.protocolGetter.isNotEmpty() && element.origin is StubOrigin.ObjCProtocol) {
|
val origin = element.origin
|
||||||
|
if (it.protocolGetter.isNotEmpty() && origin is StubOrigin.ObjCProtocol && !origin.isMeta) {
|
||||||
val protocol = (element.origin as StubOrigin.ObjCProtocol).protocol
|
val protocol = (element.origin as StubOrigin.ObjCProtocol).protocol
|
||||||
// TODO: handle the case when protocol getter stub can't be compiled.
|
// TODO: handle the case when protocol getter stub can't be compiled.
|
||||||
generateProtocolGetter(it.protocolGetter, protocol)
|
generateProtocolGetter(it.protocolGetter, protocol)
|
||||||
|
|||||||
+12
-9
@@ -73,7 +73,7 @@ internal class StructStubBuilder(
|
|||||||
val offset = field.offset / 8
|
val offset = field.offset / 8
|
||||||
val fieldRefType = context.mirror(field.type)
|
val fieldRefType = context.mirror(field.type)
|
||||||
val unwrappedFieldType = field.type.unwrapTypedefs()
|
val unwrappedFieldType = field.type.unwrapTypedefs()
|
||||||
val origin = StubOrigin.None
|
val origin = StubOrigin.Synthetic
|
||||||
if (unwrappedFieldType is ArrayType) {
|
if (unwrappedFieldType is ArrayType) {
|
||||||
val type = (fieldRefType as TypeMirror.ByValue).valueType
|
val type = (fieldRefType as TypeMirror.ByValue).valueType
|
||||||
val annotations = if (platform == KotlinPlatform.JVM) {
|
val annotations = if (platform == KotlinPlatform.JVM) {
|
||||||
@@ -115,16 +115,18 @@ internal class StructStubBuilder(
|
|||||||
context.bridgeComponentsBuilder.getterToBridgeInfo[readBits] = BridgeGenerationInfo("", typeInfo)
|
context.bridgeComponentsBuilder.getterToBridgeInfo[readBits] = BridgeGenerationInfo("", typeInfo)
|
||||||
context.bridgeComponentsBuilder.setterToBridgeInfo[writeBits] = BridgeGenerationInfo("", typeInfo)
|
context.bridgeComponentsBuilder.setterToBridgeInfo[writeBits] = BridgeGenerationInfo("", typeInfo)
|
||||||
val kind = PropertyStub.Kind.Var(readBits, writeBits)
|
val kind = PropertyStub.Kind.Var(readBits, writeBits)
|
||||||
PropertyStub(field.name, kotlinType.toStubIrType(), kind, origin = StubOrigin.None)
|
PropertyStub(field.name, kotlinType.toStubIrType(), kind, origin = StubOrigin.Synthetic)
|
||||||
}
|
}
|
||||||
|
|
||||||
val superClass = context.platform.getRuntimeType("CStructVar")
|
val superClass = context.platform.getRuntimeType("CStructVar")
|
||||||
require(superClass is ClassifierStubType)
|
require(superClass is ClassifierStubType)
|
||||||
val rawPtrConstructorParam = FunctionParameterStub("rawPtr", context.platform.getRuntimeType("NativePtr"))
|
val rawPtrConstructorParam = FunctionParameterStub("rawPtr", context.platform.getRuntimeType("NativePtr"))
|
||||||
|
val origin = StubOrigin.Struct(decl)
|
||||||
val primaryConstructor = ConstructorStub(
|
val primaryConstructor = ConstructorStub(
|
||||||
parameters = listOf(rawPtrConstructorParam),
|
parameters = listOf(rawPtrConstructorParam),
|
||||||
isPrimary = true,
|
isPrimary = true,
|
||||||
annotations = emptyList()
|
annotations = emptyList(),
|
||||||
|
origin = origin
|
||||||
)
|
)
|
||||||
val superClassInit = SuperClassInit(superClass, listOf(GetConstructorParameter(rawPtrConstructorParam)))
|
val superClassInit = SuperClassInit(superClass, listOf(GetConstructorParameter(rawPtrConstructorParam)))
|
||||||
|
|
||||||
@@ -136,7 +138,7 @@ internal class StructStubBuilder(
|
|||||||
|
|
||||||
return listOf(ClassStub.Simple(
|
return listOf(ClassStub.Simple(
|
||||||
classifier,
|
classifier,
|
||||||
origin = StubOrigin.Struct(decl),
|
origin = origin,
|
||||||
properties = fields.filterNotNull() + if (platform == KotlinPlatform.NATIVE) bitFields else emptyList(),
|
properties = fields.filterNotNull() + if (platform == KotlinPlatform.NATIVE) bitFields else emptyList(),
|
||||||
constructors = listOf(primaryConstructor),
|
constructors = listOf(primaryConstructor),
|
||||||
methods = emptyList(),
|
methods = emptyList(),
|
||||||
@@ -182,7 +184,7 @@ internal class StructStubBuilder(
|
|||||||
val rawPtrConstructorParam = FunctionParameterStub("rawPtr", context.platform.getRuntimeType("NativePtr"))
|
val rawPtrConstructorParam = FunctionParameterStub("rawPtr", context.platform.getRuntimeType("NativePtr"))
|
||||||
val superClassInit = SuperClassInit(superClass, listOf(GetConstructorParameter(rawPtrConstructorParam)))
|
val superClassInit = SuperClassInit(superClass, listOf(GetConstructorParameter(rawPtrConstructorParam)))
|
||||||
val origin = StubOrigin.Struct(s)
|
val origin = StubOrigin.Struct(s)
|
||||||
val primaryConstructor = ConstructorStub(listOf(rawPtrConstructorParam), emptyList(), isPrimary = true)
|
val primaryConstructor = ConstructorStub(listOf(rawPtrConstructorParam), emptyList(), isPrimary = true, origin = origin)
|
||||||
listOf(ClassStub.Simple(
|
listOf(ClassStub.Simple(
|
||||||
classifier,
|
classifier,
|
||||||
ClassStubModality.NONE,
|
ClassStubModality.NONE,
|
||||||
@@ -213,7 +215,7 @@ internal class EnumStubBuilder(
|
|||||||
type = baseType,
|
type = baseType,
|
||||||
kind = PropertyStub.Kind.Val(PropertyAccessor.Getter.GetConstructorParameter(constructorParameter)),
|
kind = PropertyStub.Kind.Val(PropertyAccessor.Getter.GetConstructorParameter(constructorParameter)),
|
||||||
modality = MemberStubModality.OVERRIDE,
|
modality = MemberStubModality.OVERRIDE,
|
||||||
origin = StubOrigin.None)
|
origin = StubOrigin.Synthetic)
|
||||||
|
|
||||||
val canonicalsByValue = enumDef.constants
|
val canonicalsByValue = enumDef.constants
|
||||||
.groupingBy { it.value }
|
.groupingBy { it.value }
|
||||||
@@ -232,11 +234,12 @@ internal class EnumStubBuilder(
|
|||||||
val aliases = aliasConstants.filter { it.value == constant.value }.map { EnumEntryStub.Alias(it.name) }
|
val aliases = aliasConstants.filter { it.value == constant.value }.map { EnumEntryStub.Alias(it.name) }
|
||||||
EnumEntryStub(constant.name, literal, aliases)
|
EnumEntryStub(constant.name, literal, aliases)
|
||||||
}
|
}
|
||||||
val primaryConstructor = ConstructorStub(listOf(constructorParameter), emptyList(), isPrimary = true)
|
val origin = StubOrigin.Enum(enumDef)
|
||||||
|
val primaryConstructor = ConstructorStub(listOf(constructorParameter), emptyList(), isPrimary = true, origin = origin)
|
||||||
val enum = ClassStub.Enum(clazz, canonicalEntries,
|
val enum = ClassStub.Enum(clazz, canonicalEntries,
|
||||||
constructors = listOf(primaryConstructor),
|
constructors = listOf(primaryConstructor),
|
||||||
properties = listOf(valueProperty),
|
properties = listOf(valueProperty),
|
||||||
origin = StubOrigin.Enum(enumDef),
|
origin = origin,
|
||||||
interfaces = listOf(context.platform.getRuntimeType("CEnum"))
|
interfaces = listOf(context.platform.getRuntimeType("CEnum"))
|
||||||
)
|
)
|
||||||
context.bridgeComponentsBuilder.enumToTypeMirror[enum] = baseTypeMirror
|
context.bridgeComponentsBuilder.enumToTypeMirror[enum] = baseTypeMirror
|
||||||
@@ -299,7 +302,7 @@ internal class EnumStubBuilder(
|
|||||||
kind,
|
kind,
|
||||||
MemberStubModality.FINAL,
|
MemberStubModality.FINAL,
|
||||||
null,
|
null,
|
||||||
origin = StubOrigin.None
|
origin = StubOrigin.Synthetic
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
val container = SimpleStubContainer(
|
val container = SimpleStubContainer(
|
||||||
|
|||||||
Reference in New Issue
Block a user