Don't enhance previously erased value parameters for jspecify strict mode

^KT-48261 Fixed
This commit is contained in:
Victor Petukhov
2021-10-06 14:15:25 +03:00
parent e77f72071d
commit d015d3bc0e
19 changed files with 348 additions and 21 deletions
@@ -684,6 +684,12 @@ public class FirOldFrontendForeignAnnotationsCompiledJavaTestGenerated extends A
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt47437.kt"); 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 @Test
@TestMetadata("NonPlatformTypeParameter.kt") @TestMetadata("NonPlatformTypeParameter.kt")
public void testNonPlatformTypeParameter() throws Exception { public void testNonPlatformTypeParameter() throws Exception {
@@ -913,6 +919,12 @@ public class FirOldFrontendForeignAnnotationsCompiledJavaTestGenerated extends A
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/enhancedRecursiveStarProjection.kt"); 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 @Test
@TestMetadata("methodWithTypeParameter.kt") @TestMetadata("methodWithTypeParameter.kt")
public void testMethodWithTypeParameter() throws Exception { public void testMethodWithTypeParameter() throws Exception {
@@ -684,6 +684,12 @@ public class FirOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTest
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt47437.kt"); 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 @Test
@TestMetadata("NonPlatformTypeParameter.kt") @TestMetadata("NonPlatformTypeParameter.kt")
public void testNonPlatformTypeParameter() throws Exception { public void testNonPlatformTypeParameter() throws Exception {
@@ -913,6 +919,12 @@ public class FirOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTest
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/enhancedRecursiveStarProjection.kt"); 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 @Test
@TestMetadata("methodWithTypeParameter.kt") @TestMetadata("methodWithTypeParameter.kt")
public void testMethodWithTypeParameter() throws Exception { public void testMethodWithTypeParameter() throws Exception {
@@ -684,6 +684,12 @@ public class FirOldFrontendForeignAnnotationsSourceJavaTestGenerated extends Abs
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt47437.kt"); 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 @Test
@TestMetadata("NonPlatformTypeParameter.kt") @TestMetadata("NonPlatformTypeParameter.kt")
public void testNonPlatformTypeParameter() throws Exception { public void testNonPlatformTypeParameter() throws Exception {
@@ -913,6 +919,12 @@ public class FirOldFrontendForeignAnnotationsSourceJavaTestGenerated extends Abs
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/enhancedRecursiveStarProjection.kt"); 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 @Test
@TestMetadata("methodWithTypeParameter.kt") @TestMetadata("methodWithTypeParameter.kt")
public void testMethodWithTypeParameter() throws Exception { public void testMethodWithTypeParameter() throws Exception {
@@ -146,7 +146,8 @@ fun StorageComponentContainer.configureJavaSpecificComponents(
useInstance( useInstance(
JavaResolverSettings.create( JavaResolverSettings.create(
correctNullabilityForNotNullTypeParameter = languageVersionSettings.supportsFeature(LanguageFeature.ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated), 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)) useInstance(JavaModuleResolver.getInstance(moduleContext.project))
@@ -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
@@ -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
}
@@ -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("")
@@ -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
}
@@ -684,6 +684,12 @@ public class ForeignAnnotationsCompiledJavaTestGenerated extends AbstractForeign
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt47437.kt"); 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 @Test
@TestMetadata("NonPlatformTypeParameter.kt") @TestMetadata("NonPlatformTypeParameter.kt")
public void testNonPlatformTypeParameter() throws Exception { public void testNonPlatformTypeParameter() throws Exception {
@@ -913,6 +919,12 @@ public class ForeignAnnotationsCompiledJavaTestGenerated extends AbstractForeign
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/enhancedRecursiveStarProjection.kt"); 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 @Test
@TestMetadata("methodWithTypeParameter.kt") @TestMetadata("methodWithTypeParameter.kt")
public void testMethodWithTypeParameter() throws Exception { public void testMethodWithTypeParameter() throws Exception {
@@ -684,6 +684,12 @@ public class ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated exte
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt47437.kt"); 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 @Test
@TestMetadata("NonPlatformTypeParameter.kt") @TestMetadata("NonPlatformTypeParameter.kt")
public void testNonPlatformTypeParameter() throws Exception { public void testNonPlatformTypeParameter() throws Exception {
@@ -913,6 +919,12 @@ public class ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated exte
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/enhancedRecursiveStarProjection.kt"); 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 @Test
@TestMetadata("methodWithTypeParameter.kt") @TestMetadata("methodWithTypeParameter.kt")
public void testMethodWithTypeParameter() throws Exception { public void testMethodWithTypeParameter() throws Exception {
@@ -684,6 +684,12 @@ public class ForeignAnnotationsSourceJavaTestGenerated extends AbstractForeignAn
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/kt47437.kt"); 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 @Test
@TestMetadata("NonPlatformTypeParameter.kt") @TestMetadata("NonPlatformTypeParameter.kt")
public void testNonPlatformTypeParameter() throws Exception { public void testNonPlatformTypeParameter() throws Exception {
@@ -913,6 +919,12 @@ public class ForeignAnnotationsSourceJavaTestGenerated extends AbstractForeignAn
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/enhancedRecursiveStarProjection.kt"); 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 @Test
@TestMetadata("methodWithTypeParameter.kt") @TestMetadata("methodWithTypeParameter.kt")
public void testMethodWithTypeParameter() throws Exception { public void testMethodWithTypeParameter() throws Exception {
@@ -234,6 +234,7 @@ enum class LanguageFeature(
RefineTypeCheckingOnAssignmentsToJavaFields(KOTLIN_1_7), RefineTypeCheckingOnAssignmentsToJavaFields(KOTLIN_1_7),
JvmPermittedSubclassesAttributeForSealed(KOTLIN_1_7), JvmPermittedSubclassesAttributeForSealed(KOTLIN_1_7),
ForbidUsingExtensionPropertyTypeParameterInDelegate(KOTLIN_1_7, kind = BUG_FIX), ForbidUsingExtensionPropertyTypeParameterInDelegate(KOTLIN_1_7, kind = BUG_FIX),
IgnoreNullabilityForErasedValueParameters(KOTLIN_1_7, kind = BUG_FIX),
ProhibitNonExhaustiveIfInRhsOfElvis(KOTLIN_1_7, kind = BUG_FIX), // KT-44705 ProhibitNonExhaustiveIfInRhsOfElvis(KOTLIN_1_7, kind = BUG_FIX), // KT-44705
// 1.8 // 1.8
@@ -161,7 +161,9 @@ abstract class AbstractSignatureParts<TAnnotation : Any> {
} }
fun KotlinTypeMarker.computeIndexedQualifiers( fun KotlinTypeMarker.computeIndexedQualifiers(
overrides: Iterable<KotlinTypeMarker>, predefined: TypeEnhancementInfo? overrides: Iterable<KotlinTypeMarker>,
predefined: TypeEnhancementInfo?,
ignoreDeclarationNullabilityAnnotations: Boolean = false
): IndexedJavaTypeQualifiers { ): IndexedJavaTypeQualifiers {
val indexedThisType = toIndexed() val indexedThisType = toIndexed()
val indexedFromSupertypes = overrides.map { it.toIndexed() } val indexedFromSupertypes = overrides.map { it.toIndexed() }
@@ -178,7 +180,12 @@ abstract class AbstractSignatureParts<TAnnotation : Any> {
val computedResult = Array(treeSize) { index -> val computedResult = Array(treeSize) { index ->
val qualifiers = indexedThisType[index].extractQualifiersFromAnnotations() val qualifiers = indexedThisType[index].extractQualifiersFromAnnotations()
val superQualifiers = indexedFromSupertypes.mapNotNull { it.getOrNull(index)?.type?.extractQualifiers() } 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 } } return { index -> predefined?.map?.get(index) ?: computedResult.getOrElse(index) { JavaTypeQualifiers.NONE } }
} }
@@ -35,7 +35,8 @@ private val JavaTypeQualifiers.nullabilityForErrors: NullabilityQualifier?
fun JavaTypeQualifiers.computeQualifiersForOverride( fun JavaTypeQualifiers.computeQualifiersForOverride(
superQualifiers: Collection<JavaTypeQualifiers>, superQualifiers: Collection<JavaTypeQualifiers>,
isCovariant: Boolean, isCovariant: Boolean,
isForVarargParameter: Boolean isForVarargParameter: Boolean,
ignoreDeclarationNullabilityAnnotations: Boolean
): JavaTypeQualifiers { ): JavaTypeQualifiers {
val newNullabilityForErrors = superQualifiers.mapNotNull { it.nullabilityForErrors }.toSet() val newNullabilityForErrors = superQualifiers.mapNotNull { it.nullabilityForErrors }.toSet()
.select(nullabilityForErrors, isCovariant) .select(nullabilityForErrors, isCovariant)
@@ -45,7 +46,9 @@ fun JavaTypeQualifiers.computeQualifiersForOverride(
.select(MutabilityQualifier.MUTABLE, MutabilityQualifier.READ_ONLY, mutability, isCovariant) .select(MutabilityQualifier.MUTABLE, MutabilityQualifier.READ_ONLY, mutability, isCovariant)
// Vararg value parameters effectively have non-nullable type in Kotlin // 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 // 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( return JavaTypeQualifiers(
realNullability, newMutability, realNullability, newMutability,
realNullability == NullabilityQualifier.NOT_NULL && (definitelyNotNull || superQualifiers.any { it.definitelyNotNull }), realNullability == NullabilityQualifier.NOT_NULL && (definitelyNotNull || superQualifiers.any { it.definitelyNotNull }),
@@ -37,6 +37,8 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement
public static final UserDataKey<ValueParameterDescriptor> ORIGINAL_VALUE_PARAMETER_FOR_EXTENSION_RECEIVER = public static final UserDataKey<ValueParameterDescriptor> ORIGINAL_VALUE_PARAMETER_FOR_EXTENSION_RECEIVER =
new UserDataKey<ValueParameterDescriptor>() {}; new UserDataKey<ValueParameterDescriptor>() {};
public static final UserDataKey<Boolean> HAS_ERASED_VALUE_PARAMETERS = new UserDataKey<Boolean>() {};
private enum ParameterNamesStatus { private enum ParameterNamesStatus {
NON_STABLE_DECLARED(false, false), NON_STABLE_DECLARED(false, false),
STABLE_DECLARED(true, false), STABLE_DECLARED(true, false),
@@ -82,6 +82,7 @@ class JavaResolverComponents(
interface JavaResolverSettings { interface JavaResolverSettings {
val correctNullabilityForNotNullTypeParameter: Boolean val correctNullabilityForNotNullTypeParameter: Boolean
val typeEnhancementImprovementsInStrictMode: Boolean val typeEnhancementImprovementsInStrictMode: Boolean
val ignoreNullabilityForErasedValueParameters: Boolean
object Default : JavaResolverSettings { object Default : JavaResolverSettings {
override val correctNullabilityForNotNullTypeParameter: Boolean override val correctNullabilityForNotNullTypeParameter: Boolean
@@ -89,16 +90,21 @@ interface JavaResolverSettings {
override val typeEnhancementImprovementsInStrictMode: Boolean override val typeEnhancementImprovementsInStrictMode: Boolean
get() = false get() = false
override val ignoreNullabilityForErasedValueParameters: Boolean
get() = false
} }
companion object { companion object {
fun create( fun create(
correctNullabilityForNotNullTypeParameter: Boolean, correctNullabilityForNotNullTypeParameter: Boolean,
typeEnhancementImprovementsInStrictMode: Boolean typeEnhancementImprovementsInStrictMode: Boolean,
ignoreNullabilityForErasedValueParameters: Boolean
): JavaResolverSettings = ): JavaResolverSettings =
object : JavaResolverSettings { object : JavaResolverSettings {
override val correctNullabilityForNotNullTypeParameter get() = correctNullabilityForNotNullTypeParameter override val correctNullabilityForNotNullTypeParameter get() = correctNullabilityForNotNullTypeParameter
override val typeEnhancementImprovementsInStrictMode get() = typeEnhancementImprovementsInStrictMode override val typeEnhancementImprovementsInStrictMode get() = typeEnhancementImprovementsInStrictMode
override val ignoreNullabilityForErasedValueParameters get() = ignoreNullabilityForErasedValueParameters
} }
} }
} }
@@ -481,6 +481,7 @@ class LazyJavaClassMemberScope(
) )
setSignatureChange() setSignatureChange()
setPreserveSourceElement() setPreserveSourceElement()
putUserData(JavaMethodDescriptor.HAS_ERASED_VALUE_PARAMETERS, true)
}.build() }.build()
} }
} }
@@ -22,14 +22,12 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotated import org.jetbrains.kotlin.descriptors.annotations.Annotated
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.load.java.AnnotationQualifierApplicabilityType import org.jetbrains.kotlin.load.java.*
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.descriptors.JavaCallableMemberDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor
import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor
import org.jetbrains.kotlin.load.java.descriptors.PossiblyExternalAnnotationDescriptor 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.LazyJavaResolverContext
import org.jetbrains.kotlin.load.java.lazy.copyWithNewDefaultTypeQualifiers import org.jetbrains.kotlin.load.java.lazy.copyWithNewDefaultTypeQualifiers
import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaAnnotationDescriptor import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaAnnotationDescriptor
@@ -94,10 +92,11 @@ class SignatureEnhancement(private val typeEnhancement: JavaTypeEnhancement) {
val receiverTypeEnhancement = val receiverTypeEnhancement =
if (extensionReceiverParameter != null) if (extensionReceiverParameter != null)
enhanceValueParameter( enhanceValueParameter(
parameterDescriptor = parameterDescriptor = annotationOwnerForMember.safeAs<FunctionDescriptor>()
annotationOwnerForMember.safeAs<FunctionDescriptor>()
?.getUserData(JavaMethodDescriptor.ORIGINAL_VALUE_PARAMETER_FOR_EXTENSION_RECEIVER), ?.getUserData(JavaMethodDescriptor.ORIGINAL_VALUE_PARAMETER_FOR_EXTENSION_RECEIVER),
methodContext = memberContext, predefined = null methodContext = memberContext,
predefined = null,
ignoreDeclarationNullabilityAnnotations = false
) { it.extensionReceiverParameter!!.type } ) { it.extensionReceiverParameter!!.type }
else null 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 valueParameterEnhancements = annotationOwnerForMember.valueParameters.map { p ->
val predefined = predefinedEnhancementInfo?.parametersInfo?.getOrNull(p.index) 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 = val returnTypeEnhancement =
@@ -189,12 +194,13 @@ class SignatureEnhancement(private val typeEnhancement: JavaTypeEnhancement) {
parameterDescriptor: ValueParameterDescriptor?, parameterDescriptor: ValueParameterDescriptor?,
methodContext: LazyJavaResolverContext, methodContext: LazyJavaResolverContext,
predefined: TypeEnhancementInfo?, predefined: TypeEnhancementInfo?,
ignoreDeclarationNullabilityAnnotations: Boolean,
collector: (CallableMemberDescriptor) -> KotlinType collector: (CallableMemberDescriptor) -> KotlinType
) = enhance( ) = enhance(
parameterDescriptor, false, parameterDescriptor, false,
parameterDescriptor?.let { methodContext.copyWithNewDefaultTypeQualifiers(it.annotations) } ?: methodContext, parameterDescriptor?.let { methodContext.copyWithNewDefaultTypeQualifiers(it.annotations) } ?: methodContext,
AnnotationQualifierApplicabilityType.VALUE_PARAMETER, AnnotationQualifierApplicabilityType.VALUE_PARAMETER,
predefined, collector predefined, ignoreDeclarationNullabilityAnnotations, collector
) )
private fun CallableMemberDescriptor.enhance( private fun CallableMemberDescriptor.enhance(
@@ -203,14 +209,21 @@ class SignatureEnhancement(private val typeEnhancement: JavaTypeEnhancement) {
containerContext: LazyJavaResolverContext, containerContext: LazyJavaResolverContext,
containerApplicabilityType: AnnotationQualifierApplicabilityType, containerApplicabilityType: AnnotationQualifierApplicabilityType,
predefined: TypeEnhancementInfo?, predefined: TypeEnhancementInfo?,
ignoreDeclarationNullabilityAnnotations: Boolean = false,
collector: (CallableMemberDescriptor) -> KotlinType collector: (CallableMemberDescriptor) -> KotlinType
): KotlinType? { ): KotlinType? {
return SignatureParts(typeContainer, isCovariant, containerContext, containerApplicabilityType) 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) = private fun SignatureParts.enhance(
with(typeEnhancement) { type.enhance(type.computeIndexedQualifiers(overrides, predefined), skipRawTypeArguments) } type: KotlinType,
overrides: List<KotlinType>,
predefined: TypeEnhancementInfo? = null,
ignoreDeclarationNullabilityAnnotations: Boolean = false
) = with(typeEnhancement) {
type.enhance(type.computeIndexedQualifiers(overrides, predefined, ignoreDeclarationNullabilityAnnotations), skipRawTypeArguments)
}
} }
private class SignatureParts( private class SignatureParts(
@@ -17,9 +17,8 @@
package org.jetbrains.kotlin.load.java package org.jetbrains.kotlin.load.java
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.DescriptorVisibility import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.resolve.deprecation.DescriptorBasedDeprecationInfo import org.jetbrains.kotlin.resolve.deprecation.DescriptorBasedDeprecationInfo
import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue 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) 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