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 val FirFunctionCall.isIterator
get() = this.calleeReference.name.asString() == "<iterator>" get() = this.calleeReference.name.asString() == "<iterator>"
internal val throwableClassLikeType = internal fun throwableClassLikeType(session: FirSession) = session.builtinTypes.throwableType.type
StandardClassIds.byName("Throwable").constructClassLikeType(emptyArray(), false)
fun ConeKotlinType.isThrowable(session: FirSession) = fun ConeKotlinType.isSubtypeOfThrowable(session: FirSession) =
throwableClassLikeType.isSupertypeOf(session.typeCheckerContext, this.fullyExpandedType(session)) throwableClassLikeType(session).isSupertypeOf(session.typeCheckerContext, this.fullyExpandedType(session))
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.fir.analysis.checkers.declaration package org.jetbrains.kotlin.fir.analysis.checkers.declaration
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext 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.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
@@ -33,7 +33,7 @@ object FirThrowableSubclassChecker : FirClassChecker() {
} }
private fun FirClass<*>.hasThrowableSupertype(context: CheckerContext) = 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) = private fun FirClass<*>.hasGenericOuterDeclaration(context: CheckerContext) =
classId.isLocal && context.containingDeclarations.anyIsGeneric() classId.isLocal && context.containingDeclarations.anyIsGeneric()
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.fir.analysis.checkers.expression package org.jetbrains.kotlin.fir.analysis.checkers.expression
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext 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.checkers.throwableClassLikeType
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
@@ -38,8 +38,9 @@ object FirCatchParameterChecker : FirTryExpressionChecker() {
} }
} }
if (!coneType.isThrowable(context.session)) { val session = context.session
reporter.reportOn(catchParameter.source, FirErrors.TYPE_MISMATCH, throwableClassLikeType, coneType, context) 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 ULong = Long.unsignedId()
val String = "String".baseId() val String = "String".baseId()
val Throwable = "Throwable".baseId()
val KProperty = "KProperty".reflectId() val KProperty = "KProperty".reflectId()
val KMutableProperty = "KMutableProperty".reflectId() val KMutableProperty = "KMutableProperty".reflectId()
@@ -62,4 +62,5 @@ class BuiltinTypes {
val nullableNothingType: FirImplicitBuiltinTypeRef = FirImplicitNullableNothingTypeRef(null) val nullableNothingType: FirImplicitBuiltinTypeRef = FirImplicitNullableNothingTypeRef(null)
val charType: FirImplicitBuiltinTypeRef = FirImplicitCharTypeRef(null) val charType: FirImplicitBuiltinTypeRef = FirImplicitCharTypeRef(null)
val stringType: FirImplicitBuiltinTypeRef = FirImplicitStringTypeRef(null) val stringType: FirImplicitBuiltinTypeRef = FirImplicitStringTypeRef(null)
val throwableType: FirImplicitThrowableTypeRef = FirImplicitThrowableTypeRef(null)
} }
@@ -109,6 +109,10 @@ class FirImplicitStringTypeRef(
source: FirSourceElement? source: FirSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.String) ) : FirImplicitBuiltinTypeRef(source, StandardClassIds.String)
class FirImplicitThrowableTypeRef(
source: FirSourceElement?
) : FirImplicitBuiltinTypeRef(source, StandardClassIds.Throwable)
class FirImplicitKPropertyTypeRef( class FirImplicitKPropertyTypeRef(
source: FirSourceElement?, source: FirSourceElement?,
typeArgument: ConeTypeProjection typeArgument: ConeTypeProjection
@@ -177,6 +181,7 @@ fun FirImplicitBuiltinTypeRef.withFakeSource(kind: FirFakeSourceElementKind): Fi
is FirImplicitNullableNothingTypeRef -> FirImplicitNullableNothingTypeRef(newSource) is FirImplicitNullableNothingTypeRef -> FirImplicitNullableNothingTypeRef(newSource)
is FirImplicitCharTypeRef -> FirImplicitCharTypeRef(newSource) is FirImplicitCharTypeRef -> FirImplicitCharTypeRef(newSource)
is FirImplicitStringTypeRef -> FirImplicitStringTypeRef(newSource) is FirImplicitStringTypeRef -> FirImplicitStringTypeRef(newSource)
is FirImplicitThrowableTypeRef -> FirImplicitThrowableTypeRef(newSource)
is FirImplicitKPropertyTypeRef -> FirImplicitKPropertyTypeRef( is FirImplicitKPropertyTypeRef -> FirImplicitKPropertyTypeRef(
newSource, newSource,
typeArgument = type.typeArguments[0] typeArgument = type.typeArguments[0]