From 10a1d5c03b5f08f0d8ca7c481de92d3974a79a72 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 14 Jul 2020 12:22:32 +0300 Subject: [PATCH] FirTypeIntersectionScope: add intersection overrides caching --- .../scopes/impl/FirTypeIntersectionScope.kt | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt index e768a82cacd..6342f0f0ac4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScope.kt @@ -37,6 +37,8 @@ class FirTypeIntersectionScope private constructor( private val overriddenSymbols: MutableMap, Collection>> = mutableMapOf() + private val intersectionOverrides: MutableMap = mutableMapOf() + override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) { if (!processCallablesByName(name, processor, absentFunctions, FirScope::processFunctionsByName)) { super.processFunctionsByName(name, processor) @@ -93,29 +95,32 @@ class FirTypeIntersectionScope private constructor( val mostSpecific = selectMostSpecificMember(extractedOverrides) if (extractedOverrides.size > 1 && mostSpecific is FirNamedFunctionSymbol) { // TODO: same code for properties - val newSymbol = FirNamedFunctionSymbol(mostSpecific.callableId, mostSpecific.isFakeOverride, mostSpecific) - val mostSpecificFunction = mostSpecific.fir - createFunctionCopy(mostSpecific.fir, newSymbol).apply { - resolvePhase = mostSpecificFunction.resolvePhase - 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() + 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 + 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() - overriddenSymbols[newSymbol] = extractedOverrides + }.build() + newSymbol + } + overriddenSymbols[intersectionOverride] = extractedOverrides @Suppress("UNCHECKED_CAST") - processor(newSymbol as D) + processor(intersectionOverride as D) } else { overriddenSymbols[mostSpecific] = extractedOverrides processor(mostSpecific)