FirTypeIntersectionScope: extract 'createIntersectionOverride'

This commit is contained in:
Mikhail Glukhikh
2020-07-15 13:23:33 +03:00
parent 9934f7d56e
commit ddd26de139
@@ -97,28 +97,8 @@ class FirTypeIntersectionScope private constructor(
if (extractedOverrides.size > 1 && mostSpecific is FirNamedFunctionSymbol) {
// TODO: same code for properties
val intersectionOverride = intersectionOverrides.getOrPut(mostSpecific) {
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 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
@Suppress("UNCHECKED_CAST")
createIntersectionOverride(mostSpecific, extractedOverrides as Collection<FirNamedFunctionSymbol>)
}
overriddenSymbols[intersectionOverride] = extractedOverrides
@Suppress("UNCHECKED_CAST")
@@ -132,6 +112,34 @@ class FirTypeIntersectionScope private constructor(
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 {
require(overridables.isNotEmpty()) { "Should have at least one overridable symbol" }
if (overridables.size == 1) {