提交 efee3ea6 编写于 作者: I Ilya Goncharov

[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
上级 1b5ebd83
......@@ -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)
......
......@@ -159,11 +159,6 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
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<K2JSCompilerArguments>() {
generateDceJs = arguments.irDce,
dceDriven = arguments.irDceDriven,
multiModule = arguments.irPerModule,
relativeRequirePath = true
relativeRequirePath = true,
propertyLazyInitialization = arguments.irPropertyLazyInitialization,
)
} catch (e: JsIrCompilationError) {
return COMPILATION_ERROR
......
......@@ -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");
......@@ -43,10 +43,11 @@ class JsIrBackendContext(
val additionalExportedDeclarationNames: Set<FqName>,
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<IrFile, IrSimpleFunction?> = mutableMapOf()
val fileToPurenessInitializers: MutableMap<IrFile, Boolean> = mutableMapOf()
val fileToInitializationFuns: MutableMap<IrFile, IrSimpleFunction?> = mutableMapOf()
val fileToInitializerPureness: MutableMap<IrFile, Boolean> = mutableMapOf()
override val extractedLocalClasses: MutableSet<IrClass> = hashSetOf()
......
......@@ -109,16 +109,6 @@ class ModuleLowering(
override val modulePhase: NamedCompilerPhase<JsIrBackendContext, Iterable<IrModuleFragment>>
) : Lowering(name)
class FileLowering(
name: String,
description: String,
prerequisite: Set<NamedCompilerPhase<JsIrBackendContext, *>> = emptySet(),
private val factory: (JsIrBackendContext) -> FileLoweringPass
) : Lowering(name) {
override val modulePhase: NamedCompilerPhase<JsIrBackendContext, Iterable<IrModuleFragment>> =
makeJsModulePhase(factory, name, description, prerequisite)
}
private fun makeDeclarationTransformerPhase(
lowering: (JsIrBackendContext) -> DeclarationTransformer,
name: String,
......@@ -133,13 +123,6 @@ private fun makeBodyLoweringPhase(
prerequisite: Set<Lowering> = emptySet()
) = BodyLowering(name, description, prerequisite.map { it.modulePhase }.toSet(), lowering)
private fun makeFileLoweringPhase(
lowering: (JsIrBackendContext) -> FileLoweringPass,
name: String,
description: String,
prerequisite: Set<Lowering> = emptySet()
) = FileLowering(name, description, prerequisite.map { it.modulePhase }.toSet(), lowering)
fun NamedCompilerPhase<JsIrBackendContext, Iterable<IrModuleFragment>>.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(
......
......@@ -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)
......
......@@ -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<IrField, IrExpression>,
initialisedField: IrField
initializedField: IrField
) {
body = irFactory.createBlockBody(
UNDEFINED_OFFSET,
UNDEFINED_OFFSET,
buildBodyWithIfGuard(initializers, initialisedField)
buildBodyWithIfGuard(initializers, initializedField)
)
}
private fun buildBodyWithIfGuard(
initializers: Map<IrField, IrExpression>,
initialisedField: IrField
initializedField: IrField
): List<IrStatement> {
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<IrDeclaration>? {
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
}
}
......
......@@ -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
......
......@@ -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");
......@@ -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");
......@@ -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");
......@@ -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 {
......
......@@ -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");
......
......@@ -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");
......@@ -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");
......
......@@ -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");
......@@ -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");
......
......@@ -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");
// IGNORE_BACKEND: JS, NATIVE
// IGNORE_BACKEND: JS
// DONT_TARGET_EXACT_BACKEND: WASM
// PROPERTY_LAZY_INITIALISATION
// PROPERTY_LAZY_INITIALIZATION
// FILE: A.kt
......
// 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
// 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" &&
......
// 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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册