diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt index 064b1edb16d..53ab6fca0ff 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt @@ -125,6 +125,9 @@ class K2JSCompilerArguments : CommonCompilerArguments() { @Argument(value = "-Xir-dce-print-reachability-info", description = "Print declarations' reachability info to stdout during performing DCE") var irDcePrintReachabilityInfo: Boolean by FreezableVar(false) + @Argument(value = "-Xir-property-lazy-initialisation", description = "Perform lazy initialisation for properties") + var irPropertyLazyInitialisation: Boolean by FreezableVar(false) + @Argument(value = "-Xir-only", description = "Disables pre-IR backend") var irOnly: Boolean by FreezableVar(false) diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt index 75fdfead4a5..650a37f2a88 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt @@ -27,7 +27,10 @@ import org.jetbrains.kotlin.cli.common.messages.MessageUtil import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser -import org.jetbrains.kotlin.config.* +import org.jetbrains.kotlin.config.CommonConfigurationKeys +import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.IncrementalCompilation +import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider @@ -156,6 +159,11 @@ class K2JsIrCompiler : CLICompiler() { arguments.irModuleName ?: FileUtil.getNameWithoutExtension(outputFile) ) + configurationJs.put( + JSConfigurationKeys.PROPERTY_LAZY_INITIALISATION, + arguments.irPropertyLazyInitialisation + ) + // TODO: in this method at least 3 different compiler configurations are used (original, env.configuration, jsConfig.configuration) // Such situation seems a bit buggy... val config = JsConfig(projectJs, configurationJs) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt index fea0b56df02..fb01bf3ce33 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt @@ -378,7 +378,7 @@ private val propertyLazyInitLoweringPhase = makeBodyLoweringPhase( private val removeInitializersForLazyProperties = makeDeclarationTransformerPhase( ::RemoveInitializersForLazyProperties, name = "RemoveInitializersForLazyProperties", - description = "Make property init as lazy" + description = "Remove property initializers if they was initialised lazily" ) private val propertyAccessorInlinerLoweringPhase = makeBodyLoweringPhase( diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PropertyLazyInitLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PropertyLazyInitLowering.kt index 087c16e8bbe..cd331eb612e 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PropertyLazyInitLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PropertyLazyInitLowering.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildField import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrElementBase import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.js.config.JSConfigurationKeys.PROPERTY_LAZY_INITIALISATION import org.jetbrains.kotlin.name.Name import kotlin.collections.component1 import kotlin.collections.component2 @@ -43,6 +44,10 @@ class PropertyLazyInitLowering( get() = context.fileToPurenessInitializers override fun lower(irBody: IrBody, container: IrDeclaration) { + if (context.configuration[PROPERTY_LAZY_INITIALISATION] != true) { + return + } + if (container !is IrSimpleFunction && container !is IrField && container !is IrProperty) return @@ -216,6 +221,10 @@ class RemoveInitializersForLazyProperties( get() = context.fileToPurenessInitializers override fun transformFlat(declaration: IrDeclaration): List? { + if (context.configuration[PROPERTY_LAZY_INITIALISATION] != true) { + return null + } + if (declaration !is IrField) return null val file = declaration.parent as? IrFile ?: return null diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java b/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java index 71a1ce9b29f..160238dcb45 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java @@ -89,4 +89,7 @@ public class JSConfigurationKeys { public static final CompilerConfigurationKey ERROR_TOLERANCE_POLICY = CompilerConfigurationKey.create("set up policy to ignore compilation errors"); + + public static final CompilerConfigurationKey PROPERTY_LAZY_INITIALISATION = + CompilerConfigurationKey.create("enable property lazy initialisation"); }