From 3d1f4b838686a87e81146de1a46c0d346514c5a3 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 12 Mar 2021 15:55:46 +0300 Subject: [PATCH] [FIR] Don't add `@EnhancedVisibility` to types with `@Nullable` annotation --- .../enhancement/jsr305/NonNullNever.fir.txt | 4 +- .../enhancement/jsr305/Simple.fir.txt | 4 +- .../enhancement/jsr305/Strange.fir.txt | 2 +- .../FieldsAreNullable.fir.txt | 4 +- .../ForceFlexibility.fir.txt | 2 +- .../NullabilityFromOverridden.fir.txt | 14 +++---- .../OverridingDefaultQualifier.fir.txt | 6 +-- .../ParametersAreNonnullByDefault.fir.txt | 4 +- ...rametersAreNonnullByDefaultPackage.fir.txt | 8 ++-- .../SpringNullable.fir.txt | 4 +- .../SpringNullablePackage.fir.txt | 4 +- .../FirBlackBoxCodegenTestGenerated.java | 6 +++ .../fir/java/enhancement/javaTypeUtils.kt | 2 +- ...ncorrectBytecodeWithEnhancedNullability.kt | 40 +++++++++++++++++++ ...edImplementationOfJavaInterface.fir.kt.txt | 4 +- ...gatedImplementationOfJavaInterface.fir.txt | 18 ++++----- .../ClashResolutionDescriptor.fir.txt | 2 +- .../ir/irText/firProblems/MultiList.fir.txt | 2 +- .../ir/irText/firProblems/putIfAbsent.fir.txt | 2 +- .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++ .../LightAnalysisModeTestGenerated.java | 5 +++ 22 files changed, 106 insertions(+), 43 deletions(-) create mode 100644 compiler/testData/codegen/box/fir/incorrectBytecodeWithEnhancedNullability.kt diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/NonNullNever.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/NonNullNever.fir.txt index 2b7c5855fcc..95dd7a9f24f 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/NonNullNever.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/NonNullNever.fir.txt @@ -3,9 +3,9 @@ } public open class NonNullNever : R|kotlin/Any| { - @R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.NEVER|()) public open field field: R|@EnhancedNullability kotlin/String?| + @R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.NEVER|()) public open field field: R|kotlin/String?| - @R|MyNullable|() public open fun foo(@R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.NEVER|()) x: R|@EnhancedNullability kotlin/String?|, @R|MyNullable|() y: R|@EnhancedNullability kotlin/CharSequence?|): R|@EnhancedNullability kotlin/String?| + @R|MyNullable|() public open fun foo(@R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.NEVER|()) x: R|kotlin/String?|, @R|MyNullable|() y: R|kotlin/CharSequence?|): R|kotlin/String?| public constructor(): R|NonNullNever| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/Simple.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/Simple.fir.txt index 1e59ab8255d..e0df603af60 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/Simple.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/Simple.fir.txt @@ -1,7 +1,7 @@ public open class Simple : R|kotlin/Any| { - @R|javax/annotation/Nullable|() public open field field: R|@EnhancedNullability kotlin/String?| + @R|javax/annotation/Nullable|() public open field field: R|kotlin/String?| - @R|javax/annotation/Nullable|() public open fun foo(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|@EnhancedNullability kotlin/CharSequence?|): R|@EnhancedNullability kotlin/String?| + @R|javax/annotation/Nullable|() public open fun foo(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|kotlin/String?| @R|javax/annotation/Nonnull|() public open fun bar(): R|@EnhancedNullability kotlin/String| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/Strange.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/Strange.fir.txt index 3433f67641b..ca2b86dbc67 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/Strange.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/Strange.fir.txt @@ -1,7 +1,7 @@ public open class Strange : R|kotlin/Any| { @R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.UNKNOWN|()) public open field field: R|ft| - @R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.MAYBE|()) public open fun foo(@R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.ALWAYS|()) x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.NEVER|()) y: R|@EnhancedNullability kotlin/CharSequence?|): R|@EnhancedNullability kotlin/String?| + @R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.MAYBE|()) public open fun foo(@R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.ALWAYS|()) x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.NEVER|()) y: R|kotlin/CharSequence?|): R|kotlin/String?| @R|javax/annotation/Nonnull|() public open fun bar(): R|@EnhancedNullability kotlin/String| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/FieldsAreNullable.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/FieldsAreNullable.fir.txt index 101feec5052..d5b27969058 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/FieldsAreNullable.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/FieldsAreNullable.fir.txt @@ -1,9 +1,9 @@ @R|FieldsAreNullable|() public open class A : R|kotlin/Any| { - public open field field: R|@EnhancedNullability kotlin/String?| + public open field field: R|kotlin/String?| @R|javax/annotation/Nonnull|() public open field nonNullField: R|@EnhancedNullability kotlin/String| - public open fun foo(q: R|ft|, @R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|@EnhancedNullability kotlin/CharSequence?|): R|ft| + public open fun foo(q: R|ft|, @R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|ft| @R|javax/annotation/Nonnull|() public open fun bar(): R|@EnhancedNullability kotlin/String| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ForceFlexibility.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ForceFlexibility.fir.txt index 72ab2f396d2..27c9cbf6fd3 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ForceFlexibility.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ForceFlexibility.fir.txt @@ -1,5 +1,5 @@ @R|spr/NonNullApi|() public open class A : R|kotlin/Any| { - public open fun foo(x: R|@EnhancedNullability kotlin/String|, @R|spr/Nullable|() y: R|@EnhancedNullability kotlin/CharSequence?|): R|@EnhancedNullability kotlin/String| + public open fun foo(x: R|@EnhancedNullability kotlin/String|, @R|spr/Nullable|() y: R|kotlin/CharSequence?|): R|@EnhancedNullability kotlin/String| @R|spr/ForceFlexibility|() public open fun bar(x: R|ft|, @R|javax/annotation/Nonnull|() y: R|@EnhancedNullability kotlin/CharSequence|): R|ft| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/NullabilityFromOverridden.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/NullabilityFromOverridden.fir.txt index 02bcfd919a1..99a9d21705f 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/NullabilityFromOverridden.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/NullabilityFromOverridden.fir.txt @@ -5,9 +5,9 @@ public open fun foo3(x: R|@EnhancedNullability kotlin/String|): R|@EnhancedNullability kotlin/String| - @R|javax/annotation/Nullable|() public open fun bar1(@R|javax/annotation/Nullable|() x: R|@EnhancedNullability kotlin/String?|): R|@EnhancedNullability kotlin/String?| + @R|javax/annotation/Nullable|() public open fun bar1(@R|javax/annotation/Nullable|() x: R|kotlin/String?|): R|kotlin/String?| - @R|javax/annotation/Nullable|() public open fun bar2(@R|javax/annotation/Nullable|() x: R|@EnhancedNullability kotlin/String?|): R|@EnhancedNullability kotlin/String?| + @R|javax/annotation/Nullable|() public open fun bar2(@R|javax/annotation/Nullable|() x: R|kotlin/String?|): R|kotlin/String?| public open fun baz(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|@EnhancedNullability kotlin/String| @@ -21,9 +21,9 @@ public abstract fun foo3(x: R|@EnhancedNullability kotlin/String|): R|@EnhancedNullability kotlin/CharSequence| - @R|javax/annotation/Nullable|() public abstract fun bar1(@R|javax/annotation/Nullable|() x: R|@EnhancedNullability kotlin/String?|): R|@EnhancedNullability kotlin/CharSequence?| + @R|javax/annotation/Nullable|() public abstract fun bar1(@R|javax/annotation/Nullable|() x: R|kotlin/String?|): R|kotlin/CharSequence?| - @R|javax/annotation/Nullable|() public abstract fun bar2(@R|javax/annotation/Nullable|() x: R|@EnhancedNullability kotlin/String?|): R|@EnhancedNullability kotlin/CharSequence?| + @R|javax/annotation/Nullable|() public abstract fun bar2(@R|javax/annotation/Nullable|() x: R|kotlin/String?|): R|kotlin/CharSequence?| public abstract fun baz(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|@EnhancedNullability kotlin/CharSequence| @@ -33,7 +33,7 @@ @R|javax/annotation/Nonnull|() public open fun foo2(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|@EnhancedNullability kotlin/String| - public open fun bar1(x: R|@EnhancedNullability kotlin/String?|): R|@EnhancedNullability kotlin/String?| + public open fun bar1(x: R|kotlin/String?|): R|kotlin/String?| public open fun baz(x: R|@EnhancedNullability kotlin/String|): R|@EnhancedNullability kotlin/String| @@ -45,9 +45,9 @@ public open fun foo2(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|@EnhancedNullability kotlin/String| - public open fun bar1(x: R|@EnhancedNullability kotlin/String?|): R|@EnhancedNullability kotlin/String?| + public open fun bar1(x: R|kotlin/String?|): R|kotlin/String?| - @R|javax/annotation/Nullable|() public open fun bar2(@R|javax/annotation/Nullable|() x: R|@EnhancedNullability kotlin/String?|): R|@EnhancedNullability kotlin/String?| + @R|javax/annotation/Nullable|() public open fun bar2(@R|javax/annotation/Nullable|() x: R|kotlin/String?|): R|kotlin/String?| public open fun baz(x: R|@EnhancedNullability kotlin/String|): R|@EnhancedNullability kotlin/String| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/OverridingDefaultQualifier.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/OverridingDefaultQualifier.fir.txt index 48fa03cca5d..83604bd4487 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/OverridingDefaultQualifier.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/OverridingDefaultQualifier.fir.txt @@ -1,13 +1,13 @@ @R|NonNullApi|() public open class A : R|kotlin/Any| { public open field field: R|@EnhancedNullability kotlin/String| - public open fun foo(x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|@EnhancedNullability kotlin/CharSequence?|): R|@EnhancedNullability kotlin/String| + public open fun foo(x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|@EnhancedNullability kotlin/String| - @R|NullableApi|() public open fun foobar(x: R|@EnhancedNullability kotlin/String?|, @R|NonNullApi|() y: R|@EnhancedNullability kotlin/CharSequence|): R|@EnhancedNullability kotlin/String?| + @R|NullableApi|() public open fun foobar(x: R|kotlin/String?|, @R|NonNullApi|() y: R|@EnhancedNullability kotlin/CharSequence|): R|kotlin/String?| public open fun bar(): R|@EnhancedNullability kotlin/String| - @R|javax/annotation/Nullable|() public open fun baz(): R|ft<@EnhancedNullability kotlin/collections/MutableList>?, @EnhancedNullability kotlin/collections/List>?>| + @R|javax/annotation/Nullable|() public open fun baz(): R|ft>?, kotlin/collections/List>?>| public constructor(): R|A| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefault.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefault.fir.txt index b419e930a11..2b9298b719b 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefault.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefault.fir.txt @@ -1,7 +1,7 @@ @R|javax/annotation/ParametersAreNonnullByDefault|() public open class A : R|kotlin/Any| { - @R|javax/annotation/Nullable|() public open field field: R|@EnhancedNullability kotlin/String?| + @R|javax/annotation/Nullable|() public open field field: R|kotlin/String?| - public open fun foo(q: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|@EnhancedNullability kotlin/CharSequence?|): R|ft| + public open fun foo(q: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|ft| @R|javax/annotation/Nonnull|() public open fun bar(): R|@EnhancedNullability kotlin/String| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefaultPackage.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefaultPackage.fir.txt index 2a24e346a56..eb7b2b5c972 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefaultPackage.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefaultPackage.fir.txt @@ -1,7 +1,7 @@ public open class A : R|kotlin/Any| { - @R|javax/annotation/Nullable|() public open field field: R|@EnhancedNullability kotlin/String?| + @R|javax/annotation/Nullable|() public open field field: R|kotlin/String?| - public open fun foo(q: R|ft|, @R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|@EnhancedNullability kotlin/CharSequence?|): R|ft| + public open fun foo(q: R|ft|, @R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|ft| @R|javax/annotation/Nonnull|() public open fun bar(): R|@EnhancedNullability kotlin/String| @@ -9,9 +9,9 @@ public open class A : R|kotlin/Any| { } public open class A2 : R|kotlin/Any| { - @R|javax/annotation/Nullable|() public open field field: R|@EnhancedNullability kotlin/String?| + @R|javax/annotation/Nullable|() public open field field: R|kotlin/String?| - public open fun foo(q: R|ft|, @R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|@EnhancedNullability kotlin/CharSequence?|): R|ft| + public open fun foo(q: R|ft|, @R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|ft| @R|javax/annotation/Nonnull|() public open fun bar(): R|@EnhancedNullability kotlin/String| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullable.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullable.fir.txt index 70ed02034c9..5fd29b2af90 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullable.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullable.fir.txt @@ -1,11 +1,11 @@ @R|spr/NonNullApi|() public open class A : R|kotlin/Any| { public open field field: R|ft| - public open fun foo(x: R|@EnhancedNullability kotlin/String|, @R|spr/Nullable|() y: R|@EnhancedNullability kotlin/CharSequence?|): R|@EnhancedNullability kotlin/String| + public open fun foo(x: R|@EnhancedNullability kotlin/String|, @R|spr/Nullable|() y: R|kotlin/CharSequence?|): R|@EnhancedNullability kotlin/String| public open fun bar(): R|@EnhancedNullability kotlin/String| - @R|spr/Nullable|() public open fun baz(): R|ft<@EnhancedNullability kotlin/collections/MutableList>?, @EnhancedNullability kotlin/collections/List>?>| + @R|spr/Nullable|() public open fun baz(): R|ft>?, kotlin/collections/List>?>| public constructor(): R|A| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullablePackage.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullablePackage.fir.txt index f89bf50150a..751715c5ed8 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullablePackage.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullablePackage.fir.txt @@ -1,11 +1,11 @@ public open class A : R|kotlin/Any| { public open field field: R|ft| - public open fun foo(x: R|ft|, @R|spr/Nullable|() y: R|@EnhancedNullability kotlin/CharSequence?|): R|ft| + public open fun foo(x: R|ft|, @R|spr/Nullable|() y: R|kotlin/CharSequence?|): R|ft| public open fun bar(): R|ft| - @R|spr/Nullable|() public open fun baz(): R|ft<@EnhancedNullability kotlin/collections/MutableList>?, @EnhancedNullability kotlin/collections/List>?>| + @R|spr/Nullable|() public open fun baz(): R|ft>?, kotlin/collections/List>?>| public constructor(): R|test/A| diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index f1458bb206a..5af8c18ae4c 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -15012,6 +15012,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/fir/Fir2IrClassifierStorage.kt"); } + @Test + @TestMetadata("incorrectBytecodeWithEnhancedNullability.kt") + public void testIncorrectBytecodeWithEnhancedNullability() throws Exception { + runTest("compiler/testData/codegen/box/fir/incorrectBytecodeWithEnhancedNullability.kt"); + } + @Test @TestMetadata("IrBuiltIns.kt") public void testIrBuiltIns() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt index cf98bb42d3a..36cfd355990 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt @@ -219,7 +219,7 @@ private fun ConeKotlinType.getEnhancedNullability( if (!position.shouldEnhance()) return this.isMarkedNullable.noChange() return when (qualifiers.nullability) { - NullabilityQualifier.NULLABLE -> true.enhancedNullability() + NullabilityQualifier.NULLABLE -> true.noChange() NullabilityQualifier.NOT_NULL -> false.enhancedNullability() else -> this.isMarkedNullable.noChange() } diff --git a/compiler/testData/codegen/box/fir/incorrectBytecodeWithEnhancedNullability.kt b/compiler/testData/codegen/box/fir/incorrectBytecodeWithEnhancedNullability.kt new file mode 100644 index 00000000000..c3f19307ee9 --- /dev/null +++ b/compiler/testData/codegen/box/fir/incorrectBytecodeWithEnhancedNullability.kt @@ -0,0 +1,40 @@ +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// FILE: Utils.java +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class Utils { + @NotNull + public static A resolveVisibilityFromModifiers(@NotNull A defaultVisibility) { + return A.Companion.getPUBLIC(); + } + + @Nullable + public static Integer compare(@NotNull A first, @NotNull A second) { + if (first.getIndex() == second.getIndex()) return null; + return Integer.compare(first.getIndex(), second.getIndex()); + } +} + +// FILE: main.kt + +class KtModifierListOwner +class A(val index: Int) { + companion object { + val PUBLIC = A(1) + val PRIVATE = A(2) + } +} + +fun test(visibility: A): String { + val parentVisibility = Utils.resolveVisibilityFromModifiers(visibility) + if (Utils.compare(parentVisibility, visibility) ?: 0 < 0) { + return "OK" + } + return "Fail" +} + +fun box(): String { + return test(A.PRIVATE) +} diff --git a/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.kt.txt b/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.kt.txt index a5d924d308d..19a02b4c61b 100644 --- a/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.kt.txt +++ b/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.kt.txt @@ -9,7 +9,7 @@ class Test : J { .#<$$delegate_0>.takeNotNull(x = x) } - override fun takeNullable(x: @EnhancedNullability String?) { + override fun takeNullable(x: String?) { .#<$$delegate_0>.takeNullable(x = x) } @@ -23,7 +23,7 @@ class Test : J { } @Nullable - override fun returnNullable(): @EnhancedNullability String? { + override fun returnNullable(): String? { return .#<$$delegate_0>.returnNullable() } diff --git a/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.txt b/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.txt index ef7bb38af6b..217a25eed69 100644 --- a/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.txt +++ b/compiler/testData/ir/irText/classes/delegatedImplementationOfJavaInterface.fir.txt @@ -16,16 +16,16 @@ FILE fqName: fileName:/delegatedImplementationOfJavaInterface.kt $this: GET_FIELD 'FIELD DELEGATE name:<$$delegate_0> type:.J visibility:local [final]' type=.J origin=null receiver: GET_VAR ': .Test declared in .Test.takeNotNull' type=.Test origin=null x: GET_VAR 'x: @[EnhancedNullability] kotlin.String declared in .Test.takeNotNull' type=@[EnhancedNullability] kotlin.String origin=null - FUN DELEGATED_MEMBER name:takeNullable visibility:public modality:OPEN <> ($this:.Test, x:@[EnhancedNullability] kotlin.String?) returnType:kotlin.Unit + FUN DELEGATED_MEMBER name:takeNullable visibility:public modality:OPEN <> ($this:.Test, x:kotlin.String?) returnType:kotlin.Unit overridden: - public abstract fun takeNullable (x: @[EnhancedNullability] kotlin.String?): kotlin.Unit declared in .J + public abstract fun takeNullable (x: kotlin.String?): kotlin.Unit declared in .J $this: VALUE_PARAMETER name: type:.Test - VALUE_PARAMETER name:x index:0 type:@[EnhancedNullability] kotlin.String? + VALUE_PARAMETER name:x index:0 type:kotlin.String? BLOCK_BODY - CALL 'public abstract fun takeNullable (x: @[EnhancedNullability] kotlin.String?): kotlin.Unit declared in .J' type=kotlin.Unit origin=null + CALL 'public abstract fun takeNullable (x: kotlin.String?): kotlin.Unit declared in .J' type=kotlin.Unit origin=null $this: GET_FIELD 'FIELD DELEGATE name:<$$delegate_0> type:.J visibility:local [final]' type=.J origin=null receiver: GET_VAR ': .Test declared in .Test.takeNullable' type=.Test origin=null - x: GET_VAR 'x: @[EnhancedNullability] kotlin.String? declared in .Test.takeNullable' type=@[EnhancedNullability] kotlin.String? origin=null + x: GET_VAR 'x: kotlin.String? declared in .Test.takeNullable' type=kotlin.String? origin=null FUN DELEGATED_MEMBER name:takeFlexible visibility:public modality:OPEN <> ($this:.Test, x:@[FlexibleNullability] kotlin.String?) returnType:kotlin.Unit overridden: public abstract fun takeFlexible (x: @[FlexibleNullability] kotlin.String?): kotlin.Unit declared in .J @@ -47,15 +47,15 @@ FILE fqName: fileName:/delegatedImplementationOfJavaInterface.kt CALL 'public abstract fun returnNotNull (): @[EnhancedNullability] kotlin.String declared in .J' type=@[EnhancedNullability] kotlin.String origin=null $this: GET_FIELD 'FIELD DELEGATE name:<$$delegate_0> type:.J visibility:local [final]' type=.J origin=null receiver: GET_VAR ': .Test declared in .Test.returnNotNull' type=.Test origin=null - FUN DELEGATED_MEMBER name:returnNullable visibility:public modality:OPEN <> ($this:.Test) returnType:@[EnhancedNullability] kotlin.String? + FUN DELEGATED_MEMBER name:returnNullable visibility:public modality:OPEN <> ($this:.Test) returnType:kotlin.String? annotations: Nullable(value = ) overridden: - public abstract fun returnNullable (): @[EnhancedNullability] kotlin.String? declared in .J + public abstract fun returnNullable (): kotlin.String? declared in .J $this: VALUE_PARAMETER name: type:.Test BLOCK_BODY - RETURN type=kotlin.Nothing from='public open fun returnNullable (): @[EnhancedNullability] kotlin.String? declared in .Test' - CALL 'public abstract fun returnNullable (): @[EnhancedNullability] kotlin.String? declared in .J' type=@[EnhancedNullability] kotlin.String? origin=null + RETURN type=kotlin.Nothing from='public open fun returnNullable (): kotlin.String? declared in .Test' + CALL 'public abstract fun returnNullable (): kotlin.String? declared in .J' type=kotlin.String? origin=null $this: GET_FIELD 'FIELD DELEGATE name:<$$delegate_0> type:.J visibility:local [final]' type=.J origin=null receiver: GET_VAR ': .Test declared in .Test.returnNullable' type=.Test origin=null FUN DELEGATED_MEMBER name:returnsFlexible visibility:public modality:OPEN <> ($this:.Test) returnType:@[FlexibleNullability] kotlin.String? diff --git a/compiler/testData/ir/irText/firProblems/ClashResolutionDescriptor.fir.txt b/compiler/testData/ir/irText/firProblems/ClashResolutionDescriptor.fir.txt index 1cd7ba66e09..16ee7baa6f5 100644 --- a/compiler/testData/ir/irText/firProblems/ClashResolutionDescriptor.fir.txt +++ b/compiler/testData/ir/irText/firProblems/ClashResolutionDescriptor.fir.txt @@ -152,7 +152,7 @@ FILE fqName: fileName:/ClashResolutionDescriptor.kt BLOCK type=kotlin.collections.Collection<.ComponentDescriptor> origin=ELVIS VAR IR_TEMPORARY_VARIABLE name:tmp_1 type:kotlin.collections.Collection<.ComponentDescriptor>? [val] TYPE_OP type=kotlin.collections.Collection<.ComponentDescriptor>? origin=SAFE_CAST typeOperand=kotlin.collections.Collection<.ComponentDescriptor> - CALL 'public open fun get (p0: @[FlexibleNullability] K of java.util.HashMap?): @[EnhancedNullability] V of java.util.HashMap? [operator] declared in java.util.HashMap' type=kotlin.Any? origin=null + CALL 'public open fun get (p0: @[FlexibleNullability] K of java.util.HashMap?): V of java.util.HashMap? [operator] declared in java.util.HashMap' type=kotlin.Any? origin=null $this: CALL 'private final fun (): java.util.HashMap declared in ' type=java.util.HashMap origin=GET_PROPERTY p0: CALL 'public final fun (): java.lang.Class.PlatformExtensionsClashResolver> declared in .PlatformExtensionsClashResolver' type=java.lang.Class.PlatformSpecificExtension.PlatformSpecificExtension.PlatformSpecificExtension.PlatformSpecificExtension.PlatformSpecificExtension>>>>> origin=GET_PROPERTY $this: GET_VAR 'val resolver: .PlatformExtensionsClashResolver<*> [val] declared in .resolveClashesIfAny' type=.PlatformExtensionsClashResolver<*> origin=null diff --git a/compiler/testData/ir/irText/firProblems/MultiList.fir.txt b/compiler/testData/ir/irText/firProblems/MultiList.fir.txt index 9e551765d8d..e33b5c7551f 100644 --- a/compiler/testData/ir/irText/firProblems/MultiList.fir.txt +++ b/compiler/testData/ir/irText/firProblems/MultiList.fir.txt @@ -283,7 +283,7 @@ FILE fqName: fileName:/MultiList.kt FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] overridden: public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in .MyList - public open fun equals (p0: @[EnhancedNullability] kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in java.util.ArrayList + public open fun equals (p0: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in java.util.ArrayList $this: VALUE_PARAMETER name: type:kotlin.Any VALUE_PARAMETER name:other index:0 type:kotlin.Any? FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] diff --git a/compiler/testData/ir/irText/firProblems/putIfAbsent.fir.txt b/compiler/testData/ir/irText/firProblems/putIfAbsent.fir.txt index ae8ba2428a7..69472d27072 100644 --- a/compiler/testData/ir/irText/firProblems/putIfAbsent.fir.txt +++ b/compiler/testData/ir/irText/firProblems/putIfAbsent.fir.txt @@ -16,7 +16,7 @@ FILE fqName: fileName:/putIfAbsent.kt : T of .Owner.foo : T of .Owner.foo TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit - CALL 'public open fun putIfAbsent (p0: @[EnhancedNullability] K of java.util.Map, p1: @[EnhancedNullability] V of java.util.Map): @[EnhancedNullability] V of java.util.Map? declared in java.util.Map' type=T of .Owner.foo? origin=null + CALL 'public open fun putIfAbsent (p0: @[EnhancedNullability] K of java.util.Map, p1: @[EnhancedNullability] V of java.util.Map): V of java.util.Map? declared in java.util.Map' type=T of .Owner.foo? origin=null $this: GET_VAR 'val map: kotlin.collections.MutableMap.Owner.foo, T of .Owner.foo> [val] declared in .Owner.foo' type=kotlin.collections.MutableMap.Owner.foo, T of .Owner.foo> origin=null p0: GET_VAR 'x: T of .Owner.foo declared in .Owner.foo' type=T of .Owner.foo origin=null p1: GET_VAR 'y: T of .Owner.foo declared in .Owner.foo' type=T of .Owner.foo origin=null diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 610453e312b..4f6e3666dba 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -15012,6 +15012,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/fir/Fir2IrClassifierStorage.kt"); } + @Test + @TestMetadata("incorrectBytecodeWithEnhancedNullability.kt") + public void testIncorrectBytecodeWithEnhancedNullability() throws Exception { + runTest("compiler/testData/codegen/box/fir/incorrectBytecodeWithEnhancedNullability.kt"); + } + @Test @TestMetadata("IrBuiltIns.kt") public void testIrBuiltIns() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index c5af89fd20a..f69a36d0ea9 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -15012,6 +15012,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/fir/Fir2IrClassifierStorage.kt"); } + @Test + @TestMetadata("incorrectBytecodeWithEnhancedNullability.kt") + public void testIncorrectBytecodeWithEnhancedNullability() throws Exception { + runTest("compiler/testData/codegen/box/fir/incorrectBytecodeWithEnhancedNullability.kt"); + } + @Test @TestMetadata("IrBuiltIns.kt") public void testIrBuiltIns() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 1fe0dbf778e..f7df1910994 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12393,6 +12393,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/fir/Fir2IrClassifierStorage.kt"); } + @TestMetadata("incorrectBytecodeWithEnhancedNullability.kt") + public void testIncorrectBytecodeWithEnhancedNullability() throws Exception { + runTest("compiler/testData/codegen/box/fir/incorrectBytecodeWithEnhancedNullability.kt"); + } + @TestMetadata("IrBuiltIns.kt") public void testIrBuiltIns() throws Exception { runTest("compiler/testData/codegen/box/fir/IrBuiltIns.kt");