FIR: introduce & use Throwable built-in type

This commit is contained in:
Mikhail Glukhikh
2021-02-05 09:33:54 +03:00
parent bbd1da7b71
commit f1ab5d1fbd
6 changed files with 16 additions and 9 deletions
@@ -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))
@@ -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()
@@ -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]