diff --git a/rd-kt/rd-framework/src/main/kotlin/com/jetbrains/rd/framework/Interfaces.kt b/rd-kt/rd-framework/src/main/kotlin/com/jetbrains/rd/framework/Interfaces.kt index d5f975c8d..bc679eaf3 100644 --- a/rd-kt/rd-framework/src/main/kotlin/com/jetbrains/rd/framework/Interfaces.kt +++ b/rd-kt/rd-framework/src/main/kotlin/com/jetbrains/rd/framework/Interfaces.kt @@ -107,8 +107,16 @@ class LazyCompanionMarshaller( val classLoader: ClassLoader, val fqn: String ) : IMarshaller { + companion object { + private val possibleFields = listOf("Companion", "INSTANCE") + } private val lazy = lazy(LazyThreadSafetyMode.PUBLICATION) { - Class.forName(fqn, true, classLoader).getDeclaredField("Companion").get(null) as IMarshaller + val clazz = Class.forName(fqn, true, classLoader) + val declaredFields = clazz.declaredFields + + declaredFields.firstOrNull { possibleFields.contains(it.name) }?.get(null) as? IMarshaller ?: run { + error("There are none of the fields ${possibleFields.joinToString()} in $clazz") + } } override val _type: KClass<*> diff --git a/rd-kt/rd-gen/src/main/kotlin/com/jetbrains/rd/generator/nova/MarshallersCollector.kt b/rd-kt/rd-gen/src/main/kotlin/com/jetbrains/rd/generator/nova/MarshallersCollector.kt index f211371c1..f120d1cc4 100644 --- a/rd-kt/rd-gen/src/main/kotlin/com/jetbrains/rd/generator/nova/MarshallersCollector.kt +++ b/rd-kt/rd-gen/src/main/kotlin/com/jetbrains/rd/generator/nova/MarshallersCollector.kt @@ -1,20 +1,19 @@ package com.jetbrains.rd.generator.nova -import com.jetbrains.rd.util.hash.getPlatformIndependentHash import java.io.File interface MarshallersCollector { val shouldGenerateRegistrations: Boolean - fun addMarshaller(namespace: String, name: String) + fun addMarshaller(fqn: String, rdid: Long) } object DisabledMarshallersCollector : MarshallersCollector { override val shouldGenerateRegistrations: Boolean get() = true - override fun addMarshaller(namespace: String, name: String) { + override fun addMarshaller(fqn: String, rdid: Long) { } } @@ -24,8 +23,8 @@ class RealMarshallersCollector(val marshallersFile: File) : MarshallersCollector override val shouldGenerateRegistrations: Boolean get() = false // We may want to add a separate setting here, but for now just disable it - override fun addMarshaller(namespace: String, name: String) { - marshallers.add("${name.getPlatformIndependentHash()}:${namespace}.${name}") + override fun addMarshaller(fqn: String, rdid: Long) { + marshallers.add("${rdid}:${fqn}") } fun close() { diff --git a/rd-kt/rd-gen/src/main/kotlin/com/jetbrains/rd/generator/nova/kotlin/Kotlin11Generator.kt b/rd-kt/rd-gen/src/main/kotlin/com/jetbrains/rd/generator/nova/kotlin/Kotlin11Generator.kt index ce5769189..da6b34926 100644 --- a/rd-kt/rd-gen/src/main/kotlin/com/jetbrains/rd/generator/nova/kotlin/Kotlin11Generator.kt +++ b/rd-kt/rd-gen/src/main/kotlin/com/jetbrains/rd/generator/nova/kotlin/Kotlin11Generator.kt @@ -3,6 +3,7 @@ package com.jetbrains.rd.generator.nova.kotlin import com.jetbrains.rd.generator.nova.* import com.jetbrains.rd.generator.nova.Enum import com.jetbrains.rd.generator.nova.FlowKind.* +import com.jetbrains.rd.generator.nova.getSetting import com.jetbrains.rd.generator.nova.kotlin.KotlinSanitizer.sanitize import com.jetbrains.rd.generator.nova.util.capitalizeInvariant import com.jetbrains.rd.generator.nova.util.decapitalizeInvariant @@ -36,6 +37,9 @@ open class Kotlin11Generator( object Intrinsic : SettingWithDefault(KotlinIntrinsicMarshaller.default) + val IDeclaration.marshallerRdid: Long get() = getSetting(Intrinsic)?.rdid ?: name.getPlatformIndependentHash() + val IDeclaration.marshallerFqn: String get() = getSetting(Intrinsic)?.marshallerObjectFqn ?: "${namespace}.${name}" + object Attributes : ISetting, SettingsHolder> object PublicCtors: ISetting @@ -514,12 +518,13 @@ open class Kotlin11Generator( } protected fun PrettyPrinter.companionTrait(decl: Declaration, collector: MarshallersCollector) { + val rdid = decl.marshallerRdid if (decl.isConcrete) { println() - collector.addMarshaller(decl.namespace, decl.name) + collector.addMarshaller(decl.marshallerFqn, rdid) block("companion object : IMarshaller<${decl.name}>") { + "override val _type: KClass<${decl.name}> = ${decl.name}::class" - + "override val id: RdId get() = RdId(${decl.name.getPlatformIndependentHash()})" + + "override val id: RdId get() = RdId(${rdid})" println() readerTrait(decl) println() @@ -542,10 +547,10 @@ open class Kotlin11Generator( } else if (decl.isOpen) { println() - collector.addMarshaller(decl.namespace, decl.name) + collector.addMarshaller(decl.marshallerFqn, rdid) block("companion object : IMarshaller<${decl.name}>, IAbstractDeclaration<${decl.name}>") { +"override val _type: KClass<${decl.name}> = ${decl.name}::class" - +"override val id: RdId get() = RdId(${decl.name.getPlatformIndependentHash()})" + +"override val id: RdId get() = RdId($rdid)" println() readerTrait(decl) println() @@ -614,15 +619,17 @@ open class Kotlin11Generator( block("override fun registerSerializersCore(serializers: ISerializers) ") { var first = true types.filter { !it.isAbstract }.filterIsInstance().forEach { - if (it is Declaration && it.getSetting(Intrinsic) == null) { + if (it is Declaration) { if (first && collector.shouldGenerateRegistrations) { +"val classLoader = javaClass.classLoader" first = false } + val rdid = it.marshallerRdid + val fqn = it.marshallerFqn - collector.addMarshaller(it.namespace, it.name) + collector.addMarshaller(fqn, rdid) if (collector.shouldGenerateRegistrations) { - println("serializers.register(LazyCompanionMarshaller(RdId(${it.name.getPlatformIndependentHash()}), classLoader, \"${it.namespace}.${it.name}\"))") + println("serializers.register(LazyCompanionMarshaller(RdId(${rdid}), classLoader, \"${fqn}\"))") } } else { println("serializers.register(${it.serializerRef(decl, true)})") @@ -631,7 +638,7 @@ open class Kotlin11Generator( if (decl is Root) { decl.toplevels.forEach { - collector.addMarshaller(decl.namespace, decl.name) + collector.addMarshaller(decl.marshallerFqn, it.marshallerRdid) if (collector.shouldGenerateRegistrations) { println(it.sanitizedName(decl) + ".register(serializers)") } @@ -1114,7 +1121,7 @@ open class Kotlin11Generator( constantTrait(decl) println() + "override val _type: KClass<${decl.name}> = ${decl.name}::class" - + "override val id: RdId get() = RdId(${decl.name.getPlatformIndependentHash()})" + + "override val id: RdId get() = RdId(${decl.marshallerRdid})" println() block("override fun read(ctx: SerializationCtx, buffer: AbstractBuffer): ${decl.substitutedName(decl)}") { +"return marshaller.read(ctx, buffer)" diff --git a/rd-kt/rd-gen/src/main/kotlin/com/jetbrains/rd/generator/nova/kotlin/KotlinIntrinsicMarshaller.kt b/rd-kt/rd-gen/src/main/kotlin/com/jetbrains/rd/generator/nova/kotlin/KotlinIntrinsicMarshaller.kt index 630bfba2f..1dd013dd1 100644 --- a/rd-kt/rd-gen/src/main/kotlin/com/jetbrains/rd/generator/nova/kotlin/KotlinIntrinsicMarshaller.kt +++ b/rd-kt/rd-gen/src/main/kotlin/com/jetbrains/rd/generator/nova/kotlin/KotlinIntrinsicMarshaller.kt @@ -4,7 +4,7 @@ package com.jetbrains.rd.generator.nova.kotlin /** * [marshallerObjectFqn] Fqn of object: inheritor of IMarshaller */ -data class KotlinIntrinsicMarshaller(val marshallerObjectFqn:String?) { +data class KotlinIntrinsicMarshaller(val marshallerObjectFqn:String?, val rdid: Long? = null) { companion object { val default = KotlinIntrinsicMarshaller(null) }