diff --git a/compiler/testData/cli/js/jsExtraHelp.out b/compiler/testData/cli/js/jsExtraHelp.out index 03bc63d0b88..3e7e3f6cd6b 100644 --- a/compiler/testData/cli/js/jsExtraHelp.out +++ b/compiler/testData/cli/js/jsExtraHelp.out @@ -18,6 +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 -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/testData/codegen/box/properties/lazyInitialization.kt b/compiler/testData/codegen/box/properties/lazyInitialization.kt index 580c55d101c..945b48e5932 100644 --- a/compiler/testData/codegen/box/properties/lazyInitialization.kt +++ b/compiler/testData/codegen/box/properties/lazyInitialization.kt @@ -1,5 +1,6 @@ // IGNORE_BACKEND: JS, NATIVE // DONT_TARGET_EXACT_BACKEND: WASM +// PROPERTY_LAZY_INITIALISATION // FILE: A.kt diff --git a/compiler/testData/codegen/box/properties/lazyInitializationPure.kt b/compiler/testData/codegen/box/properties/lazyInitializationPure.kt index d2b8f6ce631..7103b238896 100644 --- a/compiler/testData/codegen/box/properties/lazyInitializationPure.kt +++ b/compiler/testData/codegen/box/properties/lazyInitializationPure.kt @@ -1,4 +1,5 @@ // TARGET_BACKEND: JS_IR +// PROPERTY_LAZY_INITIALISATION // FILE: A.kt diff --git a/compiler/testData/codegen/box/properties/sideEffectInTopLevelInitializerMultiModule.kt b/compiler/testData/codegen/box/properties/sideEffectInTopLevelInitializerMultiModule.kt index 933630e9d26..318d2dfc66d 100644 --- a/compiler/testData/codegen/box/properties/sideEffectInTopLevelInitializerMultiModule.kt +++ b/compiler/testData/codegen/box/properties/sideEffectInTopLevelInitializerMultiModule.kt @@ -1,5 +1,5 @@ // IGNORE_BACKEND_FIR: JVM_IR -// IGNORE_BACKEND: JVM, JVM_IR, JS_IR +// IGNORE_BACKEND: JVM, JVM_IR // IGNORE_LIGHT_ANALYSIS // MODULE: lib1 // FILE: lib1.kt 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 96e3cf1ea64..c63fcd409eb 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,6 +131,8 @@ 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() + TestFileFactoryImpl(coroutinesPackage).use { testFactory -> val inputFiles = TestFiles.createTestFiles( file.name, @@ -172,9 +174,28 @@ abstract class BasicBoxTest( val isMainModule = mainModuleName == module.name generateJavaScriptFile( testFactory.tmpDir, - file.parent, module, outputFileName, dceOutputFileName, pirOutputFileName, dependencies, allDependencies, friends, modules.size > 1, - !SKIP_SOURCEMAP_REMAPPING.matcher(fileContent).find(), outputPrefixFile, outputPostfixFile, - actualMainCallParameters, testPackage, testFunction, needsFullIrRuntime, isMainModule, expectActualLinker, skipDceDriven, splitPerModule, errorPolicy + file.parent, + module, + outputFileName, + dceOutputFileName, + pirOutputFileName, + dependencies, + allDependencies, + friends, + modules.size > 1, + !SKIP_SOURCEMAP_REMAPPING.matcher(fileContent).find(), + outputPrefixFile, + outputPostfixFile, + actualMainCallParameters, + testPackage, + testFunction, + needsFullIrRuntime, + isMainModule, + expectActualLinker, + skipDceDriven, + splitPerModule, + errorPolicy, + propertyLazyInitialization ) when { @@ -398,7 +419,8 @@ abstract class BasicBoxTest( expectActualLinker: Boolean, skipDceDriven: Boolean, splitPerModule: Boolean, - errorIgnorancePolicy: ErrorTolerancePolicy + errorIgnorancePolicy: ErrorTolerancePolicy, + propertyLazyInitialisation: Boolean, ) { val kotlinFiles = module.files.filter { it.fileName.endsWith(".kt") } val testFiles = kotlinFiles.map { it.fileName } @@ -414,7 +436,19 @@ abstract class BasicBoxTest( val psiFiles = createPsiFiles(allSourceFiles.sortedBy { it.canonicalPath }.map { it.canonicalPath }) val sourceDirs = (testFiles + additionalFiles).map { File(it).parent }.distinct() - val config = createConfig(sourceDirs, module, dependencies, allDependencies, friends, multiModule, tmpDir, incrementalData = null, expectActualLinker = expectActualLinker, errorIgnorancePolicy) + val config = createConfig( + sourceDirs, + module, + dependencies, + allDependencies, + friends, + multiModule, + tmpDir, + incrementalData = null, + expectActualLinker = expectActualLinker, + errorIgnorancePolicy, + propertyLazyInitialisation + ) val outputFile = File(outputFileName) val dceOutputFile = File(dceOutputFileName) val pirOutputFile = File(pirOutputFileName) @@ -469,7 +503,19 @@ abstract class BasicBoxTest( .sortedBy { it.canonicalPath } .map { sourceToTranslationUnit[it]!! } - val recompiledConfig = createConfig(sourceDirs, module, dependencies, allDependencies, friends, multiModule, tmpDir, incrementalData, expectActualLinker, ErrorTolerancePolicy.DEFAULT) + val recompiledConfig = createConfig( + sourceDirs, + module, + dependencies, + allDependencies, + friends, + multiModule, + tmpDir, + incrementalData, + expectActualLinker, + ErrorTolerancePolicy.DEFAULT, + propertyLazyInitialisation = false + ) val recompiledOutputFile = File(outputFile.parentFile, outputFile.nameWithoutExtension + "-recompiled.js") translateFiles( @@ -684,8 +730,17 @@ abstract class BasicBoxTest( private fun createPsiFiles(fileNames: List): List = fileNames.map(this::createPsiFile) private fun createConfig( - sourceDirs: List, module: TestModule, dependencies: List, allDependencies: List, friends: List, - multiModule: Boolean, tmpDir: File, incrementalData: IncrementalData?, expectActualLinker: Boolean, errorIgnorancePolicy: ErrorTolerancePolicy + sourceDirs: List, + module: TestModule, + dependencies: List, + allDependencies: List, + friends: List, + multiModule: Boolean, + tmpDir: File, + incrementalData: IncrementalData?, + expectActualLinker: Boolean, + errorIgnorancePolicy: ErrorTolerancePolicy, + propertyLazyInitialisation: Boolean, ): JsConfig { val configuration = environment.configuration.copy() @@ -709,6 +764,7 @@ 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) @@ -942,6 +998,8 @@ 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) + @JvmStatic protected val runTestInNashorn = getBoolean("kotlin.js.useNashorn")