diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt index 596f325ce8a..a8bb52ff8a9 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt @@ -29,6 +29,10 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { } } + val TYPE_PARAMETERS by object : DiagnosticGroup("Type parameters") { + val UPPER_BOUND_CANNOT_BE_ARRAY by error() + } + val ANNOTATIONS by object : DiagnosticGroup("annotations") { val STRICTFP_ON_CLASS by error() val VOLATILE_ON_VALUE by error() diff --git a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt index 097e022b876..89ab3872b8a 100644 --- a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt +++ b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt @@ -25,6 +25,9 @@ object FirJvmErrors { // Types val JAVA_TYPE_MISMATCH by error2() + // Type parameters + val UPPER_BOUND_CANNOT_BE_ARRAY by error0() + // annotations val STRICTFP_ON_CLASS by error0() val VOLATILE_ON_VALUE by error0() diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmDeclarationCheckers.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmDeclarationCheckers.kt index ee4d46dbc1b..61ee64b8c08 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmDeclarationCheckers.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmDeclarationCheckers.kt @@ -16,7 +16,7 @@ object JvmDeclarationCheckers : DeclarationCheckers() { override val classCheckers: Set get() = setOf( - FirStrictfpApplicabilityChecker + FirStrictfpApplicabilityChecker, ) override val propertyCheckers: Set @@ -29,4 +29,9 @@ object JvmDeclarationCheckers : DeclarationCheckers() { FirSynchronizedAnnotationChecker, FirOverloadsChecker, ) + + override val typeParameterCheckers: Set + get() = setOf( + FirUpperBoundsChecker, + ) } diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirUpperBoundsChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirUpperBoundsChecker.kt new file mode 100644 index 00000000000..f7cd31a6d06 --- /dev/null +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirUpperBoundsChecker.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration + +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirTypeParameterChecker +import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors +import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn +import org.jetbrains.kotlin.fir.declarations.FirTypeParameter +import org.jetbrains.kotlin.fir.types.coneType +import org.jetbrains.kotlin.fir.types.isArrayType + +object FirUpperBoundsChecker : FirTypeParameterChecker() { + + override fun check(declaration: FirTypeParameter, context: CheckerContext, reporter: DiagnosticReporter) { + if (declaration.bounds.any { it.coneType.isArrayType }) { + reporter.reportOn(declaration.source, FirJvmErrors.UPPER_BOUND_CANNOT_BE_ARRAY, context) + } + } + +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/typeParameters/upperBoundCannotBeArray.fir.kt b/compiler/testData/diagnostics/tests/typeParameters/upperBoundCannotBeArray.fir.kt deleted file mode 100644 index d7986f1b23e..00000000000 --- a/compiler/testData/diagnostics/tests/typeParameters/upperBoundCannotBeArray.fir.kt +++ /dev/null @@ -1,18 +0,0 @@ -fun > f1() {} -fun > f2() {} -fun f3() where A : Array, A : Array {} - -fun IntArray> f4() {} - -fun f5() where T : Array {} - -val > T.v: String get() = "" - -class C2> -interface C3 where A : Array, A : Array - -fun foo() { - class C1> { - fun , B : Array, C : A> f() {} - } -} diff --git a/compiler/testData/diagnostics/tests/typeParameters/upperBoundCannotBeArray.kt b/compiler/testData/diagnostics/tests/typeParameters/upperBoundCannotBeArray.kt index a28bf28c13b..eecb3bce5d3 100644 --- a/compiler/testData/diagnostics/tests/typeParameters/upperBoundCannotBeArray.kt +++ b/compiler/testData/diagnostics/tests/typeParameters/upperBoundCannotBeArray.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun <A : Array> f1() {} fun A : Array> f2() {} fun A> f3() where A : Array, A : Array {} diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index be405b2c36b..da5a0d19a28 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -3447,6 +3447,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJvmErrors.UPPER_BOUND_CANNOT_BE_ARRAY) { firDiagnostic -> + UpperBoundCannotBeArrayImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } add(FirJvmErrors.STRICTFP_ON_CLASS) { firDiagnostic -> StrictfpOnClassImpl( firDiagnostic as FirPsiDiagnostic, diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index 58f99d21d50..612011a92e4 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -2404,6 +2404,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract val actualType: KtType } + abstract class UpperBoundCannotBeArray : KtFirDiagnostic() { + override val diagnosticClass get() = UpperBoundCannotBeArray::class + } + abstract class StrictfpOnClass : KtFirDiagnostic() { override val diagnosticClass get() = StrictfpOnClass::class } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index c118f28557e..d4b240b4631 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -3887,6 +3887,13 @@ internal class JavaTypeMismatchImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class UpperBoundCannotBeArrayImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.UpperBoundCannotBeArray(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + internal class StrictfpOnClassImpl( firDiagnostic: FirPsiDiagnostic, override val token: ValidityToken,