FIR: clarify some calls around lookupTag.toSymbol
This commit is contained in:
@@ -63,7 +63,7 @@ fun FirClassSymbol<*>.unsubstitutedScope(context: CheckerContext): FirTypeScope
|
||||
this.unsubstitutedScope(context.sessionHolder.session, context.sessionHolder.scopeSession, withForcedTypeCalculator = false)
|
||||
|
||||
fun FirTypeRef.toClassLikeSymbol(session: FirSession): FirClassLikeSymbol<*>? {
|
||||
return coneTypeSafe<ConeClassLikeType>()?.toSymbol(session) as? FirClassLikeSymbol<*>
|
||||
return coneTypeSafe<ConeClassLikeType>()?.toSymbol(session)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -75,9 +75,7 @@ fun FirClassSymbol<*>.isSupertypeOf(other: FirClassSymbol<*>, session: FirSessio
|
||||
*/
|
||||
fun FirClassSymbol<*>.isSupertypeOf(other: FirClassSymbol<*>, exclude: MutableSet<FirClassSymbol<*>>): Boolean {
|
||||
for (it in other.resolvedSuperTypeRefs) {
|
||||
val candidate = it.toClassLikeSymbol(session)
|
||||
?.fullyExpandedClass(session) as? FirClassSymbol<*>
|
||||
?: continue
|
||||
val candidate = it.toClassLikeSymbol(session)?.fullyExpandedClass(session) ?: continue
|
||||
|
||||
if (candidate in exclude) {
|
||||
continue
|
||||
@@ -156,14 +154,14 @@ fun FirClassSymbol<*>.getContainingDeclarationSymbol(session: FirSession): FirCl
|
||||
/**
|
||||
* Returns the FirClassLikeDeclaration that the
|
||||
* sequence of FirTypeAlias'es points to starting
|
||||
* with `this`. Or null if something goes wrong.
|
||||
* with `this`. Or null if something goes wrong or we have anonymous object symbol.
|
||||
*/
|
||||
fun FirClassLikeSymbol<*>.fullyExpandedClass(useSiteSession: FirSession): FirRegularClassSymbol? {
|
||||
tailrec fun FirClassLikeSymbol<*>.fullyExpandedClass(useSiteSession: FirSession): FirRegularClassSymbol? {
|
||||
return when (this) {
|
||||
is FirRegularClassSymbol -> this
|
||||
is FirTypeAliasSymbol -> (resolvedExpandedTypeRef.coneTypeSafe<ConeClassLikeType>()
|
||||
?.toSymbol(useSiteSession) as? FirClassLikeSymbol<*>)?.fullyExpandedClass(useSiteSession)
|
||||
else -> null
|
||||
is FirAnonymousObjectSymbol -> null
|
||||
is FirTypeAliasSymbol -> resolvedExpandedTypeRef.coneTypeSafe<ConeClassLikeType>()
|
||||
?.toSymbol(useSiteSession)?.fullyExpandedClass(useSiteSession)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -215,8 +213,6 @@ fun FirNamedFunctionSymbol.overriddenFunctions(
|
||||
return overriddenFunctions
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Returns the modality of the class
|
||||
*/
|
||||
|
||||
+2
-5
@@ -19,10 +19,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isOperator
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope
|
||||
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.isStatic
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
||||
@@ -157,7 +154,7 @@ object FirImportsChecker : FirFileChecker() {
|
||||
return when (classSymbol) {
|
||||
is FirRegularClassSymbol -> classSymbol
|
||||
is FirTypeAliasSymbol -> classSymbol.fullyExpandedClass(context.session)
|
||||
else -> null
|
||||
is FirAnonymousObjectSymbol -> null
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-4
@@ -323,13 +323,11 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirBasedSymbol<*>.isDefinedInInlineFunction(): Boolean {
|
||||
private fun FirClassifierSymbol<*>.isDefinedInInlineFunction(): Boolean {
|
||||
return when (val symbol = this) {
|
||||
is FirAnonymousFunctionSymbol -> true
|
||||
is FirCallableSymbol<*> -> symbol.isLocalMember
|
||||
is FirAnonymousObjectSymbol -> true
|
||||
is FirRegularClassSymbol -> symbol.classId.isLocal
|
||||
else -> error("Unknown callable declaration type: $symbol")
|
||||
is FirTypeAliasSymbol, is FirTypeParameterSymbol -> error("Unexpected classifier declaration type: $symbol")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.languageVersionSettings
|
||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.name.StandardClassIds
|
||||
@@ -116,7 +117,7 @@ object FirSupertypesChecker : FirClassChecker() {
|
||||
}
|
||||
|
||||
private fun checkClassCannotBeExtendedDirectly(
|
||||
symbol: FirBasedSymbol<*>?,
|
||||
symbol: FirClassifierSymbol<*>?,
|
||||
reporter: DiagnosticReporter,
|
||||
superTypeRef: FirTypeRef,
|
||||
context: CheckerContext
|
||||
|
||||
+3
-3
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.expandedConeType
|
||||
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
||||
@@ -39,13 +38,14 @@ object FirVisibilityQualifierChecker : FirResolvedQualifierChecker() {
|
||||
if (!context.session.visibilityChecker.isVisible(
|
||||
firClassLikeDeclaration, context.session, firFile, context.containingDeclarations,
|
||||
dispatchReceiver = null,
|
||||
)) {
|
||||
)
|
||||
) {
|
||||
reporter.reportOn(expression.source, FirErrors.INVISIBLE_REFERENCE, symbol, context)
|
||||
return
|
||||
}
|
||||
|
||||
if (firClassLikeDeclaration is FirTypeAlias) {
|
||||
(firClassLikeDeclaration.expandedConeType?.toSymbol(context.session) as? FirClassLikeSymbol)?.let {
|
||||
firClassLikeDeclaration.expandedConeType?.toSymbol(context.session)?.let {
|
||||
checkClassLikeSymbol(it, expression, context, reporter)
|
||||
}
|
||||
}
|
||||
|
||||
+10
-13
@@ -14,9 +14,7 @@ import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||
import org.jetbrains.kotlin.fir.scopes.*
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.coneType
|
||||
import org.jetbrains.kotlin.fir.types.lowerBoundIfFlexible
|
||||
@@ -87,11 +85,14 @@ class DelegatedMemberGenerator(
|
||||
bodiesInfo.clear()
|
||||
}
|
||||
|
||||
private fun FirTypeParameter.boundClass(): FirClass {
|
||||
val boundType = bounds.first().coneType.fullyExpandedType(session).lowerBoundIfFlexible()
|
||||
val boundClassifier = boundType.toSymbol(session)!!.fir
|
||||
if (boundClassifier is FirClass) return boundClassifier
|
||||
return (boundClassifier as FirTypeParameter).boundClass()
|
||||
private fun FirClassifierSymbol<*>?.boundClass(): FirClass {
|
||||
return when (this) {
|
||||
is FirRegularClassSymbol -> fir
|
||||
is FirAnonymousObjectSymbol -> fir
|
||||
is FirTypeParameterSymbol ->
|
||||
fir.bounds.first().coneType.fullyExpandedType(session).lowerBoundIfFlexible().toSymbol(session).boundClass()
|
||||
is FirTypeAliasSymbol, null -> throw AssertionError(this?.fir?.render())
|
||||
}
|
||||
}
|
||||
|
||||
// Generate delegated members for [subClass]. The synthetic field [irField] has the super interface type.
|
||||
@@ -100,11 +101,7 @@ class DelegatedMemberGenerator(
|
||||
|
||||
val subClassScope = firSubClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = false)
|
||||
val delegateToType = firField.initializer!!.typeRef.coneType.fullyExpandedType(session).lowerBoundIfFlexible()
|
||||
val delegateToClass = when (val fir = delegateToType.toSymbol(session)?.fir) {
|
||||
is FirClass -> fir
|
||||
is FirTypeParameter -> fir.boundClass()
|
||||
else -> throw AssertionError("${fir?.render()}")
|
||||
}
|
||||
val delegateToClass = delegateToType.toSymbol(session).boundClass()
|
||||
|
||||
val delegateToScope = delegateToClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = false)
|
||||
val delegateToLookupTag = (delegateToType as? ConeClassLikeType)?.lookupTag
|
||||
|
||||
@@ -19,8 +19,9 @@ import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.resolvedTypeFromPrototype
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLookupTagWithFixedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
@@ -207,10 +208,14 @@ fun ConeKotlinType.isUnsafeVarianceType(session: FirSession): Boolean {
|
||||
return type.attributes.unsafeVarianceType != null
|
||||
}
|
||||
|
||||
fun ConeKotlinType.toSymbol(session: FirSession): FirBasedSymbol<*>? {
|
||||
fun ConeKotlinType.toSymbol(session: FirSession): FirClassifierSymbol<*>? {
|
||||
return (this as? ConeLookupTagBasedType)?.lookupTag?.toSymbol(session)
|
||||
}
|
||||
|
||||
fun ConeClassLikeType.toSymbol(session: FirSession): FirClassLikeSymbol<*>? {
|
||||
return lookupTag.toSymbol(session)
|
||||
}
|
||||
|
||||
fun ConeKotlinType.toFirResolvedTypeRef(
|
||||
source: KtSourceElement? = null,
|
||||
delegatedTypeRef: FirTypeRef? = null
|
||||
|
||||
@@ -276,16 +276,16 @@ object CheckDslScopeViolation : ResolutionStage() {
|
||||
}
|
||||
is ConeDefinitelyNotNullType -> collectDslMarkerAnnotations(context, type.original)
|
||||
is ConeIntersectionType -> type.intersectedTypes.forEach { collectDslMarkerAnnotations(context, it) }
|
||||
is ConeLookupTagBasedType -> {
|
||||
val classDeclaration = type.toSymbol(context.session)?.fir as? FirClassLikeDeclaration ?: return
|
||||
is ConeClassLikeType -> {
|
||||
val classDeclaration = type.toSymbol(context.session)?.fir ?: return
|
||||
collectDslMarkerAnnotations(context, classDeclaration.annotations)
|
||||
when {
|
||||
classDeclaration is FirClass -> {
|
||||
when (classDeclaration) {
|
||||
is FirClass -> {
|
||||
for (superType in classDeclaration.superConeTypes) {
|
||||
collectDslMarkerAnnotations(context, superType)
|
||||
}
|
||||
}
|
||||
type is ConeClassLikeType -> {
|
||||
is FirTypeAlias -> {
|
||||
type.directExpansionType(context.session)?.let {
|
||||
collectDslMarkerAnnotations(context, it)
|
||||
}
|
||||
|
||||
+10
-6
@@ -21,6 +21,10 @@ import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.LocalClassesNa
|
||||
import org.jetbrains.kotlin.fir.scopes.FirCompositeScope
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.coneType
|
||||
import org.jetbrains.kotlin.fir.types.toSymbol
|
||||
@@ -378,12 +382,12 @@ abstract class AbstractFirStatusResolveTransformer(
|
||||
}
|
||||
|
||||
private fun forceResolveStatusOfCorrespondingClass(typeRef: FirTypeRef) {
|
||||
val superClass = typeRef.coneType.toSymbol(session)?.fir
|
||||
superClass?.ensureResolved(FirResolvePhase.SUPER_TYPES)
|
||||
when (superClass) {
|
||||
is FirRegularClass -> forceResolveStatusesOfClass(superClass)
|
||||
is FirTypeAlias -> forceResolveStatusOfCorrespondingClass(superClass.expandedTypeRef)
|
||||
else -> {}
|
||||
val superClassSymbol = typeRef.coneType.toSymbol(session)
|
||||
superClassSymbol?.ensureResolved(FirResolvePhase.SUPER_TYPES)
|
||||
when (superClassSymbol) {
|
||||
is FirRegularClassSymbol -> forceResolveStatusesOfClass(superClassSymbol.fir)
|
||||
is FirTypeAliasSymbol -> forceResolveStatusOfCorrespondingClass(superClassSymbol.fir.expandedTypeRef)
|
||||
is FirTypeParameterSymbol, is FirAnonymousObjectSymbol, null -> {}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user