diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt index 7ce0bc46579..77d303c257d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/FirSymbolProvider.kt @@ -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) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index 1c5c5c6190a..0d00b697ac4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -176,6 +176,19 @@ fun FirClassifierSymbol<*>.constructType(typeArguments: Array.constructType(parts: List, isNullable: Boolean): ConeKotlinType = constructType(parts.toTypeProjections(), isNullable) +fun FirClassifierSymbol<*>.constructType( + parts: List, + 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 diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt index d79cbf06629..6bbb9ff65df 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirTypeResolverImpl.kt @@ -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)