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
|
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))
|
||||||
+2
-2
@@ -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()
|
||||||
|
|||||||
+4
-3
@@ -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]
|
||||||
|
|||||||
Reference in New Issue
Block a user