Generate foreign annotation test data for FIR

This commit is contained in:
pyos
2021-07-29 15:38:53 +02:00
committed by TeamCityServer
parent 5873511f64
commit 33251f6d50
154 changed files with 9029 additions and 8 deletions
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
// SOURCE_RETENTION_ANNOTATIONS
// FILE: A.java
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
// SOURCE_RETENTION_ANNOTATIONS
// FILE: A.java
@@ -0,0 +1,81 @@
// 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 {
b.superAsIs(aAnyNotNullNotNullNotNull)
b.superAsIs(aAnyNotNullNotNullNull)
b.superAsIs(aAnyNotNullNullNotNull)
b.superAsIs(aAnyNotNullNullNull)
b.superNotNull(aAnyNotNullNotNullNotNull)
b.superNotNull(aAnyNotNullNotNullNull)
b.superNotNull(aAnyNotNullNullNotNull)
b.superNotNull(aAnyNotNullNullNull)
b.superNullable(aAnyNotNullNotNullNotNull)
b.superNullable(aAnyNotNullNotNullNull)
b.superNullable(aAnyNotNullNullNotNull)
b.superNullable(aAnyNotNullNullNull)
b.extendsAsIs(aNotNullNotNullNotNull)
b.extendsAsIs(aNotNullNotNullNull)
b.extendsAsIs(aNotNullNullNotNull)
b.extendsAsIs(aNotNullNullNull)
b.extendsNotNull(aNotNullNotNullNotNull)
b.extendsNotNull(aNotNullNotNullNull)
b.extendsNotNull(aNotNullNullNotNull)
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)
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// JSPECIFY_STATE: strict
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
// FILE: J1.java
@@ -0,0 +1,46 @@
// 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 {
a.everythingNotNullable(<!NULL_FOR_NONNULL_TYPE!>null<!>).foo()
a.everythingNotNullable(x).foo()
a.everythingNullable(null)<!UNSAFE_CALL!>.<!>foo()
a.everythingUnknown(null).foo()
a.mixed(<!NULL_FOR_NONNULL_TYPE!>null<!>)<!UNSAFE_CALL!>.<!>foo()
a.mixed(x)<!UNSAFE_CALL!>.<!>foo()
a.explicitlyNullnessUnspecified(x).foo()
a.explicitlyNullnessUnspecified(null).foo()
a.defaultField.foo()
a.field<!UNSAFE_CALL!>.<!>foo()
}
@@ -0,0 +1,44 @@
// 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 {
a.foo(x, null)<!UNSAFE_CALL!>.<!>foo()
a.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>, x)<!UNSAFE_CALL!>.<!>foo()
a.field<!UNSAFE_CALL!>.<!>foo()
a.everythingNotNullable(<!NULL_FOR_NONNULL_TYPE!>null<!>).foo()
a.everythingNotNullable(x).foo()
a.everythingNullable(null)<!UNSAFE_CALL!>.<!>foo()
a.everythingUnknown(null).foo()
}
@@ -0,0 +1,27 @@
// !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)
a1.bar<T>(null)
a1.bar<T>(x)
a2.foo(null)
a2.bar<Test?>(null)
a2.bar<T>(null)
a2.bar<T>(x)
}
@@ -0,0 +1,31 @@
// 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
fun main(a1: NullnessUnspecifiedTypeParameter<Any>, a2: NullnessUnspecifiedTypeParameter<Any?>, x: Test): Unit {
a1.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
a1.foo(1)
a2.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
a2.foo(1)
a1.bar(<!NULL_FOR_NONNULL_TYPE!>null<!>, <!NULL_FOR_NONNULL_TYPE!>null<!>)
a1.bar(x, <!NULL_FOR_NONNULL_TYPE!>null<!>)
a1.bar(x, 1)
a2.bar(<!NULL_FOR_NONNULL_TYPE!>null<!>, <!NULL_FOR_NONNULL_TYPE!>null<!>)
a2.bar(x, <!NULL_FOR_NONNULL_TYPE!>null<!>)
a2.bar(x, 1)
}
@@ -0,0 +1,53 @@
// 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)
ak.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
akn.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
bk.foo(bk)
bk.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
ck.foo(ck)
ck.foo(null)
ckn.foo(null)
}
@@ -0,0 +1,37 @@
// 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 {
a.foo(x, null)<!UNSAFE_CALL!>.<!>foo()
a.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>, x)<!UNSAFE_CALL!>.<!>foo()
a.bar().foo()
a.field<!UNSAFE_CALL!>.<!>foo()
}
@@ -0,0 +1,46 @@
// 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)
a.bar(aNotNullNotNullNull)
a.bar(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
a.bar(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
b.bar(aNotNullNotNullNotNull)
b.bar(aNotNullNotNullNull)
b.bar(aNotNullNullNotNull)
b.bar(aNotNullNullNull)
}
@@ -0,0 +1,40 @@
// 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
fun <T : Test> main(a1: A<Any?>, a2: A<Test>, b1: B<Any?>, b2: B<Test>, x: T): Unit {
a1.foo(null)
a1.bar<T?>(null)
a1.bar<T>(x)
a2.foo(null)
a2.bar<T?>(null)
a2.bar<T>(x)
b1.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
b1.bar<T?>(null)
b1.bar<T>(x)
b2.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
b2.bar<T?>(null)
b2.bar<T>(x)
}
@@ -0,0 +1,35 @@
// 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)
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// JSPECIFY_STATE: strict
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
// MUTE_FOR_PSI_CLASS_FILES_READING
@@ -0,0 +1,135 @@
// 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(),
UtilNullMarked.getFooOfString()
)
}
fun test3() {
// String in Foo is not null
isNotNullAndNullableStringInFoo(
UtilNullMarkedGeneric.getFooOfK(),
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()
)
}
@@ -0,0 +1,18 @@
// 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..kotlin.String?!>")!>Foo.create()<!>
}
@@ -0,0 +1,80 @@
// 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 {
b.superAsIs(aAnyNotNullNotNullNotNull)
b.superAsIs(aAnyNotNullNotNullNull)
b.superAsIs(aAnyNotNullNullNotNull)
b.superAsIs(aAnyNotNullNullNull)
b.superNotNull(aAnyNotNullNotNullNotNull)
b.superNotNull(aAnyNotNullNotNullNull)
b.superNotNull(aAnyNotNullNullNotNull)
b.superNotNull(aAnyNotNullNullNull)
b.superNullable(aAnyNotNullNotNullNotNull)
b.superNullable(aAnyNotNullNotNullNull)
b.superNullable(aAnyNotNullNullNotNull)
b.superNullable(aAnyNotNullNullNull)
b.extendsAsIs(aNotNullNotNullNotNull)
b.extendsAsIs(aNotNullNotNullNull)
b.extendsAsIs(aNotNullNullNotNull)
b.extendsAsIs(aNotNullNullNull)
b.extendsNotNull(aNotNullNotNullNotNull)
b.extendsNotNull(aNotNullNotNullNull)
b.extendsNotNull(aNotNullNullNotNull)
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)
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// JSPECIFY_STATE: warn
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode
// FILE: J1.java
@@ -0,0 +1,45 @@
// 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 {
a.everythingNotNullable(<!NULL_FOR_NONNULL_TYPE!>null<!>).foo()
a.everythingNotNullable(x).foo()
a.everythingNullable(null)<!UNSAFE_CALL!>.<!>foo()
a.everythingUnknown(null).foo()
a.mixed(<!NULL_FOR_NONNULL_TYPE!>null<!>)<!UNSAFE_CALL!>.<!>foo()
a.mixed(x)<!UNSAFE_CALL!>.<!>foo()
a.explicitlyNullnessUnspecified(x).foo()
a.explicitlyNullnessUnspecified(null).foo()
a.defaultField.foo()
a.field<!UNSAFE_CALL!>.<!>foo()
}
@@ -0,0 +1,43 @@
// 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 {
a.foo(x, null)<!UNSAFE_CALL!>.<!>foo()
a.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>, x)<!UNSAFE_CALL!>.<!>foo()
a.field<!UNSAFE_CALL!>.<!>foo()
a.everythingNotNullable(<!NULL_FOR_NONNULL_TYPE!>null<!>).foo()
a.everythingNotNullable(x).foo()
a.everythingNullable(null)<!UNSAFE_CALL!>.<!>foo()
a.everythingUnknown(null).foo()
}
@@ -0,0 +1,27 @@
// 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)
a1.bar<T>(null)
a1.bar<T>(x)
a2.foo(null)
a2.bar<Test?>(null)
a2.bar<T>(null)
a2.bar<T>(x)
}
@@ -0,0 +1,30 @@
// 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
fun main(a1: NullnessUnspecifiedTypeParameter<Any>, a2: NullnessUnspecifiedTypeParameter<Any?>, x: Test): Unit {
a1.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
a1.foo(1)
a2.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
a2.foo(1)
a1.bar(<!NULL_FOR_NONNULL_TYPE!>null<!>, <!NULL_FOR_NONNULL_TYPE!>null<!>)
a1.bar(x, <!NULL_FOR_NONNULL_TYPE!>null<!>)
a1.bar(x, 1)
a2.bar(<!NULL_FOR_NONNULL_TYPE!>null<!>, <!NULL_FOR_NONNULL_TYPE!>null<!>)
a2.bar(x, <!NULL_FOR_NONNULL_TYPE!>null<!>)
a2.bar(x, 1)
}
@@ -0,0 +1,54 @@
// 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)
ak.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
akn.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>) // the corresponding warning/error is present on the Java side
bk.foo(bk)
bk.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
ck.foo(ck)
ck.foo(null)
ckn.foo(null) // the corresponding warning/error is present on the Java side
}
@@ -0,0 +1,36 @@
// 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 {
a.foo(x, null)<!UNSAFE_CALL!>.<!>foo()
a.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>, x)<!UNSAFE_CALL!>.<!>foo()
a.bar().foo()
a.field<!UNSAFE_CALL!>.<!>foo()
}
@@ -0,0 +1,45 @@
// 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)
a.bar(aNotNullNotNullNull)
a.bar(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
a.bar(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
b.bar(aNotNullNotNullNotNull)
b.bar(aNotNullNotNullNull)
b.bar(aNotNullNullNotNull)
b.bar(aNotNullNullNull)
}
@@ -0,0 +1,39 @@
// 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
fun <T : Test> main(a1: A<Any?>, a2: A<Test>, b1: B<Any?>, b2: B<Test>, x: T): Unit {
a1.foo(null)
a1.bar<T?>(null)
a1.bar<T>(x)
a2.foo(null)
a2.bar<T?>(null)
a2.bar<T>(x)
b1.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
b1.bar<T?>(null)
b1.bar<T>(x)
b2.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
b2.bar<T?>(null)
b2.bar<T>(x)
}
@@ -0,0 +1,35 @@
// JSPECIFY_STATE: warn
// MUTE_FOR_PSI_CLASS_FILES_READING
// FILE: WildcardsWithDefault.java
import org.jspecify.nullness.*;
@NullMarked
public class WildcardsWithDefault {
public void noBoundsNotNull(A<?, ?, ?> a) {}
public void noBoundsNullable(A<? extends @Nullable Object, ? extends @Nullable Object, ? extends @Nullable Object> a) {}
}
// FILE: A.java
import org.jspecify.nullness.*;
public class A <T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {}
// FILE: main.kt
fun main(
aNotNullNotNullNotNull: A<Any, Any, Any>,
aNotNullNotNullNull: A<Any, Any, Any?>,
aNotNullNullNotNull: A<Any, Any?, Any>,
aNotNullNullNull: A<Any, Any?, Any?>,
b: WildcardsWithDefault
): Unit {
b.noBoundsNotNull(aNotNullNotNullNotNull)
b.noBoundsNotNull(aNotNullNotNullNull)
b.noBoundsNotNull(aNotNullNullNotNull)
b.noBoundsNotNull(aNotNullNullNull)
b.noBoundsNullable(aNotNullNotNullNotNull)
b.noBoundsNullable(aNotNullNotNullNull)
b.noBoundsNullable(aNotNullNullNotNull)
b.noBoundsNullable(aNotNullNullNull)
}
@@ -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)
}
}
@@ -0,0 +1,77 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
// SKIP_JAVAC
// SOURCE_RETENTION_ANNOTATIONS
// JSR305_GLOBAL_REPORT: strict
// FILE: spr/NonNullApi.java
package spr;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.annotation.Nonnull;
import javax.annotation.meta.TypeQualifierDefault;
@Target({ElementType.TYPE, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Nonnull
@TypeQualifierDefault({ElementType.TYPE_USE})
public @interface NonNullApi {
}
// FILE: spr/NullableApi.java
package spr;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.annotation.Nonnull;
import javax.annotation.meta.TypeQualifierDefault;
import javax.annotation.meta.When;
@Target({ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Nonnull(when = When.MAYBE)
@TypeQualifierDefault({ElementType.TYPE_USE})
public @interface NullableApi {
}
// FILE: A.java
import spr.*;
import java.util.*;
@NonNullApi
public class A {
public String foo(String x) { return ""; }
public @NullableApi String bar(@NullableApi String y) { return ""; }
public @NullableApi List<String> baz1() { return null; }
public List<@NullableApi String> baz2() { return null; }
public @NullableApi List<@NonNullApi String> baz3() { return null; }
}
// FILE: main.kt
fun main(a: A) {
a.foo("").length
a.foo(null)?.length
a.bar("").length
a.bar(null)?.length
a.baz1().get(0).length
a.baz1()!!.get(0).length
a.baz1()!!.get(0)?.length
a.baz2().get(0).length
a.baz2()!!.get(0).length
a.baz2()!!.get(0)?.length
a.baz3().get(0).length
a.baz3()!!.get(0).length
a.baz3()!!.get(0)?.length
}
@@ -0,0 +1,67 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
// SKIP_JAVAC
// SOURCE_RETENTION_ANNOTATIONS
// JSR305_GLOBAL_REPORT: strict
// FILE: spr/NonNullApi.java
package spr;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.annotation.Nonnull;
import javax.annotation.meta.TypeQualifierDefault;
@Target({ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Nonnull
@TypeQualifierDefault({ElementType.TYPE_USE})
public @interface NonNullApi {
}
// FILE: spr/NullableApi.java
package spr;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.annotation.Nonnull;
import javax.annotation.meta.TypeQualifierDefault;
import javax.annotation.meta.When;
@Target({ElementType.TYPE, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Nonnull(when = When.MAYBE)
@TypeQualifierDefault({ElementType.TYPE_USE})
public @interface NullableApi {
}
// FILE: A.java
import spr.*;
import java.util.*;
@NonNullApi
public class A {
public String foo(String x) { return ""; }
public @NullableApi String bar(@NullableApi String y) { return ""; }
public @NullableApi List<String> baz1() { return null; }
}
// FILE: main.kt
fun main(a: A) {
a.foo("").length
a.foo(null)?.length
a.bar("").length
a.bar(null)?.length
a.baz1().get(0).length
a.baz1()!!.get(0).length
a.baz1()!!.get(0)?.length
}
@@ -0,0 +1,79 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
// JSR305_GLOBAL_REPORT: strict
// FILE: spr/Nullable.java
package spr;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.annotation.Nonnull;
import javax.annotation.meta.TypeQualifierNickname;
import javax.annotation.meta.When;
@Target({ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Nonnull(when = When.MAYBE)
@TypeQualifierNickname
public @interface Nullable {
}
// FILE: spr/NonNullApi.java
package spr;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.annotation.Nonnull;
import javax.annotation.meta.TypeQualifierDefault;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Nonnull
@TypeQualifierDefault({ElementType.TYPE_USE})
public @interface NonNullApi {
}
// FILE: A.java
import spr.*;
@NonNullApi
public class A {
public String field = null;
public String foo(String x, @Nullable CharSequence y) {
return "";
}
public String bar() {
return "";
}
@Nullable
public java.util.List<String> baz() {
return null;
}
}
// FILE: main.kt
fun main(a: A) {
a.foo("", null)?.length
a.foo("", null).length
a.foo(null, "").length
a.bar().length
a.bar()!!.length
a.field?.length
a.field.length
a.baz()<!UNSAFE_CALL!>.<!>get(0)
a.baz()!!.get(0).get(0)
a.baz()!!.get(0)?.get(0)
}
@@ -0,0 +1,107 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
// RENDER_PACKAGE: test
// SOURCE_RETENTION_ANNOTATIONS
// WITH_RUNTIME
// JSR305_GLOBAL_REPORT: strict
// FILE: spr/Nullable.java
package spr;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.annotation.Nonnull;
import javax.annotation.meta.TypeQualifierNickname;
import javax.annotation.meta.When;
@Target({ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Nonnull(when = When.MAYBE)
@TypeQualifierNickname
public @interface Nullable {
}
// FILE: spr/NonNullApi.java
package spr;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.annotation.Nonnull;
import javax.annotation.meta.TypeQualifierDefault;
@Target(ElementType.PACKAGE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Nonnull
@TypeQualifierDefault({ElementType.TYPE_USE})
public @interface NonNullApi {
}
// FILE: test/package-info.java
@spr.NonNullApi()
package test;
// FILE: test/L.java
package test;
public class L<T extends java.util.Map<String, S>, S> {
public T t() { return null; }
public S s() { return null; }
public void setT(@spr.Nullable T t) {}
public void setS(S s) {}
}
// FILE: test/A.java
package test;
import spr.*;
import java.util.*;
public class A {
public void foo(L<Map<String, Integer>, @Nullable Integer> l) {}
public void bar(L<?, Integer> l) {}
public L<Map<String, Integer>, @Nullable Integer> baz1() { return null; }
public L<?, Integer> baz2() { return null; }
public L<? extends Map<String, Integer>, Integer> baz3() { return null; }
}
// FILE: main.kt
import test.L
fun main(a: test.A, l: L<Map<String, Int>, Int?>, l1: L<Map<String, Int>, Int>) {
a.foo(l)
a.foo(l as L<Map<String, Int>, Int>)
a.foo(l as L<Map<String, Int?>, Int?>)
a.bar(l1)
a.bar(l1 as L<Map<String, Int>, Int?>)
a.baz1().t().containsKey("")
a.baz1().t().containsKey(null)
a.baz1().t().containsValue(1)
a.baz1().t().containsValue(null)
a.baz1().s().hashCode()
a.baz1().setT(l.t())
a.baz1().setT(<!ARGUMENT_TYPE_MISMATCH!>l.t() as L<Map<String, Int>, Int><!>)
a.baz1().setT(null)
a.baz2().t().containsKey("")
a.baz2().t().containsKey(null)
a.baz2().t().containsValue(1)
a.baz2().t().containsValue(null)
a.baz2().s().hashCode()
a.baz3().t().containsKey("")
a.baz3().t().containsKey(null)
a.baz3().t().containsValue(1)
a.baz3().t().containsValue(null)
a.baz3().s().hashCode()
}
@@ -0,0 +1,77 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
// SKIP_JAVAC
// SOURCE_RETENTION_ANNOTATIONS
// JSR305_GLOBAL_REPORT: strict
// FILE: spr/NonNullApi.java
package spr;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.annotation.Nonnull;
import javax.annotation.meta.TypeQualifierDefault;
@Target({ElementType.TYPE, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Nonnull
@TypeQualifierDefault({ElementType.TYPE_USE, ElementType.METHOD})
public @interface NonNullApi {
}
// FILE: spr/NullableApi.java
package spr;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.annotation.Nonnull;
import javax.annotation.meta.TypeQualifierDefault;
import javax.annotation.meta.When;
@Target({ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Nonnull(when = When.MAYBE)
@TypeQualifierDefault({ElementType.TYPE_USE})
public @interface NullableApi {
}
// FILE: A.java
import spr.*;
import java.util.*;
@NonNullApi
public class A {
public String foo(String x) { return ""; }
public @NullableApi String bar(@NullableApi String y) { return ""; }
public @NullableApi List<String> baz1() { return null; }
public List<@NullableApi String> baz2() { return null; }
public @NullableApi List<@NonNullApi String> baz3() { return null; }
}
// FILE: main.kt
fun main(a: A) {
a.foo("").length
a.foo(null)<!UNNECESSARY_SAFE_CALL!>?.<!>length
a.bar("").length
a.bar(null)<!UNNECESSARY_SAFE_CALL!>?.<!>length
a.baz1().get(0).length
a.baz1()<!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>.get(0).length
a.baz1()<!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>.get(0)?.length
a.baz2().get(0).length
a.baz2()<!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>.get(0).length
a.baz2()<!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>.get(0)?.length
a.baz3().get(0).length
a.baz3()<!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>.get(0).length
a.baz3()<!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>.get(0)?.length
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// JAVAC_EXPECTED_FILE
// FILE: AnnotatedTypeArguments.java
import org.checkerframework.checker.nullness.qual.*;
@@ -0,0 +1,25 @@
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE
// SKIP_TXT
// MUTE_FOR_PSI_CLASS_FILES_READING
// FILE: ClassTypeParameterBound.java
import org.jetbrains.annotations.NotNull;
public class ClassTypeParameterBound <T extends @NotNull String> {
ClassTypeParameterBound(T x) { }
ClassTypeParameterBound() { }
}
// FILE: main.kt
fun main(x: ClassTypeParameterBound<String?>, y: ClassTypeParameterBound<String>, a: String?, b: String) {
val x2 = ClassTypeParameterBound<String?>()
val y2 = ClassTypeParameterBound<String>()
val x3 = ClassTypeParameterBound(a)
val y3 = ClassTypeParameterBound(b)
val x4: ClassTypeParameterBound<String?> = ClassTypeParameterBound()
val y4: ClassTypeParameterBound<String> = ClassTypeParameterBound()
}
@@ -0,0 +1,25 @@
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated, -TypeEnhancementImprovementsInStrictMode
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE
// SKIP_TXT
// MUTE_FOR_PSI_CLASS_FILES_READING
// FILE: ClassTypeParameterBoundWithWarnings.java
import org.jetbrains.annotations.NotNull;
public class ClassTypeParameterBoundWithWarnings <T extends @NotNull String> {
ClassTypeParameterBoundWithWarnings() { }
ClassTypeParameterBoundWithWarnings(T x) { }
}
// FILE: main.kt
fun main(x: ClassTypeParameterBoundWithWarnings<String?>, y: ClassTypeParameterBoundWithWarnings<String>, a: String?, b: String) {
val x2 = ClassTypeParameterBoundWithWarnings<String?>()
val y2 = ClassTypeParameterBoundWithWarnings<String>()
val x3 = ClassTypeParameterBoundWithWarnings(a)
val y3 = ClassTypeParameterBoundWithWarnings(b)
val x4: ClassTypeParameterBoundWithWarnings<String?> = ClassTypeParameterBoundWithWarnings()
val y4: ClassTypeParameterBoundWithWarnings<String> = ClassTypeParameterBoundWithWarnings()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// SKIP_TXT
// FILE: I1.java
import org.checkerframework.checker.nullness.qual.NonNull;
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// JAVAC_EXPECTED_FILE
// FILE: Outer.java
import org.checkerframework.checker.nullness.qual.*;
@@ -0,0 +1,21 @@
// SOURCE_RETENTION_ANNOTATIONS
// FILE: BaseClass.java
import org.checkerframework.checker.nullness.qual.*;
public class BaseClass {
public void loadCache(@NonNull Object... args) {}
}
// FILE: main.kt
class A : BaseClass() {
// org.checkerframework.checker.nullness.qual.NonNull has @Target TYPE_USE, so it affects only elements type
override fun loadCache(vararg args: Any?) {
super.loadCache(*args)
}
}
class B : BaseClass() {
override fun loadCache(vararg args: Any) {
super.loadCache(*args)
}
}
@@ -0,0 +1,21 @@
// SOURCE_RETENTION_ANNOTATIONS
// FILE: BaseClass.java
import org.checkerframework.checker.nullness.qual.*;
public class BaseClass {
public void loadCache(@Nullable Object... args) {}
}
// FILE: main.kt
class A : BaseClass() {
override fun loadCache(vararg args: Any?) {
super.loadCache(*args)
}
}
class B : BaseClass() {
// org.checkerframework.checker.nullness.qual.Nullable has @Target TYPE_USE, so it affects only elements type
override fun loadCache(vararg args: Any) {
super.loadCache(*args)
}
}
@@ -0,0 +1,65 @@
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated
// !DIAGNOSTICS: -UNUSED_PARAMETER
// SKIP_TXT
// MUTE_FOR_PSI_CLASS_FILES_READING
// FILE: ReturnType.java
import org.jetbrains.annotations.*;
public class ReturnType<T> {
public interface A<T1, T2> {}
public A<@Nullable String, @Nullable T> foo1() { return null; }
public A<@Nullable String, @NotNull T> foo2() { return null; }
public A<@NotNull String, @NotNull T> foo3 = null;
public @NotNull T [] foo4 = null;
public ReturnType<@Nullable String> foo41 = null;
public T foo411 = null;
public @Nullable String [] foo5() { return null; }
}
// FILE: main.kt
fun <K> takeNotNullStringAndKNullable(x: ReturnType.A<String, K?>) {}
fun <K> takeNullableStringAndKNullable(x: ReturnType.A<String?, K?>) {}
fun <K: Any> takeNotNullStringAndNotNullK(x: ReturnType.A<String, K>) {}
fun <K: Any> takeNullableStringAndNotNullK(x: ReturnType.A<String?, K>) {}
fun takeNotNullString(x: String) {}
fun takeArrayOfNotNullString(x: Array<String>) {}
fun takeArrayOfNullableString(x: Array<String?>) {}
fun <K: Any> takeArrayOfNotNullK(x: Array<K>) {}
fun <K> takeArrayOfNullableK(x: Array<K?>) {}
fun <R> main(a: ReturnType<R>) {
val x1 = <!DEBUG_INFO_EXPRESSION_TYPE("ReturnType.A<kotlin.String?, R..R?!>..ReturnType.A<kotlin.String?, R..R?!>?!")!>a.foo1()<!>
takeNotNullStringAndKNullable(<!ARGUMENT_TYPE_MISMATCH!>x1<!>)
takeNullableStringAndKNullable(x1)
takeNotNullStringAndNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x1<!>)
takeNullableStringAndNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x1<!>)
takeNotNullString(a.foo41.foo411)
val x2 = <!DEBUG_INFO_EXPRESSION_TYPE("ReturnType.A<kotlin.String, R..R?!>..ReturnType.A<kotlin.String, R..R?!>?!")!>a.foo2()<!>
takeNotNullStringAndKNullable(x2)
takeNullableStringAndKNullable(<!ARGUMENT_TYPE_MISMATCH!>x2<!>)
takeNotNullStringAndNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x2<!>)
takeNullableStringAndNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x2<!>)
val x3 = <!DEBUG_INFO_EXPRESSION_TYPE("ReturnType.A<kotlin.String, R..R?!>..ReturnType.A<kotlin.String, R..R?!>?!")!>a.foo3<!>
takeNotNullStringAndKNullable(x3)
takeNullableStringAndKNullable(<!ARGUMENT_TYPE_MISMATCH!>x3<!>)
takeNotNullStringAndNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x3<!>)
takeNullableStringAndNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x3<!>)
val x4 = <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Array<R..R?!>..kotlin.Array<out R..R?!>")!>a.foo4<!>
takeArrayOfNotNullString(<!ARGUMENT_TYPE_MISMATCH!>x4<!>)
takeArrayOfNullableString(<!ARGUMENT_TYPE_MISMATCH!>x4<!>)
takeArrayOfNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x4<!>)
takeArrayOfNullableK(x4)
val x5 = <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Array<kotlin.String..kotlin.String?!>?..kotlin.Array<out kotlin.String..kotlin.String?!>??")!>a.foo5()<!>
takeArrayOfNotNullString(<!ARGUMENT_TYPE_MISMATCH!>x5<!>)
takeArrayOfNullableString(<!ARGUMENT_TYPE_MISMATCH!>x5<!>)
takeArrayOfNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x5<!>)
takeArrayOfNullableK(<!ARGUMENT_TYPE_MISMATCH!>x5<!>)
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// JAVAC_EXPECTED_FILE
// FILE: Outer.java
import org.checkerframework.checker.nullness.qual.*;
@@ -0,0 +1,31 @@
// SOURCE_RETENTION_ANNOTATIONS
// FILE: Base.java
public interface Base<T> {}
// FILE: A.java
import org.checkerframework.checker.nullness.qual.*;
public class A {
@Nullable Base<@NonNull String> foo() { return null; }
}
// FILE: a.kt
interface Derived<E> : Base<E> {}
fun bar1(): Derived<String> = null!!
fun bar2(): Derived<String?> = null!!
class B : A() {
override fun foo(): Base<String> { return bar1(); }
}
class C1 : A() {
override fun foo(): Derived<String> { return bar1(); }
}
class C2 : A() {
override fun foo(): Derived<String>? { return bar1(); }
}
class C3 : A() {
override fun foo(): Derived<String?> { return bar2(); }
}
@@ -0,0 +1,67 @@
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated, -TypeEnhancementImprovementsInStrictMode
// !DIAGNOSTICS: -UNUSED_PARAMETER
// SKIP_TXT
// MUTE_FOR_PSI_CLASS_FILES_READING
// FILE: ReturnTypeWithWarnings.java
// We've already had errors in source mode, so it's relevant only for binaries for now
// INCLUDE_JAVA_AS_BINARY
import org.jetbrains.annotations.*;
public class ReturnTypeWithWarnings<T> {
public interface A<T1, T2> {}
public A<@Nullable String, @Nullable T> foo1() { return null; }
public A<@Nullable String, @NotNull T> foo2() { return null; }
public A<@NotNull String, @NotNull T> foo3 = null;
public @NotNull T [] foo4 = null;
public ReturnTypeWithWarnings<@Nullable String> foo41 = null;
public T foo411 = null;
public @Nullable String [] foo5() { return null; }
}
// FILE: main.kt
fun <K> takeNotNullStringAndKNullable(x: ReturnTypeWithWarnings.A<String, K?>) {}
fun <K> takeNullableStringAndKNullable(x: ReturnTypeWithWarnings.A<String?, K?>) {}
fun <K: Any> takeNotNullStringAndNotNullK(x: ReturnTypeWithWarnings.A<String, K>) {}
fun <K: Any> takeNullableStringAndNotNullK(x: ReturnTypeWithWarnings.A<String?, K>) {}
fun takeNotNullString(x: String) {}
fun takeArrayOfNotNullString(x: Array<String>) {}
fun takeArrayOfNullableString(x: Array<String?>) {}
fun <K: Any> takeArrayOfNotNullK(x: Array<K>) {}
fun <K> takeArrayOfNullableK(x: Array<K?>) {}
fun <R> main(a: ReturnTypeWithWarnings<R>) {
val x1 = <!DEBUG_INFO_EXPRESSION_TYPE("ReturnTypeWithWarnings.A<kotlin.String?, R..R?!>..ReturnTypeWithWarnings.A<kotlin.String?, R..R?!>?!")!>a.foo1()<!>
takeNotNullStringAndKNullable(<!ARGUMENT_TYPE_MISMATCH!>x1<!>)
takeNullableStringAndKNullable(x1)
takeNotNullStringAndNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x1<!>)
takeNullableStringAndNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x1<!>)
takeNotNullString(a.foo41.foo411)
val x2 = <!DEBUG_INFO_EXPRESSION_TYPE("ReturnTypeWithWarnings.A<kotlin.String, R..R?!>..ReturnTypeWithWarnings.A<kotlin.String, R..R?!>?!")!>a.foo2()<!>
takeNotNullStringAndKNullable(x2)
takeNullableStringAndKNullable(<!ARGUMENT_TYPE_MISMATCH!>x2<!>)
takeNotNullStringAndNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x2<!>)
takeNullableStringAndNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x2<!>)
val x3 = <!DEBUG_INFO_EXPRESSION_TYPE("ReturnTypeWithWarnings.A<kotlin.String, R..R?!>..ReturnTypeWithWarnings.A<kotlin.String, R..R?!>?!")!>a.foo3<!>
takeNotNullStringAndKNullable(x3)
takeNullableStringAndKNullable(<!ARGUMENT_TYPE_MISMATCH!>x3<!>)
takeNotNullStringAndNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x3<!>)
takeNullableStringAndNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x3<!>)
val x4 = <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Array<R..R?!>..kotlin.Array<out R..R?!>")!>a.foo4<!>
takeArrayOfNotNullString(<!ARGUMENT_TYPE_MISMATCH!>x4<!>)
takeArrayOfNullableString(<!ARGUMENT_TYPE_MISMATCH!>x4<!>)
takeArrayOfNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x4<!>)
takeArrayOfNullableK(x4)
val x5 = <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Array<kotlin.String..kotlin.String?!>?..kotlin.Array<out kotlin.String..kotlin.String?!>??")!>a.foo5()<!>
takeArrayOfNotNullString(<!ARGUMENT_TYPE_MISMATCH!>x5<!>)
takeArrayOfNullableString(<!ARGUMENT_TYPE_MISMATCH!>x5<!>)
takeArrayOfNotNullK(<!ARGUMENT_TYPE_MISMATCH!>x5<!>)
takeArrayOfNullableK(<!ARGUMENT_TYPE_MISMATCH!>x5<!>)
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// FILE: A.java
import org.checkerframework.checker.nullness.qual.*;
import java.util.*;
@@ -0,0 +1,14 @@
// SKIP_TXT
// MUTE_FOR_PSI_CLASS_FILES_READING
import org.jetbrains.annotations.*;
// FILE: MapLike.java
public interface MapLike<@org.jetbrains.annotations.NotNull K> {
void put(K x);
}
// FILE: main.kt
fun test2(map : MapLike<Int>, x2: Int?) {
map.put(x2)
}
@@ -0,0 +1,62 @@
// !LANGUAGE: +TypeEnhancementImprovementsInStrictMode +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated
// !DIAGNOSTICS: -UNUSED_PARAMETER -CAST_NEVER_SUCCEEDS
// SKIP_TXT
// MUTE_FOR_PSI_CLASS_FILES_READING
// FILE: ValueParameter.java
import org.jetbrains.annotations.*;
public class ValueParameter<T> {
public interface A<T1, T2> {}
public void foo1(A<@Nullable String, @Nullable T> x) { }
public void foo2(A<@Nullable String, @NotNull T> x) { }
public void foo3(A<@NotNull String, @NotNull T> x) { }
public void foo4(@NotNull T [] x) { }
public void foo41(@Nullable String x) { }
public void foo411(T x) { }
public void foo5(@Nullable String [] x) { }
}
// FILE: main.kt
fun <K> getNotNullStringAndKNullable() = null as ValueParameter.A<String, K?>
fun <K> getNullableStringAndKNullable() = null as ValueParameter.A<String?, K?>
fun <K: Any> getNotNullStringAndNotNullK() = null as ValueParameter.A<String, K>
fun <K: Any> getNullableStringAndNotNullK() = null as ValueParameter.A<String?, K>
fun getNotNullString() = null as String
fun getArrayOfNotNullString() = null as Array<String>
fun getArrayOfNullableString() = null as Array<String?>
fun <K: Any> getArrayOfNotNullK() = null as Array<K>
fun <K> getArrayOfNullableK() = null as Array<K?>
fun <R> main(a: ValueParameter<R>) {
a.foo1(<!ARGUMENT_TYPE_MISMATCH!>getNotNullStringAndKNullable()<!>)
a.foo1(getNullableStringAndKNullable())
a.foo1(<!ARGUMENT_TYPE_MISMATCH!>getNotNullStringAndNotNullK()<!>)
a.foo1(<!ARGUMENT_TYPE_MISMATCH!>getNullableStringAndNotNullK()<!>)
a.foo2(getNotNullStringAndKNullable())
a.foo2(<!ARGUMENT_TYPE_MISMATCH!>getNullableStringAndKNullable()<!>)
a.foo2(<!ARGUMENT_TYPE_MISMATCH!>getNotNullStringAndNotNullK()<!>)
a.foo2(<!ARGUMENT_TYPE_MISMATCH!>getNullableStringAndNotNullK()<!>)
a.foo3(getNotNullStringAndKNullable())
a.foo3(<!ARGUMENT_TYPE_MISMATCH!>getNullableStringAndKNullable()<!>)
a.foo3(<!ARGUMENT_TYPE_MISMATCH!>getNotNullStringAndNotNullK()<!>)
a.foo3(<!ARGUMENT_TYPE_MISMATCH!>getNullableStringAndNotNullK()<!>)
a.foo4(<!ARGUMENT_TYPE_MISMATCH!>getArrayOfNotNullString()<!>)
a.foo4(<!ARGUMENT_TYPE_MISMATCH!>getArrayOfNullableString()<!>)
a.foo4(getArrayOfNotNullK())
a.foo4(getArrayOfNullableK())
a.foo5(getArrayOfNotNullString())
a.foo5(getArrayOfNullableString())
a.foo5(getArrayOfNotNullK())
a.foo5(getArrayOfNullableK())
a.foo41(getNotNullString())
a.foo411(<!ARGUMENT_TYPE_MISMATCH!>getNotNullString()<!>)
}
@@ -0,0 +1,64 @@
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated, -TypeEnhancementImprovementsInStrictMode
// !DIAGNOSTICS: -UNUSED_PARAMETER -CAST_NEVER_SUCCEEDS
// SKIP_TXT
// MUTE_FOR_PSI_CLASS_FILES_READING
// FILE: ValueParameterWithWarnings.java
// We've already had errors in source mode, so it's relevant only for binaries for now
// INCLUDE_JAVA_AS_BINARY
import org.jetbrains.annotations.*;
public class ValueParameterWithWarnings<T> {
public interface A<T1, T2> {}
public void foo1(A<@Nullable String, @Nullable T> x) { }
public void foo2(A<@Nullable String, @NotNull T> x) { }
public void foo3(A<@NotNull String, @NotNull T> x) { }
public void foo4(@NotNull T [] x) { }
public void foo41(@Nullable String x) { }
public void foo411(T x) { }
public void foo5(@Nullable String [] x) { }
}
// FILE: main.kt
fun <K> getNotNullStringAndKNullable() = null as ValueParameterWithWarnings.A<String, K?>
fun <K> getNullableStringAndKNullable() = null as ValueParameterWithWarnings.A<String?, K?>
fun <K: Any> getNotNullStringAndNotNullK() = null as ValueParameterWithWarnings.A<String, K>
fun <K: Any> getNullableStringAndNotNullK() = null as ValueParameterWithWarnings.A<String?, K>
fun getNotNullString() = null as String
fun getArrayOfNotNullString() = null as Array<String>
fun getArrayOfNullableString() = null as Array<String?>
fun <K: Any> getArrayOfNotNullK() = null as Array<K>
fun <K> getArrayOfNullableK() = null as Array<K?>
fun <R> main(a: ValueParameterWithWarnings<R>) {
a.foo1(<!ARGUMENT_TYPE_MISMATCH!>getNotNullStringAndKNullable()<!>)
a.foo1(getNullableStringAndKNullable())
a.foo1(<!ARGUMENT_TYPE_MISMATCH!>getNotNullStringAndNotNullK()<!>)
a.foo1(<!ARGUMENT_TYPE_MISMATCH!>getNullableStringAndNotNullK()<!>)
a.foo2(getNotNullStringAndKNullable())
a.foo2(<!ARGUMENT_TYPE_MISMATCH!>getNullableStringAndKNullable()<!>)
a.foo2(<!ARGUMENT_TYPE_MISMATCH!>getNotNullStringAndNotNullK()<!>)
a.foo2(<!ARGUMENT_TYPE_MISMATCH!>getNullableStringAndNotNullK()<!>)
a.foo3(getNotNullStringAndKNullable())
a.foo3(<!ARGUMENT_TYPE_MISMATCH!>getNullableStringAndKNullable()<!>)
a.foo3(<!ARGUMENT_TYPE_MISMATCH!>getNotNullStringAndNotNullK()<!>)
a.foo3(<!ARGUMENT_TYPE_MISMATCH!>getNullableStringAndNotNullK()<!>)
a.foo4(<!ARGUMENT_TYPE_MISMATCH!>getArrayOfNotNullString()<!>)
a.foo4(<!ARGUMENT_TYPE_MISMATCH!>getArrayOfNullableString()<!>)
a.foo4(getArrayOfNotNullK())
a.foo4(getArrayOfNullableK())
a.foo5(getArrayOfNotNullString())
a.foo5(getArrayOfNullableString())
a.foo5(getArrayOfNotNullK())
a.foo5(getArrayOfNullableK())
a.foo41(getNotNullString())
a.foo411(<!ARGUMENT_TYPE_MISMATCH!>getNotNullString()<!>)
}
@@ -0,0 +1,23 @@
// !LANGUAGE: -TypeEnhancementImprovementsInStrictMode
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
// SKIP_TXT
// MUTE_FOR_PSI_CLASS_FILES_READING
// We've already had errors in source mode, so it's relevant only for binaries for now
// FILE: Base.java
// INCLUDE_JAVA_AS_BINARY
public class Base<K> {}
// FILE: Test.java
// INCLUDE_JAVA_AS_BINARY
import org.jetbrains.annotations.Nullable;
class Test extends Base<@Nullable String> {}
// FILE: main.kt
fun takeBaseOfNotNullStrings(x: Base<String>) {}
fun main() {
val x = takeBaseOfNotNullStrings(Test())
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// FILE: A.java
import org.checkerframework.checker.nullness.qual.*;
public class A {