Fix error message about unsupported annotations on type parameters

#KT-48908 Fixed
This commit is contained in:
Mikhail Glukhikh
2022-01-10 19:02:17 +03:00
parent 230f210a2a
commit 1402bb2d45
5 changed files with 22 additions and 13 deletions
@@ -59,7 +59,7 @@ object DebugInfoUtil {
markedWithErrorElements[superExpression.instanceReference] = factory markedWithErrorElements[superExpression.instanceReference] = factory
} else if (factory === Errors.EXPRESSION_EXPECTED_PACKAGE_FOUND) { } else if (factory === Errors.EXPRESSION_EXPECTED_PACKAGE_FOUND) {
markedWithErrorElements[diagnostic.psiElement as KtSimpleNameExpression] = factory 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( for (reference in PsiTreeUtil.findChildrenOfType(
diagnostic.psiElement, diagnostic.psiElement,
KtReferenceExpression::class.java KtReferenceExpression::class.java
@@ -17,9 +17,12 @@
package org.jetbrains.kotlin.resolve; package org.jetbrains.kotlin.resolve;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import kotlin.Pair;
import kotlin.collections.CollectionsKt; import kotlin.collections.CollectionsKt;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; 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.*;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget; 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(); KtModifierList modifierList = jetTypeParameter.getModifierList();
if (modifierList == null) return; if (modifierList == null) return;
for (KtAnnotationEntry annotationEntry : modifierList.getAnnotationEntries()) { 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)
));
} }
} }
@@ -517,7 +517,7 @@ class DeclarationsChecker(
private fun checkTypeParameters(typeParameterListOwner: KtTypeParameterListOwner) { private fun checkTypeParameters(typeParameterListOwner: KtTypeParameterListOwner) {
for (jetTypeParameter in typeParameterListOwner.typeParameters) { for (jetTypeParameter in typeParameterListOwner.typeParameters) {
if (!languageVersionSettings.supportsFeature(LanguageFeature.ClassTypeParameterAnnotations)) { 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) } trace.get(TYPE_PARAMETER, jetTypeParameter)?.let { DescriptorResolver.checkConflictingUpperBounds(trace, it, jetTypeParameter) }
@@ -5,10 +5,10 @@ annotation class A1
@Target(AnnotationTarget.TYPE_PARAMETER) @Target(AnnotationTarget.TYPE_PARAMETER)
annotation class A2(val some: Int = 12) annotation class A2(val some: Int = 12)
class TopLevelClass<<!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A1<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2(3)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A1(12)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2("Test")<!> T> { class TopLevelClass<<!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A1<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2(3)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A1(12)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2("Test")<!> T> {
class InnerClass<<!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A1<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2(3)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A1(12)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2("Test")<!> T> { class InnerClass<<!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A1<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2(3)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A1(12)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2("Test")<!> T> {
fun test() { fun test() {
class InFun<<!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A1<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2(3)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A1(12)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2("Test")<!> T> class InFun<<!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A1<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2(3)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A1(12)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2("Test")<!> T>
} }
} }
} }
@@ -9,18 +9,18 @@ annotation class TA1
@Target(AnnotationTarget.TYPE_PARAMETER) @Target(AnnotationTarget.TYPE_PARAMETER)
annotation class TA2(val some: Int = 12) annotation class TA2(val some: Int = 12)
class TopLevelClass<<!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A1<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2(3)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A1(12)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2("Test")<!> T> { class TopLevelClass<<!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A1<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2(3)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A1(12)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2("Test")<!> T> {
class InnerClass<<!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A1<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2(3)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A1(12)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2("Test")<!> T> { class InnerClass<<!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A1<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2(3)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A1(12)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2("Test")<!> T> {
fun test() { fun test() {
class InFun<<!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A1<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2(3)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A1(12)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@A2("Test")<!> T> class InFun<<!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A1<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2(3)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A1(12)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@A2("Test")<!> T>
} }
} }
} }
class TTopLevelClass<<!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@TA1<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@TA2(3)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@TA2<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@TA1(12)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@TA2("Test")<!> T> { class TTopLevelClass<<!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@TA1<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@TA2(3)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@TA2<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@TA1(12)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@TA2("Test")<!> T> {
class TInnerClass<<!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@TA1<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@TA2(3)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@TA2<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@TA1(12)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@TA2("Test")<!> T> { class TInnerClass<<!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@TA1<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@TA2(3)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@TA2<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@TA1(12)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@TA2("Test")<!> T> {
fun test() { fun test() {
class TInFun<<!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@TA1<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@TA2(3)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@TA2<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@TA1(12)<!> <!UNSUPPORTED, WRONG_ANNOTATION_TARGET!>@TA2("Test")<!> T> class TInFun<<!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@TA1<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@TA2(3)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@TA2<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@TA1(12)<!> <!UNSUPPORTED_FEATURE, WRONG_ANNOTATION_TARGET!>@TA2("Test")<!> T>
} }
} }
} }