[K/JS] Add serialization/deserialization for JsImport/JsExport nodes
This commit is contained in:
+13
@@ -29,6 +29,19 @@ object StatementIds {
|
||||
const val EMPTY = 17
|
||||
const val SINGLE_LINE_COMMENT = 18
|
||||
const val MULTI_LINE_COMMENT = 19
|
||||
const val IMPORT = 20
|
||||
const val EXPORT = 21
|
||||
}
|
||||
|
||||
object ImportType {
|
||||
const val ALL = 0
|
||||
const val ITEMS = 1
|
||||
const val DEFAULT = 2
|
||||
}
|
||||
|
||||
object ExportType {
|
||||
const val ALL = 0
|
||||
const val ITEMS = 1
|
||||
}
|
||||
|
||||
object ExpressionIds {
|
||||
|
||||
+32
-4
@@ -10,13 +10,9 @@ import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.JsIrIcClassModel
|
||||
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.JsIrProgramFragment
|
||||
import org.jetbrains.kotlin.ir.backend.js.utils.emptyScope
|
||||
import org.jetbrains.kotlin.js.backend.ast.*
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsImportedModule
|
||||
import org.jetbrains.kotlin.js.backend.ast.metadata.*
|
||||
import org.jetbrains.kotlin.js.backend.ast.metadata.LocalAlias
|
||||
import org.jetbrains.kotlin.js.backend.ast.metadata.SpecialFunction
|
||||
import java.nio.ByteBuffer
|
||||
import java.util.*
|
||||
import java.util.ArrayDeque
|
||||
|
||||
fun deserializeJsIrProgramFragment(input: ByteArray): JsIrProgramFragment {
|
||||
return JsIrAstDeserializer(input).readFragment()
|
||||
@@ -219,6 +215,38 @@ private class JsIrAstDeserializer(private val source: ByteArray) {
|
||||
ifTrue { readBlock() }
|
||||
)
|
||||
}
|
||||
EXPORT -> {
|
||||
JsExport(
|
||||
when (val type = readByte().toInt()) {
|
||||
ExportType.ALL -> JsExport.Subject.All
|
||||
ExportType.ITEMS -> JsExport.Subject.Elements(readList {
|
||||
JsExport.Element(
|
||||
nameTable[readInt()].makeRef(),
|
||||
ifTrue { nameTable[readInt()] }
|
||||
)
|
||||
})
|
||||
else -> error("Unknown JsExport type $type")
|
||||
},
|
||||
ifTrue { readString() }
|
||||
)
|
||||
}
|
||||
IMPORT -> {
|
||||
JsImport(
|
||||
readString(),
|
||||
when (val type = readByte().toInt()) {
|
||||
ImportType.ALL -> JsImport.Target.All(nameTable[readInt()].makeRef())
|
||||
ImportType.DEFAULT -> JsImport.Target.Default(nameTable[readInt()].makeRef())
|
||||
ImportType.ITEMS -> JsImport.Target.Elements(readList {
|
||||
JsImport.Element(
|
||||
nameTable[readInt()],
|
||||
ifTrue { nameTable[readInt()].makeRef() }
|
||||
)
|
||||
|
||||
}.toMutableList())
|
||||
else -> error("Unknown JsImport type $type")
|
||||
}
|
||||
)
|
||||
}
|
||||
EMPTY -> {
|
||||
JsEmpty
|
||||
}
|
||||
|
||||
+40
-2
@@ -8,14 +8,12 @@ package org.jetbrains.kotlin.ir.backend.js.utils.serialization
|
||||
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.JsIrIcClassModel
|
||||
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.JsIrProgramFragment
|
||||
import org.jetbrains.kotlin.js.backend.ast.*
|
||||
import org.jetbrains.kotlin.js.backend.ast.JsImportedModule
|
||||
import org.jetbrains.kotlin.js.backend.ast.metadata.*
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.io.DataOutputStream
|
||||
import java.io.OutputStream
|
||||
import java.util.*
|
||||
import java.util.ArrayDeque
|
||||
|
||||
fun JsIrProgramFragment.serializeTo(output: OutputStream) {
|
||||
JsIrAstSerializer().append(this).saveTo(output)
|
||||
@@ -301,6 +299,46 @@ private class JsIrAstSerializer {
|
||||
ifNotNull(x.finallyBlock) { writeBlock(it) }
|
||||
}
|
||||
|
||||
override fun visitExport(export: JsExport) {
|
||||
writeByte(StatementIds.EXPORT)
|
||||
|
||||
when (val subject = export.subject) {
|
||||
is JsExport.Subject.All -> writeByte(ExportType.ALL)
|
||||
is JsExport.Subject.Elements -> {
|
||||
writeByte(ExportType.ITEMS)
|
||||
writeCollection(subject.elements) {
|
||||
writeInt(internalizeName(it.name.name!!))
|
||||
ifNotNull(it.alias) { writeInt(internalizeName(it)) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ifNotNull(export.fromModule) { writeString(it) }
|
||||
}
|
||||
|
||||
override fun visitImport(import: JsImport) {
|
||||
writeByte(StatementIds.IMPORT)
|
||||
writeString(import.module)
|
||||
|
||||
when (val target = import.target) {
|
||||
is JsImport.Target.All -> {
|
||||
writeByte(ImportType.ALL)
|
||||
writeInt(internalizeName(target.alias.name!!))
|
||||
}
|
||||
is JsImport.Target.Default -> {
|
||||
writeByte(ImportType.DEFAULT)
|
||||
writeInt(internalizeName(target.name.name!!))
|
||||
}
|
||||
is JsImport.Target.Elements -> {
|
||||
writeByte(ImportType.ITEMS)
|
||||
writeCollection(target.elements) {
|
||||
writeInt(internalizeName(it.name))
|
||||
ifNotNull(it.alias) { writeInt(internalizeName(it.name!!)) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitEmpty(x: JsEmpty) {
|
||||
writeByte(StatementIds.EMPTY)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user