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( createIrParameter(
valueParameter, index, valueParameter, index,
useStubForDefaultValueStub = function !is FirConstructor || containingClass?.name != Name.identifier("Enum"), useStubForDefaultValueStub = function !is FirConstructor || containingClass?.name != Name.identifier("Enum"),
typeContext typeContext,
skipDefaultParameter = isFakeOverride
).apply { ).apply {
this.parent = parent this.parent = parent
} }
@@ -854,10 +855,10 @@ class Fir2IrDeclarationStorage(
internal fun saveFakeOverrideInClass( internal fun saveFakeOverrideInClass(
irClass: IrClass, irClass: IrClass,
callableDeclaration: FirCallableDeclaration<*>, originalDeclaration: FirCallableDeclaration<*>,
fakeOverride: FirCallableDeclaration<*> fakeOverride: FirCallableDeclaration<*>
) { ) {
fakeOverridesInClass.getOrPut(irClass, ::mutableMapOf)[callableDeclaration] = fakeOverride fakeOverridesInClass.getOrPut(irClass, ::mutableMapOf)[originalDeclaration] = fakeOverride
} }
fun getFakeOverrideInClass( fun getFakeOverrideInClass(
@@ -904,7 +905,8 @@ class Fir2IrDeclarationStorage(
valueParameter: FirValueParameter, valueParameter: FirValueParameter,
index: Int = UNDEFINED_PARAMETER_INDEX, index: Int = UNDEFINED_PARAMETER_INDEX,
useStubForDefaultValueStub: Boolean = true, useStubForDefaultValueStub: Boolean = true,
typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT,
skipDefaultParameter: Boolean = false,
): IrValueParameter { ): IrValueParameter {
val origin = IrDeclarationOrigin.DEFINED val origin = IrDeclarationOrigin.DEFINED
val type = valueParameter.returnTypeRef.toIrType() val type = valueParameter.returnTypeRef.toIrType()
@@ -917,7 +919,7 @@ class Fir2IrDeclarationStorage(
isCrossinline = valueParameter.isCrossinline, isNoinline = valueParameter.isNoinline, isCrossinline = valueParameter.isCrossinline, isNoinline = valueParameter.isNoinline,
isHidden = false, isAssignable = false isHidden = false, isAssignable = false
).apply { ).apply {
if (valueParameter.defaultValue.let { if (!skipDefaultParameter && valueParameter.defaultValue.let {
it != null && (useStubForDefaultValueStub || it !is FirExpressionStub) it != null && (useStubForDefaultValueStub || it !is FirExpressionStub)
} }
) { ) {
@@ -58,7 +58,7 @@ class Fir2IrLazySimpleFunction(
declarationStorage.enterScope(this) declarationStorage.enterScope(this)
fir.valueParameters.mapIndexed { index, valueParameter -> fir.valueParameters.mapIndexed { index, valueParameter ->
declarationStorage.createIrParameter( declarationStorage.createIrParameter(
valueParameter, index, valueParameter, index, skipDefaultParameter = isFakeOverride
).apply { ).apply {
this.parent = this@Fir2IrLazySimpleFunction this.parent = this@Fir2IrLazySimpleFunction
} }
@@ -22830,6 +22830,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/jvmOverloads/simpleJavaCall.kt"); 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 @Test
@TestMetadata("typeParameters.kt") @TestMetadata("typeParameters.kt")
public void testTypeParameters() throws Exception { 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"); 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 @Test
@TestMetadata("typeParameters.kt") @TestMetadata("typeParameters.kt")
public void testTypeParameters() throws Exception { public void testTypeParameters() throws Exception {
@@ -22830,6 +22830,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/jvmOverloads/simpleJavaCall.kt"); 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 @Test
@TestMetadata("typeParameters.kt") @TestMetadata("typeParameters.kt")
public void testTypeParameters() throws Exception { public void testTypeParameters() throws Exception {
@@ -19295,6 +19295,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/jvmOverloads/simpleJavaCall.kt"); 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") @TestMetadata("typeParameters.kt")
public void testTypeParameters() throws Exception { public void testTypeParameters() throws Exception {
runTest("compiler/testData/codegen/box/jvmOverloads/typeParameters.kt"); runTest("compiler/testData/codegen/box/jvmOverloads/typeParameters.kt");