[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.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
|
||||||
|
|||||||
+2
-2
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user