From 89fe73f6f4e093358b6e7216093e2582885a243c Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Wed, 13 Sep 2023 19:30:50 +0200 Subject: [PATCH] [FIR] Consider expect default function parameters in FirSuperCallWithDefaultsChecker ^KT-61572 Fixed --- .../FirSuperCallWithDefaultsChecker.kt | 7 ++++-- .../superCallDefaultArguments.fir.kt | 22 ------------------- .../superCallDefaultArguments.kt | 8 +++---- 3 files changed, 9 insertions(+), 28 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/multiplatform/superCallDefaultArguments.fir.kt diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperCallWithDefaultsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperCallWithDefaultsChecker.kt index 5798eb995d8..8324986da47 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperCallWithDefaultsChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirSuperCallWithDefaultsChecker.kt @@ -10,17 +10,20 @@ import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.explicitReceiverIsNotSuperReference import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.declarations.getSingleCompatibleOrWeaklyIncompatibleExpectForActualOrNull import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedArgumentList import org.jetbrains.kotlin.fir.references.toResolvedNamedFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol object FirSuperCallWithDefaultsChecker : FirFunctionCallChecker() { - override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) { if (expression.explicitReceiverIsNotSuperReference()) return val functionSymbol = expression.calleeReference.toResolvedNamedFunctionSymbol() ?: return - if (!functionSymbol.valueParameterSymbols.any { it.hasDefaultValue }) return + val relevantFunctionSymbol = + (functionSymbol.getSingleCompatibleOrWeaklyIncompatibleExpectForActualOrNull() as? FirNamedFunctionSymbol) ?: functionSymbol + if (!relevantFunctionSymbol.valueParameterSymbols.any { it.hasDefaultValue }) return val arguments = expression.argumentList as? FirResolvedArgumentList ?: return if (arguments.arguments.size < functionSymbol.valueParameterSymbols.size) { reporter.reportOn( diff --git a/compiler/testData/diagnostics/tests/multiplatform/superCallDefaultArguments.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/superCallDefaultArguments.fir.kt deleted file mode 100644 index abc6aca32d9..00000000000 --- a/compiler/testData/diagnostics/tests/multiplatform/superCallDefaultArguments.fir.kt +++ /dev/null @@ -1,22 +0,0 @@ -// KT-61572: SUPER_CALL_WITH_DEFAULT_PARAMETERS must be raised for K2/Native in fun bar1() -// !LANGUAGE: +MultiPlatformProjects -// MODULE: m1-common -// FILE: common.kt - -package foo -expect open class A { - open fun foo(x: Int = 20, y: Int = 3): Int -} - -// MODULE: m1-jvm()()(m1-common) -// FILE: jvm.kt -package foo -actual open class A { - actual open fun foo(x: Int, y: Int) = x + y -} - -open class B : A() { - override fun foo(x: Int, y: Int) = 0 - - fun bar1() = super.foo() -} diff --git a/compiler/testData/diagnostics/tests/multiplatform/superCallDefaultArguments.kt b/compiler/testData/diagnostics/tests/multiplatform/superCallDefaultArguments.kt index 0eb476799c1..eed1cee426a 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/superCallDefaultArguments.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/superCallDefaultArguments.kt @@ -1,16 +1,16 @@ -// KT-61572: SUPER_CALL_WITH_DEFAULT_PARAMETERS must be raised for K2/Native in fun bar1() -// !LANGUAGE: +MultiPlatformProjects +// FIR_IDENTICAL +// ISSUE: KT-61572 + // MODULE: m1-common // FILE: common.kt -package foo expect open class A { open fun foo(x: Int = 20, y: Int = 3): Int } // MODULE: m1-jvm()()(m1-common) // FILE: jvm.kt -package foo + actual open class A { actual open fun foo(x: Int, y: Int) = x + y }