FirTypeIntersectionScope: add intersection overrides caching
This commit is contained in:
+7
-2
@@ -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,6 +95,7 @@ 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 intersectionOverride = intersectionOverrides.getOrPut(mostSpecific) {
|
||||||
val newSymbol = FirNamedFunctionSymbol(mostSpecific.callableId, mostSpecific.isFakeOverride, mostSpecific)
|
val newSymbol = FirNamedFunctionSymbol(mostSpecific.callableId, mostSpecific.isFakeOverride, mostSpecific)
|
||||||
val mostSpecificFunction = mostSpecific.fir
|
val mostSpecificFunction = mostSpecific.fir
|
||||||
createFunctionCopy(mostSpecific.fir, newSymbol).apply {
|
createFunctionCopy(mostSpecific.fir, newSymbol).apply {
|
||||||
@@ -113,9 +116,11 @@ class FirTypeIntersectionScope private constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.build()
|
}.build()
|
||||||
overriddenSymbols[newSymbol] = extractedOverrides
|
newSymbol
|
||||||
|
}
|
||||||
|
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user