[FIR] Implement REIFIED_TYPE_FORBIDDEN_SUBSTITUTION

This commit is contained in:
Ivan Kochurkin
2021-07-15 15:29:41 +03:00
committed by teamcityserver
parent bade6cb611
commit 173813f7cf
14 changed files with 59 additions and 23 deletions
@@ -491,6 +491,10 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
parameter<FirTypeParameterSymbol>("typeParameter")
}
val REIFIED_TYPE_FORBIDDEN_SUBSTITUTION by error<PsiElement> {
parameter<ConeKotlinType>("type")
}
val FINAL_UPPER_BOUND by warning<KtTypeReference> {
parameter<ConeKotlinType>("type")
}
@@ -321,6 +321,7 @@ object FirErrors {
val TYPE_PARAMETER_AS_REIFIED by error1<PsiElement, FirTypeParameterSymbol>()
val TYPE_PARAMETER_AS_REIFIED_ARRAY by error1<PsiElement, FirTypeParameterSymbol>()
val TYPE_PARAMETER_AS_REIFIED_ARRAY_WARNING by warning1<PsiElement, FirTypeParameterSymbol>()
val REIFIED_TYPE_FORBIDDEN_SUBSTITUTION by error1<PsiElement, ConeKotlinType>()
val FINAL_UPPER_BOUND by warning1<KtTypeReference, ConeKotlinType>()
val UPPER_BOUND_IS_EXTENSION_FUNCTION_TYPE by error0<KtTypeReference>()
val BOUNDS_NOT_ALLOWED_IF_BOUNDED_BY_TYPE_PARAMETER by error0<KtElement>()
@@ -5,9 +5,7 @@
package org.jetbrains.kotlin.fir.analysis.checkers
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirAnonymousFunctionChecker
import org.jetbrains.kotlin.fir.analysis.checkers.expression.*
import org.jetbrains.kotlin.fir.analysis.checkers.syntax.FirAnonymousFunctionSyntaxChecker
object CommonExpressionCheckers : ExpressionCheckers() {
override val annotationCallCheckers: Set<FirAnnotationCallChecker>
@@ -43,7 +41,7 @@ object CommonExpressionCheckers : ExpressionCheckers() {
FirSealedClassConstructorCallChecker,
FirUninitializedEnumChecker,
FirFunInterfaceConstructorReferenceChecker,
FirTypeParameterAsReifiedChecker
FirReifiedChecker
)
override val functionCallCheckers: Set<FirFunctionCallChecker>
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.name.StandardClassIds
object FirTypeParameterAsReifiedChecker : FirQualifiedAccessExpressionChecker() {
object FirReifiedChecker : FirQualifiedAccessExpressionChecker() {
override fun check(expression: FirQualifiedAccessExpression, context: CheckerContext, reporter: DiagnosticReporter) {
val calleReference = expression.calleeReference
val typeArguments = expression.typeArguments
@@ -33,13 +33,13 @@ object FirTypeParameterAsReifiedChecker : FirQualifiedAccessExpressionChecker()
val typeArgument = typeArgumentProjection.toConeTypeProjection().type
val typeParameter = typeParameters[index]
if (source != null && (typeParameter.isTypeParameterOfKotlinArray())) {
if (source != null && typeParameter.isReifiedTypeParameterOrFromKotlinArray()) {
checkArgumentAndReport(typeArgument, source, false, context, reporter)
}
}
}
private fun FirTypeParameterSymbol.isTypeParameterOfKotlinArray(): Boolean {
private fun FirTypeParameterSymbol.isReifiedTypeParameterOrFromKotlinArray(): Boolean {
val containingDeclaration = containingDeclarationSymbol
return isReified ||
containingDeclaration is FirRegularClassSymbol && containingDeclaration.classId == StandardClassIds.Array
@@ -69,10 +69,17 @@ object FirTypeParameterAsReifiedChecker : FirQualifiedAccessExpressionChecker()
FirErrors.TYPE_PARAMETER_AS_REIFIED
}
symbol = typeArgument.toSymbol(context.session) as FirTypeParameterSymbol
} else if (typeArgument != null && typeArgument.cannotBeReified()) {
reporter.reportOn(source, FirErrors.REIFIED_TYPE_FORBIDDEN_SUBSTITUTION, typeArgument, context)
return
}
if (factory != null && !symbol.isReified) {
reporter.reportOn(source, factory, symbol, context)
}
}
private fun ConeKotlinType.cannotBeReified(): Boolean {
return this.isNothing || this.isNullableNothing || this is ConeCapturedType
}
}
@@ -320,6 +320,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_RETURN_
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_SETTER_PARAMETER_TYPE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_SINGLE_EXPRESSION_STRING_TEMPLATE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_VISIBILITY_MODIFIER
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REIFIED_TYPE_FORBIDDEN_SUBSTITUTION
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REIFIED_TYPE_IN_CATCH_CLAUSE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REIFIED_TYPE_PARAMETER_NO_INLINE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REPEATED_BOUND
@@ -794,6 +795,11 @@ class FirDefaultErrorMessages {
"Cannot use ''{0}'' as reified type parameter, since the array type parameter is not reified.",
SYMBOL
)
map.put(
REIFIED_TYPE_FORBIDDEN_SUBSTITUTION,
"Cannot use ''{0}'' as reified type parameter",
RENDER_TYPE
)
map.put(
FINAL_UPPER_BOUND,
"''{0}'' is a final type, and thus a value of the type parameter is predetermined",