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 7f449346ea9..ab254cab222 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 @@ -320,8 +320,7 @@ fun Modality.toToken(): KtModifierKeywordToken = when (this) { val FirFunctionCall.isIterator get() = this.calleeReference.name.asString() == "" -internal val throwableClassLikeType = - StandardClassIds.byName("Throwable").constructClassLikeType(emptyArray(), false) +internal fun throwableClassLikeType(session: FirSession) = session.builtinTypes.throwableType.type -fun ConeKotlinType.isThrowable(session: FirSession) = - throwableClassLikeType.isSupertypeOf(session.typeCheckerContext, this.fullyExpandedType(session)) \ No newline at end of file +fun ConeKotlinType.isSubtypeOfThrowable(session: FirSession) = + throwableClassLikeType(session).isSupertypeOf(session.typeCheckerContext, this.fullyExpandedType(session)) \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirThrowableSubclassChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirThrowableSubclassChecker.kt index 8120c465495..00f10c89a30 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirThrowableSubclassChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirThrowableSubclassChecker.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext -import org.jetbrains.kotlin.fir.analysis.checkers.isThrowable +import org.jetbrains.kotlin.fir.analysis.checkers.isSubtypeOfThrowable import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn @@ -33,7 +33,7 @@ object FirThrowableSubclassChecker : FirClassChecker() { } private fun FirClass<*>.hasThrowableSupertype(context: CheckerContext) = - superConeTypes.any { it !is ConeClassErrorType && it.isThrowable(context.session) } + superConeTypes.any { it !is ConeClassErrorType && it.isSubtypeOfThrowable(context.session) } private fun FirClass<*>.hasGenericOuterDeclaration(context: CheckerContext) = classId.isLocal && context.containingDeclarations.anyIsGeneric() diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirCatchParameterChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirCatchParameterChecker.kt index 7e06f0e160a..3562c8ed446 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirCatchParameterChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirCatchParameterChecker.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext -import org.jetbrains.kotlin.fir.analysis.checkers.isThrowable +import org.jetbrains.kotlin.fir.analysis.checkers.isSubtypeOfThrowable import org.jetbrains.kotlin.fir.analysis.checkers.throwableClassLikeType import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors @@ -38,8 +38,9 @@ object FirCatchParameterChecker : FirTryExpressionChecker() { } } - if (!coneType.isThrowable(context.session)) { - reporter.reportOn(catchParameter.source, FirErrors.TYPE_MISMATCH, throwableClassLikeType, coneType, context) + val session = context.session + if (!coneType.isSubtypeOfThrowable(context.session)) { + reporter.reportOn(catchParameter.source, FirErrors.TYPE_MISMATCH, throwableClassLikeType(session), coneType, context) } } } diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/StandardClassIds.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/StandardClassIds.kt index 96e5e4c2d4e..3e6a7f66f4c 100644 --- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/StandardClassIds.kt +++ b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/symbols/StandardClassIds.kt @@ -41,6 +41,7 @@ object StandardClassIds { val ULong = Long.unsignedId() val String = "String".baseId() + val Throwable = "Throwable".baseId() val KProperty = "KProperty".reflectId() val KMutableProperty = "KMutableProperty".reflectId() diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt index 391182ef4f8..f0d367308df 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt @@ -62,4 +62,5 @@ class BuiltinTypes { val nullableNothingType: FirImplicitBuiltinTypeRef = FirImplicitNullableNothingTypeRef(null) val charType: FirImplicitBuiltinTypeRef = FirImplicitCharTypeRef(null) val stringType: FirImplicitBuiltinTypeRef = FirImplicitStringTypeRef(null) + val throwableType: FirImplicitThrowableTypeRef = FirImplicitThrowableTypeRef(null) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt index 9733c9d9721..bfe73d6b81d 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt @@ -109,6 +109,10 @@ class FirImplicitStringTypeRef( source: FirSourceElement? ) : FirImplicitBuiltinTypeRef(source, StandardClassIds.String) +class FirImplicitThrowableTypeRef( + source: FirSourceElement? +) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Throwable) + class FirImplicitKPropertyTypeRef( source: FirSourceElement?, typeArgument: ConeTypeProjection @@ -177,6 +181,7 @@ fun FirImplicitBuiltinTypeRef.withFakeSource(kind: FirFakeSourceElementKind): Fi is FirImplicitNullableNothingTypeRef -> FirImplicitNullableNothingTypeRef(newSource) is FirImplicitCharTypeRef -> FirImplicitCharTypeRef(newSource) is FirImplicitStringTypeRef -> FirImplicitStringTypeRef(newSource) + is FirImplicitThrowableTypeRef -> FirImplicitThrowableTypeRef(newSource) is FirImplicitKPropertyTypeRef -> FirImplicitKPropertyTypeRef( newSource, typeArgument = type.typeArguments[0]