FIR2IR: Fix case of @JvmOverloads with subclass

Avoid generating synthetic overrides in subclass
It has been already working for PSI2IR because fake overrides there don't
inherit default values for parameters, while they do it in FIR
This commit is contained in:
Denis.Zharkov
2021-02-18 19:18:09 +03:00
parent 377a0aa237
commit e4c851e3ce
7 changed files with 46 additions and 6 deletions
@@ -318,7 +318,8 @@ class Fir2IrDeclarationStorage(
createIrParameter(
valueParameter, index,
useStubForDefaultValueStub = function !is FirConstructor || containingClass?.name != Name.identifier("Enum"),
typeContext
typeContext,
skipDefaultParameter = isFakeOverride
).apply {
this.parent = parent
}
@@ -854,10 +855,10 @@ class Fir2IrDeclarationStorage(
internal fun saveFakeOverrideInClass(
irClass: IrClass,
callableDeclaration: FirCallableDeclaration<*>,
originalDeclaration: FirCallableDeclaration<*>,
fakeOverride: FirCallableDeclaration<*>
) {
fakeOverridesInClass.getOrPut(irClass, ::mutableMapOf)[callableDeclaration] = fakeOverride
fakeOverridesInClass.getOrPut(irClass, ::mutableMapOf)[originalDeclaration] = fakeOverride
}
fun getFakeOverrideInClass(
@@ -904,7 +905,8 @@ class Fir2IrDeclarationStorage(
valueParameter: FirValueParameter,
index: Int = UNDEFINED_PARAMETER_INDEX,
useStubForDefaultValueStub: Boolean = true,
typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT
typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT,
skipDefaultParameter: Boolean = false,
): IrValueParameter {
val origin = IrDeclarationOrigin.DEFINED
val type = valueParameter.returnTypeRef.toIrType()
@@ -917,7 +919,7 @@ class Fir2IrDeclarationStorage(
isCrossinline = valueParameter.isCrossinline, isNoinline = valueParameter.isNoinline,
isHidden = false, isAssignable = false
).apply {
if (valueParameter.defaultValue.let {
if (!skipDefaultParameter && valueParameter.defaultValue.let {
it != null && (useStubForDefaultValueStub || it !is FirExpressionStub)
}
) {
@@ -58,7 +58,7 @@ class Fir2IrLazySimpleFunction(
declarationStorage.enterScope(this)
fir.valueParameters.mapIndexed { index, valueParameter ->
declarationStorage.createIrParameter(
valueParameter, index,
valueParameter, index, skipDefaultParameter = isFakeOverride
).apply {
this.parent = this@Fir2IrLazySimpleFunction
}
@@ -22830,6 +22830,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/jvmOverloads/simpleJavaCall.kt");
}
@Test
@TestMetadata("subClass.kt")
public void testSubClass() throws Exception {
runTest("compiler/testData/codegen/box/jvmOverloads/subClass.kt");
}
@Test
@TestMetadata("typeParameters.kt")
public void testTypeParameters() throws Exception {
+15
View File
@@ -0,0 +1,15 @@
// TARGET_BACKEND: JVM
// WITH_RUNTIME
open class A {
@JvmOverloads
fun foo(x: String, y: String = "", z: String = "K"): String {
return x + y + z
}
}
class B : A()
fun box(): String {
return B().foo("O")
}
@@ -22830,6 +22830,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/jvmOverloads/simpleJavaCall.kt");
}
@Test
@TestMetadata("subClass.kt")
public void testSubClass() throws Exception {
runTest("compiler/testData/codegen/box/jvmOverloads/subClass.kt");
}
@Test
@TestMetadata("typeParameters.kt")
public void testTypeParameters() throws Exception {
@@ -22830,6 +22830,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/jvmOverloads/simpleJavaCall.kt");
}
@Test
@TestMetadata("subClass.kt")
public void testSubClass() throws Exception {
runTest("compiler/testData/codegen/box/jvmOverloads/subClass.kt");
}
@Test
@TestMetadata("typeParameters.kt")
public void testTypeParameters() throws Exception {
@@ -19295,6 +19295,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/jvmOverloads/simpleJavaCall.kt");
}
@TestMetadata("subClass.kt")
public void testSubClass() throws Exception {
runTest("compiler/testData/codegen/box/jvmOverloads/subClass.kt");
}
@TestMetadata("typeParameters.kt")
public void testTypeParameters() throws Exception {
runTest("compiler/testData/codegen/box/jvmOverloads/typeParameters.kt");