From 54aee57fec58fc9d93d7e20f858e0e6f64d8b0f7 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Thu, 14 Mar 2024 18:34:10 +0100 Subject: [PATCH] [LC] preserve type annotations from wildcard bound ^KT-66603 --- .../forDeclaration/nestedTypeAnnotation.txt | 2 +- .../jetbrains/kotlin/asJava/classes/implUtils.kt | 9 ++++++++- .../NestedTypeAnnotations.descriptors.java | 8 ++++---- .../NestedTypeAnnotations.java | 6 +++--- .../facades/jvmWildcardAnnotations.java | 8 ++++---- .../lightClassByPsi/jvmWildcardAnnotations.java | 16 ++++++++-------- 6 files changed, 28 insertions(+), 21 deletions(-) diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/nestedTypeAnnotation.txt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/nestedTypeAnnotation.txt index 6bf5ffdb783..96bb560562f 100644 --- a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/nestedTypeAnnotation.txt +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/nestedTypeAnnotation.txt @@ -1,2 +1,2 @@ KtType: @foo.MyAnno(s = "outer") kotlin.collections.List<@foo.MyAnno(s = "middle") kotlin.collections.List<@foo.AnotherAnnotation(k = foo.Nested::class) kotlin.String>> -PsiType: java.util.@foo.MyAnno("outer") List<@foo.MyAnno("middle") ? extends java.util.List> +PsiType: java.util.@foo.MyAnno("outer") List> diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt index fccde4744a3..2fb6d4feaac 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2024 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. */ @@ -96,6 +96,13 @@ fun PsiType.annotateByTypeAnnotationProvider( fun recursiveAnnotator(psiType: PsiType) { if (!annotationsIterator.hasNext()) return + + if (psiType is PsiWildcardType) { + // Wildcard itself cannot have annotations + psiType.bound?.let(::recursiveAnnotator) + return + } + val typeAnnotations = annotationsIterator.next() when (psiType) { diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/NestedTypeAnnotations.descriptors.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/NestedTypeAnnotations.descriptors.java index 1365d9ea142..d8b454398bb 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByFqName/NestedTypeAnnotations.descriptors.java +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/NestedTypeAnnotations.descriptors.java @@ -1,14 +1,14 @@ public final class Nested /* foo.Nested*/ { @org.jetbrains.annotations.Nullable() - private @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") ? extends java.util.List> property; + private @foo.MyAnno(s = "outer") java.util.List> property; @org.jetbrains.annotations.Nullable() - public final @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") java.util.List<@foo.AnotherAnnotation(k = foo.Nested.class) java.lang.String>> function(@org.jetbrains.annotations.NotNull() @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") ? extends java.util.List>, @org.jetbrains.annotations.NotNull() @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") ? extends java.util.List>);// function(@foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") ? extends java.util.List>, @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") ? extends java.util.List>) + public final @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") java.util.List<@foo.AnotherAnnotation(k = foo.Nested.class) java.lang.String>> function(@org.jetbrains.annotations.NotNull() @foo.MyAnno(s = "outer") java.util.List>, @org.jetbrains.annotations.NotNull() @foo.MyAnno(s = "outer") java.util.List>);// function(@foo.MyAnno(s = "outer") java.util.List>, @foo.MyAnno(s = "outer") java.util.List>) @org.jetbrains.annotations.Nullable() public final @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") java.util.List<@foo.AnotherAnnotation(k = foo.Nested.class) java.lang.String>> getProperty();// getProperty() public Nested();// .ctor() - public final void setProperty(@org.jetbrains.annotations.Nullable() @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") ? extends java.util.List>);// setProperty(@foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") ? extends java.util.List>) -} \ No newline at end of file + public final void setProperty(@org.jetbrains.annotations.Nullable() @foo.MyAnno(s = "outer") java.util.List>);// setProperty(@foo.MyAnno(s = "outer") java.util.List>) +} diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/NestedTypeAnnotations.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/NestedTypeAnnotations.java index 8b48b1f0437..fe16880c7e8 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByFqName/NestedTypeAnnotations.java +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/NestedTypeAnnotations.java @@ -1,14 +1,14 @@ public final class Nested /* foo.Nested*/ { @org.jetbrains.annotations.Nullable() - private @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") ? extends java.util.List> property = null /* initializer type: null */; + private @foo.MyAnno(s = "outer") java.util.List> property = null /* initializer type: null */; @org.jetbrains.annotations.Nullable() - public final @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") java.util.List<@foo.AnotherAnnotation(k = foo.Nested.class) java.lang.String>> function(@org.jetbrains.annotations.NotNull() @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") ? extends java.util.List>, @org.jetbrains.annotations.NotNull() @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") ? extends java.util.List>);// function(@foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") ? extends java.util.List>, @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") ? extends java.util.List>) + public final @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") java.util.List<@foo.AnotherAnnotation(k = foo.Nested.class) java.lang.String>> function(@org.jetbrains.annotations.NotNull() @foo.MyAnno(s = "outer") java.util.List>, @org.jetbrains.annotations.NotNull() @foo.MyAnno(s = "outer") java.util.List>);// function(@foo.MyAnno(s = "outer") java.util.List>, @foo.MyAnno(s = "outer") java.util.List>) @org.jetbrains.annotations.Nullable() public final @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") java.util.List<@foo.AnotherAnnotation(k = foo.Nested.class) java.lang.String>> getProperty();// getProperty() public Nested();// .ctor() - public final void setProperty(@org.jetbrains.annotations.Nullable() @foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") ? extends java.util.List>);// setProperty(@foo.MyAnno(s = "outer") java.util.List<@foo.MyAnno(s = "middle") ? extends java.util.List>) + public final void setProperty(@org.jetbrains.annotations.Nullable() @foo.MyAnno(s = "outer") java.util.List>);// setProperty(@foo.MyAnno(s = "outer") java.util.List>) } diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/jvmWildcardAnnotations.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/jvmWildcardAnnotations.java index 7dca41b4a9e..d6eb328e852 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/jvmWildcardAnnotations.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/facades/jvmWildcardAnnotations.java @@ -33,14 +33,14 @@ public final class JvmWildcardAnnotationsKt /* JvmWildcardAnnotationsKt*/ { public static final void deepOpen(@org.jetbrains.annotations.NotNull() Out>>);// deepOpen(Out>>) @org.jetbrains.annotations.NotNull() - public static final @kotlin.jvm.JvmSuppressWildcards() OutPair>> combination();// combination() + public static final @kotlin.jvm.JvmSuppressWildcards() OutPair>> combination();// combination() @org.jetbrains.annotations.NotNull() - public static final @kotlin.jvm.JvmSuppressWildcards(suppress = false) OutPair, Out<@kotlin.jvm.JvmSuppressWildcards(suppress = false) ? extends Final>>> falseTrueFalse();// falseTrueFalse() + public static final @kotlin.jvm.JvmSuppressWildcards(suppress = false) OutPair, Out>> falseTrueFalse();// falseTrueFalse() - public static final void simpleIn(@org.jetbrains.annotations.NotNull() In<@kotlin.jvm.JvmWildcard() ? super java.lang.Object>);// simpleIn(In<@kotlin.jvm.JvmWildcard() ? super java.lang.Object>) + public static final void simpleIn(@org.jetbrains.annotations.NotNull() In);// simpleIn(In) - public static final void simpleOut(@org.jetbrains.annotations.NotNull() Out<@kotlin.jvm.JvmWildcard() ? extends Final>);// simpleOut(Out<@kotlin.jvm.JvmWildcard() ? extends Final>) + public static final void simpleOut(@org.jetbrains.annotations.NotNull() Out);// simpleOut(Out) } public class Open /* Open*/ { diff --git a/compiler/testData/asJava/lightClasses/lightClassByPsi/jvmWildcardAnnotations.java b/compiler/testData/asJava/lightClasses/lightClassByPsi/jvmWildcardAnnotations.java index ff4ee1b3dcc..d5e5ba3f7e9 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByPsi/jvmWildcardAnnotations.java +++ b/compiler/testData/asJava/lightClasses/lightClassByPsi/jvmWildcardAnnotations.java @@ -28,16 +28,16 @@ public final class Container /* Container*/ { public final void zoo(@org.jetbrains.annotations.NotNull() Out>>, @org.jetbrains.annotations.NotNull() @kotlin.jvm.JvmSuppressWildcards(suppress = false) Out);// zoo(Out>>, @kotlin.jvm.JvmSuppressWildcards(suppress = false) Out) @org.jetbrains.annotations.NotNull() - public final @kotlin.jvm.JvmSuppressWildcards() OutPair>> combination();// combination() + public final @kotlin.jvm.JvmSuppressWildcards() OutPair>> combination();// combination() @org.jetbrains.annotations.NotNull() - public final @kotlin.jvm.JvmSuppressWildcards(suppress = false) OutPair, Out<@kotlin.jvm.JvmSuppressWildcards(suppress = false) ? extends Final>>> falseTrueFalse();// falseTrueFalse() + public final @kotlin.jvm.JvmSuppressWildcards(suppress = false) OutPair, Out>> falseTrueFalse();// falseTrueFalse() public Container();// .ctor() - public final void simpleIn(@org.jetbrains.annotations.NotNull() In<@kotlin.jvm.JvmWildcard() ? super java.lang.Object>);// simpleIn(In<@kotlin.jvm.JvmWildcard() ? super java.lang.Object>) + public final void simpleIn(@org.jetbrains.annotations.NotNull() In);// simpleIn(In) - public final void simpleOut(@org.jetbrains.annotations.NotNull() Out<@kotlin.jvm.JvmWildcard() ? extends Final>);// simpleOut(Out<@kotlin.jvm.JvmWildcard() ? extends Final>) + public final void simpleOut(@org.jetbrains.annotations.NotNull() Out);// simpleOut(Out) } public final class ContainerForPropertyAndAccessors /* ContainerForPropertyAndAccessors*/ { @@ -45,10 +45,10 @@ public final class ContainerForPropertyAndAccessors /* ContainerForPropertyAndAc private Out bar; @org.jetbrains.annotations.NotNull() - private final In<@kotlin.jvm.JvmWildcard() ? super java.lang.Object> simpleIn; + private final In simpleIn; @org.jetbrains.annotations.NotNull() - private final Out<@kotlin.jvm.JvmWildcard() ? extends Final> simpleOut; + private final Out simpleOut; @org.jetbrains.annotations.NotNull() private final Out>> deepOpen; @@ -57,10 +57,10 @@ public final class ContainerForPropertyAndAccessors /* ContainerForPropertyAndAc public final @kotlin.jvm.JvmSuppressWildcards(suppress = false) Out getZoo(@org.jetbrains.annotations.NotNull() Out>>);// getZoo(Out>>) @org.jetbrains.annotations.NotNull() - public final In<@kotlin.jvm.JvmWildcard() ? super java.lang.Object> getSimpleIn();// getSimpleIn() + public final In getSimpleIn();// getSimpleIn() @org.jetbrains.annotations.NotNull() - public final Out<@kotlin.jvm.JvmWildcard() ? extends Final> getSimpleOut();// getSimpleOut() + public final Out getSimpleOut();// getSimpleOut() @org.jetbrains.annotations.NotNull() public final Out getBar();// getBar()