FirTypeIntersectionScope: extract 'createIntersectionOverride'
This commit is contained in:
+30
-22
@@ -97,28 +97,8 @@ class FirTypeIntersectionScope private constructor(
|
|||||||
if (extractedOverrides.size > 1 && mostSpecific is FirNamedFunctionSymbol) {
|
if (extractedOverrides.size > 1 && mostSpecific is FirNamedFunctionSymbol) {
|
||||||
// TODO: same code for properties
|
// TODO: same code for properties
|
||||||
val intersectionOverride = intersectionOverrides.getOrPut(mostSpecific) {
|
val intersectionOverride = intersectionOverrides.getOrPut(mostSpecific) {
|
||||||
val newSymbol = FirNamedFunctionSymbol(mostSpecific.callableId, mostSpecific.isFakeOverride, mostSpecific)
|
@Suppress("UNCHECKED_CAST")
|
||||||
val mostSpecificFunction = mostSpecific.fir
|
createIntersectionOverride(mostSpecific, extractedOverrides as Collection<FirNamedFunctionSymbol>)
|
||||||
createFunctionCopy(mostSpecific.fir, newSymbol).apply {
|
|
||||||
resolvePhase = mostSpecificFunction.resolvePhase
|
|
||||||
origin = FirDeclarationOrigin.IntersectionOverride
|
|
||||||
typeParameters += mostSpecificFunction.typeParameters
|
|
||||||
valueParameters += mostSpecificFunction.valueParameters.mapIndexed { index, mostSpecificParameter ->
|
|
||||||
val overriddenWithDefault =
|
|
||||||
extractedOverrides.firstOrNull {
|
|
||||||
(it as FirNamedFunctionSymbol).fir.valueParameters.getOrNull(index)?.defaultValue != null
|
|
||||||
}?.fir as? FirSimpleFunction
|
|
||||||
if (overriddenWithDefault == null) {
|
|
||||||
mostSpecificParameter
|
|
||||||
} else {
|
|
||||||
val overriddenWithDefaultParameter = overriddenWithDefault.valueParameters[index]
|
|
||||||
createValueParameterCopy(mostSpecificParameter, overriddenWithDefaultParameter.defaultValue).apply {
|
|
||||||
annotations += mostSpecificParameter.annotations
|
|
||||||
}.build()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.build()
|
|
||||||
newSymbol
|
|
||||||
}
|
}
|
||||||
overriddenSymbols[intersectionOverride] = extractedOverrides
|
overriddenSymbols[intersectionOverride] = extractedOverrides
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
@@ -132,6 +112,34 @@ class FirTypeIntersectionScope private constructor(
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun createIntersectionOverride(
|
||||||
|
mostSpecific: FirNamedFunctionSymbol,
|
||||||
|
extractedOverrides: Collection<FirNamedFunctionSymbol>
|
||||||
|
): FirNamedFunctionSymbol {
|
||||||
|
val newSymbol = FirNamedFunctionSymbol(mostSpecific.callableId, mostSpecific.isFakeOverride, mostSpecific)
|
||||||
|
val mostSpecificFunction = mostSpecific.fir
|
||||||
|
createFunctionCopy(mostSpecific.fir, newSymbol).apply {
|
||||||
|
resolvePhase = mostSpecificFunction.resolvePhase
|
||||||
|
origin = FirDeclarationOrigin.IntersectionOverride
|
||||||
|
typeParameters += mostSpecificFunction.typeParameters
|
||||||
|
valueParameters += mostSpecificFunction.valueParameters.mapIndexed { index, mostSpecificParameter ->
|
||||||
|
val overriddenWithDefault =
|
||||||
|
extractedOverrides.firstOrNull {
|
||||||
|
it.fir.valueParameters.getOrNull(index)?.defaultValue != null
|
||||||
|
}?.fir
|
||||||
|
if (overriddenWithDefault == null) {
|
||||||
|
mostSpecificParameter
|
||||||
|
} else {
|
||||||
|
val overriddenWithDefaultParameter = overriddenWithDefault.valueParameters[index]
|
||||||
|
createValueParameterCopy(mostSpecificParameter, overriddenWithDefaultParameter.defaultValue).apply {
|
||||||
|
annotations += mostSpecificParameter.annotations
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.build()
|
||||||
|
return newSymbol
|
||||||
|
}
|
||||||
|
|
||||||
private fun <D : FirCallableSymbol<*>> selectMostSpecificMember(overridables: Collection<D>): D {
|
private fun <D : FirCallableSymbol<*>> selectMostSpecificMember(overridables: Collection<D>): D {
|
||||||
require(overridables.isNotEmpty()) { "Should have at least one overridable symbol" }
|
require(overridables.isNotEmpty()) { "Should have at least one overridable symbol" }
|
||||||
if (overridables.size == 1) {
|
if (overridables.size == 1) {
|
||||||
|
|||||||
Reference in New Issue
Block a user