FirTypeIntersectionScope: add intersection overrides caching

This commit is contained in:
Mikhail Glukhikh
2020-07-14 12:22:32 +03:00
parent c1d223dbde
commit 10a1d5c03b
@@ -37,6 +37,8 @@ class FirTypeIntersectionScope private constructor(
private val overriddenSymbols: MutableMap<FirCallableSymbol<*>, Collection<FirCallableSymbol<*>>> = mutableMapOf() private val overriddenSymbols: MutableMap<FirCallableSymbol<*>, Collection<FirCallableSymbol<*>>> = mutableMapOf()
private val intersectionOverrides: MutableMap<FirNamedFunctionSymbol, FirNamedFunctionSymbol> = mutableMapOf()
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) { override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) {
if (!processCallablesByName(name, processor, absentFunctions, FirScope::processFunctionsByName)) { if (!processCallablesByName(name, processor, absentFunctions, FirScope::processFunctionsByName)) {
super.processFunctionsByName(name, processor) super.processFunctionsByName(name, processor)
@@ -93,29 +95,32 @@ class FirTypeIntersectionScope private constructor(
val mostSpecific = selectMostSpecificMember(extractedOverrides) val mostSpecific = selectMostSpecificMember(extractedOverrides)
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 newSymbol = FirNamedFunctionSymbol(mostSpecific.callableId, mostSpecific.isFakeOverride, mostSpecific) val intersectionOverride = intersectionOverrides.getOrPut(mostSpecific) {
val mostSpecificFunction = mostSpecific.fir val newSymbol = FirNamedFunctionSymbol(mostSpecific.callableId, mostSpecific.isFakeOverride, mostSpecific)
createFunctionCopy(mostSpecific.fir, newSymbol).apply { val mostSpecificFunction = mostSpecific.fir
resolvePhase = mostSpecificFunction.resolvePhase createFunctionCopy(mostSpecific.fir, newSymbol).apply {
typeParameters += mostSpecificFunction.typeParameters resolvePhase = mostSpecificFunction.resolvePhase
valueParameters += mostSpecificFunction.valueParameters.mapIndexed { index, mostSpecificParameter -> typeParameters += mostSpecificFunction.typeParameters
val overriddenWithDefault = valueParameters += mostSpecificFunction.valueParameters.mapIndexed { index, mostSpecificParameter ->
extractedOverrides.firstOrNull { val overriddenWithDefault =
(it as FirNamedFunctionSymbol).fir.valueParameters.getOrNull(index)?.defaultValue != null extractedOverrides.firstOrNull {
}?.fir as? FirSimpleFunction (it as FirNamedFunctionSymbol).fir.valueParameters.getOrNull(index)?.defaultValue != null
if (overriddenWithDefault == null) { }?.fir as? FirSimpleFunction
mostSpecificParameter if (overriddenWithDefault == null) {
} else { mostSpecificParameter
val overriddenWithDefaultParameter = overriddenWithDefault.valueParameters[index] } else {
createValueParameterCopy(mostSpecificParameter, overriddenWithDefaultParameter.defaultValue).apply { val overriddenWithDefaultParameter = overriddenWithDefault.valueParameters[index]
annotations += mostSpecificParameter.annotations createValueParameterCopy(mostSpecificParameter, overriddenWithDefaultParameter.defaultValue).apply {
}.build() annotations += mostSpecificParameter.annotations
}.build()
}
} }
} }.build()
}.build() newSymbol
overriddenSymbols[newSymbol] = extractedOverrides }
overriddenSymbols[intersectionOverride] = extractedOverrides
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
processor(newSymbol as D) processor(intersectionOverride as D)
} else { } else {
overriddenSymbols[mostSpecific] = extractedOverrides overriddenSymbols[mostSpecific] = extractedOverrides
processor(mostSpecific) processor(mostSpecific)