[KxSerialization] Implemented generation of companions for interfaces

For interfaces with custom serializer (@Serializer(`SerializerType::class)`) now the `serializer()` function is generated in the companion so that user can get a serializer by type

Merge-request: KT-MR-11040
Merged-by: Sergey Shanshin <Sergey.Shanshin@jetbrains.com>
This commit is contained in:
Sergey.Shanshin
2023-07-17 19:44:01 +00:00
committed by Space Team
parent 38b55c659b
commit a45fe2d8a8
8 changed files with 157 additions and 2 deletions
@@ -98,6 +98,15 @@ fun FirClassSymbol<*>.hasSerializableAnnotationWithoutArgs(session: FirSession):
}
} ?: false
fun FirClassSymbol<*>.hasSerializableAnnotationWithArgs(session: FirSession): Boolean {
val annotation = serializableAnnotation(needArguments = false, session) ?: return false
return if (annotation is FirAnnotationCall) {
annotation.arguments.isNotEmpty()
} else {
annotation.argumentMapping.mapping.isNotEmpty()
}
}
internal fun FirBasedSymbol<*>.getSerializableWith(session: FirSession): ConeKotlinType? =
serializableAnnotation(needArguments = true, session)?.getKClassArgument(AnnotationParameterNames.WITH)
@@ -132,6 +141,10 @@ context(FirSession)
internal val FirClassSymbol<*>.isSealedSerializableInterface: Boolean
get() = classKind.isInterface && rawStatus.modality == Modality.SEALED && hasSerializableOrMetaAnnotation
context(FirSession)
internal val FirClassSymbol<*>.isSerializableInterfaceWithCustom: Boolean
get() = classKind.isInterface && hasSerializableAnnotationWithArgs(this@FirSession)
context(FirSession)
val FirClassSymbol<*>.hasSerializableOrMetaAnnotation: Boolean
get() = hasSerializableAnnotation || hasMetaSerializableAnnotation
@@ -146,6 +159,7 @@ internal val FirClassSymbol<*>.shouldHaveGeneratedMethodsInCompanion: Boolean
|| isSerializableEnum
|| (classKind == ClassKind.CLASS && hasSerializableOrMetaAnnotation)
|| isSealedSerializableInterface
|| isSerializableInterfaceWithCustom
context(FirSession)
internal val FirClassSymbol<*>.companionNeedsSerializerFactory: Boolean
@@ -155,6 +169,7 @@ internal val FirClassSymbol<*>.companionNeedsSerializerFactory: Boolean
if (isSerializableEnum) return true
if (isAbstractOrSealedSerializableClass) return true
if (isSealedSerializableInterface) return true
if (isSerializableInterfaceWithCustom) return true
if (typeParameterSymbols.isEmpty()) return false
return true
}