Duplicate this entire test suite to jspecifyOld before changing the package locations in jspecify.
This commit is contained in:
committed by
Space Team
parent
b69b7ab22d
commit
671480ce1a
Vendored
+36
@@ -0,0 +1,36 @@
|
||||
// FILE: NullnessUnspecifiedTypeParameter.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class NullnessUnspecifiedTypeParameter<T> {
|
||||
public void foo(T t) {}
|
||||
|
||||
public void bar(Test s, T t) {} // t should not become not nullable
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
// jspecify_nullness_mismatch
|
||||
fun main(a1: NullnessUnspecifiedTypeParameter<Any>, a2: NullnessUnspecifiedTypeParameter<Any?>, x: Test): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
a1.foo(null)
|
||||
a1.foo(1)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a2.foo(null)
|
||||
a2.foo(1)
|
||||
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a1.bar(null, null)
|
||||
// jspecify_nullness_mismatch
|
||||
a1.bar(x, null)
|
||||
a1.bar(x, 1)
|
||||
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a2.bar(null, null)
|
||||
// jspecify_nullness_mismatch
|
||||
a2.bar(x, null)
|
||||
a2.bar(x, 1)
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
// FILE: NullnessUnspecifiedTypeParameter.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class NullnessUnspecifiedTypeParameter<T> {
|
||||
public void foo(T t) {}
|
||||
|
||||
public void bar(Test s, T t) {} // t should not become not nullable
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
// jspecify_nullness_mismatch
|
||||
fun main(a1: NullnessUnspecifiedTypeParameter<Any>, a2: NullnessUnspecifiedTypeParameter<<!UPPER_BOUND_VIOLATED_BASED_ON_JAVA_ANNOTATIONS!>Any?<!>>, x: Test): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
a1.foo(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
a1.foo(1)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a2.foo(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
a2.foo(1)
|
||||
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a1.bar(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>, <!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
a1.bar(x, <!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
a1.bar(x, 1)
|
||||
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a2.bar(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>, <!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
a2.bar(x, <!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
a2.bar(x, 1)
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a1: NullnessUnspecifiedTypeParameter<kotlin.Any>, /*1*/ a2: NullnessUnspecifiedTypeParameter<kotlin.Any?>, /*2*/ x: Test): kotlin.Unit
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class NullnessUnspecifiedTypeParameter</*0*/ T : kotlin.Any!> {
|
||||
public constructor NullnessUnspecifiedTypeParameter</*0*/ T : kotlin.Any!>()
|
||||
public open fun bar(/*0*/ s: Test!, /*1*/ t: T!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ t: T!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Test {
|
||||
public constructor Test()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
// JSPECIFY_STATE: strict
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
|
||||
|
||||
// FILE: AnnotatedBoundsOfWildcard.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class AnnotatedBoundsOfWildcard {
|
||||
public void superAsIs(Test<? super Base, ? super @Nullable Base, ? super @NullnessUnspecified Base> a) {}
|
||||
public void superNotNull(Test<? super Base, ? super Base, ? super Base> a) {}
|
||||
public void superNullable(Test<? super @Nullable Base, ? super @Nullable Base, ? super @Nullable Base> a) {}
|
||||
|
||||
public void extendsAsIs(Test<? extends Base, ? extends @Nullable Base, ? extends @NullnessUnspecified Base> a) {}
|
||||
public void extendsNotNull(Test<? extends Base, ? extends Base, ? extends Base> a) {}
|
||||
public void extendsNullable(Test<? extends @Nullable Base, ? extends @Nullable Base, ? extends @Nullable Base> a) {}
|
||||
|
||||
public void noBounds(Test<? extends @NullnessUnspecified Object, ? extends @NullnessUnspecified Object, ? extends @NullnessUnspecified Object> a) {}
|
||||
}
|
||||
|
||||
// FILE: Base.java
|
||||
public class Base {}
|
||||
|
||||
// FILE: Derived.java
|
||||
public class Derived extends Base {}
|
||||
|
||||
// FILE: Test.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class Test<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> { }
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(
|
||||
aNotNullNotNullNotNull: Test<Derived, Derived, Derived>,
|
||||
aNotNullNotNullNull: Test<Derived, Derived, Derived?>,
|
||||
aNotNullNullNotNull: Test<Derived, Derived?, Derived>,
|
||||
aNotNullNullNull: Test<Derived, Derived?, Derived?>,
|
||||
|
||||
aAnyNotNullNotNullNotNull: Test<Any, Any, Any>,
|
||||
aAnyNotNullNotNullNull: Test<Any, Any, Any?>,
|
||||
aAnyNotNullNullNotNull: Test<Any, Any?, Any>,
|
||||
aAnyNotNullNullNull: Test<Any, Any?, Any?>,
|
||||
|
||||
b: AnnotatedBoundsOfWildcard
|
||||
): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
b.superAsIs(<!ARGUMENT_TYPE_MISMATCH!>aAnyNotNullNotNullNotNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superAsIs(<!ARGUMENT_TYPE_MISMATCH!>aAnyNotNullNotNullNull<!>)
|
||||
b.superAsIs(aAnyNotNullNullNotNull)
|
||||
b.superAsIs(aAnyNotNullNullNull)
|
||||
|
||||
b.superNotNull(aAnyNotNullNotNullNotNull)
|
||||
b.superNotNull(aAnyNotNullNotNullNull)
|
||||
b.superNotNull(aAnyNotNullNullNotNull)
|
||||
b.superNotNull(aAnyNotNullNullNull)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(<!ARGUMENT_TYPE_MISMATCH!>aAnyNotNullNotNullNotNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(<!ARGUMENT_TYPE_MISMATCH!>aAnyNotNullNotNullNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(<!ARGUMENT_TYPE_MISMATCH!>aAnyNotNullNullNotNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(<!ARGUMENT_TYPE_MISMATCH!>aAnyNotNullNullNull<!>)
|
||||
|
||||
b.extendsAsIs(aNotNullNotNullNotNull)
|
||||
b.extendsAsIs(aNotNullNotNullNull)
|
||||
b.extendsAsIs(aNotNullNullNotNull)
|
||||
b.extendsAsIs(aNotNullNullNull)
|
||||
|
||||
b.extendsNotNull(aNotNullNotNullNotNull)
|
||||
// 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)
|
||||
|
||||
b.noBounds(aNotNullNotNullNotNull)
|
||||
b.noBounds(aNotNullNotNullNull)
|
||||
b.noBounds(aNotNullNullNotNull)
|
||||
b.noBounds(aNotNullNullNull)
|
||||
}
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
// JSPECIFY_STATE: strict
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
|
||||
|
||||
// FILE: AnnotatedBoundsOfWildcard.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class AnnotatedBoundsOfWildcard {
|
||||
public void superAsIs(Test<? super Base, ? super @Nullable Base, ? super @NullnessUnspecified Base> a) {}
|
||||
public void superNotNull(Test<? super Base, ? super Base, ? super Base> a) {}
|
||||
public void superNullable(Test<? super @Nullable Base, ? super @Nullable Base, ? super @Nullable Base> a) {}
|
||||
|
||||
public void extendsAsIs(Test<? extends Base, ? extends @Nullable Base, ? extends @NullnessUnspecified Base> a) {}
|
||||
public void extendsNotNull(Test<? extends Base, ? extends Base, ? extends Base> a) {}
|
||||
public void extendsNullable(Test<? extends @Nullable Base, ? extends @Nullable Base, ? extends @Nullable Base> a) {}
|
||||
|
||||
public void noBounds(Test<? extends @NullnessUnspecified Object, ? extends @NullnessUnspecified Object, ? extends @NullnessUnspecified Object> a) {}
|
||||
}
|
||||
|
||||
// FILE: Base.java
|
||||
public class Base {}
|
||||
|
||||
// FILE: Derived.java
|
||||
public class Derived extends Base {}
|
||||
|
||||
// FILE: Test.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class Test<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> { }
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(
|
||||
aNotNullNotNullNotNull: Test<Derived, Derived, Derived>,
|
||||
aNotNullNotNullNull: Test<Derived, Derived, Derived?>,
|
||||
aNotNullNullNotNull: Test<Derived, Derived?, Derived>,
|
||||
aNotNullNullNull: Test<Derived, Derived?, Derived?>,
|
||||
|
||||
aAnyNotNullNotNullNotNull: Test<Any, Any, Any>,
|
||||
aAnyNotNullNotNullNull: Test<Any, Any, Any?>,
|
||||
aAnyNotNullNullNotNull: Test<Any, Any?, Any>,
|
||||
aAnyNotNullNullNull: Test<Any, Any?, Any?>,
|
||||
|
||||
b: AnnotatedBoundsOfWildcard
|
||||
): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
b.superAsIs(<!TYPE_MISMATCH!>aAnyNotNullNotNullNotNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superAsIs(<!TYPE_MISMATCH!>aAnyNotNullNotNullNull<!>)
|
||||
b.superAsIs(aAnyNotNullNullNotNull)
|
||||
b.superAsIs(aAnyNotNullNullNull)
|
||||
|
||||
b.superNotNull(aAnyNotNullNotNullNotNull)
|
||||
b.superNotNull(aAnyNotNullNotNullNull)
|
||||
b.superNotNull(aAnyNotNullNullNotNull)
|
||||
b.superNotNull(aAnyNotNullNullNull)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(<!TYPE_MISMATCH!>aAnyNotNullNotNullNotNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(<!TYPE_MISMATCH!>aAnyNotNullNotNullNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(<!TYPE_MISMATCH!>aAnyNotNullNullNotNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(<!TYPE_MISMATCH!>aAnyNotNullNullNull<!>)
|
||||
|
||||
b.extendsAsIs(aNotNullNotNullNotNull)
|
||||
b.extendsAsIs(aNotNullNotNullNull)
|
||||
b.extendsAsIs(aNotNullNullNotNull)
|
||||
b.extendsAsIs(aNotNullNullNull)
|
||||
|
||||
b.extendsNotNull(aNotNullNotNullNotNull)
|
||||
// jspecify_nullness_mismatch
|
||||
b.extendsNotNull(<!TYPE_MISMATCH!>aNotNullNotNullNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.extendsNotNull(<!TYPE_MISMATCH!>aNotNullNullNotNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.extendsNotNull(<!TYPE_MISMATCH!>aNotNullNullNull<!>)
|
||||
|
||||
b.extendsNullable(aNotNullNotNullNotNull)
|
||||
b.extendsNullable(aNotNullNotNullNull)
|
||||
b.extendsNullable(aNotNullNullNotNull)
|
||||
b.extendsNullable(aNotNullNullNull)
|
||||
|
||||
b.noBounds(aNotNullNotNullNotNull)
|
||||
b.noBounds(aNotNullNotNullNull)
|
||||
b.noBounds(aNotNullNullNotNull)
|
||||
b.noBounds(aNotNullNullNull)
|
||||
}
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ aNotNullNotNullNotNull: Test<Derived, Derived, Derived>, /*1*/ aNotNullNotNullNull: Test<Derived, Derived, Derived?>, /*2*/ aNotNullNullNotNull: Test<Derived, Derived?, Derived>, /*3*/ aNotNullNullNull: Test<Derived, Derived?, Derived?>, /*4*/ aAnyNotNullNotNullNotNull: Test<kotlin.Any, kotlin.Any, kotlin.Any>, /*5*/ aAnyNotNullNotNullNull: Test<kotlin.Any, kotlin.Any, kotlin.Any?>, /*6*/ aAnyNotNullNullNotNull: Test<kotlin.Any, kotlin.Any?, kotlin.Any>, /*7*/ aAnyNotNullNullNull: Test<kotlin.Any, kotlin.Any?, kotlin.Any?>, /*8*/ b: AnnotatedBoundsOfWildcard): kotlin.Unit
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class AnnotatedBoundsOfWildcard {
|
||||
public constructor AnnotatedBoundsOfWildcard()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun extendsAsIs(/*0*/ a: Test<out Base, out @org.jspecify.nullness.Nullable Base?, out @org.jspecify.nullness.NullnessUnspecified Base!>): kotlin.Unit
|
||||
public open fun extendsNotNull(/*0*/ a: Test<out Base, out Base, out Base>): kotlin.Unit
|
||||
public open fun extendsNullable(/*0*/ a: Test<out @org.jspecify.nullness.Nullable Base?, out @org.jspecify.nullness.Nullable Base?, out @org.jspecify.nullness.Nullable Base?>): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open fun noBounds(/*0*/ a: Test<out @org.jspecify.nullness.NullnessUnspecified kotlin.Any!, out @org.jspecify.nullness.NullnessUnspecified kotlin.Any!, out @org.jspecify.nullness.NullnessUnspecified kotlin.Any!>): kotlin.Unit
|
||||
public open fun superAsIs(/*0*/ a: Test<in Base, in @org.jspecify.nullness.Nullable Base?, in @org.jspecify.nullness.NullnessUnspecified Base!>): kotlin.Unit
|
||||
public open fun superNotNull(/*0*/ a: Test<in Base, in Base, in Base>): kotlin.Unit
|
||||
public open fun superNullable(/*0*/ a: Test<in @org.jspecify.nullness.Nullable Base?, in @org.jspecify.nullness.Nullable Base?, in @org.jspecify.nullness.Nullable Base?>): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Base {
|
||||
public constructor Base()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Derived : Base {
|
||||
public constructor Derived()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class Test</*0*/ T : kotlin.Any, /*1*/ E, /*2*/ F : @org.jspecify.nullness.NullnessUnspecified kotlin.Any!> {
|
||||
public constructor Test</*0*/ T : kotlin.Any, /*1*/ E, /*2*/ F : @org.jspecify.nullness.NullnessUnspecified kotlin.Any!>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
Vendored
+18
@@ -0,0 +1,18 @@
|
||||
// FIR_IDENTICAL
|
||||
// JSPECIFY_STATE: strict
|
||||
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
|
||||
// FILE: J1.java
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public interface J1<T> {
|
||||
@Nullable
|
||||
public static <T> T foo(J1<T> x) { return null; }
|
||||
}
|
||||
|
||||
// FILE: J2.java
|
||||
import org.jspecify.nullness.Nullable;
|
||||
|
||||
public interface J2<V extends @Nullable Object> extends J1<V> { }
|
||||
|
||||
// FILE: kotlin.kt
|
||||
private fun J2<*>.bar() = J1.foo(this)
|
||||
compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecifyOld/strictMode/Captured.txt
Vendored
+18
@@ -0,0 +1,18 @@
|
||||
package
|
||||
|
||||
private fun J2<*>.bar(): @org.jspecify.nullness.Nullable kotlin.Any?
|
||||
|
||||
public interface J1</*0*/ T : kotlin.Any!> {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
@org.jetbrains.annotations.Nullable public open fun </*0*/ T : kotlin.Any!> foo(/*0*/ x: J1<T!>!): @org.jetbrains.annotations.Nullable T?
|
||||
}
|
||||
|
||||
public interface J2</*0*/ V> : J1<V> {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Vendored
+52
@@ -0,0 +1,52 @@
|
||||
// FIR_IDENTICAL
|
||||
// JSPECIFY_STATE: strict
|
||||
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
|
||||
|
||||
// FILE: Defaults.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class Defaults {
|
||||
public Foo defaultField = null;
|
||||
@Nullable public Foo field = null;
|
||||
|
||||
public Foo everythingNotNullable(Foo x) { return null; }
|
||||
|
||||
public @Nullable Foo everythingNullable(@Nullable Foo x) { return null; }
|
||||
|
||||
public @NullnessUnspecified Foo everythingUnknown(@NullnessUnspecified Foo x) { return null; }
|
||||
|
||||
public @Nullable Foo mixed(Foo x) { return null; }
|
||||
|
||||
public Foo explicitlyNullnessUnspecified(@NullnessUnspecified Foo x) { return null; }
|
||||
}
|
||||
|
||||
// FILE: Foo.java
|
||||
public class Foo {
|
||||
public Object foo() { return null; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(a: Defaults, x: Foo): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
a.everythingNotNullable(<!NULL_FOR_NONNULL_TYPE!>null<!>).foo()
|
||||
a.everythingNotNullable(x).foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a.everythingNullable(null)<!UNSAFE_CALL!>.<!>foo()
|
||||
|
||||
a.everythingUnknown(null).foo()
|
||||
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a.mixed(<!NULL_FOR_NONNULL_TYPE!>null<!>)<!UNSAFE_CALL!>.<!>foo()
|
||||
// jspecify_nullness_mismatch
|
||||
a.mixed(x)<!UNSAFE_CALL!>.<!>foo()
|
||||
|
||||
a.explicitlyNullnessUnspecified(x).foo()
|
||||
a.explicitlyNullnessUnspecified(null).foo()
|
||||
|
||||
a.defaultField.foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a.field<!UNSAFE_CALL!>.<!>foo()
|
||||
}
|
||||
compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecifyOld/strictMode/Defaults.txt
Vendored
+26
@@ -0,0 +1,26 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a: Defaults, /*1*/ x: Foo): kotlin.Unit
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class Defaults {
|
||||
public constructor Defaults()
|
||||
public final var defaultField: Foo
|
||||
@org.jspecify.nullness.Nullable public final var field: @org.jspecify.nullness.Nullable Foo?
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun everythingNotNullable(/*0*/ x: Foo): Foo
|
||||
@org.jspecify.nullness.Nullable public open fun everythingNullable(/*0*/ @org.jspecify.nullness.Nullable x: @org.jspecify.nullness.Nullable Foo?): @org.jspecify.nullness.Nullable Foo?
|
||||
@org.jspecify.nullness.NullnessUnspecified public open fun everythingUnknown(/*0*/ @org.jspecify.nullness.NullnessUnspecified x: @org.jspecify.nullness.NullnessUnspecified Foo!): @org.jspecify.nullness.NullnessUnspecified Foo!
|
||||
public open fun explicitlyNullnessUnspecified(/*0*/ @org.jspecify.nullness.NullnessUnspecified x: @org.jspecify.nullness.NullnessUnspecified Foo!): Foo
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
@org.jspecify.nullness.Nullable public open fun mixed(/*0*/ x: Foo): @org.jspecify.nullness.Nullable Foo?
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Foo {
|
||||
public constructor Foo()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(): kotlin.Any!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
// FIR_IDENTICAL
|
||||
// JSPECIFY_STATE: strict
|
||||
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
|
||||
|
||||
// FILE: IgnoreAnnotations.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class IgnoreAnnotations {
|
||||
@Nullable public Derived field = null;
|
||||
|
||||
@Nullable
|
||||
public Derived foo(Derived x, @NullnessUnspecified Base y) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Derived everythingNotNullable(Derived x) { return null; }
|
||||
|
||||
public @Nullable Derived everythingNullable(@Nullable Derived x) { return null; }
|
||||
|
||||
public @NullnessUnspecified Derived everythingUnknown(@NullnessUnspecified Derived x) { return null; }
|
||||
}
|
||||
|
||||
// FILE: Base.java
|
||||
public class Base {
|
||||
void foo() {}
|
||||
}
|
||||
|
||||
// FILE: Derived.java
|
||||
public class Derived extends Base { }
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(a: IgnoreAnnotations, x: Derived): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
a.foo(x, null)<!UNSAFE_CALL!>.<!>foo()
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>, x)<!UNSAFE_CALL!>.<!>foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a.field<!UNSAFE_CALL!>.<!>foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a.everythingNotNullable(<!NULL_FOR_NONNULL_TYPE!>null<!>).foo()
|
||||
a.everythingNotNullable(x).foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a.everythingNullable(null)<!UNSAFE_CALL!>.<!>foo()
|
||||
|
||||
a.everythingUnknown(null).foo()
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a: IgnoreAnnotations, /*1*/ x: Derived): kotlin.Unit
|
||||
|
||||
public open class Base {
|
||||
public constructor Base()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public/*package*/ open fun foo(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Derived : Base {
|
||||
public constructor Derived()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public/*package*/ open override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class IgnoreAnnotations {
|
||||
public constructor IgnoreAnnotations()
|
||||
@org.jspecify.nullness.Nullable public final var field: @org.jspecify.nullness.Nullable Derived?
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun everythingNotNullable(/*0*/ x: Derived): Derived
|
||||
@org.jspecify.nullness.Nullable public open fun everythingNullable(/*0*/ @org.jspecify.nullness.Nullable x: @org.jspecify.nullness.Nullable Derived?): @org.jspecify.nullness.Nullable Derived?
|
||||
@org.jspecify.nullness.NullnessUnspecified public open fun everythingUnknown(/*0*/ @org.jspecify.nullness.NullnessUnspecified x: @org.jspecify.nullness.NullnessUnspecified Derived!): @org.jspecify.nullness.NullnessUnspecified Derived!
|
||||
@org.jspecify.nullness.Nullable public open fun foo(/*0*/ x: Derived, /*1*/ @org.jspecify.nullness.NullnessUnspecified y: @org.jspecify.nullness.NullnessUnspecified Base!): @org.jspecify.nullness.Nullable Derived?
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
// FIR_IDENTICAL
|
||||
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated +TypeEnhancementImprovementsInStrictMode
|
||||
// JSPECIFY_STATE: strict
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
|
||||
// FILE: NonPlatformTypeParameter.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class NonPlatformTypeParameter<T extends @Nullable Object> {
|
||||
public void foo(T t) {}
|
||||
public <E extends @Nullable Object> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
fun <T : Test> main(a1: NonPlatformTypeParameter<Any?>, a2: NonPlatformTypeParameter<Test>, x: T): Unit {
|
||||
a1.foo(null)
|
||||
a1.bar<Test?>(null)
|
||||
// jspecify_nullness_mismatch
|
||||
a1.bar<T>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a1.bar<T>(x)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a2.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a2.bar<Test?>(null)
|
||||
// jspecify_nullness_mismatch
|
||||
a2.bar<T>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a2.bar<T>(x)
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package
|
||||
|
||||
public fun </*0*/ T : Test> main(/*0*/ a1: NonPlatformTypeParameter<kotlin.Any?>, /*1*/ a2: NonPlatformTypeParameter<Test>, /*2*/ x: T): kotlin.Unit
|
||||
|
||||
public open class NonPlatformTypeParameter</*0*/ T> {
|
||||
public constructor NonPlatformTypeParameter</*0*/ T>()
|
||||
public open fun </*0*/ E> bar(/*0*/ e: E): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ t: T): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Test {
|
||||
public constructor Test()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
// JSPECIFY_STATE: strict
|
||||
|
||||
// FILE: NullnessUnspecifiedTypeParameter.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class NullnessUnspecifiedTypeParameter<T> {
|
||||
public void foo(T t) {}
|
||||
|
||||
public void bar(Test s, T t) {} // t should not become not nullable
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
// jspecify_nullness_mismatch
|
||||
fun main(a1: NullnessUnspecifiedTypeParameter<Any>, a2: NullnessUnspecifiedTypeParameter<<!UPPER_BOUND_VIOLATED!>Any?<!>>, x: Test): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
a1.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a1.foo(1)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a2.foo(null)
|
||||
a2.foo(1)
|
||||
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a1.bar(<!NULL_FOR_NONNULL_TYPE!>null<!>, <!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
a1.bar(x, <!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a1.bar(x, 1)
|
||||
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a2.bar(<!NULL_FOR_NONNULL_TYPE!>null<!>, null)
|
||||
// jspecify_nullness_mismatch
|
||||
a2.bar(x, null)
|
||||
a2.bar(x, 1)
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
// JSPECIFY_STATE: strict
|
||||
|
||||
// FILE: NullnessUnspecifiedTypeParameter.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class NullnessUnspecifiedTypeParameter<T> {
|
||||
public void foo(T t) {}
|
||||
|
||||
public void bar(Test s, T t) {} // t should not become not nullable
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
// jspecify_nullness_mismatch
|
||||
fun main(a1: NullnessUnspecifiedTypeParameter<Any>, a2: NullnessUnspecifiedTypeParameter<<!UPPER_BOUND_VIOLATED!>Any?<!>>, x: Test): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
a1.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a1.foo(1)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a2.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a2.foo(1)
|
||||
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a1.bar(<!NULL_FOR_NONNULL_TYPE!>null<!>, <!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
a1.bar(x, <!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a1.bar(x, 1)
|
||||
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a2.bar(<!NULL_FOR_NONNULL_TYPE!>null<!>, <!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
a2.bar(x, <!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a2.bar(x, 1)
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a1: NullnessUnspecifiedTypeParameter<kotlin.Any>, /*1*/ a2: NullnessUnspecifiedTypeParameter<kotlin.Any?>, /*2*/ x: Test): kotlin.Unit
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class NullnessUnspecifiedTypeParameter</*0*/ T : kotlin.Any> {
|
||||
public constructor NullnessUnspecifiedTypeParameter</*0*/ T : kotlin.Any>()
|
||||
public open fun bar(/*0*/ s: Test, /*1*/ t: T): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ t: T): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Test {
|
||||
public constructor Test()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
// JSPECIFY_STATE: strict
|
||||
|
||||
// FILE: SelfType.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class SelfType<T extends SelfType<T>> {
|
||||
public void foo(T t) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
public class B extends SelfType<B> {}
|
||||
|
||||
// FILE: C.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class C<E extends C<E>> extends SelfType<E> {}
|
||||
|
||||
// FILE: AK.java
|
||||
public class AK extends SelfType<AK> {}
|
||||
|
||||
// FILE: AKN.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class AKN extends SelfType<@Nullable AK> {}
|
||||
|
||||
// FILE: BK.java
|
||||
public class BK extends B {}
|
||||
|
||||
// FILE: CK.java
|
||||
public class CK extends C<CK> {}
|
||||
|
||||
// FILE: CKN.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class CKN extends C<@Nullable CK> {}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(ak: AK, akn: AKN, bk: BK, ck: CK, ckn: CKN): Unit {
|
||||
ak.foo(ak)
|
||||
// jspecify_nullness_mismatch
|
||||
ak.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
akn.foo(null)
|
||||
|
||||
bk.foo(bk)
|
||||
// jspecify_nullness_mismatch
|
||||
bk.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
|
||||
ck.foo(ck)
|
||||
// jspecify_nullness_mismatch
|
||||
ck.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
ckn.foo(null)
|
||||
}
|
||||
Vendored
+58
@@ -0,0 +1,58 @@
|
||||
// JSPECIFY_STATE: strict
|
||||
|
||||
// FILE: SelfType.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class SelfType<T extends SelfType<T>> {
|
||||
public void foo(T t) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
public class B extends SelfType<B> {}
|
||||
|
||||
// FILE: C.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class C<E extends C<E>> extends SelfType<E> {}
|
||||
|
||||
// FILE: AK.java
|
||||
public class AK extends SelfType<AK> {}
|
||||
|
||||
// FILE: AKN.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class AKN extends SelfType<@Nullable AK> {}
|
||||
|
||||
// FILE: BK.java
|
||||
public class BK extends B {}
|
||||
|
||||
// FILE: CK.java
|
||||
public class CK extends C<CK> {}
|
||||
|
||||
// FILE: CKN.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class CKN extends C<@Nullable CK> {}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(ak: AK, akn: AKN, bk: BK, ck: CK, ckn: CKN): Unit {
|
||||
ak.foo(ak)
|
||||
// jspecify_nullness_mismatch
|
||||
ak.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
akn.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
|
||||
bk.foo(bk)
|
||||
// jspecify_nullness_mismatch
|
||||
bk.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
|
||||
ck.foo(ck)
|
||||
// jspecify_nullness_mismatch
|
||||
ck.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
ckn.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
}
|
||||
compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecifyOld/strictMode/SelfType.txt
Vendored
+68
@@ -0,0 +1,68 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ ak: AK, /*1*/ akn: AKN, /*2*/ bk: BK, /*3*/ ck: CK, /*4*/ ckn: CKN): kotlin.Unit
|
||||
|
||||
public open class AK : SelfType<AK> {
|
||||
public constructor AK()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun foo(/*0*/ t: AK): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class AKN : SelfType<@org.jspecify.nullness.Nullable AK?> {
|
||||
public constructor AKN()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun foo(/*0*/ t: @org.jspecify.nullness.Nullable AK): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class B : SelfType<B> {
|
||||
public constructor B()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun foo(/*0*/ t: B): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class BK : B {
|
||||
public constructor BK()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun foo(/*0*/ t: B): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class C</*0*/ E : C<E>> : SelfType<E> {
|
||||
public constructor C</*0*/ E : C<E>>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun foo(/*0*/ t: E): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class CK : C<CK> {
|
||||
public constructor CK()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun foo(/*0*/ t: CK): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class CKN : C<@org.jspecify.nullness.Nullable CK?> {
|
||||
public constructor CKN()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun foo(/*0*/ t: @org.jspecify.nullness.Nullable CK): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class SelfType</*0*/ T : SelfType<T>> {
|
||||
public constructor SelfType</*0*/ T : SelfType<T>>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ t: T): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
Vendored
+41
@@ -0,0 +1,41 @@
|
||||
// FIR_IDENTICAL
|
||||
// JSPECIFY_STATE: strict
|
||||
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
|
||||
|
||||
// FILE: Simple.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class Simple {
|
||||
@Nullable public Derived field = null;
|
||||
|
||||
@Nullable
|
||||
public Derived foo(Derived x, @NullnessUnspecified Base y) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Derived bar() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: Base.java
|
||||
public class Base {}
|
||||
|
||||
// FILE: Derived.java
|
||||
public class Derived extends Base {
|
||||
void foo() {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(a: Simple, x: Derived): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
a.foo(x, null)<!UNSAFE_CALL!>.<!>foo()
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>, x)<!UNSAFE_CALL!>.<!>foo()
|
||||
|
||||
a.bar().foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a.field<!UNSAFE_CALL!>.<!>foo()
|
||||
}
|
||||
Vendored
+29
@@ -0,0 +1,29 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a: Simple, /*1*/ x: Derived): kotlin.Unit
|
||||
|
||||
public open class Base {
|
||||
public constructor Base()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Derived : Base {
|
||||
public constructor Derived()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public/*package*/ open fun foo(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class Simple {
|
||||
public constructor Simple()
|
||||
@org.jspecify.nullness.Nullable public final var field: @org.jspecify.nullness.Nullable Derived?
|
||||
public open fun bar(): Derived
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
@org.jspecify.nullness.Nullable public open fun foo(/*0*/ x: Derived, /*1*/ @org.jspecify.nullness.NullnessUnspecified y: @org.jspecify.nullness.NullnessUnspecified Base!): @org.jspecify.nullness.Nullable Derived?
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
// JSPECIFY_STATE: strict
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
|
||||
|
||||
// FILE: TypeArgumentsFromParameterBounds.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class TypeArgumentsFromParameterBounds<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {}
|
||||
|
||||
// FILE: A.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class A {
|
||||
public void bar(TypeArgumentsFromParameterBounds<Test, Test, Test> a) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class B {
|
||||
public void bar(TypeArgumentsFromParameterBounds<Test, Test, Test> a) {}
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(
|
||||
aNotNullNotNullNotNull: TypeArgumentsFromParameterBounds<Test, Test, Test>,
|
||||
aNotNullNotNullNull: TypeArgumentsFromParameterBounds<Test, Test, Test?>,
|
||||
aNotNullNullNotNull: TypeArgumentsFromParameterBounds<Test, Test?, Test>,
|
||||
aNotNullNullNull: TypeArgumentsFromParameterBounds<Test, Test?, Test?>,
|
||||
a: A, b: B
|
||||
): Unit {
|
||||
a.bar(aNotNullNotNullNotNull)
|
||||
// jspecify_nullness_mismatch
|
||||
a.bar(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
a.bar(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
a.bar(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
|
||||
|
||||
b.bar(aNotNullNotNullNotNull)
|
||||
b.bar(aNotNullNotNullNull)
|
||||
b.bar(aNotNullNullNotNull)
|
||||
b.bar(aNotNullNullNull)
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
// JSPECIFY_STATE: strict
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
|
||||
|
||||
// FILE: TypeArgumentsFromParameterBounds.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class TypeArgumentsFromParameterBounds<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {}
|
||||
|
||||
// FILE: A.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class A {
|
||||
public void bar(TypeArgumentsFromParameterBounds<Test, Test, Test> a) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class B {
|
||||
public void bar(TypeArgumentsFromParameterBounds<Test, Test, Test> a) {}
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(
|
||||
aNotNullNotNullNotNull: TypeArgumentsFromParameterBounds<Test, Test, Test>,
|
||||
aNotNullNotNullNull: TypeArgumentsFromParameterBounds<Test, Test, Test?>,
|
||||
aNotNullNullNotNull: TypeArgumentsFromParameterBounds<Test, Test?, Test>,
|
||||
aNotNullNullNull: TypeArgumentsFromParameterBounds<Test, Test?, Test?>,
|
||||
a: A, b: B
|
||||
): Unit {
|
||||
a.bar(aNotNullNotNullNotNull)
|
||||
// jspecify_nullness_mismatch
|
||||
a.bar(<!TYPE_MISMATCH!>aNotNullNotNullNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
a.bar(<!TYPE_MISMATCH!>aNotNullNullNotNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
a.bar(<!TYPE_MISMATCH!>aNotNullNullNull<!>)
|
||||
|
||||
b.bar(aNotNullNotNullNotNull)
|
||||
b.bar(aNotNullNotNullNull)
|
||||
b.bar(aNotNullNullNotNull)
|
||||
b.bar(aNotNullNullNull)
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ aNotNullNotNullNotNull: TypeArgumentsFromParameterBounds<Test, Test, Test>, /*1*/ aNotNullNotNullNull: TypeArgumentsFromParameterBounds<Test, Test, Test?>, /*2*/ aNotNullNullNotNull: TypeArgumentsFromParameterBounds<Test, Test?, Test>, /*3*/ aNotNullNullNull: TypeArgumentsFromParameterBounds<Test, Test?, Test?>, /*4*/ a: A, /*5*/ b: B): kotlin.Unit
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class A {
|
||||
public constructor A()
|
||||
public open fun bar(/*0*/ a: TypeArgumentsFromParameterBounds<Test, Test, Test>): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class B {
|
||||
public constructor B()
|
||||
public open fun bar(/*0*/ a: TypeArgumentsFromParameterBounds<Test, Test!, Test!>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Test {
|
||||
public constructor Test()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class TypeArgumentsFromParameterBounds</*0*/ T : kotlin.Any, /*1*/ E, /*2*/ F : @org.jspecify.nullness.NullnessUnspecified kotlin.Any!> {
|
||||
public constructor TypeArgumentsFromParameterBounds</*0*/ T : kotlin.Any, /*1*/ E, /*2*/ F : @org.jspecify.nullness.NullnessUnspecified kotlin.Any!>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
// JSPECIFY_STATE: strict
|
||||
|
||||
// FILE: A.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class A<T> {
|
||||
public void foo(@NullnessUnspecified T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
import org.jspecify.nullness.*;
|
||||
@NullMarked
|
||||
public class B<T> {
|
||||
public void foo(T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
fun <T : Test> main(a1: A<<!UPPER_BOUND_VIOLATED!>Any?<!>>, a2: A<Test>, b1: B<<!UPPER_BOUND_VIOLATED!>Any?<!>>, b2: B<Test>, x: T): Unit {
|
||||
a1.foo(null)
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a1.bar<<!UPPER_BOUND_VIOLATED!>T?<!>>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a1.bar<T>(x)
|
||||
|
||||
a2.foo(null)
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a2.bar<<!UPPER_BOUND_VIOLATED!>T?<!>>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a2.bar<T>(x)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
b1.foo(null)
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
b1.bar<<!UPPER_BOUND_VIOLATED!>T?<!>>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
b1.bar<T>(x)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
b2.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
b2.bar<<!UPPER_BOUND_VIOLATED!>T?<!>>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
b2.bar<T>(x)
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
// JSPECIFY_STATE: strict
|
||||
|
||||
// FILE: A.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class A<T> {
|
||||
public void foo(@NullnessUnspecified T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
import org.jspecify.nullness.*;
|
||||
@NullMarked
|
||||
public class B<T> {
|
||||
public void foo(T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
fun <T : Test> main(a1: A<<!UPPER_BOUND_VIOLATED!>Any?<!>>, a2: A<Test>, b1: B<<!UPPER_BOUND_VIOLATED!>Any?<!>>, b2: B<Test>, x: T): Unit {
|
||||
a1.foo(null)
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a1.bar<<!UPPER_BOUND_VIOLATED!>T?<!>>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a1.bar<T>(x)
|
||||
|
||||
a2.foo(null)
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a2.bar<<!UPPER_BOUND_VIOLATED!>T?<!>>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a2.bar<T>(x)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
b1.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
b1.bar<<!UPPER_BOUND_VIOLATED!>T?<!>>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
b1.bar<T>(x)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
b2.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
b2.bar<<!UPPER_BOUND_VIOLATED!>T?<!>>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
b2.bar<T>(x)
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
package
|
||||
|
||||
public fun </*0*/ T : Test> main(/*0*/ a1: A<kotlin.Any?>, /*1*/ a2: A<Test>, /*2*/ b1: B<kotlin.Any?>, /*3*/ b2: B<Test>, /*4*/ x: T): kotlin.Unit
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class A</*0*/ T : kotlin.Any> {
|
||||
public constructor A</*0*/ T : kotlin.Any>()
|
||||
public open fun </*0*/ E : kotlin.Any> bar(/*0*/ e: E): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ @org.jspecify.nullness.NullnessUnspecified t: @org.jspecify.nullness.NullnessUnspecified T!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class B</*0*/ T : kotlin.Any> {
|
||||
public constructor B</*0*/ T : kotlin.Any>()
|
||||
public open fun </*0*/ E : kotlin.Any> bar(/*0*/ e: E): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ t: T): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Test {
|
||||
public constructor Test()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
// JSPECIFY_STATE: strict
|
||||
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
|
||||
|
||||
// FILE: J1.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public interface J1<T extends @Nullable Object> {
|
||||
T foo();
|
||||
}
|
||||
|
||||
// FILE: J2.java
|
||||
public interface J2 {
|
||||
J1<?> bar();
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun baz(j2: J2): Any = <!RETURN_TYPE_MISMATCH!>j2.bar().foo()<!> // Any..Any?
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
// JSPECIFY_STATE: strict
|
||||
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
|
||||
|
||||
// FILE: J1.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public interface J1<T extends @Nullable Object> {
|
||||
T foo();
|
||||
}
|
||||
|
||||
// FILE: J2.java
|
||||
public interface J2 {
|
||||
J1<?> bar();
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun baz(j2: J2): Any = j2.bar().foo() // Any..Any?
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
package
|
||||
|
||||
public fun baz(/*0*/ j2: J2): kotlin.Any
|
||||
|
||||
@org.jspecify.nullness.NullMarked public interface J1</*0*/ T> {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public abstract fun foo(): T
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface J2 {
|
||||
public abstract fun bar(): J1<out @org.jspecify.nullness.Nullable kotlin.Any!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
// FIR_IDENTICAL
|
||||
// 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)
|
||||
b.noBoundsNullable(aNotNullNotNullNull)
|
||||
b.noBoundsNullable(aNotNullNullNotNull)
|
||||
b.noBoundsNullable(aNotNullNullNull)
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ aNotNullNotNullNotNull: A<kotlin.Any, kotlin.Any, kotlin.Any>, /*1*/ aNotNullNotNullNull: A<kotlin.Any, kotlin.Any, kotlin.Any?>, /*2*/ aNotNullNullNotNull: A<kotlin.Any, kotlin.Any?, kotlin.Any>, /*3*/ aNotNullNullNull: A<kotlin.Any, kotlin.Any?, kotlin.Any?>, /*4*/ b: WildcardsWithDefault): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : kotlin.Any!, /*1*/ E, /*2*/ F : @org.jspecify.nullness.NullnessUnspecified kotlin.Any!> {
|
||||
public constructor A</*0*/ T : kotlin.Any!, /*1*/ E, /*2*/ F : @org.jspecify.nullness.NullnessUnspecified kotlin.Any!>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class WildcardsWithDefault {
|
||||
public constructor WildcardsWithDefault()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open fun noBoundsNotNull(/*0*/ a: A<*, *, *>): kotlin.Unit
|
||||
public open fun noBoundsNullable(/*0*/ a: A<out @org.jspecify.nullness.Nullable kotlin.Any?, out @org.jspecify.nullness.Nullable kotlin.Any?, out @org.jspecify.nullness.Nullable kotlin.Any?>): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
Vendored
+23
@@ -0,0 +1,23 @@
|
||||
// FIR_IDENTICAL
|
||||
// JSPECIFY_STATE: strict
|
||||
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
|
||||
// FILE: Foo.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public interface Foo {
|
||||
void test(Bar<?> list);
|
||||
}
|
||||
|
||||
// FILE: Bar.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public interface Bar<E extends @Nullable Object> {}
|
||||
|
||||
// FILE: main.kt
|
||||
fun test(foo: Foo, bar: Bar<String?>) {
|
||||
foo.test(<!DEBUG_INFO_EXPRESSION_TYPE("Bar<kotlin.String?>")!>bar<!>)
|
||||
}
|
||||
Vendored
+16
@@ -0,0 +1,16 @@
|
||||
package
|
||||
|
||||
public fun test(/*0*/ foo: Foo, /*1*/ bar: Bar<kotlin.String?>): kotlin.Unit
|
||||
|
||||
@org.jspecify.nullness.NullMarked public interface Bar</*0*/ E> {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public interface Foo {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public abstract fun test(/*0*/ list: Bar<*>): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+137
@@ -0,0 +1,137 @@
|
||||
// JSPECIFY_STATE: strict
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
|
||||
// FILE: Foo.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public interface Foo<T extends @Nullable Object> {}
|
||||
|
||||
// FILE: Util.java
|
||||
public class Util {
|
||||
public static Foo<String> getFooOfString() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: UtilNullMarked.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class UtilNullMarked {
|
||||
public static Foo<String> getFooOfString() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: UtilNullMarkedGeneric.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class UtilNullMarkedGeneric {
|
||||
public static <K> Foo<K> getFooOfK() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: UtilNullMarkedGenericNullableBound.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class UtilNullMarkedGenericNullableBound {
|
||||
public static <K extends @Nullable Object> Foo<K> getFooOfK() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: UtilGenericNullableBound.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class UtilGenericNullableBound {
|
||||
public static <K extends @Nullable Object> Foo<K> getFooOfK() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: UtilNullMarkedGenericNullnessUnspecifiedBound.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class UtilNullMarkedGenericNullnessUnspecifiedBound {
|
||||
public static <K extends @NullnessUnspecified Object> Foo<K> getFooOfK() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: UtilGenericNullnessUnspecifiedBound.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class UtilGenericNullnessUnspecifiedBound {
|
||||
public static <K extends @NullnessUnspecified Object> Foo<K> getFooOfK() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
// no errors on this call means String in Foo is flexible
|
||||
fun isNotNullAndNullableStringInFoo(x: Foo<String>, y: Foo<String?>) {}
|
||||
|
||||
fun test1() {
|
||||
// String in Foo is flexible
|
||||
isNotNullAndNullableStringInFoo(
|
||||
Util.getFooOfString(),
|
||||
Util.getFooOfString()
|
||||
)
|
||||
}
|
||||
|
||||
fun test2() {
|
||||
// String in Foo is not null
|
||||
isNotNullAndNullableStringInFoo(
|
||||
UtilNullMarked.getFooOfString(),
|
||||
// jspecify_nullness_mismatch
|
||||
<!ARGUMENT_TYPE_MISMATCH!>UtilNullMarked.getFooOfString()<!>
|
||||
)
|
||||
}
|
||||
|
||||
fun test3() {
|
||||
// String in Foo is not null
|
||||
isNotNullAndNullableStringInFoo(
|
||||
UtilNullMarkedGeneric.getFooOfK(),
|
||||
// jspecify_nullness_mismatch
|
||||
<!ARGUMENT_TYPE_MISMATCH!>UtilNullMarkedGeneric.getFooOfK()<!>
|
||||
)
|
||||
}
|
||||
|
||||
fun test4() {
|
||||
// String in Foo is flexible
|
||||
isNotNullAndNullableStringInFoo(
|
||||
UtilNullMarkedGenericNullableBound.getFooOfK(),
|
||||
UtilNullMarkedGenericNullableBound.getFooOfK()
|
||||
)
|
||||
}
|
||||
|
||||
fun test5() {
|
||||
// String in Foo is flexible
|
||||
isNotNullAndNullableStringInFoo(
|
||||
UtilGenericNullableBound.getFooOfK(),
|
||||
UtilGenericNullableBound.getFooOfK()
|
||||
)
|
||||
}
|
||||
|
||||
fun test6() {
|
||||
// String in Foo is flexible
|
||||
isNotNullAndNullableStringInFoo(
|
||||
UtilNullMarkedGenericNullnessUnspecifiedBound.getFooOfK(),
|
||||
UtilNullMarkedGenericNullnessUnspecifiedBound.getFooOfK()
|
||||
)
|
||||
}
|
||||
|
||||
fun test7() {
|
||||
// String in Foo is flexible
|
||||
isNotNullAndNullableStringInFoo(
|
||||
UtilGenericNullnessUnspecifiedBound.getFooOfK(),
|
||||
UtilGenericNullnessUnspecifiedBound.getFooOfK()
|
||||
)
|
||||
}
|
||||
Vendored
+137
@@ -0,0 +1,137 @@
|
||||
// JSPECIFY_STATE: strict
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
|
||||
// FILE: Foo.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public interface Foo<T extends @Nullable Object> {}
|
||||
|
||||
// FILE: Util.java
|
||||
public class Util {
|
||||
public static Foo<String> getFooOfString() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: UtilNullMarked.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class UtilNullMarked {
|
||||
public static Foo<String> getFooOfString() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: UtilNullMarkedGeneric.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class UtilNullMarkedGeneric {
|
||||
public static <K> Foo<K> getFooOfK() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: UtilNullMarkedGenericNullableBound.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class UtilNullMarkedGenericNullableBound {
|
||||
public static <K extends @Nullable Object> Foo<K> getFooOfK() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: UtilGenericNullableBound.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class UtilGenericNullableBound {
|
||||
public static <K extends @Nullable Object> Foo<K> getFooOfK() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: UtilNullMarkedGenericNullnessUnspecifiedBound.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class UtilNullMarkedGenericNullnessUnspecifiedBound {
|
||||
public static <K extends @NullnessUnspecified Object> Foo<K> getFooOfK() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: UtilGenericNullnessUnspecifiedBound.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class UtilGenericNullnessUnspecifiedBound {
|
||||
public static <K extends @NullnessUnspecified Object> Foo<K> getFooOfK() {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
// no errors on this call means String in Foo is flexible
|
||||
fun isNotNullAndNullableStringInFoo(x: Foo<String>, y: Foo<String?>) {}
|
||||
|
||||
fun test1() {
|
||||
// String in Foo is flexible
|
||||
isNotNullAndNullableStringInFoo(
|
||||
Util.getFooOfString(),
|
||||
Util.getFooOfString()
|
||||
)
|
||||
}
|
||||
|
||||
fun test2() {
|
||||
// String in Foo is not null
|
||||
isNotNullAndNullableStringInFoo(
|
||||
UtilNullMarked.getFooOfString(),
|
||||
// jspecify_nullness_mismatch
|
||||
<!TYPE_MISMATCH!>UtilNullMarked.getFooOfString()<!>
|
||||
)
|
||||
}
|
||||
|
||||
fun test3() {
|
||||
// String in Foo is not null
|
||||
isNotNullAndNullableStringInFoo(
|
||||
UtilNullMarkedGeneric.getFooOfK(),
|
||||
// jspecify_nullness_mismatch
|
||||
<!TYPE_MISMATCH!>UtilNullMarkedGeneric.getFooOfK()<!>
|
||||
)
|
||||
}
|
||||
|
||||
fun test4() {
|
||||
// String in Foo is flexible
|
||||
isNotNullAndNullableStringInFoo(
|
||||
UtilNullMarkedGenericNullableBound.getFooOfK(),
|
||||
UtilNullMarkedGenericNullableBound.getFooOfK()
|
||||
)
|
||||
}
|
||||
|
||||
fun test5() {
|
||||
// String in Foo is flexible
|
||||
isNotNullAndNullableStringInFoo(
|
||||
UtilGenericNullableBound.getFooOfK(),
|
||||
UtilGenericNullableBound.getFooOfK()
|
||||
)
|
||||
}
|
||||
|
||||
fun test6() {
|
||||
// String in Foo is flexible
|
||||
isNotNullAndNullableStringInFoo(
|
||||
UtilNullMarkedGenericNullnessUnspecifiedBound.getFooOfK(),
|
||||
UtilNullMarkedGenericNullnessUnspecifiedBound.getFooOfK()
|
||||
)
|
||||
}
|
||||
|
||||
fun test7() {
|
||||
// String in Foo is flexible
|
||||
isNotNullAndNullableStringInFoo(
|
||||
UtilGenericNullnessUnspecifiedBound.getFooOfK(),
|
||||
UtilGenericNullnessUnspecifiedBound.getFooOfK()
|
||||
)
|
||||
}
|
||||
Vendored
+87
@@ -0,0 +1,87 @@
|
||||
package
|
||||
|
||||
public fun isNotNullAndNullableStringInFoo(/*0*/ x: Foo<kotlin.String>, /*1*/ y: Foo<kotlin.String?>): kotlin.Unit
|
||||
public fun test1(): kotlin.Unit
|
||||
public fun test2(): kotlin.Unit
|
||||
public fun test3(): kotlin.Unit
|
||||
public fun test4(): kotlin.Unit
|
||||
public fun test5(): kotlin.Unit
|
||||
public fun test6(): kotlin.Unit
|
||||
public fun test7(): kotlin.Unit
|
||||
|
||||
public interface Foo</*0*/ T> {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Util {
|
||||
public constructor Util()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public open fun getFooOfString(): Foo<kotlin.String!>!
|
||||
}
|
||||
|
||||
public open class UtilGenericNullableBound {
|
||||
public constructor UtilGenericNullableBound()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public open fun </*0*/ K> getFooOfK(): Foo<K>!
|
||||
}
|
||||
|
||||
public open class UtilGenericNullnessUnspecifiedBound {
|
||||
public constructor UtilGenericNullnessUnspecifiedBound()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public open fun </*0*/ K : @org.jspecify.nullness.NullnessUnspecified kotlin.Any!> getFooOfK(): Foo<K!>!
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class UtilNullMarked {
|
||||
public constructor UtilNullMarked()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public open fun getFooOfString(): Foo<kotlin.String>
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class UtilNullMarkedGeneric {
|
||||
public constructor UtilNullMarkedGeneric()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public open fun </*0*/ K : kotlin.Any> getFooOfK(): Foo<K>
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class UtilNullMarkedGenericNullableBound {
|
||||
public constructor UtilNullMarkedGenericNullableBound()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public open fun </*0*/ K> getFooOfK(): Foo<K>
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class UtilNullMarkedGenericNullnessUnspecifiedBound {
|
||||
public constructor UtilNullMarkedGenericNullnessUnspecifiedBound()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public open fun </*0*/ K : @org.jspecify.nullness.NullnessUnspecified kotlin.Any!> getFooOfK(): Foo<K>
|
||||
}
|
||||
|
||||
Vendored
+19
@@ -0,0 +1,19 @@
|
||||
// FIR_IDENTICAL
|
||||
// JSPECIFY_STATE: strict
|
||||
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
|
||||
// FILE: Foo.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class Foo<T extends @Nullable Object> {
|
||||
static <T extends Comparable> Foo<T> create() {
|
||||
return new Foo<>();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun test(): Foo<String> {
|
||||
return <!DEBUG_INFO_EXPRESSION_TYPE("Foo<kotlin.String>")!>Foo.create()<!>
|
||||
}
|
||||
Vendored
+14
@@ -0,0 +1,14 @@
|
||||
package
|
||||
|
||||
public fun test(): Foo<kotlin.String>
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class Foo</*0*/ T> {
|
||||
public constructor Foo</*0*/ T>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public/*package*/ open fun </*0*/ T : (kotlin.Comparable<(raw) kotlin.Any?>..kotlin.Comparable<kotlin.Nothing>?)> create(): Foo<T>
|
||||
}
|
||||
|
||||
Vendored
+35
@@ -0,0 +1,35 @@
|
||||
// FIR_IDENTICAL
|
||||
// JSR305_GLOBAL_REPORT: strict
|
||||
// JSPECIFY_STATE: strict
|
||||
// WITH_STDLIB
|
||||
// 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
|
||||
}
|
||||
+89
@@ -0,0 +1,89 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
|
||||
// FILE: AnnotatedBoundsOfWildcard.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class AnnotatedBoundsOfWildcard {
|
||||
public void superAsIs(Test<? super Base, ? super @Nullable Base, ? super @NullnessUnspecified Base> a) {}
|
||||
public void superNotNull(Test<? super Base, ? super Base, ? super Base> a) {}
|
||||
public void superNullable(Test<? super @Nullable Base, ? super @Nullable Base, ? super @Nullable Base> a) {}
|
||||
|
||||
public void extendsAsIs(Test<? extends Base, ? extends @Nullable Base, ? extends @NullnessUnspecified Base> a) {}
|
||||
public void extendsNotNull(Test<? extends Base, ? extends Base, ? extends Base> a) {}
|
||||
public void extendsNullable(Test<? extends @Nullable Base, ? extends @Nullable Base, ? extends @Nullable Base> a) {}
|
||||
|
||||
public void noBounds(Test<? extends @NullnessUnspecified Object, ? extends @NullnessUnspecified Object, ? extends @NullnessUnspecified Object> a) {}
|
||||
}
|
||||
|
||||
// FILE: Base.java
|
||||
public class Base {}
|
||||
|
||||
// FILE: Derived.java
|
||||
public class Derived extends Base {}
|
||||
|
||||
// FILE: Test.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class Test<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> { }
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(
|
||||
aNotNullNotNullNotNull: Test<Derived, Derived, Derived>,
|
||||
aNotNullNotNullNull: Test<Derived, Derived, Derived?>,
|
||||
aNotNullNullNotNull: Test<Derived, Derived?, Derived>,
|
||||
aNotNullNullNull: Test<Derived, Derived?, Derived?>,
|
||||
|
||||
aAnyNotNullNotNullNotNull: Test<Any, Any, Any>,
|
||||
aAnyNotNullNotNullNull: Test<Any, Any, Any?>,
|
||||
aAnyNotNullNullNotNull: Test<Any, Any?, Any>,
|
||||
aAnyNotNullNullNull: Test<Any, Any?, Any?>,
|
||||
|
||||
b: AnnotatedBoundsOfWildcard
|
||||
): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
b.superAsIs(aAnyNotNullNotNullNotNull)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superAsIs(aAnyNotNullNotNullNull)
|
||||
b.superAsIs(aAnyNotNullNullNotNull)
|
||||
b.superAsIs(aAnyNotNullNullNull)
|
||||
|
||||
b.superNotNull(aAnyNotNullNotNullNotNull)
|
||||
b.superNotNull(aAnyNotNullNotNullNull)
|
||||
b.superNotNull(aAnyNotNullNullNotNull)
|
||||
b.superNotNull(aAnyNotNullNullNull)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(aAnyNotNullNotNullNotNull)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(aAnyNotNullNotNullNull)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(aAnyNotNullNullNotNull)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(aAnyNotNullNullNull)
|
||||
|
||||
b.extendsAsIs(aNotNullNotNullNotNull)
|
||||
b.extendsAsIs(aNotNullNotNullNull)
|
||||
b.extendsAsIs(aNotNullNullNotNull)
|
||||
b.extendsAsIs(aNotNullNullNull)
|
||||
|
||||
b.extendsNotNull(aNotNullNotNullNotNull)
|
||||
// jspecify_nullness_mismatch
|
||||
b.extendsNotNull(aNotNullNotNullNull)
|
||||
// jspecify_nullness_mismatch
|
||||
b.extendsNotNull(aNotNullNullNotNull)
|
||||
// jspecify_nullness_mismatch
|
||||
b.extendsNotNull(aNotNullNullNull)
|
||||
|
||||
b.extendsNullable(aNotNullNotNullNotNull)
|
||||
b.extendsNullable(aNotNullNotNullNull)
|
||||
b.extendsNullable(aNotNullNullNotNull)
|
||||
b.extendsNullable(aNotNullNullNull)
|
||||
|
||||
b.noBounds(aNotNullNotNullNotNull)
|
||||
b.noBounds(aNotNullNotNullNull)
|
||||
b.noBounds(aNotNullNullNotNull)
|
||||
b.noBounds(aNotNullNullNull)
|
||||
}
|
||||
+89
@@ -0,0 +1,89 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
|
||||
// FILE: AnnotatedBoundsOfWildcard.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class AnnotatedBoundsOfWildcard {
|
||||
public void superAsIs(Test<? super Base, ? super @Nullable Base, ? super @NullnessUnspecified Base> a) {}
|
||||
public void superNotNull(Test<? super Base, ? super Base, ? super Base> a) {}
|
||||
public void superNullable(Test<? super @Nullable Base, ? super @Nullable Base, ? super @Nullable Base> a) {}
|
||||
|
||||
public void extendsAsIs(Test<? extends Base, ? extends @Nullable Base, ? extends @NullnessUnspecified Base> a) {}
|
||||
public void extendsNotNull(Test<? extends Base, ? extends Base, ? extends Base> a) {}
|
||||
public void extendsNullable(Test<? extends @Nullable Base, ? extends @Nullable Base, ? extends @Nullable Base> a) {}
|
||||
|
||||
public void noBounds(Test<? extends @NullnessUnspecified Object, ? extends @NullnessUnspecified Object, ? extends @NullnessUnspecified Object> a) {}
|
||||
}
|
||||
|
||||
// FILE: Base.java
|
||||
public class Base {}
|
||||
|
||||
// FILE: Derived.java
|
||||
public class Derived extends Base {}
|
||||
|
||||
// FILE: Test.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class Test<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> { }
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(
|
||||
aNotNullNotNullNotNull: Test<Derived, Derived, Derived>,
|
||||
aNotNullNotNullNull: Test<Derived, Derived, Derived?>,
|
||||
aNotNullNullNotNull: Test<Derived, Derived?, Derived>,
|
||||
aNotNullNullNull: Test<Derived, Derived?, Derived?>,
|
||||
|
||||
aAnyNotNullNotNullNotNull: Test<Any, Any, Any>,
|
||||
aAnyNotNullNotNullNull: Test<Any, Any, Any?>,
|
||||
aAnyNotNullNullNotNull: Test<Any, Any?, Any>,
|
||||
aAnyNotNullNullNull: Test<Any, Any?, Any?>,
|
||||
|
||||
b: AnnotatedBoundsOfWildcard
|
||||
): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
b.superAsIs(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>aAnyNotNullNotNullNotNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superAsIs(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>aAnyNotNullNotNullNull<!>)
|
||||
b.superAsIs(aAnyNotNullNullNotNull)
|
||||
b.superAsIs(aAnyNotNullNullNull)
|
||||
|
||||
b.superNotNull(aAnyNotNullNotNullNotNull)
|
||||
b.superNotNull(aAnyNotNullNotNullNull)
|
||||
b.superNotNull(aAnyNotNullNullNotNull)
|
||||
b.superNotNull(aAnyNotNullNullNull)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>aAnyNotNullNotNullNotNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>aAnyNotNullNotNullNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>aAnyNotNullNullNotNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>aAnyNotNullNullNull<!>)
|
||||
|
||||
b.extendsAsIs(aNotNullNotNullNotNull)
|
||||
b.extendsAsIs(aNotNullNotNullNull)
|
||||
b.extendsAsIs(aNotNullNullNotNull)
|
||||
b.extendsAsIs(aNotNullNullNull)
|
||||
|
||||
b.extendsNotNull(aNotNullNotNullNotNull)
|
||||
// jspecify_nullness_mismatch
|
||||
b.extendsNotNull(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>aNotNullNotNullNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.extendsNotNull(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>aNotNullNullNotNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b.extendsNotNull(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>aNotNullNullNull<!>)
|
||||
|
||||
b.extendsNullable(aNotNullNotNullNotNull)
|
||||
b.extendsNullable(aNotNullNotNullNull)
|
||||
b.extendsNullable(aNotNullNullNotNull)
|
||||
b.extendsNullable(aNotNullNullNull)
|
||||
|
||||
b.noBounds(aNotNullNotNullNotNull)
|
||||
b.noBounds(aNotNullNotNullNull)
|
||||
b.noBounds(aNotNullNullNotNull)
|
||||
b.noBounds(aNotNullNullNull)
|
||||
}
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ aNotNullNotNullNotNull: Test<Derived, Derived, Derived>, /*1*/ aNotNullNotNullNull: Test<Derived, Derived, Derived?>, /*2*/ aNotNullNullNotNull: Test<Derived, Derived?, Derived>, /*3*/ aNotNullNullNull: Test<Derived, Derived?, Derived?>, /*4*/ aAnyNotNullNotNullNotNull: Test<kotlin.Any, kotlin.Any, kotlin.Any>, /*5*/ aAnyNotNullNotNullNull: Test<kotlin.Any, kotlin.Any, kotlin.Any?>, /*6*/ aAnyNotNullNullNotNull: Test<kotlin.Any, kotlin.Any?, kotlin.Any>, /*7*/ aAnyNotNullNullNull: Test<kotlin.Any, kotlin.Any?, kotlin.Any?>, /*8*/ b: AnnotatedBoundsOfWildcard): kotlin.Unit
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class AnnotatedBoundsOfWildcard {
|
||||
public constructor AnnotatedBoundsOfWildcard()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun extendsAsIs(/*0*/ a: Test<out Base!, out @org.jspecify.nullness.Nullable Base!, out @org.jspecify.nullness.NullnessUnspecified Base!>!): kotlin.Unit
|
||||
public open fun extendsNotNull(/*0*/ a: Test<out Base!, out Base!, out Base!>!): kotlin.Unit
|
||||
public open fun extendsNullable(/*0*/ a: Test<out @org.jspecify.nullness.Nullable Base!, out @org.jspecify.nullness.Nullable Base!, out @org.jspecify.nullness.Nullable Base!>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open fun noBounds(/*0*/ a: Test<out @org.jspecify.nullness.NullnessUnspecified kotlin.Any!, out @org.jspecify.nullness.NullnessUnspecified kotlin.Any!, out @org.jspecify.nullness.NullnessUnspecified kotlin.Any!>!): kotlin.Unit
|
||||
public open fun superAsIs(/*0*/ a: Test<in Base!, in @org.jspecify.nullness.Nullable Base!, in @org.jspecify.nullness.NullnessUnspecified Base!>!): kotlin.Unit
|
||||
public open fun superNotNull(/*0*/ a: Test<in Base!, in Base!, in Base!>!): kotlin.Unit
|
||||
public open fun superNullable(/*0*/ a: Test<in @org.jspecify.nullness.Nullable Base!, in @org.jspecify.nullness.Nullable Base!, in @org.jspecify.nullness.Nullable Base!>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Base {
|
||||
public constructor Base()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Derived : Base {
|
||||
public constructor Derived()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class Test</*0*/ T : kotlin.Any!, /*1*/ E : @org.jspecify.nullness.Nullable kotlin.Any!, /*2*/ F : @org.jspecify.nullness.NullnessUnspecified kotlin.Any!> {
|
||||
public constructor Test</*0*/ T : kotlin.Any!, /*1*/ E : @org.jspecify.nullness.Nullable kotlin.Any!, /*2*/ F : @org.jspecify.nullness.NullnessUnspecified kotlin.Any!>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
Vendored
+18
@@ -0,0 +1,18 @@
|
||||
// FIR_IDENTICAL
|
||||
// JSPECIFY_STATE: warn
|
||||
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
|
||||
// FILE: J1.java
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public interface J1<T> {
|
||||
@Nullable
|
||||
public static <T> T foo(J1<T> x) { return null; }
|
||||
}
|
||||
|
||||
// FILE: J2.java
|
||||
import org.jspecify.nullness.Nullable;
|
||||
|
||||
public interface J2<V extends @Nullable Object> extends J1<V> { }
|
||||
|
||||
// FILE: kotlin.kt
|
||||
private fun J2<*>.bar() = J1.foo(this)
|
||||
Vendored
+18
@@ -0,0 +1,18 @@
|
||||
package
|
||||
|
||||
private fun J2<*>.bar(): @org.jspecify.nullness.Nullable kotlin.Any?
|
||||
|
||||
public interface J1</*0*/ T : kotlin.Any!> {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
@org.jetbrains.annotations.Nullable public open fun </*0*/ T : kotlin.Any!> foo(/*0*/ x: J1<T!>!): @org.jetbrains.annotations.Nullable T?
|
||||
}
|
||||
|
||||
public interface J2</*0*/ V : @org.jspecify.nullness.Nullable kotlin.Any!> : J1<V!> {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
|
||||
// FILE: Defaults.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class Defaults {
|
||||
public Foo defaultField = null;
|
||||
@Nullable public Foo field = null;
|
||||
|
||||
public Foo everythingNotNullable(Foo x) { return null; }
|
||||
|
||||
public @Nullable Foo everythingNullable(@Nullable Foo x) { return null; }
|
||||
|
||||
public @NullnessUnspecified Foo everythingUnknown(@NullnessUnspecified Foo x) { return null; }
|
||||
|
||||
public @Nullable Foo mixed(Foo x) { return null; }
|
||||
|
||||
public Foo explicitlyNullnessUnspecified(@NullnessUnspecified Foo x) { return null; }
|
||||
}
|
||||
|
||||
// FILE: Foo.java
|
||||
public class Foo {
|
||||
public Object foo() { return null; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(a: Defaults, x: Foo): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
a.everythingNotNullable(null).foo()
|
||||
a.everythingNotNullable(x).foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a.everythingNullable(null).foo()
|
||||
|
||||
a.everythingUnknown(null).foo()
|
||||
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a.mixed(null).foo()
|
||||
// jspecify_nullness_mismatch
|
||||
a.mixed(x).foo()
|
||||
|
||||
a.explicitlyNullnessUnspecified(x).foo()
|
||||
a.explicitlyNullnessUnspecified(null).foo()
|
||||
|
||||
a.defaultField.foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a.field.foo()
|
||||
}
|
||||
Vendored
+50
@@ -0,0 +1,50 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
|
||||
// FILE: Defaults.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class Defaults {
|
||||
public Foo defaultField = null;
|
||||
@Nullable public Foo field = null;
|
||||
|
||||
public Foo everythingNotNullable(Foo x) { return null; }
|
||||
|
||||
public @Nullable Foo everythingNullable(@Nullable Foo x) { return null; }
|
||||
|
||||
public @NullnessUnspecified Foo everythingUnknown(@NullnessUnspecified Foo x) { return null; }
|
||||
|
||||
public @Nullable Foo mixed(Foo x) { return null; }
|
||||
|
||||
public Foo explicitlyNullnessUnspecified(@NullnessUnspecified Foo x) { return null; }
|
||||
}
|
||||
|
||||
// FILE: Foo.java
|
||||
public class Foo {
|
||||
public Object foo() { return null; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(a: Defaults, x: Foo): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
a.everythingNotNullable(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>).foo()
|
||||
a.everythingNotNullable(x).foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.everythingNullable(null)<!>.foo()
|
||||
|
||||
a.everythingUnknown(null).foo()
|
||||
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.mixed(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)<!>.foo()
|
||||
// jspecify_nullness_mismatch
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.mixed(x)<!>.foo()
|
||||
|
||||
a.explicitlyNullnessUnspecified(x).foo()
|
||||
a.explicitlyNullnessUnspecified(null).foo()
|
||||
|
||||
a.defaultField.foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.field<!>.foo()
|
||||
}
|
||||
Vendored
+26
@@ -0,0 +1,26 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a: Defaults, /*1*/ x: Foo): kotlin.Unit
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class Defaults {
|
||||
public constructor Defaults()
|
||||
public final var defaultField: Foo!
|
||||
@org.jspecify.nullness.Nullable public final var field: @org.jspecify.nullness.Nullable Foo!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun everythingNotNullable(/*0*/ x: Foo!): Foo!
|
||||
@org.jspecify.nullness.Nullable public open fun everythingNullable(/*0*/ @org.jspecify.nullness.Nullable x: @org.jspecify.nullness.Nullable Foo!): @org.jspecify.nullness.Nullable Foo!
|
||||
@org.jspecify.nullness.NullnessUnspecified public open fun everythingUnknown(/*0*/ @org.jspecify.nullness.NullnessUnspecified x: @org.jspecify.nullness.NullnessUnspecified Foo!): @org.jspecify.nullness.NullnessUnspecified Foo!
|
||||
public open fun explicitlyNullnessUnspecified(/*0*/ @org.jspecify.nullness.NullnessUnspecified x: @org.jspecify.nullness.NullnessUnspecified Foo!): Foo!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
@org.jspecify.nullness.Nullable public open fun mixed(/*0*/ x: Foo!): @org.jspecify.nullness.Nullable Foo!
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Foo {
|
||||
public constructor Foo()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(): kotlin.Any!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
|
||||
// FILE: IgnoreAnnotations.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class IgnoreAnnotations {
|
||||
@Nullable public Derived field = null;
|
||||
|
||||
@Nullable
|
||||
public Derived foo(Derived x, @NullnessUnspecified Base y) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Derived everythingNotNullable(Derived x) { return null; }
|
||||
|
||||
public @Nullable Derived everythingNullable(@Nullable Derived x) { return null; }
|
||||
|
||||
public @NullnessUnspecified Derived everythingUnknown(@NullnessUnspecified Derived x) { return null; }
|
||||
}
|
||||
|
||||
// FILE: Base.java
|
||||
public class Base {
|
||||
void foo() {}
|
||||
}
|
||||
|
||||
// FILE: Derived.java
|
||||
public class Derived extends Base { }
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(a: IgnoreAnnotations, x: Derived): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
a.foo(x, null).foo()
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a.foo(null, x).foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a.field.foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a.everythingNotNullable(null).foo()
|
||||
a.everythingNotNullable(x).foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a.everythingNullable(null).foo()
|
||||
|
||||
a.everythingUnknown(null).foo()
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
|
||||
// FILE: IgnoreAnnotations.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class IgnoreAnnotations {
|
||||
@Nullable public Derived field = null;
|
||||
|
||||
@Nullable
|
||||
public Derived foo(Derived x, @NullnessUnspecified Base y) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Derived everythingNotNullable(Derived x) { return null; }
|
||||
|
||||
public @Nullable Derived everythingNullable(@Nullable Derived x) { return null; }
|
||||
|
||||
public @NullnessUnspecified Derived everythingUnknown(@NullnessUnspecified Derived x) { return null; }
|
||||
}
|
||||
|
||||
// FILE: Base.java
|
||||
public class Base {
|
||||
void foo() {}
|
||||
}
|
||||
|
||||
// FILE: Derived.java
|
||||
public class Derived extends Base { }
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(a: IgnoreAnnotations, x: Derived): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.foo(x, null)<!>.foo()
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.foo(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>, x)<!>.foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.field<!>.foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a.everythingNotNullable(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>).foo()
|
||||
a.everythingNotNullable(x).foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.everythingNullable(null)<!>.foo()
|
||||
|
||||
a.everythingUnknown(null).foo()
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a: IgnoreAnnotations, /*1*/ x: Derived): kotlin.Unit
|
||||
|
||||
public open class Base {
|
||||
public constructor Base()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public/*package*/ open fun foo(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Derived : Base {
|
||||
public constructor Derived()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public/*package*/ open override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class IgnoreAnnotations {
|
||||
public constructor IgnoreAnnotations()
|
||||
@org.jspecify.nullness.Nullable public final var field: @org.jspecify.nullness.Nullable Derived!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun everythingNotNullable(/*0*/ x: Derived!): Derived!
|
||||
@org.jspecify.nullness.Nullable public open fun everythingNullable(/*0*/ @org.jspecify.nullness.Nullable x: @org.jspecify.nullness.Nullable Derived!): @org.jspecify.nullness.Nullable Derived!
|
||||
@org.jspecify.nullness.NullnessUnspecified public open fun everythingUnknown(/*0*/ @org.jspecify.nullness.NullnessUnspecified x: @org.jspecify.nullness.NullnessUnspecified Derived!): @org.jspecify.nullness.NullnessUnspecified Derived!
|
||||
@org.jspecify.nullness.Nullable public open fun foo(/*0*/ x: Derived!, /*1*/ @org.jspecify.nullness.NullnessUnspecified y: @org.jspecify.nullness.NullnessUnspecified Base!): @org.jspecify.nullness.Nullable Derived!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
|
||||
// FILE: NonPlatformTypeParameter.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class NonPlatformTypeParameter<T extends @Nullable Object> {
|
||||
public void foo(T t) {}
|
||||
public <E extends @Nullable Object> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
fun <T : Test> main(a1: NonPlatformTypeParameter<Any?>, a2: NonPlatformTypeParameter<Test>, x: T): Unit {
|
||||
a1.foo(null)
|
||||
a1.bar<Test?>(null)
|
||||
// jspecify_nullness_mismatch
|
||||
a1.bar<T>(null)
|
||||
a1.bar<T>(x)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a2.foo(null)
|
||||
a2.bar<Test?>(null)
|
||||
// jspecify_nullness_mismatch
|
||||
a2.bar<T>(null)
|
||||
a2.bar<T>(x)
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
|
||||
// FILE: NonPlatformTypeParameter.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class NonPlatformTypeParameter<T extends @Nullable Object> {
|
||||
public void foo(T t) {}
|
||||
public <E extends @Nullable Object> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
fun <T : Test> main(a1: NonPlatformTypeParameter<Any?>, a2: NonPlatformTypeParameter<Test>, x: T): Unit {
|
||||
a1.foo(null)
|
||||
a1.bar<Test?>(null)
|
||||
// jspecify_nullness_mismatch
|
||||
a1.bar<T>(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
a1.bar<T>(x)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a2.foo(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
a2.bar<Test?>(null)
|
||||
// jspecify_nullness_mismatch
|
||||
a2.bar<T>(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
a2.bar<T>(x)
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package
|
||||
|
||||
public fun </*0*/ T : Test> main(/*0*/ a1: NonPlatformTypeParameter<kotlin.Any?>, /*1*/ a2: NonPlatformTypeParameter<Test>, /*2*/ x: T): kotlin.Unit
|
||||
|
||||
public open class NonPlatformTypeParameter</*0*/ T : @org.jspecify.nullness.Nullable kotlin.Any!> {
|
||||
public constructor NonPlatformTypeParameter</*0*/ T : @org.jspecify.nullness.Nullable kotlin.Any!>()
|
||||
public open fun </*0*/ E : @org.jspecify.nullness.Nullable kotlin.Any!> bar(/*0*/ e: E!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ t: T!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Test {
|
||||
public constructor Test()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
// FILE: NullnessUnspecifiedTypeParameter.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class NullnessUnspecifiedTypeParameter<T> {
|
||||
public void foo(T t) {}
|
||||
|
||||
public void bar(Test s, T t) {} // t should not become not nullable
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
// jspecify_nullness_mismatch
|
||||
fun main(a1: NullnessUnspecifiedTypeParameter<Any>, a2: NullnessUnspecifiedTypeParameter<Any?>, x: Test): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
a1.foo(null)
|
||||
a1.foo(1)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a2.foo(null)
|
||||
a2.foo(1)
|
||||
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a1.bar(null, null)
|
||||
// jspecify_nullness_mismatch
|
||||
a1.bar(x, null)
|
||||
a1.bar(x, 1)
|
||||
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a2.bar(null, null)
|
||||
// jspecify_nullness_mismatch
|
||||
a2.bar(x, null)
|
||||
a2.bar(x, 1)
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
// FILE: NullnessUnspecifiedTypeParameter.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class NullnessUnspecifiedTypeParameter<T> {
|
||||
public void foo(T t) {}
|
||||
|
||||
public void bar(Test s, T t) {} // t should not become not nullable
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
// jspecify_nullness_mismatch
|
||||
fun main(a1: NullnessUnspecifiedTypeParameter<Any>, a2: NullnessUnspecifiedTypeParameter<<!UPPER_BOUND_VIOLATED_BASED_ON_JAVA_ANNOTATIONS!>Any?<!>>, x: Test): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
a1.foo(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
a1.foo(1)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a2.foo(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
a2.foo(1)
|
||||
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a1.bar(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>, <!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
a1.bar(x, <!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
a1.bar(x, 1)
|
||||
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a2.bar(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>, <!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
a2.bar(x, <!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
a2.bar(x, 1)
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a1: NullnessUnspecifiedTypeParameter<kotlin.Any>, /*1*/ a2: NullnessUnspecifiedTypeParameter<kotlin.Any?>, /*2*/ x: Test): kotlin.Unit
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class NullnessUnspecifiedTypeParameter</*0*/ T : kotlin.Any!> {
|
||||
public constructor NullnessUnspecifiedTypeParameter</*0*/ T : kotlin.Any!>()
|
||||
public open fun bar(/*0*/ s: Test!, /*1*/ t: T!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ t: T!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Test {
|
||||
public constructor Test()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
|
||||
// FILE: Foo.java
|
||||
public interface Foo {}
|
||||
// FILE: BaseClass.java
|
||||
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class BaseClass {
|
||||
public Foo everythingNotNullable(Foo x) { return null; }
|
||||
|
||||
public @Nullable Foo everythingNullable(@Nullable Foo x) { return null; }
|
||||
|
||||
public @NullnessUnspecified Foo everythingUnknown(@NullnessUnspecified Foo x) { return null; }
|
||||
|
||||
public @Nullable Foo mixed(Foo x) { return null; }
|
||||
|
||||
public Foo explicitlyNullnessUnspecified(@NullnessUnspecified Foo x) { return null; }
|
||||
}
|
||||
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
private val FOO = object : Foo {}
|
||||
|
||||
class Correct : BaseClass() {
|
||||
override fun everythingNotNullable(x: Foo): Foo {
|
||||
return FOO
|
||||
}
|
||||
|
||||
override fun everythingNullable(x: Foo?): Foo? {
|
||||
return null
|
||||
}
|
||||
|
||||
override fun everythingUnknown(x: Foo?): Foo? {
|
||||
return null
|
||||
}
|
||||
|
||||
override fun mixed(x: Foo): Foo? {
|
||||
return null
|
||||
}
|
||||
|
||||
override fun explicitlyNullnessUnspecified(x: Foo): Foo {
|
||||
return FOO
|
||||
}
|
||||
}
|
||||
|
||||
class WrongReturnTypes : BaseClass() {
|
||||
override fun everythingNotNullable(x: Foo): Foo? {
|
||||
return null
|
||||
}
|
||||
|
||||
override fun explicitlyNullnessUnspecified(x: Foo): Foo? {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
class WrongParameter : BaseClass() {
|
||||
override fun everythingNotNullable(x: Foo?): Foo {
|
||||
return FOO
|
||||
}
|
||||
|
||||
override fun everythingNullable(x: Foo): Foo? {
|
||||
return null
|
||||
}
|
||||
|
||||
override fun everythingUnknown(x: Foo): Foo? {
|
||||
return null
|
||||
}
|
||||
|
||||
override fun mixed(x: Foo?): Foo? {
|
||||
return null
|
||||
}
|
||||
|
||||
override fun explicitlyNullnessUnspecified(x: Foo?): Foo {
|
||||
return FOO
|
||||
}
|
||||
}
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
|
||||
// FILE: Foo.java
|
||||
public interface Foo {}
|
||||
// FILE: BaseClass.java
|
||||
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class BaseClass {
|
||||
public Foo everythingNotNullable(Foo x) { return null; }
|
||||
|
||||
public @Nullable Foo everythingNullable(@Nullable Foo x) { return null; }
|
||||
|
||||
public @NullnessUnspecified Foo everythingUnknown(@NullnessUnspecified Foo x) { return null; }
|
||||
|
||||
public @Nullable Foo mixed(Foo x) { return null; }
|
||||
|
||||
public Foo explicitlyNullnessUnspecified(@NullnessUnspecified Foo x) { return null; }
|
||||
}
|
||||
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
private val FOO = object : Foo {}
|
||||
|
||||
class Correct : BaseClass() {
|
||||
override fun everythingNotNullable(x: Foo): Foo {
|
||||
return FOO
|
||||
}
|
||||
|
||||
override fun everythingNullable(x: Foo?): Foo? {
|
||||
return null
|
||||
}
|
||||
|
||||
override fun everythingUnknown(x: Foo?): Foo? {
|
||||
return null
|
||||
}
|
||||
|
||||
override fun mixed(x: Foo): Foo? {
|
||||
return null
|
||||
}
|
||||
|
||||
override fun explicitlyNullnessUnspecified(x: Foo): Foo {
|
||||
return FOO
|
||||
}
|
||||
}
|
||||
|
||||
class WrongReturnTypes : BaseClass() {
|
||||
<!WRONG_NULLABILITY_FOR_JAVA_OVERRIDE!>override<!> fun everythingNotNullable(x: Foo): Foo? {
|
||||
return null
|
||||
}
|
||||
|
||||
<!WRONG_NULLABILITY_FOR_JAVA_OVERRIDE!>override<!> fun explicitlyNullnessUnspecified(x: Foo): Foo? {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
class WrongParameter : BaseClass() {
|
||||
<!WRONG_NULLABILITY_FOR_JAVA_OVERRIDE!>override<!> fun everythingNotNullable(x: Foo?): Foo {
|
||||
return FOO
|
||||
}
|
||||
|
||||
<!WRONG_NULLABILITY_FOR_JAVA_OVERRIDE!>override<!> fun everythingNullable(x: Foo): Foo? {
|
||||
return null
|
||||
}
|
||||
|
||||
override fun everythingUnknown(x: Foo): Foo? {
|
||||
return null
|
||||
}
|
||||
|
||||
<!WRONG_NULLABILITY_FOR_JAVA_OVERRIDE!>override<!> fun mixed(x: Foo?): Foo? {
|
||||
return null
|
||||
}
|
||||
|
||||
override fun explicitlyNullnessUnspecified(x: Foo?): Foo {
|
||||
return FOO
|
||||
}
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
package
|
||||
|
||||
private val FOO: FOO.`<no name provided>`
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class BaseClass {
|
||||
public constructor BaseClass()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun everythingNotNullable(/*0*/ x: Foo!): Foo!
|
||||
@org.jspecify.nullness.Nullable public open fun everythingNullable(/*0*/ @org.jspecify.nullness.Nullable x: @org.jspecify.nullness.Nullable Foo!): @org.jspecify.nullness.Nullable Foo!
|
||||
@org.jspecify.nullness.NullnessUnspecified public open fun everythingUnknown(/*0*/ @org.jspecify.nullness.NullnessUnspecified x: @org.jspecify.nullness.NullnessUnspecified Foo!): @org.jspecify.nullness.NullnessUnspecified Foo!
|
||||
public open fun explicitlyNullnessUnspecified(/*0*/ @org.jspecify.nullness.NullnessUnspecified x: @org.jspecify.nullness.NullnessUnspecified Foo!): Foo!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
@org.jspecify.nullness.Nullable public open fun mixed(/*0*/ x: Foo!): @org.jspecify.nullness.Nullable Foo!
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final class Correct : BaseClass {
|
||||
public constructor Correct()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ fun everythingNotNullable(/*0*/ x: Foo): Foo
|
||||
public open override /*1*/ fun everythingNullable(/*0*/ x: Foo?): Foo?
|
||||
public open override /*1*/ fun everythingUnknown(/*0*/ x: Foo?): Foo?
|
||||
public open override /*1*/ fun explicitlyNullnessUnspecified(/*0*/ x: Foo): Foo
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun mixed(/*0*/ x: Foo): Foo?
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface Foo {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final class WrongParameter : BaseClass {
|
||||
public constructor WrongParameter()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ fun everythingNotNullable(/*0*/ x: Foo?): Foo
|
||||
public open override /*1*/ fun everythingNullable(/*0*/ x: Foo): Foo?
|
||||
public open override /*1*/ fun everythingUnknown(/*0*/ x: Foo): Foo?
|
||||
public open override /*1*/ fun explicitlyNullnessUnspecified(/*0*/ x: Foo?): Foo
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun mixed(/*0*/ x: Foo?): Foo?
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final class WrongReturnTypes : BaseClass {
|
||||
public constructor WrongReturnTypes()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ fun everythingNotNullable(/*0*/ x: Foo): Foo?
|
||||
@org.jspecify.nullness.Nullable public open override /*1*/ /*fake_override*/ fun everythingNullable(/*0*/ @org.jspecify.nullness.Nullable x: @org.jspecify.nullness.Nullable Foo!): @org.jspecify.nullness.Nullable Foo!
|
||||
@org.jspecify.nullness.NullnessUnspecified public open override /*1*/ /*fake_override*/ fun everythingUnknown(/*0*/ @org.jspecify.nullness.NullnessUnspecified x: @org.jspecify.nullness.NullnessUnspecified Foo!): @org.jspecify.nullness.NullnessUnspecified Foo!
|
||||
public open override /*1*/ fun explicitlyNullnessUnspecified(/*0*/ x: Foo): Foo?
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
@org.jspecify.nullness.Nullable public open override /*1*/ /*fake_override*/ fun mixed(/*0*/ x: Foo!): @org.jspecify.nullness.Nullable Foo!
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
|
||||
// FILE: SelfType.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class SelfType<T extends SelfType<T>> {
|
||||
public void foo(T t) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
public class B extends SelfType<B> {}
|
||||
|
||||
// FILE: C.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class C<E extends C<E>> extends SelfType<E> {}
|
||||
|
||||
// FILE: AK.java
|
||||
public class AK extends SelfType<AK> {}
|
||||
|
||||
// FILE: AKN.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class AKN extends SelfType<@Nullable AK> {}
|
||||
|
||||
// FILE: BK.java
|
||||
public class BK extends B {}
|
||||
|
||||
// FILE: CK.java
|
||||
public class CK extends C<CK> {}
|
||||
|
||||
// FILE: CKN.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class CKN extends C<@Nullable CK> {}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(ak: AK, akn: AKN, bk: BK, ck: CK, ckn: CKN): Unit {
|
||||
ak.foo(ak)
|
||||
// jspecify_nullness_mismatch
|
||||
ak.foo(null)
|
||||
|
||||
akn.foo(null) // the corresponding warning/error is present on the Java side
|
||||
|
||||
bk.foo(bk)
|
||||
// jspecify_nullness_mismatch
|
||||
bk.foo(null)
|
||||
|
||||
ck.foo(ck)
|
||||
// jspecify_nullness_mismatch
|
||||
ck.foo(null)
|
||||
|
||||
ckn.foo(null) // the corresponding warning/error is present on the Java side
|
||||
}
|
||||
Vendored
+57
@@ -0,0 +1,57 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
|
||||
// FILE: SelfType.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class SelfType<T extends SelfType<T>> {
|
||||
public void foo(T t) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
public class B extends SelfType<B> {}
|
||||
|
||||
// FILE: C.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class C<E extends C<E>> extends SelfType<E> {}
|
||||
|
||||
// FILE: AK.java
|
||||
public class AK extends SelfType<AK> {}
|
||||
|
||||
// FILE: AKN.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class AKN extends SelfType<@Nullable AK> {}
|
||||
|
||||
// FILE: BK.java
|
||||
public class BK extends B {}
|
||||
|
||||
// FILE: CK.java
|
||||
public class CK extends C<CK> {}
|
||||
|
||||
// FILE: CKN.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class CKN extends C<@Nullable CK> {}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(ak: AK, akn: AKN, bk: BK, ck: CK, ckn: CKN): Unit {
|
||||
ak.foo(ak)
|
||||
// jspecify_nullness_mismatch
|
||||
ak.foo(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
|
||||
akn.foo(null) // the corresponding warning/error is present on the Java side
|
||||
|
||||
bk.foo(bk)
|
||||
// jspecify_nullness_mismatch
|
||||
bk.foo(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
|
||||
ck.foo(ck)
|
||||
// jspecify_nullness_mismatch
|
||||
ck.foo(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
|
||||
ckn.foo(null) // the corresponding warning/error is present on the Java side
|
||||
}
|
||||
Vendored
+68
@@ -0,0 +1,68 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ ak: AK, /*1*/ akn: AKN, /*2*/ bk: BK, /*3*/ ck: CK, /*4*/ ckn: CKN): kotlin.Unit
|
||||
|
||||
public open class AK : SelfType<AK!> {
|
||||
public constructor AK()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun foo(/*0*/ t: AK!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class AKN : SelfType<@org.jspecify.nullness.Nullable AK!> {
|
||||
public constructor AKN()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun foo(/*0*/ t: @org.jspecify.nullness.Nullable AK!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class B : SelfType<B!> {
|
||||
public constructor B()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun foo(/*0*/ t: B!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class BK : B {
|
||||
public constructor BK()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun foo(/*0*/ t: B!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class C</*0*/ E : C<E!>!> : SelfType<E!> {
|
||||
public constructor C</*0*/ E : C<E!>!>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun foo(/*0*/ t: E!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class CK : C<CK!> {
|
||||
public constructor CK()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun foo(/*0*/ t: CK!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class CKN : C<@org.jspecify.nullness.Nullable CK!> {
|
||||
public constructor CKN()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun foo(/*0*/ t: @org.jspecify.nullness.Nullable CK!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class SelfType</*0*/ T : SelfType<T!>!> {
|
||||
public constructor SelfType</*0*/ T : SelfType<T!>!>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ t: T!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
Vendored
+39
@@ -0,0 +1,39 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
|
||||
// FILE: Simple.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class Simple {
|
||||
@Nullable public Derived field = null;
|
||||
|
||||
@Nullable
|
||||
public Derived foo(Derived x, @NullnessUnspecified Base y) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Derived bar() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: Base.java
|
||||
public class Base {}
|
||||
|
||||
// FILE: Derived.java
|
||||
public class Derived extends Base {
|
||||
void foo() {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(a: Simple, x: Derived): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
a.foo(x, null).foo()
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
a.foo(null, x).foo()
|
||||
|
||||
a.bar().foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a.field.foo()
|
||||
}
|
||||
Vendored
+39
@@ -0,0 +1,39 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
|
||||
// FILE: Simple.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class Simple {
|
||||
@Nullable public Derived field = null;
|
||||
|
||||
@Nullable
|
||||
public Derived foo(Derived x, @NullnessUnspecified Base y) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Derived bar() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: Base.java
|
||||
public class Base {}
|
||||
|
||||
// FILE: Derived.java
|
||||
public class Derived extends Base {
|
||||
void foo() {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(a: Simple, x: Derived): Unit {
|
||||
// jspecify_nullness_mismatch
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.foo(x, null)<!>.foo()
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.foo(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>, x)<!>.foo()
|
||||
|
||||
a.bar().foo()
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.field<!>.foo()
|
||||
}
|
||||
Vendored
+29
@@ -0,0 +1,29 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a: Simple, /*1*/ x: Derived): kotlin.Unit
|
||||
|
||||
public open class Base {
|
||||
public constructor Base()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Derived : Base {
|
||||
public constructor Derived()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public/*package*/ open fun foo(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class Simple {
|
||||
public constructor Simple()
|
||||
@org.jspecify.nullness.Nullable public final var field: @org.jspecify.nullness.Nullable Derived!
|
||||
public open fun bar(): Derived!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
@org.jspecify.nullness.Nullable public open fun foo(/*0*/ x: Derived!, /*1*/ @org.jspecify.nullness.NullnessUnspecified y: @org.jspecify.nullness.NullnessUnspecified Base!): @org.jspecify.nullness.Nullable Derived!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
|
||||
// FILE: TypeArgumentsFromParameterBounds.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class TypeArgumentsFromParameterBounds<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {}
|
||||
|
||||
// FILE: A.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class A {
|
||||
public void bar(TypeArgumentsFromParameterBounds<Test, Test, Test> a) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class B {
|
||||
public void bar(TypeArgumentsFromParameterBounds<Test, Test, Test> a) {}
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(
|
||||
aNotNullNotNullNotNull: TypeArgumentsFromParameterBounds<Test, Test, Test>,
|
||||
aNotNullNotNullNull: TypeArgumentsFromParameterBounds<Test, Test, Test?>,
|
||||
aNotNullNullNotNull: TypeArgumentsFromParameterBounds<Test, Test?, Test>,
|
||||
aNotNullNullNull: TypeArgumentsFromParameterBounds<Test, Test?, Test?>,
|
||||
a: A, b: B
|
||||
): Unit {
|
||||
a.bar(aNotNullNotNullNotNull)
|
||||
// jspecify_nullness_mismatch
|
||||
a.bar(aNotNullNotNullNull)
|
||||
// jspecify_nullness_mismatch
|
||||
a.bar(aNotNullNullNotNull)
|
||||
// jspecify_nullness_mismatch
|
||||
a.bar(aNotNullNullNull)
|
||||
|
||||
b.bar(aNotNullNotNullNotNull)
|
||||
b.bar(aNotNullNotNullNull)
|
||||
b.bar(aNotNullNullNotNull)
|
||||
b.bar(aNotNullNullNull)
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
// MUTE_FOR_PSI_CLASS_FILES_READING
|
||||
|
||||
// FILE: TypeArgumentsFromParameterBounds.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class TypeArgumentsFromParameterBounds<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {}
|
||||
|
||||
// FILE: A.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class A {
|
||||
public void bar(TypeArgumentsFromParameterBounds<Test, Test, Test> a) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
public class B {
|
||||
public void bar(TypeArgumentsFromParameterBounds<Test, Test, Test> a) {}
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
fun main(
|
||||
aNotNullNotNullNotNull: TypeArgumentsFromParameterBounds<Test, Test, Test>,
|
||||
aNotNullNotNullNull: TypeArgumentsFromParameterBounds<Test, Test, Test?>,
|
||||
aNotNullNullNotNull: TypeArgumentsFromParameterBounds<Test, Test?, Test>,
|
||||
aNotNullNullNull: TypeArgumentsFromParameterBounds<Test, Test?, Test?>,
|
||||
a: A, b: B
|
||||
): Unit {
|
||||
a.bar(aNotNullNotNullNotNull)
|
||||
// jspecify_nullness_mismatch
|
||||
a.bar(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>aNotNullNotNullNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
a.bar(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>aNotNullNullNotNull<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
a.bar(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>aNotNullNullNull<!>)
|
||||
|
||||
b.bar(aNotNullNotNullNotNull)
|
||||
b.bar(aNotNullNotNullNull)
|
||||
b.bar(aNotNullNullNotNull)
|
||||
b.bar(aNotNullNullNull)
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ aNotNullNotNullNotNull: TypeArgumentsFromParameterBounds<Test, Test, Test>, /*1*/ aNotNullNotNullNull: TypeArgumentsFromParameterBounds<Test, Test, Test?>, /*2*/ aNotNullNullNotNull: TypeArgumentsFromParameterBounds<Test, Test?, Test>, /*3*/ aNotNullNullNull: TypeArgumentsFromParameterBounds<Test, Test?, Test?>, /*4*/ a: A, /*5*/ b: B): kotlin.Unit
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class A {
|
||||
public constructor A()
|
||||
public open fun bar(/*0*/ a: TypeArgumentsFromParameterBounds<Test!, Test!, Test!>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class B {
|
||||
public constructor B()
|
||||
public open fun bar(/*0*/ a: TypeArgumentsFromParameterBounds<Test!, Test!, Test!>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Test {
|
||||
public constructor Test()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class TypeArgumentsFromParameterBounds</*0*/ T : kotlin.Any!, /*1*/ E : @org.jspecify.nullness.Nullable kotlin.Any!, /*2*/ F : @org.jspecify.nullness.NullnessUnspecified kotlin.Any!> {
|
||||
public constructor TypeArgumentsFromParameterBounds</*0*/ T : kotlin.Any!, /*1*/ E : @org.jspecify.nullness.Nullable kotlin.Any!, /*2*/ F : @org.jspecify.nullness.NullnessUnspecified kotlin.Any!>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
// FILE: A.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class A<T> {
|
||||
public void foo(@NullnessUnspecified T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
import org.jspecify.nullness.*;
|
||||
@NullMarked
|
||||
public class B<T> {
|
||||
public void foo(T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
fun <T : Test> main(a1: A<Any?>, a2: A<Test>, b1: B<Any?>, b2: B<Test>, x: T): Unit {
|
||||
a1.foo(null)
|
||||
// jspecify_nullness_mismatch
|
||||
a1.bar<T?>(null)
|
||||
a1.bar<T>(x)
|
||||
|
||||
a2.foo(null)
|
||||
// jspecify_nullness_mismatch
|
||||
a2.bar<T?>(null)
|
||||
a2.bar<T>(x)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
b1.foo(null)
|
||||
// jspecify_nullness_mismatch
|
||||
b1.bar<T?>(null)
|
||||
b1.bar<T>(x)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
b2.foo(null)
|
||||
// jspecify_nullness_mismatch
|
||||
b2.bar<T?>(null)
|
||||
b2.bar<T>(x)
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
// FILE: A.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public class A<T> {
|
||||
public void foo(@NullnessUnspecified T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
import org.jspecify.nullness.*;
|
||||
@NullMarked
|
||||
public class B<T> {
|
||||
public void foo(T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: Test.java
|
||||
public class Test {}
|
||||
|
||||
// FILE: main.kt
|
||||
// jspecify_nullness_mismatch, jspecify_nullness_mismatch
|
||||
fun <T : Test> main(a1: A<<!UPPER_BOUND_VIOLATED_BASED_ON_JAVA_ANNOTATIONS!>Any?<!>>, a2: A<Test>, b1: B<<!UPPER_BOUND_VIOLATED_BASED_ON_JAVA_ANNOTATIONS!>Any?<!>>, b2: B<Test>, x: T): Unit {
|
||||
a1.foo(null)
|
||||
// jspecify_nullness_mismatch
|
||||
a1.bar<<!UPPER_BOUND_VIOLATED_BASED_ON_JAVA_ANNOTATIONS!>T?<!>>(null)
|
||||
a1.bar<T>(x)
|
||||
|
||||
a2.foo(null)
|
||||
// jspecify_nullness_mismatch
|
||||
a2.bar<<!UPPER_BOUND_VIOLATED_BASED_ON_JAVA_ANNOTATIONS!>T?<!>>(null)
|
||||
a2.bar<T>(x)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
b1.foo(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b1.bar<<!UPPER_BOUND_VIOLATED_BASED_ON_JAVA_ANNOTATIONS!>T?<!>>(null)
|
||||
b1.bar<T>(x)
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
b2.foo(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)
|
||||
// jspecify_nullness_mismatch
|
||||
b2.bar<<!UPPER_BOUND_VIOLATED_BASED_ON_JAVA_ANNOTATIONS!>T?<!>>(null)
|
||||
b2.bar<T>(x)
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
package
|
||||
|
||||
public fun </*0*/ T : Test> main(/*0*/ a1: A<kotlin.Any?>, /*1*/ a2: A<Test>, /*2*/ b1: B<kotlin.Any?>, /*3*/ b2: B<Test>, /*4*/ x: T): kotlin.Unit
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class A</*0*/ T : kotlin.Any!> {
|
||||
public constructor A</*0*/ T : kotlin.Any!>()
|
||||
public open fun </*0*/ E : kotlin.Any!> bar(/*0*/ e: E!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ @org.jspecify.nullness.NullnessUnspecified t: @org.jspecify.nullness.NullnessUnspecified T!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class B</*0*/ T : kotlin.Any!> {
|
||||
public constructor B</*0*/ T : kotlin.Any!>()
|
||||
public open fun </*0*/ E : kotlin.Any!> bar(/*0*/ e: E!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(/*0*/ t: T!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open class Test {
|
||||
public constructor Test()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
// FIR_IDENTICAL
|
||||
// JSPECIFY_STATE: warn
|
||||
// FILE: J1.java
|
||||
import org.jspecify.nullness.*;
|
||||
|
||||
@NullMarked
|
||||
public interface J1<T extends @Nullable Object> {
|
||||
T foo();
|
||||
}
|
||||
|
||||
// FILE: J2.java
|
||||
public interface J2 {
|
||||
J1<?> bar();
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun baz(j2: J2): Any = j2.bar().foo() // Any..Any?
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
package
|
||||
|
||||
public fun baz(/*0*/ j2: J2): kotlin.Any
|
||||
|
||||
@org.jspecify.nullness.NullMarked public interface J1</*0*/ T : @org.jspecify.nullness.Nullable kotlin.Any!> {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public abstract fun foo(): T!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface J2 {
|
||||
public abstract fun bar(): J1<out @org.jspecify.nullness.Nullable kotlin.Any!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
// FIR_IDENTICAL
|
||||
// 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(aNotNullNotNullNull)
|
||||
b.noBoundsNullable(aNotNullNullNotNull)
|
||||
b.noBoundsNullable(aNotNullNullNull)
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ aNotNullNotNullNotNull: A<kotlin.Any, kotlin.Any, kotlin.Any>, /*1*/ aNotNullNotNullNull: A<kotlin.Any, kotlin.Any, kotlin.Any?>, /*2*/ aNotNullNullNotNull: A<kotlin.Any, kotlin.Any?, kotlin.Any>, /*3*/ aNotNullNullNull: A<kotlin.Any, kotlin.Any?, kotlin.Any?>, /*4*/ b: WildcardsWithDefault): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : kotlin.Any!, /*1*/ E : @org.jspecify.nullness.Nullable kotlin.Any!, /*2*/ F : @org.jspecify.nullness.NullnessUnspecified kotlin.Any!> {
|
||||
public constructor A</*0*/ T : kotlin.Any!, /*1*/ E : @org.jspecify.nullness.Nullable kotlin.Any!, /*2*/ F : @org.jspecify.nullness.NullnessUnspecified kotlin.Any!>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@org.jspecify.nullness.NullMarked public open class WildcardsWithDefault {
|
||||
public constructor WildcardsWithDefault()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open fun noBoundsNotNull(/*0*/ a: A<*, *, *>!): kotlin.Unit
|
||||
public open fun noBoundsNullable(/*0*/ a: A<out @org.jspecify.nullness.Nullable kotlin.Any!, out @org.jspecify.nullness.Nullable kotlin.Any!, out @org.jspecify.nullness.Nullable kotlin.Any!>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecifyOld/warnMode/kt47899.fir.kt
Vendored
+15
@@ -0,0 +1,15 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
|
||||
// FILE: Foo.java
|
||||
import org.jspecify.nullness.Nullable;
|
||||
|
||||
public class Foo {
|
||||
public static <T> void gauge(@Nullable T stateObject) {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun <T> test(metric: T) {
|
||||
if (metric is String) {
|
||||
Foo.gauge(metric)
|
||||
}
|
||||
}
|
||||
Vendored
+15
@@ -0,0 +1,15 @@
|
||||
// JSPECIFY_STATE: warn
|
||||
|
||||
// FILE: Foo.java
|
||||
import org.jspecify.nullness.Nullable;
|
||||
|
||||
public class Foo {
|
||||
public static <T> void gauge(@Nullable T stateObject) {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
fun <T> test(metric: T) {
|
||||
if (metric is String) {
|
||||
Foo.gauge(<!DEBUG_INFO_SMARTCAST!>metric<!>)
|
||||
}
|
||||
}
|
||||
Vendored
+13
@@ -0,0 +1,13 @@
|
||||
package
|
||||
|
||||
public fun </*0*/ T> test(/*0*/ metric: T): kotlin.Unit
|
||||
|
||||
public open class Foo {
|
||||
public constructor Foo()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public open fun </*0*/ T : kotlin.Any!> gauge(/*0*/ @org.jspecify.nullness.Nullable stateObject: @org.jspecify.nullness.Nullable T!): kotlin.Unit
|
||||
}
|
||||
Reference in New Issue
Block a user