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:
+7
-5
@@ -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
|
||||
}
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user