[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.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
fun ConeClassLikeLookupTagImpl.bindSymbolToLookupTag(provider: FirSymbolProvider, symbol: FirClassLikeSymbol<*>?) {
boundSymbol = Pair(provider, symbol)
}
abstract class FirSymbolProvider : FirSessionComponent { abstract class FirSymbolProvider : FirSessionComponent {
abstract fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? abstract fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>?
@@ -38,8 +42,7 @@ abstract class FirSymbolProvider : FirSessionComponent {
?.boundSymbol?.takeIf { it.first === this }?.let { return it.second } ?.boundSymbol?.takeIf { it.first === this }?.let { return it.second }
return getClassLikeSymbolByFqName(lookupTag.classId).also { return getClassLikeSymbolByFqName(lookupTag.classId).also {
(lookupTag as? ConeClassLikeLookupTagImpl) (lookupTag as? ConeClassLikeLookupTagImpl)?.bindSymbolToLookupTag(this, it)
?.boundSymbol = Pair(this, it)
} }
} }
@@ -176,6 +176,19 @@ fun FirClassifierSymbol<*>.constructType(typeArguments: Array<ConeKotlinTypeProj
fun FirClassifierSymbol<*>.constructType(parts: List<FirQualifierPart>, isNullable: Boolean): ConeKotlinType = fun FirClassifierSymbol<*>.constructType(parts: List<FirQualifierPart>, isNullable: Boolean): ConeKotlinType =
constructType(parts.toTypeProjections(), isNullable) 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 = fun ConeKotlinType.toTypeProjection(variance: Variance): ConeKotlinTypeProjection =
when (variance) { when (variance) {
Variance.INVARIANT -> this Variance.INVARIANT -> this
@@ -83,7 +83,7 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver {
if (symbol == null) { if (symbol == null) {
return ConeKotlinErrorType("Symbol not found, for `${typeRef.render()}`") 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) createFunctionalType(typeRef)
} }
is FirImplicitBuiltinTypeRef -> { is FirImplicitBuiltinTypeRef -> {
resolveToSymbol(typeRef, scope)!!.constructType(emptyList(), isNullable = false) resolveToSymbol(typeRef, scope)!!.constructType(emptyList(), isNullable = false, symbolOriginSession = session)
} }
is FirDelegatedTypeRef -> { is FirDelegatedTypeRef -> {
resolveType(typeRef.typeRef, scope) resolveType(typeRef.typeRef, scope)