Fixed bug with fake overridden functions with defaults
This commit is contained in:
committed by
Igor Chevdar
parent
c49770d9a7
commit
2f3ff60abc
+30
-24
@@ -35,7 +35,6 @@ import org.jetbrains.kotlin.ir.types.*
|
|||||||
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
||||||
import org.jetbrains.kotlin.ir.util.defaultType
|
import org.jetbrains.kotlin.ir.util.defaultType
|
||||||
import org.jetbrains.kotlin.ir.util.transformDeclarationsFlat
|
import org.jetbrains.kotlin.ir.util.transformDeclarationsFlat
|
||||||
import org.jetbrains.kotlin.ir.util.transformFlat
|
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
@@ -66,28 +65,13 @@ open class DefaultArgumentStubGenerator constructor(val context: CommonBackendCo
|
|||||||
|
|
||||||
if (bodies.isEmpty()) {
|
if (bodies.isEmpty()) {
|
||||||
// Fake override
|
// Fake override
|
||||||
val newIrFunction = irFunction.generateDefaultsFunction(context, IrDeclarationOrigin.FAKE_OVERRIDE)
|
val newIrFunction = irFunction.generateDefaultsFunction(context, IrDeclarationOrigin.FAKE_OVERRIDE, skipInlineMethods)
|
||||||
|
|
||||||
if (irFunction is IrSimpleFunction) {
|
|
||||||
for (baseFunSymbol in irFunction.overriddenSymbols) {
|
|
||||||
val baseFun = baseFunSymbol.owner
|
|
||||||
if (baseFun.needsDefaultArgumentsLowering(skipInlineMethods)) {
|
|
||||||
val baseOrigin = if (baseFun.valueParameters.any { it.defaultValue != null }) {
|
|
||||||
DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER
|
|
||||||
} else {
|
|
||||||
IrDeclarationOrigin.FAKE_OVERRIDE
|
|
||||||
}
|
|
||||||
(baseFun.generateDefaultsFunction(context, baseOrigin) as? IrSimpleFunction)?.let {
|
|
||||||
(newIrFunction as IrSimpleFunction).overriddenSymbols.add(it.symbol)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return listOf(irFunction, newIrFunction)
|
return listOf(irFunction, newIrFunction)
|
||||||
}
|
}
|
||||||
|
|
||||||
val newIrFunction = irFunction.generateDefaultsFunction(context, DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER)
|
val newIrFunction =
|
||||||
|
irFunction.generateDefaultsFunction(context, DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER, skipInlineMethods)
|
||||||
|
|
||||||
log { "$irFunction -> $newIrFunction" }
|
log { "$irFunction -> $newIrFunction" }
|
||||||
val builder = context.createIrBuilder(newIrFunction.symbol)
|
val builder = context.createIrBuilder(newIrFunction.symbol)
|
||||||
@@ -281,7 +265,8 @@ open class DefaultParameterInjector constructor(
|
|||||||
val declaration = expression.symbol.owner
|
val declaration = expression.symbol.owner
|
||||||
|
|
||||||
val keyFunction = declaration.findSuperMethodWithDefaultArguments()!!
|
val keyFunction = declaration.findSuperMethodWithDefaultArguments()!!
|
||||||
val realFunction = keyFunction.generateDefaultsFunction(context, DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER)
|
val realFunction =
|
||||||
|
keyFunction.generateDefaultsFunction(context, DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER, skipInline)
|
||||||
|
|
||||||
log { "$declaration -> $realFunction" }
|
log { "$declaration -> $realFunction" }
|
||||||
val maskValues = Array((declaration.valueParameters.size + 31) / 32) { 0 }
|
val maskValues = Array((declaration.valueParameters.size + 31) / 32) { 0 }
|
||||||
@@ -368,7 +353,11 @@ private fun IrFunction.needsDefaultArgumentsLowering(skipInlineMethods: Boolean)
|
|||||||
return overriddenSymbols.any { it.owner.needsDefaultArgumentsLowering(skipInlineMethods) }
|
return overriddenSymbols.any { it.owner.needsDefaultArgumentsLowering(skipInlineMethods) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrFunction.generateDefaultsFunctionImpl(context: CommonBackendContext, origin: IrDeclarationOrigin): IrFunction {
|
private fun IrFunction.generateDefaultsFunctionImpl(
|
||||||
|
context: CommonBackendContext,
|
||||||
|
origin: IrDeclarationOrigin,
|
||||||
|
skipInlineMethods: Boolean
|
||||||
|
): IrFunction {
|
||||||
val newFunction = buildFunctionDeclaration(this, origin)
|
val newFunction = buildFunctionDeclaration(this, origin)
|
||||||
|
|
||||||
val syntheticParameters = MutableList((valueParameters.size + 31) / 32) { i ->
|
val syntheticParameters = MutableList((valueParameters.size + 31) / 32) { i ->
|
||||||
@@ -404,7 +393,20 @@ private fun IrFunction.generateDefaultsFunctionImpl(context: CommonBackendContex
|
|||||||
|
|
||||||
annotations.mapTo(newFunction.annotations) { it.deepCopyWithSymbols() }
|
annotations.mapTo(newFunction.annotations) { it.deepCopyWithSymbols() }
|
||||||
|
|
||||||
newFunction.parent = parent
|
if (origin == IrDeclarationOrigin.FAKE_OVERRIDE) {
|
||||||
|
for (baseFunSymbol in (this as IrSimpleFunction).overriddenSymbols) {
|
||||||
|
val baseFun = baseFunSymbol.owner
|
||||||
|
if (baseFun.needsDefaultArgumentsLowering(skipInlineMethods)) {
|
||||||
|
val baseOrigin = if (baseFun.valueParameters.any { it.defaultValue != null }) {
|
||||||
|
DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER
|
||||||
|
} else {
|
||||||
|
IrDeclarationOrigin.FAKE_OVERRIDE
|
||||||
|
}
|
||||||
|
val defaultsBaseFun = baseFun.generateDefaultsFunction(context, baseOrigin, skipInlineMethods)
|
||||||
|
(newFunction as IrSimpleFunction).overriddenSymbols.add((defaultsBaseFun as IrSimpleFunction).symbol)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return newFunction
|
return newFunction
|
||||||
}
|
}
|
||||||
@@ -453,9 +455,13 @@ private fun buildFunctionDeclaration(irFunction: IrFunction, origin: IrDeclarati
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrFunction.generateDefaultsFunction(context: CommonBackendContext, origin: IrDeclarationOrigin): IrFunction =
|
private fun IrFunction.generateDefaultsFunction(
|
||||||
|
context: CommonBackendContext,
|
||||||
|
origin: IrDeclarationOrigin,
|
||||||
|
skipInlineMethods: Boolean
|
||||||
|
): IrFunction =
|
||||||
context.ir.defaultParameterDeclarationsCache.getOrPut(this) {
|
context.ir.defaultParameterDeclarationsCache.getOrPut(this) {
|
||||||
generateDefaultsFunctionImpl(context, origin)
|
generateDefaultsFunctionImpl(context, origin, skipInlineMethods)
|
||||||
}
|
}
|
||||||
|
|
||||||
object DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER :
|
object DECLARATION_ORIGIN_FUNCTION_FOR_DEFAULT_PARAMETER :
|
||||||
|
|||||||
Reference in New Issue
Block a user