Don't enhance previously erased value parameters for jspecify strict mode
^KT-48261 Fixed
This commit is contained in:
+12
@@ -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 {
|
||||
|
||||
+12
@@ -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 {
|
||||
|
||||
+12
@@ -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 {
|
||||
|
||||
@@ -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))
|
||||
|
||||
Vendored
+35
@@ -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<E> extends AbstractCollection<E> {
|
||||
@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<E> extends MyCollection<E> implements List<E> {
|
||||
@Override
|
||||
public boolean contains(@CheckForNull Object o) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun go(myList : MyList<String>, string : String) = string in myList
|
||||
Vendored
+75
@@ -0,0 +1,75 @@
|
||||
package
|
||||
|
||||
public fun go(/*0*/ myList: MyList<kotlin.String>, /*1*/ string: kotlin.String): kotlin.Boolean
|
||||
|
||||
@org.jspecify.nullness.NullMarked public abstract class MyCollection</*0*/ E : kotlin.Any> : java.util.AbstractCollection<E> {
|
||||
public constructor MyCollection</*0*/ E : kotlin.Any>()
|
||||
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<E!>): 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<E!>): 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<in E!>!): 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<E!>
|
||||
public open override /*1*/ /*fake_override*/ fun parallelStream(): java.util.stream.Stream<E!>
|
||||
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<E!>): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun removeIf(/*0*/ p0: java.util.function.Predicate<in E!>): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<E!>): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun spliterator(): java.util.Spliterator<E!>
|
||||
public open override /*1*/ /*fake_override*/ fun stream(): java.util.stream.Stream<E!>
|
||||
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
|
||||
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> 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 </*0*/ T : kotlin.Any!> 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</*0*/ E : kotlin.Any> : MyCollection<E>, kotlin.collections.MutableList<E> {
|
||||
public constructor MyList</*0*/ E : kotlin.Any>()
|
||||
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<E>): kotlin.Boolean
|
||||
public open override /*2*/ /*fake_override*/ fun addAll(/*0*/ elements: kotlin.collections.Collection<E>): 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<E!>): 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<in E>): 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<E>
|
||||
public abstract override /*1*/ /*fake_override*/ fun lastIndexOf(/*0*/ element: E): kotlin.Int
|
||||
public abstract override /*1*/ /*fake_override*/ fun listIterator(): kotlin.collections.MutableListIterator<E>
|
||||
public abstract override /*1*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.collections.MutableListIterator<E>
|
||||
public open override /*2*/ /*fake_override*/ fun parallelStream(): java.util.stream.Stream<E>
|
||||
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<E!>): 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<in E>): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun replaceAll(/*0*/ p0: java.util.function.UnaryOperator<E>): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<E!>): 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<in E!>!): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun spliterator(): java.util.Spliterator<E>
|
||||
public open override /*2*/ /*fake_override*/ fun stream(): java.util.stream.Stream<E>
|
||||
public abstract override /*1*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.collections.MutableList<E>
|
||||
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
|
||||
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> 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 </*0*/ T : kotlin.Any!> 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
|
||||
}
|
||||
+31
@@ -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<E> extends MyCollection<E> 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<E> extends AbstractCollection<E> {
|
||||
@Override
|
||||
public boolean contains(@CheckForNull Object o) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun go(myList : MyList<String>) = myList.contains("")
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
package
|
||||
|
||||
public fun go(/*0*/ myList: MyList<kotlin.String>): kotlin.Boolean
|
||||
|
||||
public abstract class MyCollection</*0*/ E : kotlin.Any!> : java.util.AbstractCollection<E!> {
|
||||
public constructor MyCollection</*0*/ E : kotlin.Any!>()
|
||||
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<E!>): 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<E!>): 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<in E!>!): 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<E!>
|
||||
public open override /*1*/ /*fake_override*/ fun parallelStream(): java.util.stream.Stream<E!>
|
||||
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<E!>): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun removeIf(/*0*/ p0: java.util.function.Predicate<in E!>): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun retainAll(/*0*/ elements: kotlin.collections.Collection<E!>): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun spliterator(): java.util.Spliterator<E!>
|
||||
public open override /*1*/ /*fake_override*/ fun stream(): java.util.stream.Stream<E!>
|
||||
public open override /*1*/ /*fake_override*/ fun toArray(): kotlin.Array<(out) kotlin.Any!>!
|
||||
public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> 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 </*0*/ T : kotlin.Any!> 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</*0*/ E : kotlin.Any!> : MyCollection<E!>, kotlin.collections.MutableList<@org.jetbrains.annotations.NotNull E> {
|
||||
public constructor MyList</*0*/ E : kotlin.Any!>()
|
||||
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<E>): 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<E!>): 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<in E!>!): 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<E>
|
||||
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<E>
|
||||
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<E!>): 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<in E>): 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<E!>): 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<in @org.jetbrains.annotations.NotNull E!>!): kotlin.Unit
|
||||
public open override /*2*/ /*fake_override*/ fun spliterator(): java.util.Spliterator<E!>
|
||||
public open override /*2*/ /*fake_override*/ fun stream(): java.util.stream.Stream<E>
|
||||
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 </*0*/ T : kotlin.Any!> 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 </*0*/ T : kotlin.Any!> 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
|
||||
}
|
||||
+12
@@ -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 {
|
||||
|
||||
+12
@@ -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 {
|
||||
|
||||
+12
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
+9
-2
@@ -161,7 +161,9 @@ abstract class AbstractSignatureParts<TAnnotation : Any> {
|
||||
}
|
||||
|
||||
fun KotlinTypeMarker.computeIndexedQualifiers(
|
||||
overrides: Iterable<KotlinTypeMarker>, predefined: TypeEnhancementInfo?
|
||||
overrides: Iterable<KotlinTypeMarker>,
|
||||
predefined: TypeEnhancementInfo?,
|
||||
ignoreDeclarationNullabilityAnnotations: Boolean = false
|
||||
): IndexedJavaTypeQualifiers {
|
||||
val indexedThisType = toIndexed()
|
||||
val indexedFromSupertypes = overrides.map { it.toIndexed() }
|
||||
@@ -178,7 +180,12 @@ abstract class AbstractSignatureParts<TAnnotation : Any> {
|
||||
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 } }
|
||||
}
|
||||
|
||||
+5
-2
@@ -35,7 +35,8 @@ private val JavaTypeQualifiers.nullabilityForErrors: NullabilityQualifier?
|
||||
fun JavaTypeQualifiers.computeQualifiersForOverride(
|
||||
superQualifiers: Collection<JavaTypeQualifiers>,
|
||||
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 }),
|
||||
|
||||
+2
@@ -37,6 +37,8 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement
|
||||
public static final UserDataKey<ValueParameterDescriptor> ORIGINAL_VALUE_PARAMETER_FOR_EXTENSION_RECEIVER =
|
||||
new UserDataKey<ValueParameterDescriptor>() {};
|
||||
|
||||
public static final UserDataKey<Boolean> HAS_ERASED_VALUE_PARAMETERS = new UserDataKey<Boolean>() {};
|
||||
|
||||
private enum ParameterNamesStatus {
|
||||
NON_STABLE_DECLARED(false, false),
|
||||
STABLE_DECLARED(true, false),
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
@@ -481,6 +481,7 @@ class LazyJavaClassMemberScope(
|
||||
)
|
||||
setSignatureChange()
|
||||
setPreserveSourceElement()
|
||||
putUserData(JavaMethodDescriptor.HAS_ERASED_VALUE_PARAMETERS, true)
|
||||
}.build()
|
||||
}
|
||||
}
|
||||
|
||||
+25
-12
@@ -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<FunctionDescriptor>()
|
||||
parameterDescriptor = annotationOwnerForMember.safeAs<FunctionDescriptor>()
|
||||
?.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<KotlinType>, predefined: TypeEnhancementInfo? = null) =
|
||||
with(typeEnhancement) { type.enhance(type.computeIndexedQualifiers(overrides, predefined), skipRawTypeArguments) }
|
||||
private fun SignatureParts.enhance(
|
||||
type: KotlinType,
|
||||
overrides: List<KotlinType>,
|
||||
predefined: TypeEnhancementInfo? = null,
|
||||
ignoreDeclarationNullabilityAnnotations: Boolean = false
|
||||
) = with(typeEnhancement) {
|
||||
type.enhance(type.computeIndexedQualifiers(overrides, predefined, ignoreDeclarationNullabilityAnnotations), skipRawTypeArguments)
|
||||
}
|
||||
}
|
||||
|
||||
private class SignatureParts(
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user