From d015d3bc0e92d8024eb95b3d8d6bfa92eacac809 Mon Sep 17 00:00:00 2001 From: Victor Petukhov Date: Wed, 6 Oct 2021 14:15:25 +0300 Subject: [PATCH] Don't enhance previously erased value parameters for jspecify strict mode ^KT-48261 Fixed --- ...nAnnotationsCompiledJavaTestGenerated.java | 12 +++ ...dJavaWithPsiClassReadingTestGenerated.java | 12 +++ ...ignAnnotationsSourceJavaTestGenerated.java | 12 +++ .../kotlin/frontend/java/di/injection.kt | 3 +- .../java8Tests/jspecify/strictMode/kt48261.kt | 35 +++++++++ .../jspecify/strictMode/kt48261.txt | 75 +++++++++++++++++++ .../java8Tests/misc/kt48261.kt | 31 ++++++++ .../java8Tests/misc/kt48261.txt | 75 +++++++++++++++++++ ...nAnnotationsCompiledJavaTestGenerated.java | 12 +++ ...dJavaWithPsiClassReadingTestGenerated.java | 12 +++ ...ignAnnotationsSourceJavaTestGenerated.java | 12 +++ .../kotlin/config/LanguageVersionSettings.kt | 1 + .../typeEnhancement/AbstractSignatureParts.kt | 11 ++- .../typeEnhancement/typeEnhancementUtils.kt | 7 +- .../descriptors/JavaMethodDescriptor.java | 2 + .../kotlin/load/java/lazy/context.kt | 8 +- .../descriptors/LazyJavaClassMemberScope.kt | 1 + .../typeEnhancement/signatureEnhancement.kt | 37 ++++++--- .../org/jetbrains/kotlin/load/java/utils.kt | 11 ++- 19 files changed, 348 insertions(+), 21 deletions(-) create mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt48261.kt create mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt48261.txt create mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/kt48261.kt create mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/kt48261.txt diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java index cb097a18770..3ab4739fe63 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java @@ -684,6 +684,12 @@ public class FirOldFrontendForeignAnnotationsCompiledJavaTestGenerated extends A runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt47437.kt"); } + @Test + @TestMetadata("kt48261.kt") + public void testKt48261() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt48261.kt"); + } + @Test @TestMetadata("NonPlatformTypeParameter.kt") public void testNonPlatformTypeParameter() throws Exception { @@ -913,6 +919,12 @@ public class FirOldFrontendForeignAnnotationsCompiledJavaTestGenerated extends A runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/enhancedRecursiveStarProjection.kt"); } + @Test + @TestMetadata("kt48261.kt") + public void testKt48261() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/kt48261.kt"); + } + @Test @TestMetadata("methodWithTypeParameter.kt") public void testMethodWithTypeParameter() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java index b576a256a30..3c4ab38c7e0 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java @@ -684,6 +684,12 @@ public class FirOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTest runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt47437.kt"); } + @Test + @TestMetadata("kt48261.kt") + public void testKt48261() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt48261.kt"); + } + @Test @TestMetadata("NonPlatformTypeParameter.kt") public void testNonPlatformTypeParameter() throws Exception { @@ -913,6 +919,12 @@ public class FirOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTest runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/enhancedRecursiveStarProjection.kt"); } + @Test + @TestMetadata("kt48261.kt") + public void testKt48261() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/kt48261.kt"); + } + @Test @TestMetadata("methodWithTypeParameter.kt") public void testMethodWithTypeParameter() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsSourceJavaTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsSourceJavaTestGenerated.java index b15f02e0757..82530bc5020 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsSourceJavaTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendForeignAnnotationsSourceJavaTestGenerated.java @@ -684,6 +684,12 @@ public class FirOldFrontendForeignAnnotationsSourceJavaTestGenerated extends Abs runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt47437.kt"); } + @Test + @TestMetadata("kt48261.kt") + public void testKt48261() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt48261.kt"); + } + @Test @TestMetadata("NonPlatformTypeParameter.kt") public void testNonPlatformTypeParameter() throws Exception { @@ -913,6 +919,12 @@ public class FirOldFrontendForeignAnnotationsSourceJavaTestGenerated extends Abs runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/enhancedRecursiveStarProjection.kt"); } + @Test + @TestMetadata("kt48261.kt") + public void testKt48261() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/kt48261.kt"); + } + @Test @TestMetadata("methodWithTypeParameter.kt") public void testMethodWithTypeParameter() throws Exception { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt index 1f63c2309cb..b9d3344f908 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt @@ -146,7 +146,8 @@ fun StorageComponentContainer.configureJavaSpecificComponents( useInstance( JavaResolverSettings.create( correctNullabilityForNotNullTypeParameter = languageVersionSettings.supportsFeature(LanguageFeature.ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated), - typeEnhancementImprovementsInStrictMode = languageVersionSettings.supportsFeature(LanguageFeature.TypeEnhancementImprovementsInStrictMode) + typeEnhancementImprovementsInStrictMode = languageVersionSettings.supportsFeature(LanguageFeature.TypeEnhancementImprovementsInStrictMode), + ignoreNullabilityForErasedValueParameters = languageVersionSettings.supportsFeature(LanguageFeature.IgnoreNullabilityForErasedValueParameters) ) ) useInstance(JavaModuleResolver.getInstance(moduleContext.project)) diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt48261.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt48261.kt new file mode 100644 index 00000000000..934f1299d93 --- /dev/null +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt48261.kt @@ -0,0 +1,35 @@ +// FIR_IDENTICAL +// JSR305_GLOBAL_REPORT: strict +// JSPECIFY_STATE: strict +// WITH_RUNTIME +// FULL_JDK + +// FILE: MyCollection.java +import java.util.AbstractCollection; +import javax.annotation.CheckForNull; +import org.jspecify.nullness.NullMarked; + +@NullMarked +public abstract class MyCollection extends AbstractCollection { + @Override + public boolean contains(@CheckForNull Object o) { + return false; + } +} + +// FILE: MyList.java +import java.util.AbstractCollection; +import java.util.List; +import javax.annotation.CheckForNull; +import org.jspecify.nullness.NullMarked; + +@NullMarked +public abstract class MyList extends MyCollection implements List { + @Override + public boolean contains(@CheckForNull Object o) { + return false; + } +} + +// FILE: main.kt +fun go(myList : MyList, string : String) = string in myList diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt48261.txt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt48261.txt new file mode 100644 index 00000000000..21d01549f39 --- /dev/null +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt48261.txt @@ -0,0 +1,75 @@ +package + +public fun go(/*0*/ myList: MyList, /*1*/ string: kotlin.String): kotlin.Boolean + +@org.jspecify.nullness.NullMarked public abstract class MyCollection : java.util.AbstractCollection { + public constructor MyCollection() + public abstract override /*1*/ /*fake_override*/ val size: kotlin.Int + public open override /*1*/ /*fake_override*/ fun add(/*0*/ element: E!): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit + @java.lang.Override public open override /*1*/ fun contains(/*0*/ @javax.annotation.CheckForNull element: E!): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator + public open override /*1*/ /*fake_override*/ fun parallelStream(): java.util.stream.Stream + public open override /*1*/ /*fake_override*/ fun remove(/*0*/ element: E!): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun removeIf(/*0*/ p0: java.util.function.Predicate): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun spliterator(): java.util.Spliterator + public open override /*1*/ /*fake_override*/ fun stream(): java.util.stream.Stream + public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>! + public open override /*1*/ /*fake_override*/ fun toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>! + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + invisible_fake const final override /*1*/ /*fake_override*/ val MAX_ARRAY_SIZE: kotlin.Int = 2147483639 + invisible_fake open override /*1*/ /*fake_override*/ fun finishToArray(/*0*/ p0: kotlin.Array<(out) T!>!, /*1*/ p1: kotlin.collections.(Mutable)Iterator<*>!): kotlin.Array<(out) T!>! + invisible_fake open override /*1*/ /*fake_override*/ fun hugeCapacity(/*0*/ p0: kotlin.Int): kotlin.Int +} + +@org.jspecify.nullness.NullMarked public abstract class MyList : MyCollection, kotlin.collections.MutableList { + public constructor MyList() + public abstract override /*2*/ /*fake_override*/ val size: kotlin.Int + public open override /*2*/ /*fake_override*/ fun add(/*0*/ element: E): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun add(/*0*/ index: kotlin.Int, /*1*/ element: E): kotlin.Unit + public abstract override /*1*/ /*fake_override*/ fun addAll(/*0*/ index: kotlin.Int, /*1*/ elements: kotlin.collections.Collection): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun clear(): kotlin.Unit + @java.lang.Override public open override /*2*/ fun contains(/*0*/ @javax.annotation.CheckForNull element: E!): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun forEach(/*0*/ p0: java.util.function.Consumer): kotlin.Unit + public abstract override /*1*/ /*fake_override*/ fun get(/*0*/ index: kotlin.Int): E + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public abstract override /*1*/ /*fake_override*/ fun indexOf(/*0*/ element: E): kotlin.Int + public open override /*2*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean + public abstract override /*2*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator + public abstract override /*1*/ /*fake_override*/ fun lastIndexOf(/*0*/ element: E): kotlin.Int + public abstract override /*1*/ /*fake_override*/ fun listIterator(): kotlin.collections.MutableListIterator + public abstract override /*1*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.collections.MutableListIterator + public open override /*2*/ /*fake_override*/ fun parallelStream(): java.util.stream.Stream + public open override /*2*/ /*fake_override*/ fun remove(/*0*/ element: E!): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun removeAt(/*0*/ index: kotlin.Int): E + public open override /*2*/ /*fake_override*/ fun removeIf(/*0*/ p0: java.util.function.Predicate): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun replaceAll(/*0*/ p0: java.util.function.UnaryOperator): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun set(/*0*/ index: kotlin.Int, /*1*/ element: E): E + public open override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun sort(/*0*/ p0: java.util.Comparator!): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun spliterator(): java.util.Spliterator + public open override /*2*/ /*fake_override*/ fun stream(): java.util.stream.Stream + public abstract override /*1*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.collections.MutableList + public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>! + public open override /*1*/ /*fake_override*/ fun toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>! + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + invisible_fake const final override /*1*/ /*fake_override*/ val MAX_ARRAY_SIZE: kotlin.Int = 2147483639 + invisible_fake open override /*1*/ /*fake_override*/ fun finishToArray(/*0*/ p0: kotlin.Array<(out) T!>!, /*1*/ p1: kotlin.collections.(Mutable)Iterator<*>!): kotlin.Array<(out) T!>! + invisible_fake open override /*1*/ /*fake_override*/ fun hugeCapacity(/*0*/ p0: kotlin.Int): kotlin.Int +} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/kt48261.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/kt48261.kt new file mode 100644 index 00000000000..c941dbd5076 --- /dev/null +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/kt48261.kt @@ -0,0 +1,31 @@ +// FIR_IDENTICAL +// JSR305_GLOBAL_REPORT: strict +// JSPECIFY_STATE: warn +// WITH_RUNTIME +// FULL_JDK +// !LANGUAGE: +IgnoreNullabilityForErasedValueParameters + +// FILE: MyList.java +import java.util.List; +import org.jetbrains.annotations.NotNull; + +public abstract class MyList extends MyCollection implements List<@NotNull E> { + @Override + public boolean contains(Object o) { + return false; + } +} + +// FILE: MyCollection.java +import java.util.AbstractCollection; +import javax.annotation.CheckForNull; + +public abstract class MyCollection extends AbstractCollection { + @Override + public boolean contains(@CheckForNull Object o) { + return false; + } +} + +// FILE: main.kt +fun go(myList : MyList) = myList.contains("") \ No newline at end of file diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/kt48261.txt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/kt48261.txt new file mode 100644 index 00000000000..c89fedfa57c --- /dev/null +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/kt48261.txt @@ -0,0 +1,75 @@ +package + +public fun go(/*0*/ myList: MyList): kotlin.Boolean + +public abstract class MyCollection : java.util.AbstractCollection { + public constructor MyCollection() + public abstract override /*1*/ /*fake_override*/ val size: kotlin.Int + public open override /*1*/ /*fake_override*/ fun add(/*0*/ element: E!): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit + @java.lang.Override public open override /*1*/ fun contains(/*0*/ @javax.annotation.CheckForNull element: E!): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator + public open override /*1*/ /*fake_override*/ fun parallelStream(): java.util.stream.Stream + public open override /*1*/ /*fake_override*/ fun remove(/*0*/ element: E!): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun removeIf(/*0*/ p0: java.util.function.Predicate): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun spliterator(): java.util.Spliterator + public open override /*1*/ /*fake_override*/ fun stream(): java.util.stream.Stream + public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>! + public open override /*1*/ /*fake_override*/ fun toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>! + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + invisible_fake const final override /*1*/ /*fake_override*/ val MAX_ARRAY_SIZE: kotlin.Int = 2147483639 + invisible_fake open override /*1*/ /*fake_override*/ fun finishToArray(/*0*/ p0: kotlin.Array<(out) T!>!, /*1*/ p1: kotlin.collections.(Mutable)Iterator<*>!): kotlin.Array<(out) T!>! + invisible_fake open override /*1*/ /*fake_override*/ fun hugeCapacity(/*0*/ p0: kotlin.Int): kotlin.Int +} + +public abstract class MyList : MyCollection, kotlin.collections.MutableList<@org.jetbrains.annotations.NotNull E> { + public constructor MyList() + public abstract override /*2*/ /*fake_override*/ val size: kotlin.Int + public open override /*2*/ /*fake_override*/ fun add(/*0*/ element: E): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun add(/*0*/ index: kotlin.Int, /*1*/ element: @org.jetbrains.annotations.NotNull E): kotlin.Unit + public abstract override /*1*/ /*fake_override*/ fun addAll(/*0*/ index: kotlin.Int, /*1*/ elements: kotlin.collections.Collection<@org.jetbrains.annotations.NotNull E>): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun clear(): kotlin.Unit + @java.lang.Override public open override /*2*/ fun contains(/*0*/ element: E!): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun forEach(/*0*/ p0: java.util.function.Consumer!): kotlin.Unit + public abstract override /*1*/ /*fake_override*/ fun get(/*0*/ index: kotlin.Int): @org.jetbrains.annotations.NotNull E + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public abstract override /*1*/ /*fake_override*/ fun indexOf(/*0*/ element: @org.jetbrains.annotations.NotNull E): kotlin.Int + public open override /*2*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean + public abstract override /*2*/ /*fake_override*/ fun iterator(): kotlin.collections.MutableIterator + public abstract override /*1*/ /*fake_override*/ fun lastIndexOf(/*0*/ element: @org.jetbrains.annotations.NotNull E): kotlin.Int + public abstract override /*1*/ /*fake_override*/ fun listIterator(): kotlin.collections.MutableListIterator<@org.jetbrains.annotations.NotNull E> + public abstract override /*1*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.collections.MutableListIterator<@org.jetbrains.annotations.NotNull E> + public open override /*2*/ /*fake_override*/ fun parallelStream(): java.util.stream.Stream + public open override /*2*/ /*fake_override*/ fun remove(/*0*/ element: E!): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun removeAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun removeAt(/*0*/ index: kotlin.Int): @org.jetbrains.annotations.NotNull E + public open override /*2*/ /*fake_override*/ fun removeIf(/*0*/ p0: java.util.function.Predicate): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun replaceAll(/*0*/ p0: java.util.function.UnaryOperator<@org.jetbrains.annotations.NotNull E>): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun set(/*0*/ index: kotlin.Int, /*1*/ element: @org.jetbrains.annotations.NotNull E): @org.jetbrains.annotations.NotNull E + public open override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun sort(/*0*/ p0: java.util.Comparator!): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun spliterator(): java.util.Spliterator + public open override /*2*/ /*fake_override*/ fun stream(): java.util.stream.Stream + public abstract override /*1*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.collections.MutableList<@org.jetbrains.annotations.NotNull E> + public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>! + public open override /*1*/ /*fake_override*/ fun toArray(/*0*/ p0: kotlin.Array<(out) T!>!): kotlin.Array<(out) T!>! + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + invisible_fake const final override /*1*/ /*fake_override*/ val MAX_ARRAY_SIZE: kotlin.Int = 2147483639 + invisible_fake open override /*1*/ /*fake_override*/ fun finishToArray(/*0*/ p0: kotlin.Array<(out) T!>!, /*1*/ p1: kotlin.collections.(Mutable)Iterator<*>!): kotlin.Array<(out) T!>! + invisible_fake open override /*1*/ /*fake_override*/ fun hugeCapacity(/*0*/ p0: kotlin.Int): kotlin.Int +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java index 685fa024920..d46e1232411 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java @@ -684,6 +684,12 @@ public class ForeignAnnotationsCompiledJavaTestGenerated extends AbstractForeign runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt47437.kt"); } + @Test + @TestMetadata("kt48261.kt") + public void testKt48261() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt48261.kt"); + } + @Test @TestMetadata("NonPlatformTypeParameter.kt") public void testNonPlatformTypeParameter() throws Exception { @@ -913,6 +919,12 @@ public class ForeignAnnotationsCompiledJavaTestGenerated extends AbstractForeign runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/enhancedRecursiveStarProjection.kt"); } + @Test + @TestMetadata("kt48261.kt") + public void testKt48261() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/kt48261.kt"); + } + @Test @TestMetadata("methodWithTypeParameter.kt") public void testMethodWithTypeParameter() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java index 232a42da463..0d8c86fb688 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java @@ -684,6 +684,12 @@ public class ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated exte runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt47437.kt"); } + @Test + @TestMetadata("kt48261.kt") + public void testKt48261() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt48261.kt"); + } + @Test @TestMetadata("NonPlatformTypeParameter.kt") public void testNonPlatformTypeParameter() throws Exception { @@ -913,6 +919,12 @@ public class ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated exte runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/enhancedRecursiveStarProjection.kt"); } + @Test + @TestMetadata("kt48261.kt") + public void testKt48261() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/kt48261.kt"); + } + @Test @TestMetadata("methodWithTypeParameter.kt") public void testMethodWithTypeParameter() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java index 8f007f7291a..ac848241006 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java @@ -684,6 +684,12 @@ public class ForeignAnnotationsSourceJavaTestGenerated extends AbstractForeignAn runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt47437.kt"); } + @Test + @TestMetadata("kt48261.kt") + public void testKt48261() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt48261.kt"); + } + @Test @TestMetadata("NonPlatformTypeParameter.kt") public void testNonPlatformTypeParameter() throws Exception { @@ -913,6 +919,12 @@ public class ForeignAnnotationsSourceJavaTestGenerated extends AbstractForeignAn runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/enhancedRecursiveStarProjection.kt"); } + @Test + @TestMetadata("kt48261.kt") + public void testKt48261() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/kt48261.kt"); + } + @Test @TestMetadata("methodWithTypeParameter.kt") public void testMethodWithTypeParameter() throws Exception { diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index d895e946f9a..6e7e139f712 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -234,6 +234,7 @@ enum class LanguageFeature( RefineTypeCheckingOnAssignmentsToJavaFields(KOTLIN_1_7), JvmPermittedSubclassesAttributeForSealed(KOTLIN_1_7), ForbidUsingExtensionPropertyTypeParameterInDelegate(KOTLIN_1_7, kind = BUG_FIX), + IgnoreNullabilityForErasedValueParameters(KOTLIN_1_7, kind = BUG_FIX), ProhibitNonExhaustiveIfInRhsOfElvis(KOTLIN_1_7, kind = BUG_FIX), // KT-44705 // 1.8 diff --git a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/AbstractSignatureParts.kt b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/AbstractSignatureParts.kt index 23ef2f7fa98..cad9223301f 100644 --- a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/AbstractSignatureParts.kt +++ b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/AbstractSignatureParts.kt @@ -161,7 +161,9 @@ abstract class AbstractSignatureParts { } fun KotlinTypeMarker.computeIndexedQualifiers( - overrides: Iterable, predefined: TypeEnhancementInfo? + overrides: Iterable, + predefined: TypeEnhancementInfo?, + ignoreDeclarationNullabilityAnnotations: Boolean = false ): IndexedJavaTypeQualifiers { val indexedThisType = toIndexed() val indexedFromSupertypes = overrides.map { it.toIndexed() } @@ -178,7 +180,12 @@ abstract class AbstractSignatureParts { val computedResult = Array(treeSize) { index -> val qualifiers = indexedThisType[index].extractQualifiersFromAnnotations() val superQualifiers = indexedFromSupertypes.mapNotNull { it.getOrNull(index)?.type?.extractQualifiers() } - qualifiers.computeQualifiersForOverride(superQualifiers, index == 0 && isCovariant, index == 0 && containerIsVarargParameter) + qualifiers.computeQualifiersForOverride( + superQualifiers, + index == 0 && isCovariant, + index == 0 && containerIsVarargParameter, + ignoreDeclarationNullabilityAnnotations + ) } return { index -> predefined?.map?.get(index) ?: computedResult.getOrElse(index) { JavaTypeQualifiers.NONE } } } diff --git a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/typeEnhancementUtils.kt b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/typeEnhancementUtils.kt index ed192ab9c6c..8235907fe6f 100644 --- a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/typeEnhancementUtils.kt +++ b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/typeEnhancementUtils.kt @@ -35,7 +35,8 @@ private val JavaTypeQualifiers.nullabilityForErrors: NullabilityQualifier? fun JavaTypeQualifiers.computeQualifiersForOverride( superQualifiers: Collection, isCovariant: Boolean, - isForVarargParameter: Boolean + isForVarargParameter: Boolean, + ignoreDeclarationNullabilityAnnotations: Boolean ): JavaTypeQualifiers { val newNullabilityForErrors = superQualifiers.mapNotNull { it.nullabilityForErrors }.toSet() .select(nullabilityForErrors, isCovariant) @@ -45,7 +46,9 @@ fun JavaTypeQualifiers.computeQualifiersForOverride( .select(MutabilityQualifier.MUTABLE, MutabilityQualifier.READ_ONLY, mutability, isCovariant) // Vararg value parameters effectively have non-nullable type in Kotlin // and having nullable types in Java may lead to impossibility of overriding them in Kotlin - val realNullability = newNullability?.takeUnless { isForVarargParameter && it == NullabilityQualifier.NULLABLE } + val realNullability = newNullability?.takeUnless { + ignoreDeclarationNullabilityAnnotations || (isForVarargParameter && it == NullabilityQualifier.NULLABLE) + } return JavaTypeQualifiers( realNullability, newMutability, realNullability == NullabilityQualifier.NOT_NULL && (definitelyNotNull || superQualifiers.any { it.definitelyNotNull }), diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java index b64547ec933..9b7a994a7bd 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java @@ -37,6 +37,8 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement public static final UserDataKey ORIGINAL_VALUE_PARAMETER_FOR_EXTENSION_RECEIVER = new UserDataKey() {}; + public static final UserDataKey HAS_ERASED_VALUE_PARAMETERS = new UserDataKey() {}; + private enum ParameterNamesStatus { NON_STABLE_DECLARED(false, false), STABLE_DECLARED(true, false), diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/context.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/context.kt index 0c17d69ac2d..dcae80a367e 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/context.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/context.kt @@ -82,6 +82,7 @@ class JavaResolverComponents( interface JavaResolverSettings { val correctNullabilityForNotNullTypeParameter: Boolean val typeEnhancementImprovementsInStrictMode: Boolean + val ignoreNullabilityForErasedValueParameters: Boolean object Default : JavaResolverSettings { override val correctNullabilityForNotNullTypeParameter: Boolean @@ -89,16 +90,21 @@ interface JavaResolverSettings { override val typeEnhancementImprovementsInStrictMode: Boolean get() = false + + override val ignoreNullabilityForErasedValueParameters: Boolean + get() = false } companion object { fun create( correctNullabilityForNotNullTypeParameter: Boolean, - typeEnhancementImprovementsInStrictMode: Boolean + typeEnhancementImprovementsInStrictMode: Boolean, + ignoreNullabilityForErasedValueParameters: Boolean ): JavaResolverSettings = object : JavaResolverSettings { override val correctNullabilityForNotNullTypeParameter get() = correctNullabilityForNotNullTypeParameter override val typeEnhancementImprovementsInStrictMode get() = typeEnhancementImprovementsInStrictMode + override val ignoreNullabilityForErasedValueParameters get() = ignoreNullabilityForErasedValueParameters } } } diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt index 5e4f6a9c162..2c9b005a893 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt @@ -481,6 +481,7 @@ class LazyJavaClassMemberScope( ) setSignatureChange() setPreserveSourceElement() + putUserData(JavaMethodDescriptor.HAS_ERASED_VALUE_PARAMETERS, true) }.build() } } diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt index 783ae48d6ea..4ede5ceef6c 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt @@ -22,14 +22,12 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotated import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.load.java.AnnotationQualifierApplicabilityType -import org.jetbrains.kotlin.load.java.AnnotationTypeQualifierResolver -import org.jetbrains.kotlin.load.java.DeprecationCausedByFunctionNInfo -import org.jetbrains.kotlin.load.java.JavaTypeQualifiersByElementType +import org.jetbrains.kotlin.load.java.* import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor import org.jetbrains.kotlin.load.java.descriptors.PossiblyExternalAnnotationDescriptor +import org.jetbrains.kotlin.load.java.lazy.JavaResolverComponents import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext import org.jetbrains.kotlin.load.java.lazy.copyWithNewDefaultTypeQualifiers import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaAnnotationDescriptor @@ -94,10 +92,11 @@ class SignatureEnhancement(private val typeEnhancement: JavaTypeEnhancement) { val receiverTypeEnhancement = if (extensionReceiverParameter != null) enhanceValueParameter( - parameterDescriptor = - annotationOwnerForMember.safeAs() + parameterDescriptor = annotationOwnerForMember.safeAs() ?.getUserData(JavaMethodDescriptor.ORIGINAL_VALUE_PARAMETER_FOR_EXTENSION_RECEIVER), - methodContext = memberContext, predefined = null + methodContext = memberContext, + predefined = null, + ignoreDeclarationNullabilityAnnotations = false ) { it.extensionReceiverParameter!!.type } else null @@ -113,9 +112,15 @@ class SignatureEnhancement(private val typeEnhancement: JavaTypeEnhancement) { } } + val ignoreDeclarationNullabilityAnnotations = + (isJspecifyEnabledInStrictMode(c.components.javaTypeEnhancementState) + || memberContext.components.settings.ignoreNullabilityForErasedValueParameters) + && hasErasedValueParameters(this) val valueParameterEnhancements = annotationOwnerForMember.valueParameters.map { p -> val predefined = predefinedEnhancementInfo?.parametersInfo?.getOrNull(p.index) - enhanceValueParameter(p, memberContext, predefined) { it.valueParameters[p.index].type } + enhanceValueParameter(p, memberContext, predefined, ignoreDeclarationNullabilityAnnotations) { + it.valueParameters[p.index].type + } } val returnTypeEnhancement = @@ -189,12 +194,13 @@ class SignatureEnhancement(private val typeEnhancement: JavaTypeEnhancement) { parameterDescriptor: ValueParameterDescriptor?, methodContext: LazyJavaResolverContext, predefined: TypeEnhancementInfo?, + ignoreDeclarationNullabilityAnnotations: Boolean, collector: (CallableMemberDescriptor) -> KotlinType ) = enhance( parameterDescriptor, false, parameterDescriptor?.let { methodContext.copyWithNewDefaultTypeQualifiers(it.annotations) } ?: methodContext, AnnotationQualifierApplicabilityType.VALUE_PARAMETER, - predefined, collector + predefined, ignoreDeclarationNullabilityAnnotations, collector ) private fun CallableMemberDescriptor.enhance( @@ -203,14 +209,21 @@ class SignatureEnhancement(private val typeEnhancement: JavaTypeEnhancement) { containerContext: LazyJavaResolverContext, containerApplicabilityType: AnnotationQualifierApplicabilityType, predefined: TypeEnhancementInfo?, + ignoreDeclarationNullabilityAnnotations: Boolean = false, collector: (CallableMemberDescriptor) -> KotlinType ): KotlinType? { return SignatureParts(typeContainer, isCovariant, containerContext, containerApplicabilityType) - .enhance(collector(this), overriddenDescriptors.map { collector(it) }, predefined) + .enhance(collector(this), overriddenDescriptors.map { collector(it) }, predefined, ignoreDeclarationNullabilityAnnotations) } - private fun SignatureParts.enhance(type: KotlinType, overrides: List, predefined: TypeEnhancementInfo? = null) = - with(typeEnhancement) { type.enhance(type.computeIndexedQualifiers(overrides, predefined), skipRawTypeArguments) } + private fun SignatureParts.enhance( + type: KotlinType, + overrides: List, + predefined: TypeEnhancementInfo? = null, + ignoreDeclarationNullabilityAnnotations: Boolean = false + ) = with(typeEnhancement) { + type.enhance(type.computeIndexedQualifiers(overrides, predefined, ignoreDeclarationNullabilityAnnotations), skipRawTypeArguments) + } } private class SignatureParts( diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/utils.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/utils.kt index c24e78c7219..ff4bdb3d94b 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/utils.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/utils.kt @@ -17,9 +17,8 @@ package org.jetbrains.kotlin.load.java import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.DescriptorVisibility -import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor import org.jetbrains.kotlin.resolve.deprecation.DescriptorBasedDeprecationInfo import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue @@ -31,3 +30,9 @@ class DeprecationCausedByFunctionNInfo(override val target: DeclarationDescripto } internal fun Visibility.toDescriptorVisibility(): DescriptorVisibility = JavaDescriptorVisibilities.toDescriptorVisibility(this) + +fun isJspecifyEnabledInStrictMode(javaTypeEnhancementState: JavaTypeEnhancementState) = + javaTypeEnhancementState.getReportLevelForAnnotation(JSPECIFY_ANNOTATIONS_PACKAGE) == ReportLevel.STRICT + +fun hasErasedValueParameters(memberDescriptor: CallableMemberDescriptor) = + memberDescriptor is FunctionDescriptor && memberDescriptor.getUserData(JavaMethodDescriptor.HAS_ERASED_VALUE_PARAMETERS) == true