FIR: clarify some calls around lookupTag.toSymbol

This commit is contained in:
Mikhail Glukhikh
2021-12-03 17:31:36 +03:00
parent d842ac5d3e
commit de783ad51f
9 changed files with 48 additions and 50 deletions
@@ -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
*/
@@ -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
}
}
@@ -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")
}
}
@@ -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
@@ -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)
}
}
@@ -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)
}
@@ -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 -> {}
}
}