From 373283dcae476c52522d2e319cac937c39fdc723 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 30 May 2019 18:07:56 +0300 Subject: [PATCH] FIR: Cache ConeClassifierSymbol in ConeClassLikeLookupTagImpl --- .../org/jetbrains/kotlin/fir/symbols/ConeLookupTags.kt | 2 ++ .../jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/ConeLookupTags.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/ConeLookupTags.kt index 855097c730a..c241d566c97 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/ConeLookupTags.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/ConeLookupTags.kt @@ -32,6 +32,8 @@ interface ConeTypeAliasLookupTag : ConeClassLikeLookupTag interface ConeClassLookupTag : ConeClassLikeLookupTag class ConeClassLikeLookupTagImpl(override val classId: ClassId) : ConeClassLikeLookupTag { + var boundSymbol: Pair<*, *>? = null + override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt index 53ada571be5..bc599c0e667 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt @@ -21,7 +21,15 @@ interface FirSymbolProvider { fun getSymbolByLookupTag(lookupTag: ConeClassifierLookupTag): ConeClassifierSymbol? { return when (lookupTag) { - is ConeClassLikeLookupTag -> getClassLikeSymbolByFqName(lookupTag.classId) + is ConeClassLikeLookupTag -> { + (lookupTag as? ConeClassLikeLookupTagImpl) + ?.boundSymbol?.takeIf { it.first === this }?.let { return it.second as ConeClassifierSymbol? } + + getClassLikeSymbolByFqName(lookupTag.classId).also { + (lookupTag as? ConeClassLikeLookupTagImpl) + ?.boundSymbol = Pair(this, it) + } + } is ConeClassifierLookupTagWithFixedSymbol -> lookupTag.symbol else -> error("Unknown lookupTag type: ${lookupTag::class}") }