Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compilation fails when try to generate serialization staff for Map<String, Any> #88

Closed
Fuud opened this issue Feb 21, 2018 · 2 comments
Closed
Labels

Comments

@Fuud
Copy link

Fuud commented Feb 21, 2018

For example:

package kotlinx.serialization

import kotlin.test.Test
import kotlin.test.assertEquals

class JsTest {

    @Serializable
    data class DataWithMap(val a: Map<String, Any>)

    @Test
    fun jsTestWithMap() {
        val parsed = kotlinx.serialization.json.JSON.unquoted.parse<DataWithMap>("""{a: { "b" : "c" } }""")
        assertEquals(parsed, DataWithMap(mapOf("b" to "c")))
    }
}

will fail with:

:js:compileTestKotlin2Js
e: org.jetbrains.kotlin.js.facade.exceptions.TranslationRuntimeException: Unexpected error occurred compiling the following fragment: '/*
 * Copyright 2017 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package kotlinx.serialization

import kotlin.test.Test
import kotlin.test.assertEquals

class JsTest {

    @Serializable
    data class DataWithMap(val a: Map<String, Any>)

    @Test
    fun jsTestWithMap() {
        val parsed = kotlinx.serialization.json.JSON.unquoted.parse<DataWithMap>("""{a: { "b" : "c" } }""")
        assertEquals(parsed, DataWithMap(mapOf("b" to "c")))
    }
}' at (1,1) in G:/work/kotlinx.serialization/runtime/js/src/test/kotlin/kotlinx/serialization/JsTest.kt
        at org.jetbrains.kotlin.js.translate.general.Translation.translateFile(Translation.java:390)
        at org.jetbrains.kotlin.js.translate.general.Translation.doGenerateAst(Translation.java:299)
        at org.jetbrains.kotlin.js.translate.general.Translation.generateAst(Translation.java:261)
        at org.jetbrains.kotlin.js.facade.K2JSTranslator.translateUnits(K2JSTranslator.java:134)
        at org.jetbrains.kotlin.js.facade.K2JSTranslator.translate(K2JSTranslator.java:96)
        at org.jetbrains.kotlin.cli.js.K2JSCompiler.translate(K2JSCompiler.java:149)
        at org.jetbrains.kotlin.cli.js.K2JSCompiler.doExecute(K2JSCompiler.java:275)
        at org.jetbrains.kotlin.cli.js.K2JSCompiler.doExecute(K2JSCompiler.java:82)
        at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.java:109)
        at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.java:53)
        at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:92)
        at org.jetbrains.kotlin.daemon.CompileServiceImpl$compile$1$2.invoke(CompileServiceImpl.kt:387)
        at org.jetbrains.kotlin.daemon.CompileServiceImpl$compile$1$2.invoke(CompileServiceImpl.kt:97)
        at org.jetbrains.kotlin.daemon.CompileServiceImpl$doCompile$$inlined$ifAlive$lambda$2.invoke(CompileServiceImpl.kt:895)
        at org.jetbrains.kotlin.daemon.CompileServiceImpl$doCompile$$inlined$ifAlive$lambda$2.invoke(CompileServiceImpl.kt:97)
        at org.jetbrains.kotlin.daemon.common.DummyProfiler.withMeasure(PerfUtils.kt:137)
        at org.jetbrains.kotlin.daemon.CompileServiceImpl.checkedCompile(CompileServiceImpl.kt:925)
        at org.jetbrains.kotlin.daemon.CompileServiceImpl.doCompile(CompileServiceImpl.kt:894)
        at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:386)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
        at sun.rmi.transport.Transport$1.run(Transport.java:200)
        at sun.rmi.transport.Transport$1.run(Transport.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$255(TCPTransport.java:683)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$1/1341995085.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: Can't locate polymorphic serializer definition
        at org.jetbrains.kotlinx.serialization.compiler.backend.common.TypeUtilKt.findPolymorphicSerializer(TypeUtil.kt:118)
        at org.jetbrains.kotlinx.serialization.compiler.backend.common.TypeUtilKt.findTypeSerializer(TypeUtil.kt:72)
        at org.jetbrains.kotlinx.serialization.compiler.backend.js.SerializerJsTranslator.serializerInstance(SerializerJsTranslator.kt:187)
        at org.jetbrains.kotlinx.serialization.compiler.backend.js.SerializerJsTranslator.access$serializerInstance(SerializerJsTranslator.kt:46)
        at org.jetbrains.kotlinx.serialization.compiler.backend.js.SerializerJsTranslator$generateSave$1.invoke(SerializerJsTranslator.kt:145)
        at org.jetbrains.kotlinx.serialization.compiler.backend.js.SerializerJsTranslator$generateSave$1.invoke(SerializerJsTranslator.kt:46)
        at org.jetbrains.kotlinx.serialization.compiler.backend.js.JsCodegenUtilKt.buildFunction(JsCodegenUtil.kt:84)
        at org.jetbrains.kotlinx.serialization.compiler.backend.js.SerializerJsTranslator.generateFunction(SerializerJsTranslator.kt:51)
        at org.jetbrains.kotlinx.serialization.compiler.backend.js.SerializerJsTranslator.generateSave(SerializerJsTranslator.kt:119)
        at org.jetbrains.kotlinx.serialization.compiler.backend.common.SerializerCodegen.generateSaveIfNeeded(SerializerCodegen.kt:74)
        at org.jetbrains.kotlinx.serialization.compiler.backend.common.SerializerCodegen.generate(SerializerCodegen.kt:42)
        at org.jetbrains.kotlinx.serialization.compiler.backend.js.SerializerJsTranslator$Companion.translate(SerializerJsTranslator.kt:367)
        at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationJsExtension.generateClassSyntheticParts(SerializationJsExtension.kt:30)
        at org.jetbrains.kotlin.js.translate.declaration.ClassTranslator.generateClassSyntheticParts(ClassTranslator.kt:153)
        at org.jetbrains.kotlin.js.translate.declaration.ClassTranslator.translate(ClassTranslator.kt:111)
        at org.jetbrains.kotlin.js.translate.declaration.ClassTranslator.access$translate(ClassTranslator.kt:63)
        at org.jetbrains.kotlin.js.translate.declaration.ClassTranslator$Companion.translate(ClassTranslator.kt:564)
        at org.jetbrains.kotlin.js.translate.declaration.DeclarationBodyVisitor.generateClassOrObject(DeclarationBodyVisitor.kt:59)
        at org.jetbrains.kotlin.js.translate.declaration.ClassTranslator.translate(ClassTranslator.kt:108)
        at org.jetbrains.kotlin.js.translate.declaration.ClassTranslator.access$translate(ClassTranslator.kt:63)
        at org.jetbrains.kotlin.js.translate.declaration.ClassTranslator$Companion.translate(ClassTranslator.kt:568)
        at org.jetbrains.kotlin.js.translate.declaration.AbstractDeclarationVisitor.visitClassOrObject(AbstractDeclarationVisitor.kt:44)
        at org.jetbrains.kotlin.js.translate.declaration.DeclarationBodyVisitor.visitClassOrObject(DeclarationBodyVisitor.kt:47)
        at org.jetbrains.kotlin.js.translate.declaration.DeclarationBodyVisitor.visitClassOrObject(DeclarationBodyVisitor.kt:34)
        at org.jetbrains.kotlin.psi.KtVisitor.visitClass(KtVisitor.java:33)
        at org.jetbrains.kotlin.psi.KtClass.accept(KtClass.kt:34)
        at org.jetbrains.kotlin.js.translate.general.TranslatorVisitor.traverseContainer(TranslatorVisitor.java:43)
        at org.jetbrains.kotlin.js.translate.declaration.ClassTranslator.translate(ClassTranslator.kt:92)
        at org.jetbrains.kotlin.js.translate.declaration.ClassTranslator.access$translate(ClassTranslator.kt:63)
        at org.jetbrains.kotlin.js.translate.declaration.ClassTranslator$Companion.translate(ClassTranslator.kt:568)
        at org.jetbrains.kotlin.js.translate.declaration.AbstractDeclarationVisitor.visitClassOrObject(AbstractDeclarationVisitor.kt:44)
        at org.jetbrains.kotlin.js.translate.declaration.AbstractDeclarationVisitor.visitClassOrObject(AbstractDeclarationVisitor.kt:37)
        at org.jetbrains.kotlin.psi.KtVisitor.visitClass(KtVisitor.java:33)
        at org.jetbrains.kotlin.psi.KtClass.accept(KtClass.kt:34)
        at org.jetbrains.kotlin.js.translate.general.Translation.translateFile(Translation.java:382)
        ... 36 more

@sandwwraith
Copy link
Member

sandwwraith commented Feb 21, 2018

Because there is no reflection on Kotlin/JS, it now seems impossible to use polymorphic serialization with type recording, and therefore Any is not serializable on JS. Perhaps this restriction will be relaxed in future design, and library will allow only to write such values.

@sandwwraith
Copy link
Member

#101

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants