I am trying to get Custom Elements running with Kotlin/Wasm, but when compiling I encounter this exception:
> Task :compileDevelopmentExecutableKotlinWasm FAILED
e: java.lang.IllegalArgumentException: Function createKType not found
at org.jetbrains.kotlin.backend.wasm.WasmSymbols.getFunction(WasmSymbols.kt:348)
at org.jetbrains.kotlin.backend.wasm.WasmSymbols.getInternalFunction(WasmSymbols.kt:358)
at org.jetbrains.kotlin.backend.wasm.WasmSymbols.access$getInternalFunction(WasmSymbols.kt:30)
at org.jetbrains.kotlin.backend.wasm.WasmSymbols$WasmReflectionSymbols.<init>(WasmSymbols.kt:50)
at org.jetbrains.kotlin.backend.wasm.WasmSymbols.<init>(WasmSymbols.kt:67)
at org.jetbrains.kotlin.backend.wasm.WasmBackendContext.<init>(WasmBackendContext.kt:117)
at org.jetbrains.kotlin.backend.wasm.CompilerKt.compileToLoweredIr(compiler.kt:65)
at org.jetbrains.kotlin.cli.js.K2JsIrCompiler.doExecute(K2JsIrCompiler.kt:367)
at org.jetbrains.kotlin.cli.js.K2JSCompiler.doExecute(K2JSCompiler.java:181)
at org.jetbrains.kotlin.cli.js.K2JSCompiler.doExecute(K2JSCompiler.java:72)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:100)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:46)
at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101)
at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1486)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:598)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:844)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:721)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:720)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1589)
My code:
import kotlinx.browser.window
import org.w3c.dom.Element
import org.w3c.dom.HTMLElement
import kotlin.reflect.KClass
abstract class CustomElement : HTMLElement() {
init {
println("Creating custom element")
textContent = "Hello world"
}
}
fun <T : Element> defineElement(name: String, constructor: KClass<T>) {
window.customElements.define(name, constructor.js.unsafeCast<() -> dynamic>())
}
fun main(args: Array<String>) {
defineElement("custom-element", CustomElement::class)
}
My build.gradle.kts:
import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompile
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
group = "de.obenland"
version = "1.0-SNAPSHOT"
plugins {
kotlin("multiplatform") version "1.8.21"
kotlin("plugin.spring") version "1.8.21"
}
repositories {
mavenCentral()
}
kotlin {
wasm {
binaries.executable()
browser { }
}
sourceSets {
val wasmMain by getting {
dependencies {
implementation(kotlin("stdlib-js"))
}
}
}
}
With the help of IntelliJ I found createKType in kotlin-stdlib-js's sources. But not in the compiled dependency. kotlin-stdlib-js contains a kotlin.js which contains the JS part of this function.
I thought maybe the plugin org.jetbrains.kotlin.js is missing, but this collides with org.jetbrains.kotlin.multiplatform