From e8f5e35a86695efb8c402a6a8d1ad0de41d333b5 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 10 Jan 2024 14:08:54 +0200 Subject: [PATCH] [FIR] Consider expect declarations in defaults arguments inheritance checker Actual functions cannot declare default values for parameters Corresponding expect function should be checked instead --- ...MultipleDefaultsInheritedFromSupertypesChecker.kt | 12 ++++++++++-- .../scopes/multipleDefaultsInhereted.fir.kt | 8 ++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMultipleDefaultsInheritedFromSupertypesChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMultipleDefaultsInheritedFromSupertypesChecker.kt index 96e04382da8..be6ab080668 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMultipleDefaultsInheritedFromSupertypesChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMultipleDefaultsInheritedFromSupertypesChecker.kt @@ -11,11 +11,14 @@ import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind import org.jetbrains.kotlin.fir.analysis.checkers.collectOverriddenFunctionsWhere import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.processOverriddenFunctions import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.containingClassLookupTag import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction +import org.jetbrains.kotlin.fir.declarations.getSingleMatchedExpectForActualOrNull import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes import org.jetbrains.kotlin.fir.isSubstitutionOverride @@ -58,9 +61,14 @@ sealed class FirMultipleDefaultsInheritedFromSupertypesChecker(mppKind: MppCheck context: CheckerContext, reporter: DiagnosticReporter, ) { - val overriddenFunctions = function.collectOverriddenFunctionsWhere(mutableSetOf(), context) { overridden -> + val overriddenFunctions = mutableSetOf() + function.processOverriddenFunctions(context) { overridden -> + // default values of actual functions are located in corresponding expect functions + val overriddenWithDefaults = overridden.getSingleMatchedExpectForActualOrNull() as? FirNamedFunctionSymbol ?: overridden // Substitution overrides copy default values from originals - !overridden.isSubstitutionOverride && overridden.valueParameterSymbols.any { it.hasDefaultValue } + if (!overriddenWithDefaults.isSubstitutionOverride && overriddenWithDefaults.valueParameterSymbols.any { it.hasDefaultValue }) { + overriddenFunctions += overriddenWithDefaults + } } val isExplicitOverride = function.origin == FirDeclarationOrigin.Source diff --git a/compiler/testData/diagnostics/tests/multiplatform/scopes/multipleDefaultsInhereted.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/scopes/multipleDefaultsInhereted.fir.kt index 9256b1aad85..b88b91af964 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/scopes/multipleDefaultsInhereted.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/scopes/multipleDefaultsInhereted.fir.kt @@ -16,8 +16,8 @@ expect interface I2 { override fun foo(x: Int) } -interface CommonInterface : I1, I2 { - override fun foo(x: Int) +interface CommonInterface : I1, I2 { + override fun foo(x: Int) } // MODULE: m1-jvm()()(m1-common) @@ -33,6 +33,6 @@ actual interface I2 { actual fun bar(x: Int) } -actual interface ExpectInterface : I1, I2 { - actual override fun foo(x: Int) +actual interface ExpectInterface : I1, I2 { + actual override fun foo(x: Int) }