Coverage Summary for Class: FragmentedSerializeEmitter (com.ghost.serialization.compiler)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| FragmentedSerializeEmitter |
0%
(0/1)
|
0%
(0/3)
|
0%
(0/4)
|
0%
(0/32)
|
0%
(0/190)
|
package com.ghost.serialization.compiler
import com.ghost.serialization.compiler.GhostEmitterConstants as C
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.FunSpec
import com.squareup.kotlinpoet.KModifier
import com.squareup.kotlinpoet.TypeSpec
/**
* Emitter for fragmented serialization logic.
*
* Used for large classes to avoid JVM method size limits by splitting
* the writing logic into multiple private "chunk" functions.
*/
internal class FragmentedSerializeEmitter(
properties: List<GhostPropertyModel>,
originalClassName: ClassName,
writerClass: ClassName
) : BaseSerializeEmitter(properties, originalClassName, writerClass) {
/**
* Emits the fragmented chunk-based serialization logic.
*
* @param code The target [CodeBlock.Builder].
* @param typeSpecBuilder The KotlinPoet companion [TypeSpec.Builder].
* @param discriminator Optional polymorphic sealed class discriminator value.
* @param sealedDiscriminatorKey Discriminator key name.
*/
fun emit(
code: CodeBlock.Builder,
typeSpecBuilder: TypeSpec.Builder,
discriminator: String?,
sealedDiscriminatorKey: String
) {
code.addStatement(C.STR_WRITER_BEGIN_OBJ)
val hasDiscriminatorProperty = properties.any { it.jsonName == sealedDiscriminatorKey }
if (discriminator != null && !hasDiscriminatorProperty) {
code.addStatement(
C.STR_WRITER_NAME_TYPE_VAL,
sealedDiscriminatorKey,
discriminator
)
}
val chunks = properties.chunked(C.DEFAULT_CHUNK_SIZE)
val writerSuffix = writerClass.simpleName
chunks.forEachIndexed { index, chunkProps ->
val chunkFunName = C.TEMPLATE_CHUNK_FUN_NAME
.format(C.STR_SERIALIZE_CHUNK_PREFIX, index, writerSuffix)
emitChunkFunction(index, chunkProps, typeSpecBuilder, writerSuffix)
code.addStatement(C.TEMPLATE_CHUNK_CALL_WRITER, chunkFunName)
}
code.addStatement(C.STR_WRITER_END_OBJ)
}
/**
* Generates a private chunk serialization method.
*/
private fun emitChunkFunction(
index: Int,
chunkProps: List<GhostPropertyModel>,
typeSpecBuilder: TypeSpec.Builder,
writerSuffix: String
) {
val chunkFun = FunSpec
.builder(
C.TEMPLATE_CHUNK_FUN_NAME.format(
C.STR_SERIALIZE_CHUNK_PREFIX,
index,
writerSuffix
)
)
.addModifiers(KModifier.PRIVATE)
.addParameter(C.STR_PARAM_WRITER, writerClass)
.addParameter(C.STR_PARAM_VALUE, originalClassName)
val chunkCode = CodeBlock.builder()
chunkProps.forEach { prop ->
emitProperty(chunkCode, prop)
}
chunkFun.addCode(chunkCode.build())
typeSpecBuilder.addFunction(chunkFun.build())
}
}