[FIR] Cache lookupTag lookup on creation from symbol (partially)
This commit is contained in:
@@ -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
|
||||
|
||||
+2
-2
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user