~ wip
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt
index 51385c9..5397a6a 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt
@@ -7,6 +7,7 @@
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analyzer.AbstractAnalyzerWithCompilerReport
+import org.jetbrains.kotlin.backend.common.lower
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel
import org.jetbrains.kotlin.config.CompilerConfiguration
@@ -47,7 +48,8 @@
dceDriven: Boolean = false,
es6mode: Boolean = false,
multiModule: Boolean = false,
- relativeRequirePath: Boolean = false
+ relativeRequirePath: Boolean = false,
+ useStdlibCache: Boolean = false,
): CompilerResult {
val irFactory = PersistentIrFactory()
@@ -70,6 +72,18 @@
deserializer.postProcess()
symbolTable.noUnboundLeft("Unbound symbols at the end of linker")
+ if (useStdlibCache) {
+ // TODO maybe populate caches here? e.g. load fully, lower, save IC caches, and then load again?
+ // Try load stdlib lowered IR
+ prepareIcCaches(project, analyzer, configuration, allDependencies)
+
+ // Inject carriers, new declarations and mappings into the stdlib IrModule
+ //loadIrForIc()
+
+ // Remove stdlib from allModules
+// allModules = allModules.subList(1, allModules.size)
+ }
+
// This won't work incrementally
allModules.forEach { module ->
moveBodilessDeclarationsToSeparatePlace(context, module)
@@ -99,9 +113,8 @@
)
return transformer.generateModule(allModules)
} else {
- // TODO need to use a special StageController here
+ lowerPreservingIcData(allModules, irFactory, context)
- jsPhases.invokeToplevel(phaseConfig, context, allModules)
val transformer = IrModuleToJsTransformer(
context,
mainArguments,
@@ -111,10 +124,7 @@
relativeRequirePath = relativeRequirePath
)
- // TODO serialize the data
- // All the declarations
- // Mappings
-
+ // TODO stdlib code?
return transformer.generateModule(allModules)
}
}
@@ -130,3 +140,38 @@
val transformer = IrModuleToJsTransformer(context, null, true, nameTables)
return transformer.generateModule(listOf(moduleFragment)).jsCode!!.mainModule
}
+
+// Only allows to apply a lowering to the whole world and save the result
+class WholeWorldStageController : StageController() {
+ override var currentStage: Int = 0
+
+ // TODO assert lowered
+}
+
+fun lowerPreservingIcData(allModules: Iterable<IrModuleFragment>, irFactory: PersistentIrFactory, context: JsIrBackendContext) {
+ val controller = WholeWorldStageController()
+
+ irFactory.stageController = controller
+
+ // TODO what about other lowering?
+ val lowerings = loweringList.filter { it is DeclarationLowering || it is BodyLowering }
+
+ // TODO skip stdlib in lowerings
+ // Lower all the things
+ lowerings.forEachIndexed { i, lowering ->
+ controller.currentStage = i + 1
+ when (lowering) {
+ is DeclarationLowering ->
+ lowering.declarationTransformer(context).let { declarationTransformer ->
+ allModules.forEach { declarationTransformer.lower(it) }
+ }
+ is BodyLowering ->
+ lowering.bodyLowering(context).let { bodyLoweringPass ->
+ allModules.forEach { bodyLoweringPass.lower(it) }
+ }
+ // else -> TODO what about other lowerings?
+ }
+ }
+
+ controller.currentStage++
+}
\ No newline at end of file
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic.kt
new file mode 100644
index 0000000..65fe279
--- /dev/null
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic.kt
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.ir.backend.js
+
+import com.intellij.openapi.project.Project
+import org.jetbrains.kotlin.analyzer.AbstractAnalyzerWithCompilerReport
+import org.jetbrains.kotlin.config.CompilerConfiguration
+import org.jetbrains.kotlin.config.languageVersionSettings
+import org.jetbrains.kotlin.ir.backend.js.lower.generateTests
+import org.jetbrains.kotlin.ir.backend.js.lower.moveBodilessDeclarationsToSeparatePlace
+import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
+import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrFactory
+import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
+import org.jetbrains.kotlin.ir.util.noUnboundLeft
+import org.jetbrains.kotlin.library.resolver.KotlinLibraryResolveResult
+
+// TODO test purpose only
+// klib path -> ic data path
+val icCache = mutableMapOf<String, SerializedIcData>()
+
+fun prepareIcCaches(
+ project: Project,
+ analyzer: AbstractAnalyzerWithCompilerReport,
+ configuration: CompilerConfiguration,
+ allDependencies: KotlinLibraryResolveResult,
+) {
+ val irFactory = PersistentIrFactory()
+
+ // only process stdlib for now
+ val stdlibResolved = findStdlib(allDependencies)
+ val stdlibKlib = stdlibResolved.getFullList().single()
+
+ icCache.getOrPut(stdlibKlib.libraryName) {
+ val mainModule = MainModule.Klib(stdlibKlib)
+
+ val (moduleFragment: IrModuleFragment, dependencyModules, irBuiltIns, symbolTable, deserializer) =
+ loadIr(project, mainModule, analyzer, configuration, stdlibResolved, emptyList(), irFactory)
+
+ val moduleDescriptor = moduleFragment.descriptor
+
+ val context = JsIrBackendContext(moduleDescriptor, irBuiltIns, symbolTable, moduleFragment, emptySet(), configuration, irFactory)
+
+ // Load declarations referenced during `context` initialization
+ val irProviders = listOf(deserializer)
+ ExternalDependenciesGenerator(symbolTable, irProviders, configuration.languageVersionSettings).generateUnboundSymbolsAsDependencies()
+
+ deserializer.postProcess()
+ symbolTable.noUnboundLeft("Unbound symbols at the end of linker")
+
+ // This won't work incrementally
+ moveBodilessDeclarationsToSeparatePlace(context, moduleFragment)
+
+ // TODO should be done incrementally
+ generateTests(context, moduleFragment)
+
+ lowerPreservingIcData(listOf(moduleFragment), irFactory, context)
+
+ irFactory.allDeclarations.forEach {
+ // filter newly created
+ // group by file
+ // group by stage
+ // serialize declaration
+ // serialize Carriers
+ // serialize mappings
+ }
+
+ SerializedIcData()
+ }
+}
+
+private fun findStdlib(allDependencies: KotlinLibraryResolveResult): KotlinLibraryResolveResult {
+ var result: KotlinLibraryResolveResult? = null
+
+ allDependencies.forEach { klib, _ ->
+ val resolvedLib = allDependencies.filterRoots {
+ it.library == klib
+ }
+
+ if (resolvedLib.getFullList().size == 1) result = resolvedLib
+ }
+
+ return result!!
+}
+
+fun loadIrForIc(stdlibIcCachePath: String) {
+
+}
+
+fun serializeIrForIc(stdlibIcCachePath: String) {
+
+}
+
+class SerializedIcData()
\ No newline at end of file
diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrEnumEntry.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrEnumEntry.kt
index d886a1a..9c7181c 100644
--- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrEnumEntry.kt
+++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrEnumEntry.kt
@@ -15,6 +15,7 @@
import org.jetbrains.kotlin.ir.declarations.persistent.carriers.EnumEntryCarrier
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
+import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol
import org.jetbrains.kotlin.name.Name
@@ -49,13 +50,13 @@
override val descriptor: ClassDescriptor
get() = symbol.descriptor
- override var correspondingClassField: IrClass? = null
+ override var correspondingClassField: IrClassSymbol? = null
override var correspondingClass: IrClass?
- get() = getCarrier().correspondingClassField
+ get() = getCarrier().correspondingClassField?.owner
set(v) {
if (correspondingClass !== v) {
- setCarrier().correspondingClassField = v
+ setCarrier().correspondingClassField = v?.symbol
}
}
diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrFactory.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrFactory.kt
index 54e20d9..81697d0 100644
--- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrFactory.kt
+++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/PersistentIrFactory.kt
@@ -23,6 +23,8 @@
override var stageController = StageController()
+ val allDeclarations = mutableListOf<IrDeclaration>()
+
override fun createAnonymousInitializer(
startOffset: Int,
endOffset: Int,
@@ -30,7 +32,7 @@
symbol: IrAnonymousInitializerSymbol,
isStatic: Boolean,
): IrAnonymousInitializer =
- PersistentIrAnonymousInitializer(startOffset, endOffset, origin, symbol, isStatic, this)
+ PersistentIrAnonymousInitializer(startOffset, endOffset, origin, symbol, isStatic, this).also { allDeclarations += it }
override fun createClass(
startOffset: Int,
@@ -54,7 +56,7 @@
startOffset, endOffset, origin, symbol, name, kind, visibility, modality,
isCompanion, isInner, isData, isExternal, isInline, isExpect, isFun, source,
this
- )
+ ).also { allDeclarations += it }
override fun createConstructor(
startOffset: Int,
@@ -73,7 +75,7 @@
PersistentIrConstructor(
startOffset, endOffset, origin, symbol, name, visibility, returnType, isInline, isExternal, isPrimary, isExpect,
containerSource, this
- )
+ ).also { allDeclarations += it }
override fun createEnumEntry(
startOffset: Int,
@@ -82,14 +84,14 @@
symbol: IrEnumEntrySymbol,
name: Name,
): IrEnumEntry =
- PersistentIrEnumEntry(startOffset, endOffset, origin, symbol, name, this)
+ PersistentIrEnumEntry(startOffset, endOffset, origin, symbol, name, this).also { allDeclarations += it }
override fun createErrorDeclaration(
startOffset: Int,
endOffset: Int,
descriptor: DeclarationDescriptor,
): IrErrorDeclaration =
- PersistentIrErrorDeclaration(startOffset, endOffset, descriptor, this)
+ PersistentIrErrorDeclaration(startOffset, endOffset, descriptor, this).also { allDeclarations += it }
override fun createField(
startOffset: Int,
@@ -103,7 +105,7 @@
isExternal: Boolean,
isStatic: Boolean,
): IrField =
- PersistentIrField(startOffset, endOffset, origin, symbol, name, type, visibility, isFinal, isExternal, isStatic, this)
+ PersistentIrField(startOffset, endOffset, origin, symbol, name, type, visibility, isFinal, isExternal, isStatic, this).also { allDeclarations += it }
override fun createFunction(
startOffset: Int,
@@ -128,7 +130,7 @@
startOffset, endOffset, origin, symbol, name, visibility, modality, returnType,
isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, isFakeOverride,
containerSource, this
- )
+ ).also { allDeclarations += it }
override fun createFakeOverrideFunction(
startOffset: Int,
@@ -149,7 +151,7 @@
PersistentIrFakeOverrideFunction(
startOffset, endOffset, origin, name, visibility, modality, returnType,
isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, this
- )
+ ).also { allDeclarations += it }
override fun createLocalDelegatedProperty(
startOffset: Int,
@@ -162,7 +164,7 @@
): IrLocalDelegatedProperty =
PersistentIrLocalDelegatedProperty(
startOffset, endOffset, origin, symbol, name, type, isVar, this
- )
+ ).also { allDeclarations += it }
override fun createProperty(
startOffset: Int,
@@ -185,7 +187,7 @@
startOffset, endOffset, origin, symbol, name, visibility, modality,
isVar, isConst, isLateinit, isDelegated, isExternal, isExpect, isFakeOverride,
containerSource, this
- )
+ ).also { allDeclarations += it }
override fun createFakeOverrideProperty(
startOffset: Int,
@@ -205,7 +207,7 @@
startOffset, endOffset, origin, name, visibility, modality,
isVar, isConst, isLateinit, isDelegated, isExternal, isExpect,
this
- )
+ ).also { allDeclarations += it }
override fun createTypeAlias(
startOffset: Int,
@@ -217,7 +219,7 @@
isActual: Boolean,
origin: IrDeclarationOrigin,
): IrTypeAlias =
- PersistentIrTypeAlias(startOffset, endOffset, symbol, name, visibility, expandedType, isActual, origin, this)
+ PersistentIrTypeAlias(startOffset, endOffset, symbol, name, visibility, expandedType, isActual, origin, this).also { allDeclarations += it }
override fun createTypeParameter(
startOffset: Int,
@@ -229,7 +231,7 @@
isReified: Boolean,
variance: Variance,
): IrTypeParameter =
- PersistentIrTypeParameter(startOffset, endOffset, origin, symbol, name, index, isReified, variance, this)
+ PersistentIrTypeParameter(startOffset, endOffset, origin, symbol, name, index, isReified, variance, this).also { allDeclarations += it }
override fun createValueParameter(
startOffset: Int,
@@ -247,7 +249,7 @@
): IrValueParameter =
PersistentIrValueParameter(
startOffset, endOffset, origin, symbol, name, index, type, varargElementType, isCrossinline, isNoinline, isHidden, isAssignable, this
- )
+ ).also { allDeclarations += it }
override fun createExpressionBody(
startOffset: Int,
diff --git a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/EnumEntryCarrier.kt b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/EnumEntryCarrier.kt
index 310adc1..38dac84 100644
--- a/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/EnumEntryCarrier.kt
+++ b/compiler/ir/ir.tree.persistent/src/org/jetbrains/kotlin/ir/declarations/persistent/carriers/EnumEntryCarrier.kt
@@ -10,11 +10,12 @@
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
+import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
// Auto-generated by compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/persistentIrGenerator/Main.kt. DO NOT EDIT!
internal interface EnumEntryCarrier : DeclarationCarrier{
- var correspondingClassField: IrClass?
+ var correspondingClassField: IrClassSymbol?
var initializerExpressionField: IrExpressionBody?
override fun clone(): EnumEntryCarrier {
@@ -34,6 +35,6 @@
override var parentField: IrDeclarationParent?,
override var originField: IrDeclarationOrigin,
override var annotationsField: List<IrConstructorCall>,
- override var correspondingClassField: IrClass?,
+ override var correspondingClassField: IrClassSymbol?,
override var initializerExpressionField: IrExpressionBody?
) : EnumEntryCarrier