From c46fac34640258d5cdbe59d352b0571d28e7743f Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 14 Jul 2020 11:18:52 +0300 Subject: [PATCH] FirTypeIntersectionScope: support inherited default parameters --- .../scopes/impl/FirTypeIntersectionScope.kt | 18 +++++++++++++++++- .../box/defaultArguments/function/kt15971.kt | 1 - .../box/defaultArguments/function/kt15971_2.kt | 1 - .../box/defaultArguments/function/kt15971_3.kt | 1 - 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt index 847ebb64d47..b009e107ac6 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt @@ -95,10 +95,26 @@ class FirTypeIntersectionScope private constructor( // TODO: same code for properties val newSymbol = FirNamedFunctionSymbol(mostSpecific.callableId, mostSpecific.isFakeOverride, mostSpecific) val mostSpecificFunction = mostSpecific.fir + val overriddenWithDefault = + extractedOverrides.firstOrNull { + (it as FirNamedFunctionSymbol).fir.valueParameters.any { parameter -> parameter.defaultValue != null } + }?.fir as? FirSimpleFunction createFunctionCopy(mostSpecific.fir, newSymbol).apply { resolvePhase = mostSpecificFunction.resolvePhase typeParameters += mostSpecificFunction.typeParameters - valueParameters += mostSpecificFunction.valueParameters + if (overriddenWithDefault == null) { + valueParameters += mostSpecificFunction.valueParameters + } else { + valueParameters += mostSpecificFunction.valueParameters.zip(overriddenWithDefault.valueParameters) + .map { (mostSpecificParameter, overriddenWithDefaultParameter) -> + if (overriddenWithDefaultParameter.defaultValue != null) + createValueParameterCopy(mostSpecificParameter, overriddenWithDefaultParameter.defaultValue).apply { + annotations += mostSpecificParameter.annotations + }.build() + else + mostSpecificParameter + } + } }.build() overriddenSymbols[newSymbol] = extractedOverrides @Suppress("UNCHECKED_CAST") diff --git a/compiler/testData/codegen/box/defaultArguments/function/kt15971.kt b/compiler/testData/codegen/box/defaultArguments/function/kt15971.kt index 97f44c0672b..7016e03b344 100644 --- a/compiler/testData/codegen/box/defaultArguments/function/kt15971.kt +++ b/compiler/testData/codegen/box/defaultArguments/function/kt15971.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR interface Q { fun foo(a: Double): Double } diff --git a/compiler/testData/codegen/box/defaultArguments/function/kt15971_2.kt b/compiler/testData/codegen/box/defaultArguments/function/kt15971_2.kt index 6feed5c242b..0c3d4eb5217 100644 --- a/compiler/testData/codegen/box/defaultArguments/function/kt15971_2.kt +++ b/compiler/testData/codegen/box/defaultArguments/function/kt15971_2.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR interface Q { fun foo(a: Double) = 0.0 } diff --git a/compiler/testData/codegen/box/defaultArguments/function/kt15971_3.kt b/compiler/testData/codegen/box/defaultArguments/function/kt15971_3.kt index 0694b56b648..82bb5e454e1 100644 --- a/compiler/testData/codegen/box/defaultArguments/function/kt15971_3.kt +++ b/compiler/testData/codegen/box/defaultArguments/function/kt15971_3.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR interface Q { fun foo(a: Double): Double }