K2: change API around collect/lookupSupertypes

In this commit we now require a class-like symbol
(and not a more general classifier symbol) whenever possible.
Exceptional situation with a type parameter is now handled
in Synthetics.kt

Related to KT-63569
This commit is contained in:
Mikhail Glukhikh
2023-11-20 11:29:43 +01:00
committed by Space Team
parent 49e786f088
commit 8924e46458
2 changed files with 17 additions and 9 deletions
@@ -64,7 +64,7 @@ fun collectSymbolsForType(type: ConeKotlinType, useSiteSession: FirSession): Lis
}
fun lookupSuperTypes(
symbols: List<FirClassifierSymbol<*>>,
symbols: List<FirClassSymbol<*>>,
lookupInterfaces: Boolean,
deep: Boolean,
useSiteSession: FirSession,
@@ -161,7 +161,7 @@ fun FirClass.isThereLoopInSupertypes(session: FirSession): Boolean {
}
fun lookupSuperTypes(
symbol: FirClassifierSymbol<*>,
symbol: FirClassLikeSymbol<*>,
lookupInterfaces: Boolean,
deep: Boolean,
useSiteSession: FirSession
@@ -231,7 +231,7 @@ private fun ConeClassLikeType.computePartialExpansion(
supertypeSupplier: SupertypeSupplier
): ConeClassLikeType = fullyExpandedType(useSiteSession) { supertypeSupplier.expansionForTypeAlias(it, useSiteSession) }
private fun FirClassifierSymbol<*>.collectSuperTypes(
private fun FirClassLikeSymbol<*>.collectSuperTypes(
list: MutableList<ConeClassLikeType>,
visitedSymbols: MutableSet<FirClassifierSymbol<*>>,
deep: Boolean,
@@ -287,7 +287,6 @@ private fun FirClassifierSymbol<*>.collectSuperTypes(
expansion.lookupTag.toSymbol(useSiteSession)
?.collectSuperTypes(list, visitedSymbols, deep, lookupInterfaces, substituteSuperTypes, useSiteSession, supertypeSupplier)
}
else -> error("?!id:1")
}
}
@@ -15,8 +15,10 @@ import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.symbols.SyntheticSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.name.CallableId
@@ -277,7 +279,7 @@ class FirSyntheticPropertiesScope private constructor(
*/
private fun isJavaTypeOnThePath(baseType: ConeSimpleKotlinType?): Boolean {
val lookupTagToStop = (baseType as? ConeLookupTagBasedType)?.lookupTag ?: return false
val dispatchReceiverClass = (dispatchReceiverType as? ConeLookupTagBasedType)?.lookupTag?.toSymbol(session) ?: return false
val dispatchReceiverClassSymbol = (dispatchReceiverType as? ConeLookupTagBasedType)?.lookupTag?.toSymbol(session) ?: return false
val typeContext = session.typeContext
fun checkType(type: ConeClassLikeType): Boolean {
@@ -294,10 +296,17 @@ class FirSyntheticPropertiesScope private constructor(
return true
}
val superTypes = lookupSuperTypes(dispatchReceiverClass, lookupInterfaces = true, deep = true, session)
for (superType in superTypes) {
if (checkType(superType)) return true
when (dispatchReceiverClassSymbol) {
is FirClassLikeSymbol -> {
val superTypes = lookupSuperTypes(dispatchReceiverClassSymbol, lookupInterfaces = true, deep = true, session)
for (superType in superTypes) {
if (checkType(superType)) return true
}
return false
}
is FirTypeParameterSymbol -> {
error("Type parameter symbol ${dispatchReceiverClassSymbol.name} is not expected here")
}
}
return false
}
}