From 1402bb2d455027dbfd5d063eaf934a1c69f55b4c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 10 Jan 2022 19:02:17 +0300 Subject: [PATCH] Fix error message about unsupported annotations on type parameters #KT-48908 Fixed --- .../kotlin/checkers/utils/DebugInfoUtil.kt | 2 +- .../kotlin/resolve/AnnotationResolverImpl.java | 13 +++++++++++-- .../jetbrains/kotlin/resolve/DeclarationsChecker.kt | 2 +- .../AnnotationForClassTypeParameter_15.kt | 6 +++--- .../AnnotationForClassTypeParameter_typeUseFlag.kt | 12 ++++++------ 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/checkers/utils/DebugInfoUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/checkers/utils/DebugInfoUtil.kt index 56f44c7e408..2bfc3398592 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/checkers/utils/DebugInfoUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/checkers/utils/DebugInfoUtil.kt @@ -59,7 +59,7 @@ object DebugInfoUtil { markedWithErrorElements[superExpression.instanceReference] = factory } else if (factory === Errors.EXPRESSION_EXPECTED_PACKAGE_FOUND) { markedWithErrorElements[diagnostic.psiElement as KtSimpleNameExpression] = factory - } else if (factory === Errors.UNSUPPORTED) { + } else if (factory === Errors.UNSUPPORTED || factory === Errors.UNSUPPORTED_FEATURE) { for (reference in PsiTreeUtil.findChildrenOfType( diagnostic.psiElement, KtReferenceExpression::class.java diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationResolverImpl.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationResolverImpl.java index 29de99d7886..e1c5c3377a0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationResolverImpl.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationResolverImpl.java @@ -17,9 +17,12 @@ package org.jetbrains.kotlin.resolve; import com.intellij.psi.util.PsiTreeUtil; +import kotlin.Pair; import kotlin.collections.CollectionsKt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.config.LanguageFeature; +import org.jetbrains.kotlin.config.LanguageVersionSettings; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget; @@ -168,12 +171,18 @@ public class AnnotationResolverImpl extends AnnotationResolver { ); } - public static void reportUnsupportedAnnotationForTypeParameter(@NotNull KtTypeParameter jetTypeParameter, @NotNull BindingTrace trace) { + public static void reportUnsupportedAnnotationForTypeParameter( + @NotNull KtTypeParameter jetTypeParameter, + @NotNull BindingTrace trace, + @NotNull LanguageVersionSettings languageVersionSettings + ) { KtModifierList modifierList = jetTypeParameter.getModifierList(); if (modifierList == null) return; for (KtAnnotationEntry annotationEntry : modifierList.getAnnotationEntries()) { - trace.report(Errors.UNSUPPORTED.on(annotationEntry, "Annotations for type parameters are not supported yet")); + trace.report(Errors.UNSUPPORTED_FEATURE.on( + annotationEntry, new Pair<>(LanguageFeature.ClassTypeParameterAnnotations, languageVersionSettings) + )); } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt index 3da2a90956b..3b6f9c9bf5a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt @@ -517,7 +517,7 @@ class DeclarationsChecker( private fun checkTypeParameters(typeParameterListOwner: KtTypeParameterListOwner) { for (jetTypeParameter in typeParameterListOwner.typeParameters) { if (!languageVersionSettings.supportsFeature(LanguageFeature.ClassTypeParameterAnnotations)) { - AnnotationResolverImpl.reportUnsupportedAnnotationForTypeParameter(jetTypeParameter, trace) + AnnotationResolverImpl.reportUnsupportedAnnotationForTypeParameter(jetTypeParameter, trace, languageVersionSettings) } trace.get(TYPE_PARAMETER, jetTypeParameter)?.let { DescriptorResolver.checkConflictingUpperBounds(trace, it, jetTypeParameter) } diff --git a/compiler/testData/diagnostics/tests/annotations/AnnotationForClassTypeParameter_15.kt b/compiler/testData/diagnostics/tests/annotations/AnnotationForClassTypeParameter_15.kt index 8d2208febbe..d18a863ca09 100644 --- a/compiler/testData/diagnostics/tests/annotations/AnnotationForClassTypeParameter_15.kt +++ b/compiler/testData/diagnostics/tests/annotations/AnnotationForClassTypeParameter_15.kt @@ -5,10 +5,10 @@ annotation class A1 @Target(AnnotationTarget.TYPE_PARAMETER) annotation class A2(val some: Int = 12) -class TopLevelClass<@A1 @A2(3) @A2 @A1(12) @A2("Test") T> { - class InnerClass<@A1 @A2(3) @A2 @A1(12) @A2("Test") T> { +class TopLevelClass<@A1 @A2(3) @A2 @A1(12) @A2("Test") T> { + class InnerClass<@A1 @A2(3) @A2 @A1(12) @A2("Test") T> { fun test() { - class InFun<@A1 @A2(3) @A2 @A1(12) @A2("Test") T> + class InFun<@A1 @A2(3) @A2 @A1(12) @A2("Test") T> } } } diff --git a/compiler/testData/diagnostics/tests/annotations/AnnotationForClassTypeParameter_typeUseFlag.kt b/compiler/testData/diagnostics/tests/annotations/AnnotationForClassTypeParameter_typeUseFlag.kt index f711b91f718..d4f93f004da 100644 --- a/compiler/testData/diagnostics/tests/annotations/AnnotationForClassTypeParameter_typeUseFlag.kt +++ b/compiler/testData/diagnostics/tests/annotations/AnnotationForClassTypeParameter_typeUseFlag.kt @@ -9,18 +9,18 @@ annotation class TA1 @Target(AnnotationTarget.TYPE_PARAMETER) annotation class TA2(val some: Int = 12) -class TopLevelClass<@A1 @A2(3) @A2 @A1(12) @A2("Test") T> { - class InnerClass<@A1 @A2(3) @A2 @A1(12) @A2("Test") T> { +class TopLevelClass<@A1 @A2(3) @A2 @A1(12) @A2("Test") T> { + class InnerClass<@A1 @A2(3) @A2 @A1(12) @A2("Test") T> { fun test() { - class InFun<@A1 @A2(3) @A2 @A1(12) @A2("Test") T> + class InFun<@A1 @A2(3) @A2 @A1(12) @A2("Test") T> } } } -class TTopLevelClass<@TA1 @TA2(3) @TA2 @TA1(12) @TA2("Test") T> { - class TInnerClass<@TA1 @TA2(3) @TA2 @TA1(12) @TA2("Test") T> { +class TTopLevelClass<@TA1 @TA2(3) @TA2 @TA1(12) @TA2("Test") T> { + class TInnerClass<@TA1 @TA2(3) @TA2 @TA1(12) @TA2("Test") T> { fun test() { - class TInFun<@TA1 @TA2(3) @TA2 @TA1(12) @TA2("Test") T> + class TInFun<@TA1 @TA2(3) @TA2 @TA1(12) @TA2("Test") T> } } }