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 53ab6fca0ff..1ac840bd657 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,8 +125,8 @@ 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-property-lazy-initialization", description = "Perform lazy initialization for properties") + var irPropertyLazyInitialization: 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 650a37f2a88..efa64a745a8 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 @@ -159,11 +159,6 @@ 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) @@ -269,7 +264,8 @@ class K2JsIrCompiler : CLICompiler() { generateDceJs = arguments.irDce, dceDriven = arguments.irDceDriven, multiModule = arguments.irPerModule, - relativeRequirePath = true + relativeRequirePath = true, + propertyLazyInitialization = arguments.irPropertyLazyInitialization, ) } catch (e: JsIrCompilationError) { return COMPILATION_ERROR diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 0c5a6a23438..fc3fc9a4d51 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -21373,11 +21373,6 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/properties/kt9603.kt"); } - @TestMetadata("lazyInitialization.kt") - public void testLazyInitialization() throws Exception { - runTest("compiler/testData/codegen/box/properties/lazyInitialization.kt"); - } - @TestMetadata("primitiveOverrideDefaultAccessor.kt") public void testPrimitiveOverrideDefaultAccessor() throws Exception { runTest("compiler/testData/codegen/box/properties/primitiveOverrideDefaultAccessor.kt"); diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt index d4ba2a1b836..602ecb58b5b 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt @@ -43,10 +43,11 @@ class JsIrBackendContext( val additionalExportedDeclarationNames: Set, override val configuration: CompilerConfiguration, // TODO: remove configuration from backend context override val scriptMode: Boolean = false, - override val es6mode: Boolean = false + override val es6mode: Boolean = false, + val propertyLazyInitialization: Boolean = false, ) : JsCommonBackendContext { - val fileToInitialisationFuns: MutableMap = mutableMapOf() - val fileToPurenessInitializers: MutableMap = mutableMapOf() + val fileToInitializationFuns: MutableMap = mutableMapOf() + val fileToInitializerPureness: MutableMap = mutableMapOf() override val extractedLocalClasses: MutableSet = hashSetOf() 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 fb01bf3ce33..7b66b386d04 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 @@ -109,16 +109,6 @@ class ModuleLowering( override val modulePhase: NamedCompilerPhase> ) : Lowering(name) -class FileLowering( - name: String, - description: String, - prerequisite: Set> = emptySet(), - private val factory: (JsIrBackendContext) -> FileLoweringPass -) : Lowering(name) { - override val modulePhase: NamedCompilerPhase> = - makeJsModulePhase(factory, name, description, prerequisite) -} - private fun makeDeclarationTransformerPhase( lowering: (JsIrBackendContext) -> DeclarationTransformer, name: String, @@ -133,13 +123,6 @@ private fun makeBodyLoweringPhase( prerequisite: Set = emptySet() ) = BodyLowering(name, description, prerequisite.map { it.modulePhase }.toSet(), lowering) -private fun makeFileLoweringPhase( - lowering: (JsIrBackendContext) -> FileLoweringPass, - name: String, - description: String, - prerequisite: Set = emptySet() -) = FileLowering(name, description, prerequisite.map { it.modulePhase }.toSet(), lowering) - fun NamedCompilerPhase>.toModuleLowering() = ModuleLowering(this.name, this) private val validateIrBeforeLowering = makeCustomJsModulePhase( @@ -378,7 +361,7 @@ private val propertyLazyInitLoweringPhase = makeBodyLoweringPhase( private val removeInitializersForLazyProperties = makeDeclarationTransformerPhase( ::RemoveInitializersForLazyProperties, name = "RemoveInitializersForLazyProperties", - description = "Remove property initializers if they was initialised lazily" + description = "Remove property initializers if they was initialized lazily" ) private val propertyAccessorInlinerLoweringPhase = makeBodyLoweringPhase( 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 bf466560798..22df3e9ab30 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 @@ -48,7 +48,8 @@ fun compile( dceDriven: Boolean = false, es6mode: Boolean = false, multiModule: Boolean = false, - relativeRequirePath: Boolean = false + relativeRequirePath: Boolean = false, + propertyLazyInitialization: Boolean, ): CompilerResult { stageController = StageController() @@ -62,7 +63,16 @@ fun compile( is MainModule.Klib -> dependencyModules } - val context = JsIrBackendContext(moduleDescriptor, irBuiltIns, symbolTable, allModules.first(), exportedDeclarations, configuration, es6mode = es6mode) + val context = JsIrBackendContext( + moduleDescriptor, + irBuiltIns, + symbolTable, + allModules.first(), + exportedDeclarations, + configuration, + es6mode = es6mode, + propertyLazyInitialization = propertyLazyInitialization, + ) // Load declarations referenced during `context` initialization val irProviders = listOf(deserializer) 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 cd331eb612e..55a9253af4e 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,7 +20,6 @@ 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 @@ -37,43 +36,41 @@ class PropertyLazyInitLowering( private val irFactory get() = context.irFactory - val fileToInitialisationFuns - get() = context.fileToInitialisationFuns + private val fileToInitializationFuns + get() = context.fileToInitializationFuns - val fileToPurenessInitializers - get() = context.fileToPurenessInitializers + private val fileToInitializerPureness + get() = context.fileToInitializerPureness override fun lower(irBody: IrBody, container: IrDeclaration) { - if (context.configuration[PROPERTY_LAZY_INITIALISATION] != true) { + if (!context.propertyLazyInitialization) { return } if (container !is IrSimpleFunction && container !is IrField && container !is IrProperty) return - if (!container.isTopLevel) return - val file = container.parent as? IrFile ?: return val initFun = (when { - file in fileToInitialisationFuns -> fileToInitialisationFuns[file] - fileToPurenessInitializers[file] == true -> null + file in fileToInitializationFuns -> fileToInitializationFuns[file] + fileToInitializerPureness[file] == true -> null else -> { - createInitialisationFunction(file).also { - fileToInitialisationFuns[file] = it + createInitializationFunction(file).also { + fileToInitializationFuns[file] = it } } }) ?: return - val initialisationCall = JsIrBuilder.buildCall( + val initializationCall = JsIrBuilder.buildCall( target = initFun.symbol, type = initFun.returnType ) when (container) { is IrSimpleFunction -> - irBody.addInitialisation(initialisationCall, container) + irBody.addInitialization(initializationCall, container) is IrField -> { container .correspondingProperty @@ -82,13 +79,13 @@ class PropertyLazyInitLowering( ?.let { listOf(it.getter, it.setter) } ?.filterNotNull() ?.forEach { - irBody.addInitialisation(initialisationCall, it) + irBody.addInitialization(initializationCall, it) } } } } - private fun createInitialisationFunction( + private fun createInitializationFunction( file: IrFile ): IrSimpleFunction? { val fileName = file.name @@ -102,12 +99,12 @@ class PropertyLazyInitLowering( if (fieldToInitializer.isEmpty()) return null val allFieldsInFilePure = allFieldsInFilePure(fieldToInitializer.values) - fileToPurenessInitializers[file] = allFieldsInFilePure + fileToInitializerPureness[file] = allFieldsInFilePure if (allFieldsInFilePure) { return null } - val initialisedField = irFactory.createInitialisationField(fileName) + val initializedField = irFactory.createInitializationField(fileName) .apply { file.declarations.add(this) parent = file @@ -121,14 +118,14 @@ class PropertyLazyInitLowering( }.apply { buildPropertiesInitializationBody( fieldToInitializer, - initialisedField + initializedField ) } } - private fun IrFactory.createInitialisationField(fileName: String): IrField = + private fun IrFactory.createInitializationField(fileName: String): IrField = buildField { - name = Name.identifier("properties initialised $fileName") + name = Name.identifier("properties initialized $fileName") type = irBuiltIns.booleanType isStatic = true isFinal = true @@ -137,18 +134,18 @@ class PropertyLazyInitLowering( private fun IrSimpleFunction.buildPropertiesInitializationBody( initializers: Map, - initialisedField: IrField + initializedField: IrField ) { body = irFactory.createBlockBody( UNDEFINED_OFFSET, UNDEFINED_OFFSET, - buildBodyWithIfGuard(initializers, initialisedField) + buildBodyWithIfGuard(initializers, initializedField) ) } private fun buildBodyWithIfGuard( initializers: Map, - initialisedField: IrField + initializedField: IrField ): List { val statements = initializers .map { (field, expression) -> @@ -156,13 +153,13 @@ class PropertyLazyInitLowering( } val upGuard = createIrSetField( - initialisedField, + initializedField, JsIrBuilder.buildBoolean(context.irBuiltIns.booleanType, true) ) return JsIrBuilder.buildIfElse( type = irBuiltIns.unitType, - cond = calculator.not(createIrGetField(initialisedField)), + cond = calculator.not(createIrGetField(initializedField)), thenBranch = JsIrBuilder.buildComposite( type = irBuiltIns.unitType, statements = mutableListOf(upGuard).apply { addAll(statements) } @@ -171,7 +168,7 @@ class PropertyLazyInitLowering( } } -private fun IrBody.addInitialisation( +private fun IrBody.addInitialization( initCall: IrCall, container: IrSimpleFunction ) { @@ -217,11 +214,11 @@ class RemoveInitializersForLazyProperties( private val context: JsIrBackendContext ) : DeclarationTransformer { - val fileToPurenessInitializers - get() = context.fileToPurenessInitializers + private val fileToInitializerPureness + get() = context.fileToInitializerPureness override fun transformFlat(declaration: IrDeclaration): List? { - if (context.configuration[PROPERTY_LAZY_INITIALISATION] != true) { + if (!context.propertyLazyInitialization) { return null } @@ -229,9 +226,9 @@ class RemoveInitializersForLazyProperties( val file = declaration.parent as? IrFile ?: return null - if (fileToPurenessInitializers[file] == true) return null + if (fileToInitializerPureness[file] == true) return null - val allFieldsInFilePure = fileToPurenessInitializers[file] + val allFieldsInFilePure = fileToInitializerPureness[file] ?: calculateFileFieldsPureness(file) if (allFieldsInFilePure) { @@ -252,7 +249,7 @@ class RemoveInitializersForLazyProperties( .values val allFieldsInFilePure = allFieldsInFilePure(expressions) - fileToPurenessInitializers[file] = allFieldsInFilePure + fileToInitializerPureness[file] = allFieldsInFilePure return allFieldsInFilePure } } diff --git a/compiler/testData/cli/js/jsExtraHelp.out b/compiler/testData/cli/js/jsExtraHelp.out index 3e7e3f6cd6b..5dec79a8564 100644 --- a/compiler/testData/cli/js/jsExtraHelp.out +++ b/compiler/testData/cli/js/jsExtraHelp.out @@ -18,8 +18,8 @@ where advanced options include: -Xir-produce-klib-dir Generate unpacked KLIB into parent directory of output JS file. In combination with -meta-info generates both IR and pre-IR versions of library. -Xir-produce-klib-file Generate packed klib into file specified by -output. Disables pre-IR backend - -Xir-property-lazy-initialisation - Perform lazy initialisation for properties + -Xir-property-lazy-initialization + Perform lazy initialization for properties -Xmetadata-only Generate *.meta.js and *.kjsm files only -Xtyped-arrays Translate primitive arrays to JS typed arrays -Xwasm Use experimental WebAssembly compiler backend diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 33565b25640..2507d84c0ab 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -23144,11 +23144,6 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/properties/kt9603.kt"); } - @TestMetadata("lazyInitialization.kt") - public void testLazyInitialization() throws Exception { - runTest("compiler/testData/codegen/box/properties/lazyInitialization.kt"); - } - @TestMetadata("primitiveOverrideDefaultAccessor.kt") public void testPrimitiveOverrideDefaultAccessor() throws Exception { runTest("compiler/testData/codegen/box/properties/primitiveOverrideDefaultAccessor.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 38eb8b8533f..1b0a7860b6a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -23149,11 +23149,6 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/properties/kt9603.kt"); } - @TestMetadata("lazyInitialization.kt") - public void testLazyInitialization() throws Exception { - runTest("compiler/testData/codegen/box/properties/lazyInitialization.kt"); - } - @TestMetadata("primitiveOverrideDefaultAccessor.kt") public void testPrimitiveOverrideDefaultAccessor() throws Exception { runTest("compiler/testData/codegen/box/properties/primitiveOverrideDefaultAccessor.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index e0e6057ba3f..9e5864a4ad4 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -21373,11 +21373,6 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/properties/kt9603.kt"); } - @TestMetadata("lazyInitialization.kt") - public void testLazyInitialization() throws Exception { - runTest("compiler/testData/codegen/box/properties/lazyInitialization.kt"); - } - @TestMetadata("primitiveOverrideDefaultAccessor.kt") public void testPrimitiveOverrideDefaultAccessor() throws Exception { runTest("compiler/testData/codegen/box/properties/primitiveOverrideDefaultAccessor.kt"); 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 160238dcb45..71a1ce9b29f 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,7 +89,4 @@ 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"); } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt index c63fcd409eb..9c4c05785a2 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt @@ -131,7 +131,7 @@ abstract class BasicBoxTest( val skipDceDriven = SKIP_DCE_DRIVEN.matcher(fileContent).find() val splitPerModule = SPLIT_PER_MODULE.matcher(fileContent).find() - val propertyLazyInitialization = PROPERTY_LAZY_INITIALISATION.matcher(fileContent).find() + val propertyLazyInitialization = PROPERTY_LAZY_INITIALIZATION.matcher(fileContent).find() TestFileFactoryImpl(coroutinesPackage).use { testFactory -> val inputFiles = TestFiles.createTestFiles( @@ -420,7 +420,7 @@ abstract class BasicBoxTest( skipDceDriven: Boolean, splitPerModule: Boolean, errorIgnorancePolicy: ErrorTolerancePolicy, - propertyLazyInitialisation: Boolean, + propertyLazyInitialization: Boolean, ) { val kotlinFiles = module.files.filter { it.fileName.endsWith(".kt") } val testFiles = kotlinFiles.map { it.fileName } @@ -447,7 +447,6 @@ abstract class BasicBoxTest( incrementalData = null, expectActualLinker = expectActualLinker, errorIgnorancePolicy, - propertyLazyInitialisation ) val outputFile = File(outputFileName) val dceOutputFile = File(dceOutputFileName) @@ -455,8 +454,23 @@ abstract class BasicBoxTest( val incrementalData = IncrementalData() translateFiles( - psiFiles.map(TranslationUnit::SourceFile), outputFile, dceOutputFile, pirOutputFile, config, outputPrefixFile, outputPostfixFile, - mainCallParameters, incrementalData, remap, testPackage, testFunction, needsFullIrRuntime, isMainModule, skipDceDriven, splitPerModule + psiFiles.map(TranslationUnit::SourceFile), + outputFile, + dceOutputFile, + pirOutputFile, + config, + outputPrefixFile, + outputPostfixFile, + mainCallParameters, + incrementalData, + remap, + testPackage, + testFunction, + needsFullIrRuntime, + isMainModule, + skipDceDriven, + splitPerModule, + propertyLazyInitialization, ) if (incrementalCompilationChecksEnabled && module.hasFilesToRecompile) { @@ -514,13 +528,27 @@ abstract class BasicBoxTest( incrementalData, expectActualLinker, ErrorTolerancePolicy.DEFAULT, - propertyLazyInitialisation = false ) val recompiledOutputFile = File(outputFile.parentFile, outputFile.nameWithoutExtension + "-recompiled.js") translateFiles( - translationUnits, recompiledOutputFile, recompiledOutputFile, recompiledOutputFile, recompiledConfig, outputPrefixFile, outputPostfixFile, - mainCallParameters, incrementalData, remap, testPackage, testFunction, needsFullIrRuntime, false, true, false + translationUnits, + recompiledOutputFile, + recompiledOutputFile, + recompiledOutputFile, + recompiledConfig, + outputPrefixFile, + outputPostfixFile, + mainCallParameters, + incrementalData, + remap, + testPackage, + testFunction, + needsFullIrRuntime, + isMainModule = false, + skipDceDriven = true, + splitPerModule = false, + propertyLazyInitialization = false, ) val originalOutput = FileUtil.loadFile(outputFile) @@ -594,7 +622,8 @@ abstract class BasicBoxTest( needsFullIrRuntime: Boolean, isMainModule: Boolean, skipDceDriven: Boolean, - splitPerModule: Boolean + splitPerModule: Boolean, + propertyLazyInitialization: Boolean, ) { val translator = K2JSTranslator(config, false) val translationResult = translator.translateUnits(ExceptionThrowingReporter, units, mainCallParameters) @@ -740,7 +769,6 @@ abstract class BasicBoxTest( incrementalData: IncrementalData?, expectActualLinker: Boolean, errorIgnorancePolicy: ErrorTolerancePolicy, - propertyLazyInitialisation: Boolean, ): JsConfig { val configuration = environment.configuration.copy() @@ -764,7 +792,6 @@ abstract class BasicBoxTest( configuration.put(JSConfigurationKeys.MODULE_KIND, module.moduleKind) configuration.put(JSConfigurationKeys.TARGET, EcmaVersion.v5) configuration.put(JSConfigurationKeys.ERROR_TOLERANCE_POLICY, errorIgnorancePolicy) - configuration.put(JSConfigurationKeys.PROPERTY_LAZY_INITIALISATION, propertyLazyInitialisation) if (errorIgnorancePolicy.allowErrors) { configuration.put(JSConfigurationKeys.DEVELOPER_MODE, true) @@ -998,7 +1025,7 @@ abstract class BasicBoxTest( private val ERROR_POLICY_PATTERN = Pattern.compile("^// *ERROR_POLICY: *(.+)$", Pattern.MULTILINE) - private val PROPERTY_LAZY_INITIALISATION = Pattern.compile("^// *PROPERTY_LAZY_INITIALISATION *$", Pattern.MULTILINE) + private val PROPERTY_LAZY_INITIALIZATION = Pattern.compile("^// *PROPERTY_LAZY_INITIALIZATION *$", Pattern.MULTILINE) @JvmStatic protected val runTestInNashorn = getBoolean("kotlin.js.useNashorn") diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt index d08ee6094ed..9002741d78e 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt @@ -93,7 +93,8 @@ abstract class BasicIrBoxTest( needsFullIrRuntime: Boolean, isMainModule: Boolean, skipDceDriven: Boolean, - splitPerModule: Boolean + splitPerModule: Boolean, + propertyLazyInitialization: Boolean, ) { val filesToCompile = units.map { (it as TranslationUnit.SourceFile).file } @@ -143,7 +144,8 @@ abstract class BasicIrBoxTest( generateFullJs = true, generateDceJs = runIrDce, es6mode = runEs6Mode, - multiModule = splitPerModule || perModule + multiModule = splitPerModule || perModule, + propertyLazyInitialization = propertyLazyInitialization, ) compiledModule.jsCode!!.writeTo(outputFile, config) @@ -169,7 +171,8 @@ abstract class BasicIrBoxTest( exportedDeclarations = setOf(FqName.fromSegments(listOfNotNull(testPackage, testFunction))), dceDriven = true, es6mode = runEs6Mode, - multiModule = splitPerModule || perModule + multiModule = splitPerModule || perModule, + propertyLazyInitialization = propertyLazyInitialization ).jsCode!!.writeTo(pirOutputFile, config) } } else { diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java index 808d305870a..72847fb334f 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java @@ -6786,6 +6786,26 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test { runTest("js/js.translator/testData/box/propertyAccess/initValInConstructor.kt"); } + @TestMetadata("lazyInitialization.kt") + public void testLazyInitialization() throws Exception { + runTest("js/js.translator/testData/box/propertyAccess/lazyInitialization.kt"); + } + + @TestMetadata("lazyInitializationOrder.kt") + public void testLazyInitializationOrder() throws Exception { + runTest("js/js.translator/testData/box/propertyAccess/lazyInitializationOrder.kt"); + } + + @TestMetadata("lazyInitializationPure.kt") + public void testLazyInitializationPure() throws Exception { + runTest("js/js.translator/testData/box/propertyAccess/lazyInitializationPure.kt"); + } + + @TestMetadata("lazyInitializationSplitPerModule.kt") + public void testLazyInitializationSplitPerModule() throws Exception { + runTest("js/js.translator/testData/box/propertyAccess/lazyInitializationSplitPerModule.kt"); + } + @TestMetadata("overloadedOverriddenFunctionPropertyName.kt") public void testOverloadedOverriddenFunctionPropertyName() throws Exception { runTest("js/js.translator/testData/box/propertyAccess/overloadedOverriddenFunctionPropertyName.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index c18bbfc6bb2..ded22676945 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -17629,16 +17629,6 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/properties/kt9603.kt"); } - @TestMetadata("lazyInitialization.kt") - public void testLazyInitialization() throws Exception { - runTest("compiler/testData/codegen/box/properties/lazyInitialization.kt"); - } - - @TestMetadata("lazyInitializationPure.kt") - public void testLazyInitializationPure() throws Exception { - runTest("compiler/testData/codegen/box/properties/lazyInitializationPure.kt"); - } - @TestMetadata("primitiveOverrideDefaultAccessor.kt") public void testPrimitiveOverrideDefaultAccessor() throws Exception { runTest("compiler/testData/codegen/box/properties/primitiveOverrideDefaultAccessor.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java index 14377b8240e..61cbddedf67 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java @@ -6786,6 +6786,26 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/propertyAccess/initValInConstructor.kt"); } + @TestMetadata("lazyInitialization.kt") + public void testLazyInitialization() throws Exception { + runTest("js/js.translator/testData/box/propertyAccess/lazyInitialization.kt"); + } + + @TestMetadata("lazyInitializationOrder.kt") + public void testLazyInitializationOrder() throws Exception { + runTest("js/js.translator/testData/box/propertyAccess/lazyInitializationOrder.kt"); + } + + @TestMetadata("lazyInitializationPure.kt") + public void testLazyInitializationPure() throws Exception { + runTest("js/js.translator/testData/box/propertyAccess/lazyInitializationPure.kt"); + } + + @TestMetadata("lazyInitializationSplitPerModule.kt") + public void testLazyInitializationSplitPerModule() throws Exception { + runTest("js/js.translator/testData/box/propertyAccess/lazyInitializationSplitPerModule.kt"); + } + @TestMetadata("overloadedOverriddenFunctionPropertyName.kt") public void testOverloadedOverriddenFunctionPropertyName() throws Exception { runTest("js/js.translator/testData/box/propertyAccess/overloadedOverriddenFunctionPropertyName.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index c1200b0aa20..f4943aebaf4 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -17629,16 +17629,6 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/properties/kt9603.kt"); } - @TestMetadata("lazyInitialization.kt") - public void testLazyInitialization() throws Exception { - runTest("compiler/testData/codegen/box/properties/lazyInitialization.kt"); - } - - @TestMetadata("lazyInitializationPure.kt") - public void testLazyInitializationPure() throws Exception { - runTest("compiler/testData/codegen/box/properties/lazyInitializationPure.kt"); - } - @TestMetadata("primitiveOverrideDefaultAccessor.kt") public void testPrimitiveOverrideDefaultAccessor() throws Exception { runTest("compiler/testData/codegen/box/properties/primitiveOverrideDefaultAccessor.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 7ba15667bbe..6a78d1ee0e5 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -6816,6 +6816,26 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/propertyAccess/initValInConstructor.kt"); } + @TestMetadata("lazyInitialization.kt") + public void testLazyInitialization() throws Exception { + runTest("js/js.translator/testData/box/propertyAccess/lazyInitialization.kt"); + } + + @TestMetadata("lazyInitializationOrder.kt") + public void testLazyInitializationOrder() throws Exception { + runTest("js/js.translator/testData/box/propertyAccess/lazyInitializationOrder.kt"); + } + + @TestMetadata("lazyInitializationPure.kt") + public void testLazyInitializationPure() throws Exception { + runTest("js/js.translator/testData/box/propertyAccess/lazyInitializationPure.kt"); + } + + @TestMetadata("lazyInitializationSplitPerModule.kt") + public void testLazyInitializationSplitPerModule() throws Exception { + runTest("js/js.translator/testData/box/propertyAccess/lazyInitializationSplitPerModule.kt"); + } + @TestMetadata("overloadedOverriddenFunctionPropertyName.kt") public void testOverloadedOverriddenFunctionPropertyName() throws Exception { runTest("js/js.translator/testData/box/propertyAccess/overloadedOverriddenFunctionPropertyName.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index c92775e4abb..18ef3e5b394 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -17734,11 +17734,6 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/properties/kt9603.kt"); } - @TestMetadata("lazyInitialization.kt") - public void testLazyInitialization() throws Exception { - runTest("compiler/testData/codegen/box/properties/lazyInitialization.kt"); - } - @TestMetadata("primitiveOverrideDefaultAccessor.kt") public void testPrimitiveOverrideDefaultAccessor() throws Exception { runTest("compiler/testData/codegen/box/properties/primitiveOverrideDefaultAccessor.kt"); diff --git a/compiler/testData/codegen/box/properties/lazyInitialization.kt b/js/js.translator/testData/box/propertyAccess/lazyInitialization.kt similarity index 72% rename from compiler/testData/codegen/box/properties/lazyInitialization.kt rename to js/js.translator/testData/box/propertyAccess/lazyInitialization.kt index 945b48e5932..50f5cf093b5 100644 --- a/compiler/testData/codegen/box/properties/lazyInitialization.kt +++ b/js/js.translator/testData/box/propertyAccess/lazyInitialization.kt @@ -1,6 +1,6 @@ -// IGNORE_BACKEND: JS, NATIVE +// IGNORE_BACKEND: JS // DONT_TARGET_EXACT_BACKEND: WASM -// PROPERTY_LAZY_INITIALISATION +// PROPERTY_LAZY_INITIALIZATION // FILE: A.kt diff --git a/js/js.translator/testData/box/propertyAccess/lazyInitializationOrder.kt b/js/js.translator/testData/box/propertyAccess/lazyInitializationOrder.kt new file mode 100644 index 00000000000..d46ce65701f --- /dev/null +++ b/js/js.translator/testData/box/propertyAccess/lazyInitializationOrder.kt @@ -0,0 +1,36 @@ +// EXPECTED_REACHABLE_NODES: 1239 +// DONT_TARGET_EXACT_BACKEND: WASM +// PROPERTY_LAZY_INITIALIZATION + +// FILE: A.kt + +val a = "A".let { + flag = !flag + if (flag) { + it + } else { + "!A" + } +} + +val b = "B".let { + flag = !flag + if (!flag) { + it + } else { + "!B" + } +} + +// FILE: B.kt +var flag: Boolean = false + +// FILE: main.kt + +fun box(): String { + return if ( + a == "A" && b == "B" + ) + "OK" + else "a = $a; b = ${b}" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/properties/lazyInitializationPure.kt b/js/js.translator/testData/box/propertyAccess/lazyInitializationPure.kt similarity index 81% rename from compiler/testData/codegen/box/properties/lazyInitializationPure.kt rename to js/js.translator/testData/box/propertyAccess/lazyInitializationPure.kt index 7103b238896..c0f377a5c91 100644 --- a/compiler/testData/codegen/box/properties/lazyInitializationPure.kt +++ b/js/js.translator/testData/box/propertyAccess/lazyInitializationPure.kt @@ -1,5 +1,5 @@ -// TARGET_BACKEND: JS_IR -// PROPERTY_LAZY_INITIALISATION +// IGNORE_BACKEND: JS +// PROPERTY_LAZY_INITIALIZATION // FILE: A.kt @@ -18,7 +18,7 @@ val e = d // FILE: main.kt fun box(): String { - d + // Get only e to initialize all properties in file e return if ( js("a") === "A" && diff --git a/js/js.translator/testData/box/propertyAccess/lazyInitializationSplitPerModule.kt b/js/js.translator/testData/box/propertyAccess/lazyInitializationSplitPerModule.kt new file mode 100644 index 00000000000..fa99790a96a --- /dev/null +++ b/js/js.translator/testData/box/propertyAccess/lazyInitializationSplitPerModule.kt @@ -0,0 +1,22 @@ +// IGNORE_BACKEND: JS +// DONT_TARGET_EXACT_BACKEND: WASM +// SPLIT_PER_MODULE +// PROPERTY_LAZY_INITIALIZATION + +// MODULE: lib1 +// FILE: A.kt +val o = "O" + +// FILE: B.kt +val okCandidate = o + k + +// FILE: C.kt +val k = "K" + +// MODULE: lib2(lib1) +// FILE: lib2.kt +val ok = okCandidate + +// MODULE: main(lib1, lib2) +// FILE: main.kt +fun box(): String = ok \ No newline at end of file