[FIR] Forbid mixing supertypes with different functional kinds
^KT-61277 Fixed
This commit is contained in:
committed by
Space Team
parent
f674529558
commit
4958196c51
+3
@@ -1650,6 +1650,9 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
|
||||
)
|
||||
val RETURN_FOR_BUILT_IN_SUSPEND by error<KtReturnExpression>()
|
||||
val MIXING_SUSPEND_AND_NON_SUSPEND_SUPERTYPES by error<PsiElement>(PositioningStrategy.SUPERTYPES_LIST)
|
||||
val MIXING_FUNCTIONAL_KINDS_IN_SUPERTYPES by error<PsiElement>(PositioningStrategy.SUPERTYPES_LIST) {
|
||||
parameter<Set<FunctionTypeKind>>("kinds")
|
||||
}
|
||||
}
|
||||
|
||||
val LABEL by object : DiagnosticGroup("label") {
|
||||
|
||||
@@ -827,6 +827,7 @@ object FirErrors {
|
||||
val MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND_FUN by deprecationError0<PsiElement>(ModifierNonBuiltinSuspendFunError, SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED)
|
||||
val RETURN_FOR_BUILT_IN_SUSPEND by error0<KtReturnExpression>()
|
||||
val MIXING_SUSPEND_AND_NON_SUSPEND_SUPERTYPES by error0<PsiElement>(SourceElementPositioningStrategies.SUPERTYPES_LIST)
|
||||
val MIXING_FUNCTIONAL_KINDS_IN_SUPERTYPES by error1<PsiElement, Set<FunctionTypeKind>>(SourceElementPositioningStrategies.SUPERTYPES_LIST)
|
||||
|
||||
// label
|
||||
val REDUNDANT_LABEL_WARNING by warning0<KtLabelReferenceExpression>(SourceElementPositioningStrategies.LABEL)
|
||||
|
||||
+1
-1
@@ -109,7 +109,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
|
||||
FirEnumCompanionInEnumConstructorCallChecker,
|
||||
FirBadInheritedJavaSignaturesChecker,
|
||||
FirSealedInterfaceAllowedChecker,
|
||||
FirSuspendFunctionAsSupertypeChecker,
|
||||
FirMixedFunctionalTypesInSupertypesChecker,
|
||||
)
|
||||
|
||||
override val regularClassCheckers: Set<FirRegularClassChecker>
|
||||
|
||||
+13
-10
@@ -5,8 +5,8 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
||||
|
||||
import org.jetbrains.kotlin.builtins.functions.isBasicFunctionOrKFunction
|
||||
import org.jetbrains.kotlin.builtins.functions.isSuspendOrKSuspendFunction
|
||||
import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind.Function
|
||||
import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind.SuspendFunction
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
@@ -15,16 +15,19 @@ import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||
import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes
|
||||
import org.jetbrains.kotlin.fir.types.functionTypeKind
|
||||
|
||||
object FirSuspendFunctionAsSupertypeChecker : FirClassChecker() {
|
||||
object FirMixedFunctionalTypesInSupertypesChecker : FirClassChecker() {
|
||||
override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
val supertypes = lookupSuperTypes(declaration.symbol, lookupInterfaces = true, deep = true, context.session)
|
||||
.mapNotNull { it.functionTypeKind(context.session) }
|
||||
val superKinds = lookupSuperTypes(declaration.symbol, lookupInterfaces = true, deep = true, context.session)
|
||||
.mapNotNullTo(mutableSetOf()) { it.functionTypeKind(context.session)?.nonReflectKind() }
|
||||
|
||||
if (
|
||||
supertypes.any { it.isSuspendOrKSuspendFunction } &&
|
||||
supertypes.any { it.isBasicFunctionOrKFunction }
|
||||
) {
|
||||
reporter.reportOn(declaration.source, FirErrors.MIXING_SUSPEND_AND_NON_SUSPEND_SUPERTYPES, context)
|
||||
when {
|
||||
superKinds.size <= 1 -> {}
|
||||
superKinds == setOf(Function, SuspendFunction) -> {
|
||||
reporter.reportOn(declaration.source, FirErrors.MIXING_SUSPEND_AND_NON_SUSPEND_SUPERTYPES, context)
|
||||
}
|
||||
else -> {
|
||||
reporter.reportOn(declaration.source, FirErrors.MIXING_FUNCTIONAL_KINDS_IN_SUPERTYPES, superKinds, context)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+6
@@ -356,6 +356,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.METHOD_OF_ANY_IMP
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISPLACED_TYPE_PARAMETER_CONSTRAINTS
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISSING_STDLIB_CLASS
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISSING_VAL_ON_ANNOTATION_PARAMETER
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MIXING_FUNCTIONAL_KINDS_IN_SUPERTYPES
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MIXING_SUSPEND_AND_NON_SUSPEND_SUPERTYPES
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND_FUN
|
||||
@@ -2349,6 +2350,11 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
|
||||
)
|
||||
map.put(RETURN_FOR_BUILT_IN_SUSPEND, "Using implicit label for this lambda is prohibited")
|
||||
map.put(MIXING_SUSPEND_AND_NON_SUSPEND_SUPERTYPES, "Mixing suspend and non-suspend supertypes is not allowed")
|
||||
map.put(
|
||||
MIXING_FUNCTIONAL_KINDS_IN_SUPERTYPES,
|
||||
"Mixing supertypes of different functional kinds ({0}) is not allowed.",
|
||||
FUNCTIONAL_TYPE_KINDS,
|
||||
)
|
||||
|
||||
// Label
|
||||
map.put(
|
||||
|
||||
Reference in New Issue
Block a user