FirTypeIntersectionScope: support inherited default parameters

This commit is contained in:
Mikhail Glukhikh
2020-07-14 11:18:52 +03:00
parent 7a2ea49399
commit c46fac3464
4 changed files with 17 additions and 4 deletions
@@ -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")
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
interface Q {
fun foo(a: Double): Double
}
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
interface Q {
fun foo(a: Double) = 0.0
}
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
interface Q {
fun foo(a: Double): Double
}