From 77546e5e06516b9208a2033f4b309f4b030291aa Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 10 Aug 2022 15:21:24 +0300 Subject: [PATCH] [AA LC] Compute nullability annotation for parameter for extension receiver --- .../annotations/symbolAnnotationsUtils.kt | 18 +++++++++------ .../SymbolLightParameterForReceiver.kt | 9 ++++++-- .../AnnotatedPropertyWithSites.fir.java | 22 +++++++++++++++++++ .../ultraLightClasses/annotations.fir.java | 2 +- .../delegatingToInterfaces.fir.java | 4 ++-- .../ultraLightClasses/generics.fir.java | 2 +- .../asJava/ultraLightClasses/objects.fir.java | 4 ++-- .../ultraLightClasses/properties.fir.java | 2 +- .../simpleFunctions.fir.java | 2 +- .../ultraLightFacades/properties.fir.java | 2 +- .../simpleFunctions.fir.java | 2 +- 11 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 compiler/testData/asJava/lightClasses/AnnotatedPropertyWithSites.fir.java diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/symbolAnnotationsUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/symbolAnnotationsUtils.kt index 6c3dc7e70d1..9c91a9bd7a4 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/symbolAnnotationsUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/annotations/symbolAnnotationsUtils.kt @@ -91,6 +91,16 @@ internal fun KtAnnotatedSymbol.hasAnnotation(fqName: FqName, annotationUseSiteTa it.useSiteTarget == annotationUseSiteTarget && it.classId?.asSingleFqName() == fqName } +internal fun NullabilityType.computeNullabilityAnnotation(parent: PsiElement): SymbolLightSimpleAnnotation? { + return when (this) { + NullabilityType.NotNull -> NotNull::class.java + NullabilityType.Nullable -> Nullable::class.java + else -> null + }?.let { + SymbolLightSimpleAnnotation(it.name, parent) + } +} + internal fun KtAnnotatedSymbol.computeAnnotations( parent: PsiElement, nullability: NullabilityType, @@ -98,13 +108,7 @@ internal fun KtAnnotatedSymbol.computeAnnotations( includeAnnotationsWithoutSite: Boolean = true ): List { - val nullabilityAnnotation = when (nullability) { - NullabilityType.NotNull -> NotNull::class.java - NullabilityType.Nullable -> Nullable::class.java - else -> null - }?.let { - SymbolLightSimpleAnnotation(it.name, parent) - } + val nullabilityAnnotation = nullability.computeNullabilityAnnotation(parent) val parentIsAnnotation = (parent as? PsiClass)?.isAnnotationType == true diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt index e7777a8ac16..f1b4cc69e5d 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/parameters/SymbolLightParameterForReceiver.kt @@ -19,9 +19,11 @@ import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.light.classes.symbol.annotations.SymbolLightAnnotationForAnnotationCall +import org.jetbrains.kotlin.light.classes.symbol.annotations.computeNullabilityAnnotation import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethodBase import org.jetbrains.kotlin.light.classes.symbol.modifierLists.SymbolLightClassModifierList import org.jetbrains.kotlin.light.classes.symbol.nonExistentType +import org.jetbrains.kotlin.light.classes.symbol.nullabilityType import org.jetbrains.kotlin.psi.KtParameter context(KtAnalysisSession) @@ -66,8 +68,11 @@ internal class SymbolLightParameterForReceiver private constructor( override val kotlinOrigin: KtParameter? = null private val _annotations: List by lazyPub { - receiverType.annotations.map { - SymbolLightAnnotationForAnnotationCall(it, this) + buildList { + receiverType.nullabilityType.computeNullabilityAnnotation(this@SymbolLightParameterForReceiver)?.let { add(it) } + receiverType.annotations.mapTo(this) { + SymbolLightAnnotationForAnnotationCall(it, this@SymbolLightParameterForReceiver) + } } } diff --git a/compiler/testData/asJava/lightClasses/AnnotatedPropertyWithSites.fir.java b/compiler/testData/asJava/lightClasses/AnnotatedPropertyWithSites.fir.java new file mode 100644 index 00000000000..f77e55030cf --- /dev/null +++ b/compiler/testData/asJava/lightClasses/AnnotatedPropertyWithSites.fir.java @@ -0,0 +1,22 @@ +public final class Test /* Test*/ { + @MyAnnotation5() + @org.jetbrains.annotations.NotNull() + private java.lang.String bar; + + @MyAnnotation() + @org.jetbrains.annotations.NotNull() + public final java.lang.String getBar();// getBar() + + @MyAnnotation2() + public final void setBar(@MyAnnotation3() @org.jetbrains.annotations.NotNull() java.lang.String);// setBar(java.lang.String) + + @org.jetbrains.annotations.NotNull() + public final kotlin.Unit getFooP(@MyAnnotation7() @org.jetbrains.annotations.NotNull() int);// getFooP(int) + + public Test(@MyAnnotation6() @org.jetbrains.annotations.NotNull() java.lang.String);// .ctor(java.lang.String) + + public final void fooF(@MyAnnotation7() @org.jetbrains.annotations.NotNull() int);// fooF(int) + + public final void setFooP(@MyAnnotation7() @org.jetbrains.annotations.NotNull() int, @org.jetbrains.annotations.NotNull() kotlin.Unit);// setFooP(int, kotlin.Unit) + +} diff --git a/compiler/testData/asJava/ultraLightClasses/annotations.fir.java b/compiler/testData/asJava/ultraLightClasses/annotations.fir.java index df525fcb5cc..bfa15a0c754 100644 --- a/compiler/testData/asJava/ultraLightClasses/annotations.fir.java +++ b/compiler/testData/asJava/ultraLightClasses/annotations.fir.java @@ -111,7 +111,7 @@ public final class Foo /* Foo*/ { public Foo(error.NonExistentClass);// .ctor(error.NonExistentClass) @Anno() - public final void f4(java.lang.String);// f4(java.lang.String) + public final void f4(@org.jetbrains.annotations.NotNull() java.lang.String);// f4(java.lang.String) @Anno() public final void setX(@org.jetbrains.annotations.Nullable() java.lang.String);// setX(java.lang.String) diff --git a/compiler/testData/asJava/ultraLightClasses/delegatingToInterfaces.fir.java b/compiler/testData/asJava/ultraLightClasses/delegatingToInterfaces.fir.java index 442b32eb087..c6eab6c3441 100644 --- a/compiler/testData/asJava/ultraLightClasses/delegatingToInterfaces.fir.java +++ b/compiler/testData/asJava/ultraLightClasses/delegatingToInterfaces.fir.java @@ -1,5 +1,5 @@ public abstract interface Base /* Base*/ { - public abstract int foo(java.lang.String, @org.jetbrains.annotations.Nullable() java.lang.Object);// foo(java.lang.String, java.lang.Object) + public abstract int foo(@org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.Nullable() java.lang.Object);// foo(java.lang.String, java.lang.Object) public abstract int getX();// getX() @@ -30,7 +30,7 @@ public final class BaseImpl /* BaseImpl*/ implements Base { public final class Derived /* Derived*/ implements Base { @java.lang.Override() - public int foo(java.lang.String, @org.jetbrains.annotations.Nullable() java.lang.Object);// foo(java.lang.String, java.lang.Object) + public int foo(@org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.Nullable() java.lang.Object);// foo(java.lang.String, java.lang.Object) @java.lang.Override() public void printMessage();// printMessage() diff --git a/compiler/testData/asJava/ultraLightClasses/generics.fir.java b/compiler/testData/asJava/ultraLightClasses/generics.fir.java index 1ba6fc1574b..42de8a94871 100644 --- a/compiler/testData/asJava/ultraLightClasses/generics.fir.java +++ b/compiler/testData/asJava/ultraLightClasses/generics.fir.java @@ -52,7 +52,7 @@ public abstract class C /* C*/ { public C(@org.jetbrains.annotations.NotNull() java.util.List);// .ctor(java.util.List) - public final Q getW(Q);// getW(Q) + public final Q getW(@org.jetbrains.annotations.NotNull() Q);// getW(Q) public final T foo(V, @org.jetbrains.annotations.NotNull() C, @org.jetbrains.annotations.NotNull() kotlin.sequences.Sequence);// foo(V, C, kotlin.sequences.Sequence) diff --git a/compiler/testData/asJava/ultraLightClasses/objects.fir.java b/compiler/testData/asJava/ultraLightClasses/objects.fir.java index 241874d1d40..6f2d2ed8bee 100644 --- a/compiler/testData/asJava/ultraLightClasses/objects.fir.java +++ b/compiler/testData/asJava/ultraLightClasses/objects.fir.java @@ -33,13 +33,13 @@ public final class C /* C*/ { public static final class Companion /* C.Companion*/ { @kotlin.jvm.JvmStatic() @org.jetbrains.annotations.NotNull() - public final java.lang.String getC(I);// getC(I) + public final java.lang.String getC(@org.jetbrains.annotations.NotNull() I);// getC(I) @kotlin.jvm.JvmStatic() public final void foo();// foo() @kotlin.jvm.JvmStatic() - public final void setC(I, @org.jetbrains.annotations.NotNull() java.lang.String);// setC(I, java.lang.String) + public final void setC(@org.jetbrains.annotations.NotNull() I, @org.jetbrains.annotations.NotNull() java.lang.String);// setC(I, java.lang.String) @kotlin.jvm.JvmStatic() public final void setC1(@org.jetbrains.annotations.NotNull() java.lang.String);// setC1(java.lang.String) diff --git a/compiler/testData/asJava/ultraLightClasses/properties.fir.java b/compiler/testData/asJava/ultraLightClasses/properties.fir.java index 38a80e14ef4..266a2d9c3c7 100644 --- a/compiler/testData/asJava/ultraLightClasses/properties.fir.java +++ b/compiler/testData/asJava/ultraLightClasses/properties.fir.java @@ -161,7 +161,7 @@ public final class Foo /* Foo*/ { public final int getF1();// getF1() - public final int getIntProp(int);// getIntProp(int) + public final int getIntProp(@org.jetbrains.annotations.NotNull() int);// getIntProp(int) public final int getInternalWithPrivateSet$light_idea_test_case();// getInternalWithPrivateSet$light_idea_test_case() diff --git a/compiler/testData/asJava/ultraLightClasses/simpleFunctions.fir.java b/compiler/testData/asJava/ultraLightClasses/simpleFunctions.fir.java index a894d2312da..bc3534ca6f3 100644 --- a/compiler/testData/asJava/ultraLightClasses/simpleFunctions.fir.java +++ b/compiler/testData/asJava/ultraLightClasses/simpleFunctions.fir.java @@ -1,6 +1,6 @@ public final class Foo /* Foo*/ { @org.jetbrains.annotations.NotNull() - public final Foo onString(java.lang.String, @org.jetbrains.annotations.NotNull() kotlin.jvm.functions.Function1);// onString(java.lang.String, kotlin.jvm.functions.Function1) + public final Foo onString(@org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.NotNull() kotlin.jvm.functions.Function1);// onString(java.lang.String, kotlin.jvm.functions.Function1) @org.jetbrains.annotations.NotNull() public final Foo plus(int);// plus(int) diff --git a/compiler/testData/asJava/ultraLightFacades/properties.fir.java b/compiler/testData/asJava/ultraLightFacades/properties.fir.java index 4f515b31915..bca56201544 100644 --- a/compiler/testData/asJava/ultraLightFacades/properties.fir.java +++ b/compiler/testData/asJava/ultraLightFacades/properties.fir.java @@ -141,7 +141,7 @@ public final class PropertiesKt /* PropertiesKt*/ { public static final int getInt2();// getInt2() - public static final int getIntProp(int);// getIntProp(int) + public static final int getIntProp(@org.jetbrains.annotations.NotNull() int);// getIntProp(int) public static final int getInternalWithPrivateSet();// getInternalWithPrivateSet() diff --git a/compiler/testData/asJava/ultraLightFacades/simpleFunctions.fir.java b/compiler/testData/asJava/ultraLightFacades/simpleFunctions.fir.java index 5f145ac8f58..98a93e2bd2a 100644 --- a/compiler/testData/asJava/ultraLightFacades/simpleFunctions.fir.java +++ b/compiler/testData/asJava/ultraLightFacades/simpleFunctions.fir.java @@ -6,7 +6,7 @@ public final class SimpleFunctionsKt /* SimpleFunctionsKt*/ { public static final /* vararg */ void nullableVararg(@org.jetbrains.annotations.NotNull() java.lang.Object...);// nullableVararg(java.lang.Object[]) - public static final error.NonExistentClass onString(java.lang.String, @org.jetbrains.annotations.NotNull() kotlin.jvm.functions.Function1);// onString(java.lang.String, kotlin.jvm.functions.Function1) + public static final error.NonExistentClass onString(@org.jetbrains.annotations.NotNull() java.lang.String, @org.jetbrains.annotations.NotNull() kotlin.jvm.functions.Function1);// onString(java.lang.String, kotlin.jvm.functions.Function1) public static final error.NonExistentClass plus(int);// plus(int)