JVM_IR: permit @NoArg if super constructor is already zero-argument

#KT-46537 Fixed
This commit is contained in:
pyos
2021-05-07 10:44:00 +02:00
committed by Alexander Udalov
parent ac9e8f667d
commit 36a25353e9
5 changed files with 46 additions and 63 deletions
@@ -35,7 +35,8 @@ class InitializersLowering(context: CommonBackendContext) : InitializersLowering
val irClass = container.constructedClass
val instanceInitializerStatements = extractInitializers(irClass) {
(it is IrField && !it.isStatic) || (it is IrAnonymousInitializer && !it.isStatic)
(it is IrField && !it.isStatic && (container.isPrimary || !it.primaryConstructorParameter)) ||
(it is IrAnonymousInitializer && !it.isStatic)
}
val block = IrBlockImpl(irClass.startOffset, irClass.endOffset, context.irBuiltIns.unitType, null, instanceInitializerStatements)
// Check that the initializers contain no local classes. Deep-copying them is a disaster for code size, and liable to break randomly.
@@ -54,6 +55,9 @@ class InitializersLowering(context: CommonBackendContext) : InitializersLowering
}
}
private val IrField.primaryConstructorParameter: Boolean
get() = (initializer?.expression as? IrGetValue)?.origin == IrStatementOrigin.INITIALIZE_PROPERTY_FROM_PARAMETER
abstract class InitializersLoweringBase(open val context: CommonBackendContext) {
protected fun extractInitializers(irClass: IrClass, filter: (IrDeclaration) -> Boolean) =
// TODO What about fields that were added by lowerings? e.g. captured outer class or locals?