FIR: introduce & use Throwable built-in type
This commit is contained in:
@@ -320,8 +320,7 @@ fun Modality.toToken(): KtModifierKeywordToken = when (this) {
|
||||
val FirFunctionCall.isIterator
|
||||
get() = this.calleeReference.name.asString() == "<iterator>"
|
||||
|
||||
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))
|
||||
fun ConeKotlinType.isSubtypeOfThrowable(session: FirSession) =
|
||||
throwableClassLikeType(session).isSupertypeOf(session.typeCheckerContext, this.fullyExpandedType(session))
|
||||
+2
-2
@@ -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()
|
||||
|
||||
+4
-3
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user