[JS IR] IC: support per-module layout

This commit is contained in:
Anton Bannykh
2021-12-08 14:21:12 +03:00
parent 434c23a343
commit 4d8926cf26
17 changed files with 110 additions and 23 deletions
@@ -5,10 +5,8 @@
package org.jetbrains.kotlin.ir.backend.js
import org.jetbrains.kotlin.backend.common.lower
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
import org.jetbrains.kotlin.backend.common.phaser.PhaserState
import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.backend.js.ic.ModuleCache
@@ -17,8 +15,8 @@ import org.jetbrains.kotlin.ir.backend.js.lower.generateJsTests
import org.jetbrains.kotlin.ir.backend.js.lower.moveBodilessDeclarationsToSeparatePlace
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrLinker
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.*
import org.jetbrains.kotlin.ir.backend.js.utils.sanitizeName
import org.jetbrains.kotlin.ir.backend.js.utils.serialization.JsIrAstDeserializer
import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors
import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
@@ -107,6 +105,8 @@ fun compileWithIC(
val ast = transformer.generateBinaryAst(dirtyFiles)
ast.entries.forEach { (path, bytes) -> cacheConsumer.commitBinaryAst(path, bytes) }
cacheConsumer.commitModuleName(module.name.asString())
}
fun lowerPreservingTags(modules: Iterable<IrModuleFragment>, context: JsIrBackendContext, phaseConfig: PhaseConfig, controller: WholeWorldStageController) {
@@ -131,15 +131,21 @@ fun generateJsFromAst(
caches: Map<String, ModuleCache>,
): CompilerResult {
val deserializer = JsIrAstDeserializer()
val fragments = JsIrProgram(caches.values.map { JsIrModule(it.name, it.name, it.asts.values.sortedBy { it.name }.mapNotNull { it.ast?.let { deserializer.deserialize(ByteArrayInputStream(it))} }) })
val jsIrProgram = JsIrProgram(caches.values.map {
JsIrModule(
it.name.safeModuleName,
sanitizeName(it.name.safeModuleName),
it.asts.values.sortedBy { it.name }.mapNotNull { it.ast?.let { deserializer.deserialize(ByteArrayInputStream(it)) } })
})
return CompilerResult(
generateSingleWrappedModuleBody(
mainModuleName,
moduleKind,
fragments.modules.flatMap { it.fragments },
generateWrappedModuleBody(
multiModule = true,
mainModuleName = mainModuleName,
moduleKind = moduleKind,
jsIrProgram,
sourceMapsInfo = null,
relativeRequirePath = false,
generateScriptModule = false,
generateCallToMain = true,
), null
)
}
@@ -283,7 +283,7 @@ class IrModuleToJsTransformerTmp(
}
}
private fun generateWrappedModuleBody(
fun generateWrappedModuleBody(
multiModule: Boolean,
mainModuleName: String,
moduleKind: ModuleKind,
@@ -336,7 +336,7 @@ private fun generateWrappedModuleBody(
}
}
fun generateSingleWrappedModuleBody(
private fun generateSingleWrappedModuleBody(
moduleName: String,
moduleKind: ModuleKind,
fragments: List<JsIrProgramFragment>,
@@ -117,8 +117,11 @@ fun buildCrossModuleReferenceInfo(modules: Iterable<IrModuleFragment>): CrossMod
}
val IrModuleFragment.safeName: String
get() = name.asString().safeModuleName
val String.safeModuleName: String
get() {
var result = name.asString()
var result = this
if (result.startsWith('<')) result = result.substring(1)
if (result.endsWith('>')) result = result.substring(0, result.length - 1)