FIR: Cache ConeClassifierSymbol in ConeClassLikeLookupTagImpl

This commit is contained in:
Denis Zharkov
2019-05-30 18:07:56 +03:00
committed by Mikhail Glukhikh
parent 91d8f1fc88
commit 373283dcae
2 changed files with 11 additions and 1 deletions
@@ -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
@@ -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}")
}