diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt index 9bd60f240ae..0a84947c207 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt @@ -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()?.toSymbol(session) as? FirClassLikeSymbol<*> + return coneTypeSafe()?.toSymbol(session) } /** @@ -75,9 +75,7 @@ fun FirClassSymbol<*>.isSupertypeOf(other: FirClassSymbol<*>, session: FirSessio */ fun FirClassSymbol<*>.isSupertypeOf(other: FirClassSymbol<*>, exclude: MutableSet>): 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() - ?.toSymbol(useSiteSession) as? FirClassLikeSymbol<*>)?.fullyExpandedClass(useSiteSession) - else -> null + is FirAnonymousObjectSymbol -> null + is FirTypeAliasSymbol -> resolvedExpandedTypeRef.coneTypeSafe() + ?.toSymbol(useSiteSession)?.fullyExpandedClass(useSiteSession) } } @@ -215,8 +213,6 @@ fun FirNamedFunctionSymbol.overriddenFunctions( return overriddenFunctions } - - /** * Returns the modality of the class */ diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt index 6692494dce7..16c0a6e610a 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt @@ -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 } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt index 40cbea1c0ad..2779d483c04 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt @@ -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") } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt index c5b45c5988c..05e584f978a 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt @@ -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 diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirVisibilityQualifierChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirVisibilityQualifierChecker.kt index 08f4ce39889..9b7851e4336 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirVisibilityQualifierChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirVisibilityQualifierChecker.kt @@ -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) } } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt index 0546b9934cb..38d5572b1ae 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt @@ -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 diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt index bab38ed6fc0..a22119c3631 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt @@ -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 diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt index 84cb7dbc9b6..4300b69d008 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt @@ -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) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt index b74a077394e..ba4c94e8ec8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt @@ -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 -> {} } }