[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:
+2
-2
@@ -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
|
||||
|
||||
Generated
-5
@@ -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)
|
||||
|
||||
+30
-33
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
-5
@@ -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");
|
||||
|
||||
-5
@@ -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");
|
||||
|
||||
-5
@@ -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 {
|
||||
|
||||
+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");
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
@@ -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}"
|
||||
}
|
||||
+3
-3
@@ -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" &&
|
||||
+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