Add SerializerFactory supertype for Native & JS in FIR serialization plugin.
This supertype is intended to be used with @AssociatedObject on platforms where reflection possibilities are limited.
This commit is contained in:
@@ -10,6 +10,8 @@ dependencies {
|
||||
compileOnly(project(":compiler:fir:tree"))
|
||||
compileOnly(project(":compiler:fir:resolve"))
|
||||
compileOnly(project(":compiler:fir:entrypoint"))
|
||||
compileOnly(project(":js:js.config"))
|
||||
compileOnly(project(":compiler:cli-common"))
|
||||
|
||||
implementation(project(":kotlinx-serialization-compiler-plugin.common"))
|
||||
|
||||
|
||||
+17
@@ -32,7 +32,10 @@ import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.SpecialNames
|
||||
import org.jetbrains.kotlin.platform.js.isJs
|
||||
import org.jetbrains.kotlin.platform.konan.isNative
|
||||
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames
|
||||
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.SERIALIZER_FACTORY_INTERFACE_NAME
|
||||
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializationPackages
|
||||
|
||||
val generatedSerializerClassId = ClassId(SerializationPackages.internalPackageFqName, SerialEntityNames.GENERATED_SERIALIZER_CLASS)
|
||||
@@ -321,6 +324,10 @@ class SerializationFirResolveExtension(session: FirSession) : FirDeclarationGene
|
||||
name = SpecialNames.DEFAULT_NAME_FOR_COMPANION_OBJECT
|
||||
symbol = FirRegularClassSymbol(classId)
|
||||
superTypeRefs += session.builtinTypes.anyType
|
||||
if (owner.companionNeedsSerializerFactory()) {
|
||||
val serializerFactoryClassId = ClassId(SerializationPackages.internalPackageFqName, SERIALIZER_FACTORY_INTERFACE_NAME)
|
||||
superTypeRefs += serializerFactoryClassId.constructClassLikeType(emptyArray(), false).toFirResolvedTypeRef()
|
||||
}
|
||||
}
|
||||
return regularClass.symbol
|
||||
}
|
||||
@@ -328,4 +335,14 @@ class SerializationFirResolveExtension(session: FirSession) : FirDeclarationGene
|
||||
override fun FirDeclarationPredicateRegistrar.registerPredicates() {
|
||||
register(FirSerializationPredicates.annotatedWithSerializable)
|
||||
}
|
||||
|
||||
private fun FirClassSymbol<*>.companionNeedsSerializerFactory(): Boolean {
|
||||
if (!(moduleData.platform.isNative() || moduleData.platform.isJs())) return false
|
||||
if (isSerializableObject) return true
|
||||
if (isSerializableEnum) return true
|
||||
if (isAbstractOrSealedSerializableClass) return true
|
||||
if (isSealedSerializableInterface) return true
|
||||
if (typeParameterSymbols.isEmpty()) return false
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -157,6 +157,9 @@ internal val FirClassSymbol<*>.isInternalSerializable: Boolean
|
||||
return hasSerializableAnnotationWithoutArgs
|
||||
}
|
||||
|
||||
internal val FirClassSymbol<*>.isAbstractOrSealedSerializableClass: Boolean
|
||||
get() = isInternalSerializable && (rawStatus.modality == Modality.ABSTRACT || rawStatus.modality == Modality.SEALED)
|
||||
|
||||
internal val FirClassSymbol<*>.isInternallySerializableEnum: Boolean
|
||||
get() = classKind.isEnumClass && hasSerializableAnnotationWithoutArgs
|
||||
|
||||
|
||||
Reference in New Issue
Block a user