[FIR] Cache lookupTag lookup on creation from symbol (partially)

This commit is contained in:
Simon Ogorodnik
2019-12-12 18:23:52 +03:00
parent 0fb883ef62
commit 2e27862d38
3 changed files with 20 additions and 4 deletions
@@ -29,6 +29,10 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
fun ConeClassLikeLookupTagImpl.bindSymbolToLookupTag(provider: FirSymbolProvider, symbol: FirClassLikeSymbol<*>?) {
boundSymbol = Pair(provider, symbol)
}
abstract class FirSymbolProvider : FirSessionComponent {
abstract fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>?
@@ -38,8 +42,7 @@ abstract class FirSymbolProvider : FirSessionComponent {
?.boundSymbol?.takeIf { it.first === this }?.let { return it.second }
return getClassLikeSymbolByFqName(lookupTag.classId).also {
(lookupTag as? ConeClassLikeLookupTagImpl)
?.boundSymbol = Pair(this, it)
(lookupTag as? ConeClassLikeLookupTagImpl)?.bindSymbolToLookupTag(this, it)
}
}
@@ -176,6 +176,19 @@ fun FirClassifierSymbol<*>.constructType(typeArguments: Array<ConeKotlinTypeProj
fun FirClassifierSymbol<*>.constructType(parts: List<FirQualifierPart>, isNullable: Boolean): ConeKotlinType =
constructType(parts.toTypeProjections(), isNullable)
fun FirClassifierSymbol<*>.constructType(
parts: List<FirQualifierPart>,
isNullable: Boolean,
symbolOriginSession: FirSession
): ConeKotlinType =
constructType(parts.toTypeProjections(), isNullable)
.also {
val lookupTag = it.lookupTag
if (lookupTag is ConeClassLikeLookupTagImpl && this is FirClassLikeSymbol<*>) {
lookupTag.bindSymbolToLookupTag(symbolOriginSession.firSymbolProvider, this)
}
}
fun ConeKotlinType.toTypeProjection(variance: Variance): ConeKotlinTypeProjection =
when (variance) {
Variance.INVARIANT -> this
@@ -83,7 +83,7 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver {
if (symbol == null) {
return ConeKotlinErrorType("Symbol not found, for `${typeRef.render()}`")
}
return symbol.constructType(typeRef.qualifier, typeRef.isMarkedNullable)
return symbol.constructType(typeRef.qualifier, typeRef.isMarkedNullable, symbolOriginSession = session)
}
@@ -113,7 +113,7 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver {
createFunctionalType(typeRef)
}
is FirImplicitBuiltinTypeRef -> {
resolveToSymbol(typeRef, scope)!!.constructType(emptyList(), isNullable = false)
resolveToSymbol(typeRef, scope)!!.constructType(emptyList(), isNullable = false, symbolOriginSession = session)
}
is FirDelegatedTypeRef -> {
resolveType(typeRef.typeRef, scope)