JSpecify: rework tests – replace kotlin use sites to java ones with future j2k conversion
This commit is contained in:
-75
@@ -1,75 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A<T extends @NotNull Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class B {
|
||||
public void superAsIs(A<? super CharSequence, ? super CharSequence, ? super CharSequence> a) {}
|
||||
public void superNotNull(A<? super @NotNull CharSequence, ? super @NotNull CharSequence, ? super @NotNull CharSequence> a) {}
|
||||
public void superNullable(A<? super @Nullable CharSequence, ? super @Nullable CharSequence, ? super @Nullable CharSequence> a) {}
|
||||
|
||||
public void extendsAsIs(A<? extends CharSequence, ? extends CharSequence, ? extends CharSequence> a) {}
|
||||
public void extendsNotNull(A<? extends @NotNull CharSequence, ? extends @NotNull CharSequence, ? extends @NotNull CharSequence> a) {}
|
||||
public void extendsNullable(A<? extends @Nullable CharSequence, ? extends @Nullable CharSequence, ? extends @Nullable CharSequence> a) {}
|
||||
|
||||
public void noBounds(A<?, ?, ?> a) {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(
|
||||
aNotNullNotNullNotNull: A<String, String, String>,
|
||||
aNotNullNotNullNull: A<String, String, String?>,
|
||||
aNotNullNullNotNull: A<String, String?, String>,
|
||||
aNotNullNullNull: A<String, String?, String?>,
|
||||
|
||||
aAnyNotNullNotNullNotNull: A<Any, Any, Any>,
|
||||
aAnyNotNullNotNullNull: A<Any, Any, Any?>,
|
||||
aAnyNotNullNullNotNull: A<Any, Any?, Any>,
|
||||
aAnyNotNullNullNull: A<Any, Any?, Any?>,
|
||||
b: B
|
||||
) {
|
||||
b.superAsIs(<!TYPE_MISMATCH!>aAnyNotNullNotNullNotNull<!>)
|
||||
b.superAsIs(<!TYPE_MISMATCH!>aAnyNotNullNotNullNull<!>)
|
||||
b.superAsIs(aAnyNotNullNullNotNull)
|
||||
b.superAsIs(aAnyNotNullNullNull)
|
||||
|
||||
b.superNotNull(aAnyNotNullNotNullNotNull)
|
||||
b.superNotNull(aAnyNotNullNotNullNull)
|
||||
b.superNotNull(aAnyNotNullNullNotNull)
|
||||
b.superNotNull(aAnyNotNullNullNull)
|
||||
|
||||
// TODO: Bound for the first argument in "superNullable" contradicts to declared nullability of the parameter
|
||||
// Do we need to ignore such arguments' nullability?
|
||||
b.superNullable(<!TYPE_MISMATCH!>aAnyNotNullNotNullNotNull<!>)
|
||||
b.superNullable(<!TYPE_MISMATCH!>aAnyNotNullNotNullNull<!>)
|
||||
b.superNullable(<!TYPE_MISMATCH!>aAnyNotNullNullNotNull<!>)
|
||||
b.superNullable(<!TYPE_MISMATCH!>aAnyNotNullNullNull<!>)
|
||||
|
||||
b.extendsAsIs(aNotNullNotNullNotNull)
|
||||
b.extendsAsIs(aNotNullNotNullNull)
|
||||
b.extendsAsIs(aNotNullNullNotNull)
|
||||
b.extendsAsIs(aNotNullNullNull)
|
||||
|
||||
b.extendsNotNull(aNotNullNotNullNotNull)
|
||||
b.extendsNotNull(<!TYPE_MISMATCH!>aNotNullNotNullNull<!>)
|
||||
b.extendsNotNull(<!TYPE_MISMATCH!>aNotNullNullNotNull<!>)
|
||||
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)
|
||||
}
|
||||
-24
@@ -1,24 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ aNotNullNotNullNotNull: A<kotlin.String, kotlin.String, kotlin.String>, /*1*/ aNotNullNotNullNull: A<kotlin.String, kotlin.String, kotlin.String?>, /*2*/ aNotNullNullNotNull: A<kotlin.String, kotlin.String?, kotlin.String>, /*3*/ aNotNullNullNull: A<kotlin.String, kotlin.String?, kotlin.String?>, /*4*/ aAnyNotNullNotNullNotNull: A<kotlin.Any, kotlin.Any, kotlin.Any>, /*5*/ aAnyNotNullNotNullNull: A<kotlin.Any, kotlin.Any, kotlin.Any?>, /*6*/ aAnyNotNullNullNotNull: A<kotlin.Any, kotlin.Any?, kotlin.Any>, /*7*/ aAnyNotNullNullNull: A<kotlin.Any, kotlin.Any?, kotlin.Any?>, /*8*/ b: B): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any, /*1*/ E, /*2*/ F : @org.jspecify.annotations.NullnessUnspecified kotlin.Any!> {
|
||||
public constructor A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any, /*1*/ E, /*2*/ F : @org.jspecify.annotations.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
|
||||
}
|
||||
|
||||
public open class B {
|
||||
public constructor B()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun extendsAsIs(/*0*/ a: A<out kotlin.CharSequence, out kotlin.CharSequence?, out kotlin.CharSequence!>!): kotlin.Unit
|
||||
public open fun extendsNotNull(/*0*/ a: A<out @org.jspecify.annotations.NotNull kotlin.CharSequence, out @org.jspecify.annotations.NotNull kotlin.CharSequence, out @org.jspecify.annotations.NotNull kotlin.CharSequence>!): kotlin.Unit
|
||||
public open fun extendsNullable(/*0*/ a: A<out @org.jspecify.annotations.Nullable kotlin.CharSequence?, out @org.jspecify.annotations.Nullable kotlin.CharSequence?, out @org.jspecify.annotations.Nullable kotlin.CharSequence?>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open fun noBounds(/*0*/ a: A<*, *, *>!): kotlin.Unit
|
||||
public open fun superAsIs(/*0*/ a: A<in kotlin.CharSequence, in kotlin.CharSequence?, in kotlin.CharSequence!>!): kotlin.Unit
|
||||
public open fun superNotNull(/*0*/ a: A<in @org.jspecify.annotations.NotNull kotlin.CharSequence, in @org.jspecify.annotations.NotNull kotlin.CharSequence, in @org.jspecify.annotations.NotNull kotlin.CharSequence>!): kotlin.Unit
|
||||
public open fun superNullable(/*0*/ a: A<in @org.jspecify.annotations.Nullable kotlin.CharSequence?, in @org.jspecify.annotations.Nullable kotlin.CharSequence?, in @org.jspecify.annotations.Nullable kotlin.CharSequence?>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNonNull
|
||||
public class A {
|
||||
public String defaultField = "";
|
||||
@Nullable public String field = null;
|
||||
|
||||
public String everythingNotNullable(String x) { return ""; }
|
||||
|
||||
@DefaultNullable
|
||||
public String everythingNullable(String x) { return ""; }
|
||||
|
||||
@DefaultNullnessUnspecified
|
||||
public String everythingUnknown(String x) { return ""; }
|
||||
|
||||
@DefaultNullable
|
||||
public String mixed(@NotNull String x) { return ""; }
|
||||
|
||||
public String explicitlyNullnessUnspecified(@NullnessUnspecified String x) { return ""; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(a: A) {
|
||||
a.everythingNotNullable(<!NULL_FOR_NONNULL_TYPE!>null<!>)<!UNNECESSARY_SAFE_CALL!>?.<!>length
|
||||
a.everythingNotNullable(<!NULL_FOR_NONNULL_TYPE!>null<!>).length
|
||||
a.everythingNotNullable("").length
|
||||
|
||||
a.everythingNullable(null)<!UNSAFE_CALL!>.<!>length
|
||||
a.everythingNullable(null)?.length
|
||||
|
||||
a.everythingUnknown(null).length
|
||||
a.everythingUnknown(null)?.length
|
||||
|
||||
a.mixed(<!NULL_FOR_NONNULL_TYPE!>null<!>)<!UNSAFE_CALL!>.<!>length
|
||||
a.mixed(<!NULL_FOR_NONNULL_TYPE!>null<!>)?.length
|
||||
a.mixed("")?.length
|
||||
|
||||
a.explicitlyNullnessUnspecified("").length
|
||||
a.explicitlyNullnessUnspecified("")<!UNNECESSARY_SAFE_CALL!>?.<!>length
|
||||
a.explicitlyNullnessUnspecified(null).length
|
||||
|
||||
a.defaultField<!UNNECESSARY_SAFE_CALL!>?.<!>length
|
||||
a.defaultField.length
|
||||
|
||||
a.field?.length
|
||||
a.field<!UNSAFE_CALL!>.<!>length
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a: A): kotlin.Unit
|
||||
|
||||
@org.jspecify.annotations.DefaultNonNull public open class A {
|
||||
public constructor A()
|
||||
public final var defaultField: kotlin.String
|
||||
@org.jspecify.annotations.Nullable public final var field: @org.jspecify.annotations.Nullable kotlin.String?
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun everythingNotNullable(/*0*/ x: kotlin.String): kotlin.String
|
||||
@org.jspecify.annotations.DefaultNullable public open fun everythingNullable(/*0*/ x: kotlin.String?): @org.jspecify.annotations.DefaultNullable kotlin.String?
|
||||
@org.jspecify.annotations.DefaultNullnessUnspecified public open fun everythingUnknown(/*0*/ x: kotlin.String!): @org.jspecify.annotations.DefaultNullnessUnspecified kotlin.String!
|
||||
public open fun explicitlyNullnessUnspecified(/*0*/ @org.jspecify.annotations.NullnessUnspecified x: @org.jspecify.annotations.NullnessUnspecified kotlin.String!): kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
@org.jspecify.annotations.DefaultNullable public open fun mixed(/*0*/ @org.jspecify.annotations.NotNull x: @org.jspecify.annotations.NotNull kotlin.String): @org.jspecify.annotations.DefaultNullable kotlin.String?
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
-52
@@ -1,52 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// JSPECIFY_STATE ignore
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A {
|
||||
@Nullable public String field = null;
|
||||
|
||||
@Nullable
|
||||
public String foo(@NotNull String x, @NullnessUnspecified CharSequence y) {
|
||||
return "";
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String bar() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@DefaultNonNull
|
||||
public String everythingNotNullable(String x) { return ""; }
|
||||
|
||||
@DefaultNullable
|
||||
public String everythingNullable(String x) { return ""; }
|
||||
|
||||
@DefaultNullnessUnspecified
|
||||
public String everythingUnknown(String x) { return ""; }
|
||||
}
|
||||
|
||||
// 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.everythingNotNullable(null)?.length
|
||||
a.everythingNotNullable(null).length
|
||||
a.everythingNotNullable("").length
|
||||
|
||||
a.everythingNullable(null).length
|
||||
a.everythingNullable(null)?.length
|
||||
|
||||
a.everythingUnknown(null).length
|
||||
a.everythingUnknown(null)?.length
|
||||
}
|
||||
-16
@@ -1,16 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a: A): kotlin.Unit
|
||||
|
||||
public open class A {
|
||||
public constructor A()
|
||||
@org.jspecify.annotations.Nullable public final var field: @org.jspecify.annotations.Nullable kotlin.String!
|
||||
@org.jspecify.annotations.NotNull public open fun bar(): @org.jspecify.annotations.NotNull kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
@org.jspecify.annotations.DefaultNonNull public open fun everythingNotNullable(/*0*/ x: kotlin.String!): @org.jspecify.annotations.DefaultNonNull kotlin.String!
|
||||
@org.jspecify.annotations.DefaultNullable public open fun everythingNullable(/*0*/ x: kotlin.String!): @org.jspecify.annotations.DefaultNullable kotlin.String!
|
||||
@org.jspecify.annotations.DefaultNullnessUnspecified public open fun everythingUnknown(/*0*/ x: kotlin.String!): @org.jspecify.annotations.DefaultNullnessUnspecified kotlin.String!
|
||||
@org.jspecify.annotations.Nullable public open fun foo(/*0*/ @org.jspecify.annotations.NotNull x: @org.jspecify.annotations.NotNull kotlin.String!, /*1*/ @org.jspecify.annotations.NullnessUnspecified y: @org.jspecify.annotations.NullnessUnspecified kotlin.CharSequence!): @org.jspecify.annotations.Nullable kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Vendored
+81
@@ -0,0 +1,81 @@
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNonNull
|
||||
public class AnnotatedBoundsOfWildcard {
|
||||
public void superAsIs(Test<? super @NullnessUnspecified Base, ? super @NullnessUnspecified 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 @NullnessUnspecified Base, ? extends @NullnessUnspecified 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<@NullnessUnspecified ?, @NullnessUnspecified ?, @NullnessUnspecified ?> a) {}
|
||||
}
|
||||
|
||||
class Base {}
|
||||
class Derived extends Base {}
|
||||
|
||||
@DefaultNonNull
|
||||
class Test<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> { }
|
||||
|
||||
@DefaultNonNull
|
||||
class Use {
|
||||
public void main(
|
||||
Test<Derived, Derived, Derived> aNotNullNotNullNotNull,
|
||||
Test<Derived, Derived, @Nullable Derived> aNotNullNotNullNull,
|
||||
Test<Derived, @Nullable Derived, Derived> aNotNullNullNotNull,
|
||||
Test<Derived, @Nullable Derived, @Nullable Derived> aNotNullNullNull,
|
||||
|
||||
Test<Object, Object, Object> aObjectNotNullNotNullNotNull,
|
||||
Test<Object, Object, @Nullable Object> aObjectNotNullNotNullNull,
|
||||
Test<Object, @Nullable Object, Object> aObjectNotNullNullNotNull,
|
||||
Test<Object, @Nullable Object, @Nullable Object> aObjectNotNullNullNull,
|
||||
|
||||
AnnotatedBoundsOfWildcard b
|
||||
) {
|
||||
// jspecify_nullness_mismatch
|
||||
b.superAsIs(aObjectNotNullNotNullNotNull);
|
||||
// jspecify_nullness_mismatch
|
||||
b.superAsIs(aObjectNotNullNotNullNull);
|
||||
b.superAsIs(aObjectNotNullNullNotNull);
|
||||
b.superAsIs(aObjectNotNullNullNull);
|
||||
|
||||
b.superNotNull(aObjectNotNullNotNullNotNull);
|
||||
b.superNotNull(aObjectNotNullNotNullNull);
|
||||
b.superNotNull(aObjectNotNullNullNotNull);
|
||||
b.superNotNull(aObjectNotNullNullNull);
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(aObjectNotNullNotNullNotNull);
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(aObjectNotNullNotNullNull);
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(aObjectNotNullNullNotNull);
|
||||
// jspecify_nullness_mismatch
|
||||
b.superNullable(aObjectNotNullNullNull);
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNonNull
|
||||
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; }
|
||||
}
|
||||
|
||||
class Foo {
|
||||
public Object foo() { return null; }
|
||||
}
|
||||
|
||||
class Use {
|
||||
static void main(Defaults a, Foo x) {
|
||||
// jspecify_nullness_mismatch
|
||||
a.everythingNotNullable(null).foo();
|
||||
a.everythingNotNullable(x).foo();
|
||||
|
||||
a.everythingNullable(null).foo();
|
||||
|
||||
a.everythingUnknown(null).foo();
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a.mixed(null).foo();
|
||||
a.mixed(x).foo();
|
||||
|
||||
a.explicitlyNullnessUnspecified(x).foo();
|
||||
a.explicitlyNullnessUnspecified(null).foo();
|
||||
|
||||
a.defaultField.foo();
|
||||
|
||||
a.field.foo();
|
||||
}
|
||||
}
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNonNull
|
||||
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; }
|
||||
}
|
||||
|
||||
class Base {
|
||||
void foo() {}
|
||||
}
|
||||
|
||||
class Derived extends Base { }
|
||||
|
||||
class Use {
|
||||
static void main(IgnoreAnnotations a, Derived x) {
|
||||
a.foo(x, null).foo();
|
||||
// jspecify_nullness_mismatch
|
||||
a.foo(null, x).foo();
|
||||
|
||||
a.field.foo();
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a.everythingNotNullable(null).foo();
|
||||
a.everythingNotNullable(x).foo();
|
||||
|
||||
a.everythingNullable(null).foo();
|
||||
|
||||
a.everythingUnknown(null).foo();
|
||||
}
|
||||
}
|
||||
Vendored
+26
@@ -0,0 +1,26 @@
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class NonPlatformTypeParameter<T extends @Nullable Object> {
|
||||
public void foo(T t) {}
|
||||
public <E extends @Nullable Object> void bar(E e) {}
|
||||
}
|
||||
|
||||
class Test {}
|
||||
|
||||
@DefaultNonNull
|
||||
class Use {
|
||||
public <T extends Test> void main(NonPlatformTypeParameter<@Nullable Object> a1, NonPlatformTypeParameter<Test> a2, T x) {
|
||||
a1.foo(null);
|
||||
a1.<@Nullable Test>bar(null);
|
||||
// jspecify_nullness_mismatch
|
||||
a1.<T>bar(null);
|
||||
a1.<T>bar(x);
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a2.foo(null);
|
||||
a2.<@Nullable Test>bar(null);
|
||||
// jspecify_nullness_mismatch
|
||||
a2.<T>bar(null);
|
||||
a2.<T>bar(x);
|
||||
}
|
||||
}
|
||||
Vendored
+30
@@ -0,0 +1,30 @@
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNonNull
|
||||
public class NullnessUnspecifiedTypeParameter<T> {
|
||||
public void foo(T t) {}
|
||||
|
||||
public void bar(Test s, T t) {} // t should not become not nullable
|
||||
}
|
||||
|
||||
class Test {}
|
||||
|
||||
class Use {
|
||||
void main(NullnessUnspecifiedTypeParameter<Object> a1, NullnessUnspecifiedTypeParameter<@Nullable Object> a2, Test x) {
|
||||
a1.foo(null);
|
||||
a1.foo(1);
|
||||
|
||||
a2.foo(null);
|
||||
a2.foo(1);
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a1.bar(null, null);
|
||||
a1.bar(x, null);
|
||||
a1.bar(x, 1);
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a2.bar(null, null);
|
||||
a2.bar(x, null);
|
||||
a2.bar(x, 1);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNotNull
|
||||
public class SelfType<T extends SelfType<T>> {
|
||||
public void foo(T t) {}
|
||||
}
|
||||
|
||||
class B extends SelfType<B> {}
|
||||
|
||||
@DefaultNotNull
|
||||
class C<E extends C<E>> extends SelfType<E> {}
|
||||
|
||||
class AK extends SelfType<AK> {}
|
||||
class AKN extends SelfType<@Nullable AK> {}
|
||||
|
||||
class BK extends B {}
|
||||
|
||||
class CK extends C<CK> {}
|
||||
|
||||
class CKN extends C<@Nullable CK> {
|
||||
public void main(AK ak, AKN akn, BK bk, CK ck, CKN ckn) {
|
||||
ak.foo(ak);
|
||||
// jspecify_nullness_mismatch
|
||||
ak.foo(null);
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
akn.foo(null);
|
||||
|
||||
bk.foo(bk);
|
||||
// jspecify_nullness_mismatch
|
||||
bk.foo(null);
|
||||
|
||||
ck.foo(ck);
|
||||
// jspecify_nullness_mismatch
|
||||
ck.foo(null);
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
ckn.foo(null);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNonNull
|
||||
public class Simple {
|
||||
@Nullable public Derived field = null;
|
||||
|
||||
@Nullable
|
||||
public Derived foo(Derived x, @NullnessUnspecified Base y) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Derived bar() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class Base {}
|
||||
class Derived extends Base {
|
||||
void foo() {}
|
||||
}
|
||||
|
||||
@DefaultNonNull
|
||||
class Use {
|
||||
static public void main(Simple a, Derived x) {
|
||||
a.foo(x, null).foo();
|
||||
// jspecify_nullness_mismatch
|
||||
a.foo(null, x).foo();
|
||||
|
||||
a.bar().foo();
|
||||
|
||||
a.field.foo();
|
||||
}
|
||||
}
|
||||
Vendored
+53
@@ -0,0 +1,53 @@
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNonNull
|
||||
public class TypeArgumentsFromParameterBounds<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> { }
|
||||
|
||||
class A {
|
||||
public void bar(TypeArgumentsFromParameterBounds<@Nullable Test, @Nullable Test, @Nullable Test> a) {}
|
||||
}
|
||||
|
||||
@DefaultNonNull
|
||||
class B {
|
||||
public void bar(TypeArgumentsFromParameterBounds<Test, Test, Test> a) {}
|
||||
}
|
||||
|
||||
class C {
|
||||
public void bar(TypeArgumentsFromParameterBounds<Test, Test, Test> a) {}
|
||||
}
|
||||
|
||||
class Test {}
|
||||
|
||||
@DefaultNonNull
|
||||
class Use {
|
||||
static public void main(
|
||||
TypeArgumentsFromParameterBounds<Test, Test, Test> aNotNullNotNullNotNull,
|
||||
TypeArgumentsFromParameterBounds<Test, Test, @Nullable Test> aNotNullNotNullNull,
|
||||
TypeArgumentsFromParameterBounds<Test, @Nullable Test, Test> aNotNullNullNotNull,
|
||||
TypeArgumentsFromParameterBounds<Test, @Nullable Test, @Nullable Test> aNotNullNullNull,
|
||||
A a, B b, C c
|
||||
) {
|
||||
// jspecify_nullness_mismatch
|
||||
a.bar(aNotNullNotNullNotNull);
|
||||
// jspecify_nullness_mismatch
|
||||
a.bar(aNotNullNotNullNull);
|
||||
// jspecify_nullness_mismatch
|
||||
a.bar(aNotNullNullNotNull);
|
||||
a.bar(aNotNullNullNull);
|
||||
|
||||
b.bar(aNotNullNotNullNotNull);
|
||||
// jspecify_nullness_mismatch
|
||||
b.bar(aNotNullNotNullNull);
|
||||
// jspecify_nullness_mismatch
|
||||
b.bar(aNotNullNullNotNull);
|
||||
// jspecify_nullness_mismatch
|
||||
b.bar(aNotNullNullNull);
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
c.bar(aNotNullNotNullNotNull);
|
||||
// jspecify_nullness_mismatch
|
||||
c.bar(aNotNullNotNullNull);
|
||||
c.bar(aNotNullNullNotNull);
|
||||
c.bar(aNotNullNullNull);
|
||||
}
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNonNull
|
||||
class A<T> {
|
||||
public void foo(@NullnessUnspecified T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
@DefaultNonNull
|
||||
class B<T> {
|
||||
public void foo(T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
class Test {}
|
||||
|
||||
@DefaultNonNull
|
||||
public class TypeParameterBounds {
|
||||
<T extends Test> void main(A<@Nullable Object> a1, A<Test> a2, B<@Nullable Object> b1, B<Test> b2, T x) {
|
||||
// jspecify_nullness_mismatch
|
||||
a1.foo(null);
|
||||
// jspecify_nullness_mismatch
|
||||
a1.<@Nullable T>bar(null);
|
||||
a1.<T>bar(x);
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
a2.foo(null);
|
||||
// jspecify_nullness_mismatch
|
||||
a2.<@Nullable T>bar(null);
|
||||
a2.<T>bar(x);
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
b1.foo(null);
|
||||
// jspecify_nullness_mismatch
|
||||
b1.<@Nullable T>bar(null);
|
||||
b1.<T>bar(x);
|
||||
|
||||
// jspecify_nullness_mismatch
|
||||
b2.foo(null);
|
||||
// jspecify_nullness_mismatch
|
||||
b2.<@Nullable T>bar(null);
|
||||
b2.<T>bar(x);
|
||||
}
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNonNull
|
||||
public class WildcardsWithDefault {
|
||||
public void noBoundsNotNull(A<?, ?, ?> a) {}
|
||||
public void noBoundsNullable(A<@Nullable ?, @Nullable ?, @Nullable ?> a) {}
|
||||
}
|
||||
|
||||
class A <T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {}
|
||||
|
||||
@DefaultNonNull
|
||||
class Use {
|
||||
public static void main(
|
||||
A<Object, Object, Object> aNotNullNotNullNotNull,
|
||||
A<Object, Object, @Nullable Object> aNotNullNotNullNull,
|
||||
A<Object, @Nullable Object, Object> aNotNullNullNotNull,
|
||||
A<Object, @Nullable Object, @Nullable Object> aNotNullNullNull,
|
||||
WildcardsWithDefault b
|
||||
) {
|
||||
// jspecify_nullness_mismatch
|
||||
b.noBoundsNotNull(aNotNullNotNullNotNull);
|
||||
b.noBoundsNotNull(aNotNullNotNullNull);
|
||||
// jspecify_nullness_mismatch
|
||||
b.noBoundsNotNull(aNotNullNullNotNull);
|
||||
// jspecify_nullness_mismatch
|
||||
b.noBoundsNotNull(aNotNullNullNull);
|
||||
|
||||
b.noBoundsNullable(aNotNullNotNullNotNull);
|
||||
b.noBoundsNullable(aNotNullNotNullNull);
|
||||
b.noBoundsNullable(aNotNullNullNotNull);
|
||||
b.noBoundsNullable(aNotNullNullNull);
|
||||
}
|
||||
}
|
||||
-43
@@ -1,43 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A<T extends @Nullable Object> {
|
||||
public void foo(T t) {}
|
||||
public <E extends @Nullable Object> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNullable
|
||||
public class B<T> {
|
||||
public void foo(T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(a1: A<Any?>, a2: A<String>, b1: B<Any?>, b2: B<String>) {
|
||||
a1.foo(null)
|
||||
a1.bar<String?>(null)
|
||||
a1.bar<String>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a1.bar<String>("")
|
||||
|
||||
a2.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a2.bar<String?>(null)
|
||||
a2.bar<String>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a2.bar<String>("")
|
||||
|
||||
b1.foo(null)
|
||||
b1.bar<String?>(null)
|
||||
b1.bar<String>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
b1.bar<String>("")
|
||||
|
||||
b2.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
b2.bar<String?>(null)
|
||||
b2.bar<String>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
b2.bar<String>("")
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a1: A<kotlin.Any?>, /*1*/ a2: A<kotlin.String>, /*2*/ b1: B<kotlin.Any?>, /*3*/ b2: B<kotlin.String>): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T> {
|
||||
public constructor A</*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
|
||||
}
|
||||
|
||||
@org.jspecify.annotations.DefaultNullable public open class B</*0*/ T> {
|
||||
public constructor B</*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
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A<T extends @NotNull A<T>> {
|
||||
public void foo(T t) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
public class B extends A<B> {}
|
||||
|
||||
// FILE: C.java
|
||||
import org.jspecify.annotations.*;
|
||||
public class C<E extends @NotNull C<E>> extends A<E> {}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
class AK : A<AK>()
|
||||
class AKN : A<<!UPPER_BOUND_VIOLATED!>AK?<!>>()
|
||||
|
||||
class BK : B()
|
||||
|
||||
class CK : C<CK>()
|
||||
class CKN : C<<!UPPER_BOUND_VIOLATED!>CK?<!>>()
|
||||
|
||||
fun main(
|
||||
ak: AK,
|
||||
akn: AKN,
|
||||
bk: BK,
|
||||
ck: CK,
|
||||
ckn: CKN
|
||||
) {
|
||||
ak.foo(ak)
|
||||
ak.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
|
||||
akn.foo(<!TYPE_MISMATCH!>akn<!>)
|
||||
akn.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
|
||||
bk.foo(bk)
|
||||
bk.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
|
||||
ck.foo(ck)
|
||||
ck.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
|
||||
ckn.foo(<!TYPE_MISMATCH!>ckn<!>)
|
||||
ckn.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A {
|
||||
@Nullable public String field = null;
|
||||
|
||||
@Nullable
|
||||
public String foo(@NotNull String x, @NullnessUnspecified CharSequence y) {
|
||||
return "";
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String bar() {
|
||||
return "";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(a: A) {
|
||||
a.foo("", null)?.length
|
||||
a.foo("", null)<!UNSAFE_CALL!>.<!>length
|
||||
a.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>, "")<!UNSAFE_CALL!>.<!>length
|
||||
|
||||
a.bar().length
|
||||
a.bar()<!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>.length
|
||||
|
||||
a.field?.length
|
||||
a.field<!UNSAFE_CALL!>.<!>length
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a: A): kotlin.Unit
|
||||
|
||||
public open class A {
|
||||
public constructor A()
|
||||
@org.jspecify.annotations.Nullable public final var field: @org.jspecify.annotations.Nullable kotlin.String?
|
||||
@org.jspecify.annotations.NotNull public open fun bar(): @org.jspecify.annotations.NotNull kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
@org.jspecify.annotations.Nullable public open fun foo(/*0*/ @org.jspecify.annotations.NotNull x: @org.jspecify.annotations.NotNull kotlin.String, /*1*/ @org.jspecify.annotations.NullnessUnspecified y: @org.jspecify.annotations.NullnessUnspecified kotlin.CharSequence!): @org.jspecify.annotations.Nullable kotlin.String?
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Vendored
-59
@@ -1,59 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A<T extends @NotNull Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNullable
|
||||
public class B {
|
||||
public void bar(A<String, String, String> a) {}
|
||||
}
|
||||
|
||||
// FILE: C.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNonNull
|
||||
public class C {
|
||||
public void bar(A<String, String, String> a) {}
|
||||
}
|
||||
|
||||
// FILE: D.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNullnessUnspecified
|
||||
public class D {
|
||||
public void bar(A<String, String, String> a) {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(
|
||||
aNotNullNotNullNotNull: A<String, String, String>,
|
||||
aNotNullNotNullNull: A<String, String, String?>,
|
||||
aNotNullNullNotNull: A<String, String?, String>,
|
||||
aNotNullNullNull: A<String, String?, String?>,
|
||||
b: B, c: C, d: D
|
||||
) {
|
||||
b.bar(<!TYPE_MISMATCH!>aNotNullNotNullNotNull<!>)
|
||||
b.bar(<!TYPE_MISMATCH!>aNotNullNotNullNull<!>)
|
||||
b.bar(<!TYPE_MISMATCH!>aNotNullNullNotNull<!>)
|
||||
b.bar(aNotNullNullNull)
|
||||
|
||||
c.bar(aNotNullNotNullNotNull)
|
||||
c.bar(<!TYPE_MISMATCH!>aNotNullNotNullNull<!>)
|
||||
c.bar(<!TYPE_MISMATCH!>aNotNullNullNotNull<!>)
|
||||
c.bar(<!TYPE_MISMATCH!>aNotNullNullNull<!>)
|
||||
|
||||
d.bar(<!TYPE_MISMATCH!>aNotNullNotNullNotNull<!>)
|
||||
d.bar(<!TYPE_MISMATCH!>aNotNullNotNullNull<!>)
|
||||
d.bar(aNotNullNullNotNull)
|
||||
d.bar(aNotNullNullNull)
|
||||
}
|
||||
Vendored
-34
@@ -1,34 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ aNotNullNotNullNotNull: A<kotlin.String, kotlin.String, kotlin.String>, /*1*/ aNotNullNotNullNull: A<kotlin.String, kotlin.String, kotlin.String?>, /*2*/ aNotNullNullNotNull: A<kotlin.String, kotlin.String?, kotlin.String>, /*3*/ aNotNullNullNull: A<kotlin.String, kotlin.String?, kotlin.String?>, /*4*/ b: B, /*5*/ c: C, /*6*/ d: D): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any, /*1*/ E, /*2*/ F : @org.jspecify.annotations.NullnessUnspecified kotlin.Any!> {
|
||||
public constructor A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any, /*1*/ E, /*2*/ F : @org.jspecify.annotations.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.annotations.DefaultNullable public open class B {
|
||||
public constructor B()
|
||||
public open fun bar(/*0*/ a: A<kotlin.String, kotlin.String?, kotlin.String?>?): 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
|
||||
}
|
||||
|
||||
@org.jspecify.annotations.DefaultNonNull public open class C {
|
||||
public constructor C()
|
||||
public open fun bar(/*0*/ a: A<kotlin.String, kotlin.String, kotlin.String>): 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
|
||||
}
|
||||
|
||||
@org.jspecify.annotations.DefaultNullnessUnspecified public open class D {
|
||||
public constructor D()
|
||||
public open fun bar(/*0*/ a: A<kotlin.String, kotlin.String?, kotlin.String!>!): 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
|
||||
}
|
||||
-39
@@ -1,39 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A<T extends @NotNull Object> {
|
||||
public void foo(T t) {}
|
||||
public <E extends @NotNull Object> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNonNull
|
||||
public class B<T> {
|
||||
public void foo(T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(a1: A<<!UPPER_BOUND_VIOLATED!>Any?<!>>, a2: A<String>, b1: B<<!UPPER_BOUND_VIOLATED!>Any?<!>>, b2: B<String>) {
|
||||
a1.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a1.bar<<!UPPER_BOUND_VIOLATED!>String?<!>>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a1.bar<String>("")
|
||||
|
||||
a2.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a2.bar<<!UPPER_BOUND_VIOLATED!>String?<!>>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
a2.bar<String>("")
|
||||
|
||||
b1.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
b1.bar<<!UPPER_BOUND_VIOLATED!>String?<!>>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
b1.bar<String>("")
|
||||
|
||||
b2.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
b2.bar<<!UPPER_BOUND_VIOLATED!>String?<!>>(<!NULL_FOR_NONNULL_TYPE!>null<!>)
|
||||
b2.bar<String>("")
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a1: A<kotlin.Any?>, /*1*/ a2: A<kotlin.String>, /*2*/ b1: B<kotlin.Any?>, /*3*/ b2: B<kotlin.String>): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any> {
|
||||
public constructor A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any>()
|
||||
public open fun </*0*/ E : @org.jspecify.annotations.NotNull 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
|
||||
}
|
||||
|
||||
@org.jspecify.annotations.DefaultNonNull 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
|
||||
}
|
||||
-29
@@ -1,29 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A<T> {
|
||||
public void foo(T t) {}
|
||||
|
||||
@DefaultNonNull
|
||||
public void bar(String s, T t) {} // t should not become not nullable
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(a1: A<Int>, a2: A<Int?>) {
|
||||
a1.foo(null)
|
||||
a1.foo(1)
|
||||
|
||||
a2.foo(null)
|
||||
a2.foo(1)
|
||||
|
||||
a1.bar(<!NULL_FOR_NONNULL_TYPE!>null<!>, null)
|
||||
a1.bar("", null)
|
||||
a1.bar("", 1)
|
||||
|
||||
a2.bar(<!NULL_FOR_NONNULL_TYPE!>null<!>, null)
|
||||
a2.bar("", null)
|
||||
a2.bar("", 1)
|
||||
}
|
||||
-12
@@ -1,12 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a1: A<kotlin.Int>, /*1*/ a2: A<kotlin.Int?>): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : kotlin.Any!> {
|
||||
public constructor A</*0*/ T : kotlin.Any!>()
|
||||
@org.jspecify.annotations.DefaultNonNull public open fun bar(/*0*/ s: kotlin.String, /*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
|
||||
}
|
||||
-81
@@ -1,81 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// JSPECIFY_STATE warn
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A<T extends @NotNull Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class B {
|
||||
public void superAsIs(A<? super CharSequence, ? super CharSequence, ? super CharSequence> a) {}
|
||||
public void superNotNull(A<? super @NotNull CharSequence, ? super @NotNull CharSequence, ? super @NotNull CharSequence> a) {}
|
||||
public void superNullable(A<? super @Nullable CharSequence, ? super @Nullable CharSequence, ? super @Nullable CharSequence> a) {}
|
||||
|
||||
public void extendsAsIs(A<? extends CharSequence, ? extends CharSequence, ? extends CharSequence> a) {}
|
||||
public void extendsNotNull(A<? extends @NotNull CharSequence, ? extends @NotNull CharSequence, ? extends @NotNull CharSequence> a) {}
|
||||
public void extendsNullable(A<? extends @Nullable CharSequence, ? extends @Nullable CharSequence, ? extends @Nullable CharSequence> a) {}
|
||||
|
||||
public void noBounds(A<?, ?, ?> a) {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(
|
||||
aNotNullNotNullNotNull: A<String, String, String>,
|
||||
aNotNullNotNullNull: A<String, String, String?>,
|
||||
aNotNullNullNotNull: A<String, String?, String>,
|
||||
aNotNullNullNull: A<String, String?, String?>,
|
||||
|
||||
aAnyNotNullNotNullNotNull: A<Any, Any, Any>,
|
||||
aAnyNotNullNotNullNull: A<Any, Any, Any?>,
|
||||
aAnyNotNullNullNotNull: A<Any, Any?, Any>,
|
||||
aAnyNotNullNullNull: A<Any, Any?, Any?>,
|
||||
b: B
|
||||
) {
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.superAsIs(aAnyNotNullNotNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.superAsIs(aAnyNotNullNotNullNull)
|
||||
b.superAsIs(aAnyNotNullNullNotNull)
|
||||
b.superAsIs(aAnyNotNullNullNull)
|
||||
|
||||
b.superNotNull(aAnyNotNullNotNullNotNull)
|
||||
b.superNotNull(aAnyNotNullNotNullNull)
|
||||
b.superNotNull(aAnyNotNullNullNotNull)
|
||||
b.superNotNull(aAnyNotNullNullNull)
|
||||
|
||||
// TODO: Bound for the first argument in "superNullable" contradicts to declared nullability of the parameter
|
||||
// Do we need to ignore such arguments' nullability?
|
||||
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)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.extendsNotNull(aNotNullNotNullNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.extendsNotNull(aNotNullNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
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)
|
||||
}
|
||||
-24
@@ -1,24 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ aNotNullNotNullNotNull: A<kotlin.String, kotlin.String, kotlin.String>, /*1*/ aNotNullNotNullNull: A<kotlin.String, kotlin.String, kotlin.String?>, /*2*/ aNotNullNullNotNull: A<kotlin.String, kotlin.String?, kotlin.String>, /*3*/ aNotNullNullNull: A<kotlin.String, kotlin.String?, kotlin.String?>, /*4*/ aAnyNotNullNotNullNotNull: A<kotlin.Any, kotlin.Any, kotlin.Any>, /*5*/ aAnyNotNullNotNullNull: A<kotlin.Any, kotlin.Any, kotlin.Any?>, /*6*/ aAnyNotNullNullNotNull: A<kotlin.Any, kotlin.Any?, kotlin.Any>, /*7*/ aAnyNotNullNullNull: A<kotlin.Any, kotlin.Any?, kotlin.Any?>, /*8*/ b: B): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any!, /*1*/ E : @org.jspecify.annotations.Nullable kotlin.Any!, /*2*/ F : @org.jspecify.annotations.NullnessUnspecified kotlin.Any!> {
|
||||
public constructor A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any!, /*1*/ E : @org.jspecify.annotations.Nullable kotlin.Any!, /*2*/ F : @org.jspecify.annotations.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
|
||||
}
|
||||
|
||||
public open class B {
|
||||
public constructor B()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun extendsAsIs(/*0*/ a: A<out kotlin.CharSequence!, out kotlin.CharSequence!, out kotlin.CharSequence!>!): kotlin.Unit
|
||||
public open fun extendsNotNull(/*0*/ a: A<out @org.jspecify.annotations.NotNull kotlin.CharSequence!, out @org.jspecify.annotations.NotNull kotlin.CharSequence!, out @org.jspecify.annotations.NotNull kotlin.CharSequence!>!): kotlin.Unit
|
||||
public open fun extendsNullable(/*0*/ a: A<out @org.jspecify.annotations.Nullable kotlin.CharSequence!, out @org.jspecify.annotations.Nullable kotlin.CharSequence!, out @org.jspecify.annotations.Nullable kotlin.CharSequence!>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open fun noBounds(/*0*/ a: A<*, *, *>!): kotlin.Unit
|
||||
public open fun superAsIs(/*0*/ a: A<in kotlin.CharSequence!, in kotlin.CharSequence!, in kotlin.CharSequence!>!): kotlin.Unit
|
||||
public open fun superNotNull(/*0*/ a: A<in @org.jspecify.annotations.NotNull kotlin.CharSequence!, in @org.jspecify.annotations.NotNull kotlin.CharSequence!, in @org.jspecify.annotations.NotNull kotlin.CharSequence!>!): kotlin.Unit
|
||||
public open fun superNullable(/*0*/ a: A<in @org.jspecify.annotations.Nullable kotlin.CharSequence!, in @org.jspecify.annotations.Nullable kotlin.CharSequence!, in @org.jspecify.annotations.Nullable kotlin.CharSequence!>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
-52
@@ -1,52 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// JSPECIFY_STATE warn
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNonNull
|
||||
public class A {
|
||||
public String defaultField = "";
|
||||
@Nullable public String field = null;
|
||||
|
||||
public String everythingNotNullable(String x) { return ""; }
|
||||
|
||||
@DefaultNullable
|
||||
public String everythingNullable(String x) { return ""; }
|
||||
|
||||
@DefaultNullnessUnspecified
|
||||
public String everythingUnknown(String x) { return ""; }
|
||||
|
||||
@DefaultNullable
|
||||
public String mixed(@NotNull String x) { return ""; }
|
||||
|
||||
public String explicitlyNullnessUnspecified(@NullnessUnspecified String x) { return ""; }
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(a: A) {
|
||||
a.everythingNotNullable(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)<!UNNECESSARY_SAFE_CALL!>?.<!>length
|
||||
a.everythingNotNullable(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>).length
|
||||
a.everythingNotNullable("").length
|
||||
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.everythingNullable(null)<!>.length
|
||||
a.everythingNullable(null)?.length
|
||||
|
||||
a.everythingUnknown(null).length
|
||||
a.everythingUnknown(null)?.length
|
||||
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.mixed(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)<!>.length
|
||||
a.mixed(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>)?.length
|
||||
a.mixed("")?.length
|
||||
|
||||
a.explicitlyNullnessUnspecified("").length
|
||||
a.explicitlyNullnessUnspecified("")<!UNNECESSARY_SAFE_CALL!>?.<!>length
|
||||
a.explicitlyNullnessUnspecified(null).length
|
||||
|
||||
a.defaultField<!UNNECESSARY_SAFE_CALL!>?.<!>length
|
||||
a.defaultField.length
|
||||
|
||||
a.field?.length
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.field<!>.length
|
||||
}
|
||||
-17
@@ -1,17 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a: A): kotlin.Unit
|
||||
|
||||
@org.jspecify.annotations.DefaultNonNull public open class A {
|
||||
public constructor A()
|
||||
public final var defaultField: kotlin.String!
|
||||
@org.jspecify.annotations.Nullable public final var field: @org.jspecify.annotations.Nullable kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun everythingNotNullable(/*0*/ x: kotlin.String!): kotlin.String!
|
||||
@org.jspecify.annotations.DefaultNullable public open fun everythingNullable(/*0*/ x: kotlin.String!): @org.jspecify.annotations.DefaultNullable kotlin.String!
|
||||
@org.jspecify.annotations.DefaultNullnessUnspecified public open fun everythingUnknown(/*0*/ x: kotlin.String!): @org.jspecify.annotations.DefaultNullnessUnspecified kotlin.String!
|
||||
public open fun explicitlyNullnessUnspecified(/*0*/ @org.jspecify.annotations.NullnessUnspecified x: @org.jspecify.annotations.NullnessUnspecified kotlin.String!): kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
@org.jspecify.annotations.DefaultNullable public open fun mixed(/*0*/ @org.jspecify.annotations.NotNull x: @org.jspecify.annotations.NotNull kotlin.String!): @org.jspecify.annotations.DefaultNullable kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Vendored
-50
@@ -1,50 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// JSPECIFY_STATE warn
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A<T extends @Nullable Object> {
|
||||
public void foo(T t) {}
|
||||
public <E extends @Nullable Object> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNullable
|
||||
public class B<T> {
|
||||
public void foo(T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(a1: A<Any?>, a2: A<String>, b1: B<Any?>, b2: B<String>) {
|
||||
a1.foo(null)
|
||||
a1.bar<String?>(null)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
a1.bar<String>(null)
|
||||
a1.bar<String>("")
|
||||
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
a2.foo(null)
|
||||
a2.bar<String?>(null)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
a2.bar<String>(null)
|
||||
a2.bar<String>("")
|
||||
|
||||
b1.foo(null)
|
||||
b1.bar<String?>(null)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b1.bar<String>(null)
|
||||
b1.bar<String>("")
|
||||
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b2.foo(null)
|
||||
b2.bar<String?>(null)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b2.bar<String>(null)
|
||||
b2.bar<String>("")
|
||||
}
|
||||
Vendored
-21
@@ -1,21 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a1: A<kotlin.Any?>, /*1*/ a2: A<kotlin.String>, /*2*/ b1: B<kotlin.Any?>, /*3*/ b2: B<kotlin.String>): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : @org.jspecify.annotations.Nullable kotlin.Any!> {
|
||||
public constructor A</*0*/ T : @org.jspecify.annotations.Nullable kotlin.Any!>()
|
||||
public open fun </*0*/ E : @org.jspecify.annotations.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
|
||||
}
|
||||
|
||||
@org.jspecify.annotations.DefaultNullable 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
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// JSPECIFY_STATE warn
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A {
|
||||
@Nullable public String field = null;
|
||||
|
||||
@Nullable
|
||||
public String foo(@NotNull String x, @NullnessUnspecified CharSequence y) {
|
||||
return "";
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String bar() {
|
||||
return "";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(a: A) {
|
||||
a.foo("", null)?.length
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.foo("", null)<!>.length
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.foo(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>, "")<!>.length
|
||||
|
||||
a.bar().length
|
||||
a.bar()<!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>.length
|
||||
|
||||
a.field?.length
|
||||
<!RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>a.field<!>.length
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a: A): kotlin.Unit
|
||||
|
||||
public open class A {
|
||||
public constructor A()
|
||||
@org.jspecify.annotations.Nullable public final var field: @org.jspecify.annotations.Nullable kotlin.String!
|
||||
@org.jspecify.annotations.NotNull public open fun bar(): @org.jspecify.annotations.NotNull kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
@org.jspecify.annotations.Nullable public open fun foo(/*0*/ @org.jspecify.annotations.NotNull x: @org.jspecify.annotations.NotNull kotlin.String!, /*1*/ @org.jspecify.annotations.NullnessUnspecified y: @org.jspecify.annotations.NullnessUnspecified kotlin.CharSequence!): @org.jspecify.annotations.Nullable kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
-68
@@ -1,68 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// JSPECIFY_STATE warn
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A<T extends @NotNull Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNullable
|
||||
public class B {
|
||||
public void bar(A<String, String, String> a) {}
|
||||
}
|
||||
|
||||
// FILE: C.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNonNull
|
||||
public class C {
|
||||
public void bar(A<String, String, String> a) {}
|
||||
}
|
||||
|
||||
// FILE: D.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNullnessUnspecified
|
||||
public class D {
|
||||
public void bar(A<String, String, String> a) {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(
|
||||
aNotNullNotNullNotNull: A<String, String, String>,
|
||||
aNotNullNotNullNull: A<String, String, String?>,
|
||||
aNotNullNullNotNull: A<String, String?, String>,
|
||||
aNotNullNullNull: A<String, String?, String?>,
|
||||
b: B, c: C, d: D
|
||||
) {
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.bar(aNotNullNotNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.bar(aNotNullNotNullNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.bar(aNotNullNullNotNull)
|
||||
b.bar(aNotNullNullNull)
|
||||
|
||||
c.bar(aNotNullNotNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
c.bar(aNotNullNotNullNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
c.bar(aNotNullNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
c.bar(aNotNullNullNull)
|
||||
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
d.bar(aNotNullNotNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
d.bar(aNotNullNotNullNull)
|
||||
d.bar(aNotNullNullNotNull)
|
||||
d.bar(aNotNullNullNull)
|
||||
}
|
||||
-34
@@ -1,34 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ aNotNullNotNullNotNull: A<kotlin.String, kotlin.String, kotlin.String>, /*1*/ aNotNullNotNullNull: A<kotlin.String, kotlin.String, kotlin.String?>, /*2*/ aNotNullNullNotNull: A<kotlin.String, kotlin.String?, kotlin.String>, /*3*/ aNotNullNullNull: A<kotlin.String, kotlin.String?, kotlin.String?>, /*4*/ b: B, /*5*/ c: C, /*6*/ d: D): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any!, /*1*/ E : @org.jspecify.annotations.Nullable kotlin.Any!, /*2*/ F : @org.jspecify.annotations.NullnessUnspecified kotlin.Any!> {
|
||||
public constructor A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any!, /*1*/ E : @org.jspecify.annotations.Nullable kotlin.Any!, /*2*/ F : @org.jspecify.annotations.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.annotations.DefaultNullable public open class B {
|
||||
public constructor B()
|
||||
public open fun bar(/*0*/ a: A<kotlin.String!, kotlin.String!, kotlin.String!>!): 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
|
||||
}
|
||||
|
||||
@org.jspecify.annotations.DefaultNonNull public open class C {
|
||||
public constructor C()
|
||||
public open fun bar(/*0*/ a: A<kotlin.String!, kotlin.String!, kotlin.String!>!): 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
|
||||
}
|
||||
|
||||
@org.jspecify.annotations.DefaultNullnessUnspecified public open class D {
|
||||
public constructor D()
|
||||
public open fun bar(/*0*/ a: A<kotlin.String!, kotlin.String!, kotlin.String!>!): 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
|
||||
}
|
||||
-49
@@ -1,49 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// JSPECIFY_STATE warn
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A<T extends @NotNull Object> {
|
||||
public void foo(T t) {}
|
||||
public <E extends @NotNull Object> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
@DefaultNonNull
|
||||
public class B<T> {
|
||||
public void foo(T t) {}
|
||||
public <E> void bar(E e) {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
// TODO: UPPER_BOUND_VIOLATED_WARNING should be reported
|
||||
fun main(a1: A<Any?>, a2: A<String>, b1: B<Any?>, b2: B<String>) {
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
a1.foo(null)
|
||||
// TODO: UPPER_BOUND_VIOLATED_WARNING should be reported
|
||||
a1.bar<String?>(null)
|
||||
a1.bar<String>("")
|
||||
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
a2.foo(null)
|
||||
// TODO: UPPER_BOUND_VIOLATED_WARNING should be reported
|
||||
a2.bar<String?>(null)
|
||||
a2.bar<String>("")
|
||||
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b1.foo(null)
|
||||
// TODO: UPPER_BOUND_VIOLATED_WARNING should be reported
|
||||
b1.bar<String?>(null)
|
||||
b1.bar<String>("")
|
||||
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b2.foo(null)
|
||||
// TODO: UPPER_BOUND_VIOLATED_WARNING should be reported
|
||||
b2.bar<String?>(null)
|
||||
b2.bar<String>("")
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a1: A<kotlin.Any?>, /*1*/ a2: A<kotlin.String>, /*2*/ b1: B<kotlin.Any?>, /*3*/ b2: B<kotlin.String>): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any!> {
|
||||
public constructor A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any!>()
|
||||
public open fun </*0*/ E : @org.jspecify.annotations.NotNull 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
|
||||
}
|
||||
|
||||
@org.jspecify.annotations.DefaultNonNull 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
|
||||
}
|
||||
Vendored
-30
@@ -1,30 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// JSPECIFY_STATE warn
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A<T> {
|
||||
public void foo(T t) {}
|
||||
|
||||
@DefaultNonNull
|
||||
public void bar(String s, T t) {} // t should not become not nullable
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(a1: A<Int>, a2: A<Int?>) {
|
||||
a1.foo(null)
|
||||
a1.foo(1)
|
||||
|
||||
a2.foo(null)
|
||||
a2.foo(1)
|
||||
|
||||
a1.bar(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>, null)
|
||||
a1.bar("", null)
|
||||
a1.bar("", 1)
|
||||
|
||||
a2.bar(<!NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS!>null<!>, null)
|
||||
a2.bar("", null)
|
||||
a2.bar("", 1)
|
||||
}
|
||||
Vendored
-12
@@ -1,12 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ a1: A<kotlin.Int>, /*1*/ a2: A<kotlin.Int?>): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : kotlin.Any!> {
|
||||
public constructor A</*0*/ T : kotlin.Any!>()
|
||||
@org.jspecify.annotations.DefaultNonNull public open fun bar(/*0*/ s: kotlin.String!, /*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
|
||||
}
|
||||
-42
@@ -1,42 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// JSPECIFY_STATE warn
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A<T extends @NotNull Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class B {
|
||||
@DefaultNonNull
|
||||
public void noBoundsNotNull(A<?, ?, ?> a) {}
|
||||
@DefaultNullable
|
||||
public void noBoundsNullable(A<?, ?, ?> a) {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(
|
||||
aNotNullNotNullNotNull: A<String, String, String>,
|
||||
aNotNullNotNullNull: A<String, String, String?>,
|
||||
aNotNullNullNotNull: A<String, String?, String>,
|
||||
aNotNullNullNull: A<String, String?, String?>,
|
||||
b: B
|
||||
) {
|
||||
b.noBoundsNotNull(aNotNullNotNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.noBoundsNotNull(aNotNullNotNullNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.noBoundsNotNull(aNotNullNullNotNull)
|
||||
// TODO: NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS should be reported
|
||||
b.noBoundsNotNull(aNotNullNullNull)
|
||||
|
||||
b.noBoundsNullable(aNotNullNotNullNotNull)
|
||||
b.noBoundsNullable(aNotNullNotNullNull)
|
||||
b.noBoundsNullable(aNotNullNullNotNull)
|
||||
b.noBoundsNullable(aNotNullNullNull)
|
||||
}
|
||||
-19
@@ -1,19 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ aNotNullNotNullNotNull: A<kotlin.String, kotlin.String, kotlin.String>, /*1*/ aNotNullNotNullNull: A<kotlin.String, kotlin.String, kotlin.String?>, /*2*/ aNotNullNullNotNull: A<kotlin.String, kotlin.String?, kotlin.String>, /*3*/ aNotNullNullNull: A<kotlin.String, kotlin.String?, kotlin.String?>, /*4*/ b: B): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any!, /*1*/ E : @org.jspecify.annotations.Nullable kotlin.Any!, /*2*/ F : @org.jspecify.annotations.NullnessUnspecified kotlin.Any!> {
|
||||
public constructor A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any!, /*1*/ E : @org.jspecify.annotations.Nullable kotlin.Any!, /*2*/ F : @org.jspecify.annotations.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
|
||||
}
|
||||
|
||||
public open class 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 hashCode(): kotlin.Int
|
||||
@org.jspecify.annotations.DefaultNonNull public open fun noBoundsNotNull(/*0*/ a: A<*, *, *>!): kotlin.Unit
|
||||
@org.jspecify.annotations.DefaultNullable public open fun noBoundsNullable(/*0*/ a: A<*, *, *>!): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
-38
@@ -1,38 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// FILE: A.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class A<T extends @NotNull Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {
|
||||
}
|
||||
|
||||
// FILE: B.java
|
||||
|
||||
import org.jspecify.annotations.*;
|
||||
|
||||
public class B {
|
||||
@DefaultNonNull
|
||||
public void noBoundsNotNull(A<?, ?, ?> a) {}
|
||||
@DefaultNullable
|
||||
public void noBoundsNullable(A<?, ?, ?> a) {}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun main(
|
||||
aNotNullNotNullNotNull: A<String, String, String>,
|
||||
aNotNullNotNullNull: A<String, String, String?>,
|
||||
aNotNullNullNotNull: A<String, String?, String>,
|
||||
aNotNullNullNull: A<String, String?, String?>,
|
||||
b: B
|
||||
) {
|
||||
b.noBoundsNotNull(aNotNullNotNullNotNull)
|
||||
b.noBoundsNotNull(<!TYPE_MISMATCH!>aNotNullNotNullNull<!>)
|
||||
b.noBoundsNotNull(<!TYPE_MISMATCH!>aNotNullNullNotNull<!>)
|
||||
b.noBoundsNotNull(<!TYPE_MISMATCH!>aNotNullNullNull<!>)
|
||||
|
||||
b.noBoundsNullable(aNotNullNotNullNotNull)
|
||||
b.noBoundsNullable(aNotNullNotNullNull)
|
||||
b.noBoundsNullable(aNotNullNullNotNull)
|
||||
b.noBoundsNullable(aNotNullNullNull)
|
||||
}
|
||||
-19
@@ -1,19 +0,0 @@
|
||||
package
|
||||
|
||||
public fun main(/*0*/ aNotNullNotNullNotNull: A<kotlin.String, kotlin.String, kotlin.String>, /*1*/ aNotNullNotNullNull: A<kotlin.String, kotlin.String, kotlin.String?>, /*2*/ aNotNullNullNotNull: A<kotlin.String, kotlin.String?, kotlin.String>, /*3*/ aNotNullNullNull: A<kotlin.String, kotlin.String?, kotlin.String?>, /*4*/ b: B): kotlin.Unit
|
||||
|
||||
public open class A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any, /*1*/ E, /*2*/ F : @org.jspecify.annotations.NullnessUnspecified kotlin.Any!> {
|
||||
public constructor A</*0*/ T : @org.jspecify.annotations.NotNull kotlin.Any, /*1*/ E, /*2*/ F : @org.jspecify.annotations.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
|
||||
}
|
||||
|
||||
public open class 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 hashCode(): kotlin.Int
|
||||
@org.jspecify.annotations.DefaultNonNull public open fun noBoundsNotNull(/*0*/ a: A<out @org.jspecify.annotations.NotNull kotlin.Any, out @org.jspecify.annotations.Nullable kotlin.Any, out @org.jspecify.annotations.NullnessUnspecified kotlin.Any>): kotlin.Unit
|
||||
@org.jspecify.annotations.DefaultNullable public open fun noBoundsNullable(/*0*/ a: A<out @org.jspecify.annotations.NotNull kotlin.Any, *, *>?): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
Reference in New Issue
Block a user