Translate KClass references to built-in types in serialization plugin correctly.
Add overload with ClassDescriptor to `getPrimitiveClass` translation function and increase it visibility to public to be usable from plugin.
This commit is contained in:
+3
-8
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.js.backend.ast.*
|
||||
import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi
|
||||
import org.jetbrains.kotlin.js.translate.context.TranslationContext
|
||||
import org.jetbrains.kotlin.js.translate.expression.ExpressionVisitor
|
||||
import org.jetbrains.kotlin.js.translate.expression.translateAndAliasParameters
|
||||
import org.jetbrains.kotlin.js.translate.reference.ReferenceTranslator
|
||||
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils
|
||||
@@ -147,14 +148,14 @@ internal fun SerializerJsTranslator.serializerInstance(
|
||||
return context.serializerObjectGetter(serializerClass)
|
||||
} else {
|
||||
var args = if (serializerClass.classId == enumSerializerId || serializerClass.classId == contextSerializerId)
|
||||
listOf(createGetKClassExpression(kType.toClassDescriptor!!))
|
||||
listOf(ExpressionVisitor.getObjectKClass(context, kType.toClassDescriptor!!))
|
||||
else kType.arguments.map {
|
||||
val argSer = findTypeSerializerOrContext(module, it.type, sourceElement = serializerClass.findPsi())
|
||||
val expr = serializerInstance(argSer, module, it.type, it.type.genericIndex) ?: return null
|
||||
if (it.type.isMarkedNullable) JsNew(nullableSerClass, listOf(expr)) else expr
|
||||
}
|
||||
if (serializerClass.classId == referenceArraySerializerId)
|
||||
args = listOf(createGetKClassExpression(kType.arguments[0].type.toClassDescriptor!!)) + args
|
||||
args = listOf(ExpressionVisitor.getObjectKClass(context, kType.arguments[0].type.toClassDescriptor!!)) + args
|
||||
val serializable = getSerializableClassDescriptorBySerializer(serializerClass)
|
||||
val ref = if (serializable?.declaredTypeParameters?.isNotEmpty() == true) {
|
||||
val desc = requireNotNull(
|
||||
@@ -171,12 +172,6 @@ internal fun SerializerJsTranslator.serializerInstance(
|
||||
}
|
||||
}
|
||||
|
||||
internal fun SerializerJsTranslator.createGetKClassExpression(classDescriptor: ClassDescriptor): JsExpression =
|
||||
JsInvocation(
|
||||
context.namer().kotlin("getKClass"),
|
||||
context.translateQualifiedReference(classDescriptor)
|
||||
)
|
||||
|
||||
fun TranslationContext.buildInitializersRemapping(forClass: KtPureClassOrObject): Map<PropertyDescriptor, KtExpression?> = forClass.run {
|
||||
(bodyPropertiesDescriptorsMap(bindingContext()).mapValues { it.value.delegateExpressionOrInitializer } +
|
||||
primaryPropertiesDescriptorsMap(bindingContext()).mapValues { it.value.defaultValue })
|
||||
|
||||
+5
-1
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.js.translate.context.Namer
|
||||
import org.jetbrains.kotlin.js.translate.context.TranslationContext
|
||||
import org.jetbrains.kotlin.js.translate.declaration.DeclarationBodyVisitor
|
||||
import org.jetbrains.kotlin.js.translate.declaration.DefaultPropertyTranslator
|
||||
import org.jetbrains.kotlin.js.translate.expression.ExpressionVisitor
|
||||
import org.jetbrains.kotlin.js.translate.general.Translation
|
||||
import org.jetbrains.kotlin.js.translate.intrinsic.functions.factories.TopLevelFIF.KOTLIN_EQUALS
|
||||
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils
|
||||
@@ -277,7 +278,10 @@ class SerializerJsTranslator(descriptor: ClassDescriptor,
|
||||
.single { !unknownSer || (it.valueParameters.size == 3) }
|
||||
.let { context.getNameForDescriptor(it) }
|
||||
val readArgs = mutableListOf(serialClassDescRef, JsIntLiteral(i))
|
||||
if (unknownSer) readArgs.add(createGetKClassExpression(property.type.toClassDescriptor!!))
|
||||
if (unknownSer) readArgs.add(ExpressionVisitor.getObjectKClass(
|
||||
this@SerializerJsTranslator.context,
|
||||
property.type.toClassDescriptor!!
|
||||
))
|
||||
JsInvocation(JsNameRef(readFunc, inputVar), readArgs)
|
||||
}
|
||||
else {
|
||||
|
||||
Reference in New Issue
Block a user