FIR: enhance in/out-variant type arguments

This commit is contained in:
pyos
2021-08-02 13:53:13 +02:00
committed by teamcityserver
parent 8e122397b0
commit 5355d04553
17 changed files with 186 additions and 162 deletions
@@ -60,22 +60,34 @@ fun main(
b.superNullable(aAnyNotNullNullNull)
b.extendsAsIs(aNotNullNotNullNotNull)
b.extendsAsIs(aNotNullNotNullNull)
b.extendsAsIs(aNotNullNullNotNull)
b.extendsAsIs(aNotNullNullNull)
// jspecify_nullness_mismatch
b.extendsAsIs(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
// jspecify_nullness_mismatch
b.extendsAsIs(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
// jspecify_nullness_mismatch
b.extendsAsIs(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
b.extendsNotNull(aNotNullNotNullNotNull)
b.extendsNotNull(aNotNullNotNullNull)
b.extendsNotNull(aNotNullNullNotNull)
b.extendsNotNull(aNotNullNullNull)
// jspecify_nullness_mismatch
b.extendsNotNull(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
// jspecify_nullness_mismatch
b.extendsNotNull(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
// jspecify_nullness_mismatch
b.extendsNotNull(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
b.extendsNullable(aNotNullNotNullNotNull)
b.extendsNullable(aNotNullNotNullNull)
b.extendsNullable(aNotNullNullNotNull)
b.extendsNullable(aNotNullNullNull)
// jspecify_nullness_mismatch
b.extendsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
// jspecify_nullness_mismatch
b.extendsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
// jspecify_nullness_mismatch
b.extendsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
b.noBounds(aNotNullNotNullNotNull)
b.noBounds(aNotNullNotNullNull)
b.noBounds(aNotNullNullNotNull)
b.noBounds(aNotNullNullNull)
// jspecify_nullness_mismatch
b.noBounds(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
// jspecify_nullness_mismatch
b.noBounds(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
// jspecify_nullness_mismatch
b.noBounds(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
}
@@ -0,0 +1,38 @@
// JSPECIFY_STATE: strict
// MUTE_FOR_PSI_CLASS_FILES_READING
// FILE: WildcardsWithDefault.java
import org.jspecify.nullness.*;
@NullMarked
public class WildcardsWithDefault {
public void noBoundsNotNull(A<?, ?, ?> a) {}
public void noBoundsNullable(A<? extends @Nullable Object, ? extends @Nullable Object, ? extends @Nullable Object> a) {}
}
// FILE: A.java
import org.jspecify.nullness.*;
public class A <T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {}
// FILE: main.kt
fun main(
aNotNullNotNullNotNull: A<Any, Any, Any>,
aNotNullNotNullNull: A<Any, Any, Any?>,
aNotNullNullNotNull: A<Any, Any?, Any>,
aNotNullNullNull: A<Any, Any?, Any?>,
b: WildcardsWithDefault
): Unit {
b.noBoundsNotNull(aNotNullNotNullNotNull)
b.noBoundsNotNull(aNotNullNotNullNull)
b.noBoundsNotNull(aNotNullNullNotNull)
b.noBoundsNotNull(aNotNullNullNull)
b.noBoundsNullable(aNotNullNotNullNotNull)
// jspecify_nullness_mismatch
b.noBoundsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
// jspecify_nullness_mismatch
b.noBoundsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
// jspecify_nullness_mismatch
b.noBoundsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
}
@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// JSPECIFY_STATE: strict
// MUTE_FOR_PSI_CLASS_FILES_READING
@@ -59,22 +59,22 @@ fun main(
b.superNullable(aAnyNotNullNullNull)
b.extendsAsIs(aNotNullNotNullNotNull)
b.extendsAsIs(aNotNullNotNullNull)
b.extendsAsIs(aNotNullNullNotNull)
b.extendsAsIs(aNotNullNullNull)
b.extendsAsIs(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
b.extendsAsIs(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
b.extendsAsIs(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
b.extendsNotNull(aNotNullNotNullNotNull)
b.extendsNotNull(aNotNullNotNullNull)
b.extendsNotNull(aNotNullNullNotNull)
b.extendsNotNull(aNotNullNullNull)
b.extendsNotNull(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
b.extendsNotNull(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
b.extendsNotNull(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
b.extendsNullable(aNotNullNotNullNotNull)
b.extendsNullable(aNotNullNotNullNull)
b.extendsNullable(aNotNullNullNotNull)
b.extendsNullable(aNotNullNullNull)
b.extendsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
b.extendsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
b.extendsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
b.noBounds(aNotNullNotNullNotNull)
b.noBounds(aNotNullNotNullNull)
b.noBounds(aNotNullNullNotNull)
b.noBounds(aNotNullNullNull)
b.noBounds(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
b.noBounds(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
b.noBounds(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
}
@@ -0,0 +1,35 @@
// JSPECIFY_STATE: warn
// MUTE_FOR_PSI_CLASS_FILES_READING
// FILE: WildcardsWithDefault.java
import org.jspecify.nullness.*;
@NullMarked
public class WildcardsWithDefault {
public void noBoundsNotNull(A<?, ?, ?> a) {}
public void noBoundsNullable(A<? extends @Nullable Object, ? extends @Nullable Object, ? extends @Nullable Object> a) {}
}
// FILE: A.java
import org.jspecify.nullness.*;
public class A <T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {}
// FILE: main.kt
fun main(
aNotNullNotNullNotNull: A<Any, Any, Any>,
aNotNullNotNullNull: A<Any, Any, Any?>,
aNotNullNullNotNull: A<Any, Any?, Any>,
aNotNullNullNull: A<Any, Any?, Any?>,
b: WildcardsWithDefault
): Unit {
b.noBoundsNotNull(aNotNullNotNullNotNull)
b.noBoundsNotNull(aNotNullNotNullNull)
b.noBoundsNotNull(aNotNullNullNotNull)
b.noBoundsNotNull(aNotNullNullNull)
b.noBoundsNullable(aNotNullNotNullNotNull)
b.noBoundsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
b.noBoundsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
b.noBoundsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
}
@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// JSPECIFY_STATE: warn
// MUTE_FOR_PSI_CLASS_FILES_READING
@@ -1,41 +0,0 @@
// FULL_JDK
import java.util.function.Consumer
abstract class MyIt1<out T> : Iterator<T> {
override fun forEachRemaining(x: Consumer<in T>) {}
}
abstract class MyIt2<out T> : Iterator<T> {
override fun forEachRemaining(x: Consumer<in T?>) {}
}
abstract class MyIt3<out T> : Iterator<T> {
<!NOTHING_TO_OVERRIDE!>override<!> fun forEachRemaining(x: Consumer<in T>?) {}
}
abstract class MyIt4 : Iterator<String?> {
override fun forEachRemaining(x: Consumer<in String?>) {}
}
abstract class MyIt5 : Iterator<String> {
override fun forEachRemaining(x: Consumer<in String>) {}
}
abstract class MyIt6 : Iterator<String?> {
<!NOTHING_TO_OVERRIDE!>override<!> fun forEachRemaining(x: Consumer<in String>) {}
}
abstract class MyIt7 : Iterator<String> {
override fun forEachRemaining(x: Consumer<in String?>) {}
}
fun foo(x: Iterator<String>, y: Iterator<String?>) {
x.forEachRemaining(<!NULL_FOR_NONNULL_TYPE!>null<!>)
x.forEachRemaining { it -> it.length }
x.forEachRemaining { it -> it?.length }
y.forEachRemaining { it -> it<!UNSAFE_CALL!>.<!>length }
y.forEachRemaining { it -> it?.length }
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// FULL_JDK
import java.util.function.Consumer