FirTypeIntersectionScope: support inherited default parameters
This commit is contained in:
+17
-1
@@ -95,10 +95,26 @@ class FirTypeIntersectionScope private constructor(
|
|||||||
// TODO: same code for properties
|
// TODO: same code for properties
|
||||||
val newSymbol = FirNamedFunctionSymbol(mostSpecific.callableId, mostSpecific.isFakeOverride, mostSpecific)
|
val newSymbol = FirNamedFunctionSymbol(mostSpecific.callableId, mostSpecific.isFakeOverride, mostSpecific)
|
||||||
val mostSpecificFunction = mostSpecific.fir
|
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 {
|
createFunctionCopy(mostSpecific.fir, newSymbol).apply {
|
||||||
resolvePhase = mostSpecificFunction.resolvePhase
|
resolvePhase = mostSpecificFunction.resolvePhase
|
||||||
typeParameters += mostSpecificFunction.typeParameters
|
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()
|
}.build()
|
||||||
overriddenSymbols[newSymbol] = extractedOverrides
|
overriddenSymbols[newSymbol] = extractedOverrides
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
interface Q {
|
interface Q {
|
||||||
fun foo(a: Double): Double
|
fun foo(a: Double): Double
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
interface Q {
|
interface Q {
|
||||||
fun foo(a: Double) = 0.0
|
fun foo(a: Double) = 0.0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
interface Q {
|
interface Q {
|
||||||
fun foo(a: Double): Double
|
fun foo(a: Double): Double
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user