[JS IR] - Remove file lowering declarations from lowering phases
- rename fileToPurenessInitializers onto fileToInitializerPureness - remove redundant check on top-level property [JS IR] Rename initialis* to initializ* for consistency [JS IR] Move propertyLazyInitialization property to context from configuration [JS IR] Add test on lazy initialization properties order [JS IR] Add multi module for lazy initialization of properties [JS IR] Move tests onto js.translator [JS IR] Rename fileToInitializerPureness according to context name ^KT-43222 fixed
This commit is contained in:
@@ -89,7 +89,4 @@ public class JSConfigurationKeys {
|
||||
|
||||
public static final CompilerConfigurationKey<ErrorTolerancePolicy> ERROR_TOLERANCE_POLICY =
|
||||
CompilerConfigurationKey.create("set up policy to ignore compilation errors");
|
||||
|
||||
public static final CompilerConfigurationKey<Boolean> PROPERTY_LAZY_INITIALISATION =
|
||||
CompilerConfigurationKey.create("enable property lazy initialisation");
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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 {
|
||||
|
||||
+20
@@ -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");
|
||||
|
||||
Generated
-10
@@ -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");
|
||||
|
||||
+20
@@ -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");
|
||||
|
||||
Generated
-10
@@ -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");
|
||||
|
||||
+20
@@ -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");
|
||||
|
||||
-5
@@ -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");
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
// IGNORE_BACKEND: JS
|
||||
// DONT_TARGET_EXACT_BACKEND: WASM
|
||||
// PROPERTY_LAZY_INITIALIZATION
|
||||
|
||||
// FILE: A.kt
|
||||
|
||||
val o = "O"
|
||||
|
||||
// FILE: B.kt
|
||||
val ok = o + k
|
||||
|
||||
// FILE: C.kt
|
||||
|
||||
val k = "K"
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun box(): String = ok
|
||||
@@ -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}"
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
// IGNORE_BACKEND: JS
|
||||
// PROPERTY_LAZY_INITIALIZATION
|
||||
|
||||
// FILE: A.kt
|
||||
|
||||
val a = "A"
|
||||
|
||||
// FILE: B.kt
|
||||
val b = "B".apply {}
|
||||
|
||||
val c = b
|
||||
|
||||
// FILE: C.kt
|
||||
val d = "D".apply {}
|
||||
|
||||
val e = d
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun box(): String {
|
||||
// Get only e to initialize all properties in file
|
||||
e
|
||||
return if (
|
||||
js("a") === "A" &&
|
||||
js("typeof b") == "undefined" &&
|
||||
js("typeof c") == "undefined" &&
|
||||
js("d") === "D" &&
|
||||
js("e") === "D"
|
||||
)
|
||||
"OK"
|
||||
else "a = ${js("a")}; typeof b = ${js("typeof b")}; typeof c = ${js("typeof c")}; d = ${js("d")}; e = ${js("e")}"
|
||||
}
|
||||
+22
@@ -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
|
||||
Reference in New Issue
Block a user