This commit is contained in:
Victor Petukhov
2020-10-07 16:19:48 +03:00
parent 307cfea0f7
commit 994113ee8b
38 changed files with 572 additions and 330 deletions

View File

@@ -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,
AnnotatedWildcards 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);
}
}

View File

@@ -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();
}
}

View File

@@ -1,11 +1,7 @@
import org.jspecify.annotations.*;
@DefaultNonNull
public class IgnoreAnnotations {
public static class Base {
void foo() {}
}
public static class Derived extends Base { }
@Nullable public Derived field = null;
@Nullable
@@ -13,10 +9,31 @@ public class IgnoreAnnotations {
return null;
}
static void main(IgnoreAnnotations a) {
a.foo(new Derived(), null).foo();
a.foo(null, new Derived()).foo();
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();
a.foo(null, x).foo();
a.field.foo();
a.everythingNotNullable(null).foo();
a.everythingNotNullable(x).foo();
a.everythingNullable(null).foo();
a.everythingUnknown(null).foo();
}
}

View File

@@ -1,18 +1,26 @@
import org.jspecify.annotations.*;
public class NonPlatformTypeParameter<T extends @Nullable Object> {
public static class Test {}
public void foo(T t) {}
public <E extends @Nullable Object> void bar(E e) {}
}
public static void main(NonPlatformTypeParameter<Object> a1, NonPlatformTypeParameter<Test> a2) {
class Test {}
@DefaultNonNull
class Use {
public <T extends Test> void main(NonPlatformTypeParameter<@Nullable Object> a1, NonPlatformTypeParameter<Test> a2, T x) {
a1.foo(null);
a1.<Test>bar(null);
a1.<Test>bar(new Test());
a1.<@Nullable Test>bar(null);
// jspecify_nullness_mismatch
a1.<T>bar(null);
a1.<T>bar(x);
// jspecify_nullness_mismatch
a2.foo(null);
a2.<Test>bar(null);
a2.<Test>bar(new Test());
a2.<@Nullable Test>bar(null);
// jspecify_nullness_mismatch
a2.<T>bar(null);
a2.<T>bar(x);
}
}

View File

@@ -1,21 +1,32 @@
import org.jspecify.annotations.*;
@DefaultNonNull
public class Simple {
public static class Base {}
public static class Derived extends Base {
void foo() {}
}
@Nullable public Simple.Derived field = null;
@Nullable public Derived field = null;
@Nullable
public Simple.Derived foo(Derived x, @NullnessUnspecified Base y) {
public Derived foo(Derived x, @NullnessUnspecified Base y) {
return null;
}
static public void main(Simple a) {
a.foo(new Derived(), null).foo();
a.foo(null, new Derived()).foo();
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();
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -0,0 +1,37 @@
// COMPILER_ARGUMENTS: -Xjspecify-annotations
import org.jspecify.annotations.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@DefaultNonNull
public class WildcardsWithDefault {
public void noBoundsNotNull(WildcardsWithDefault.A<?, ?, ?> a) {}
public void noBoundsNullable(WildcardsWithDefault.A<@Nullable ?, @Nullable ?, @Nullable ?> a) {}
public class A <T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {}
}
@DefaultNonNull
class Use {
public static void main(
WildcardsWithDefault.A<Object, Object, Object> aNotNullNotNullNotNull,
WildcardsWithDefault.A<Object, Object, @Nullable Object> aNotNullNotNullNull,
WildcardsWithDefault.A<Object, @Nullable Object, Object> aNotNullNullNotNull,
WildcardsWithDefault.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);
}
}

View File

@@ -1,3 +0,0 @@
import org.jspecify.annotations.*;
public class AnnotatedWildcardsA<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> { }

View File

@@ -1,53 +0,0 @@
import org.jspecify.annotations.*;
public class AnnotatedWildcardsB {
public static class Base {}
public static class Derived extends Base {}
public void superAsIs(AnnotatedWildcardsA<? super Base, ? super Base, ? super Base> a) {}
public void superNullable(AnnotatedWildcardsA<? super @Nullable Base, ? super @Nullable Base, ? super @Nullable Base> a) {}
public void extendsAsIs(AnnotatedWildcardsA<? extends Base, ? extends Base, ? extends Base> a) {}
public void extendsNullable(AnnotatedWildcardsA<? extends @Nullable Base, ? extends @Nullable Base, ? extends @Nullable Base> a) {}
public void noBounds(AnnotatedWildcardsA<?, ?, ?> a) {}
public void main(
AnnotatedWildcardsA<Derived, Derived, Derived> aNullUnspecNullUnspecNullUnspec,
AnnotatedWildcardsA<Derived, Derived, @Nullable Derived> aNullUnspecNullUnspecNull,
AnnotatedWildcardsA<Derived, @Nullable Derived, Derived> aNullUnspecNullNullUnspec,
AnnotatedWildcardsA<Derived, @Nullable Derived, @Nullable Derived> aNullUnspecNullNull,
AnnotatedWildcardsA<Object, Object, Object> aObjectNullUnspecNullUnspecNullUnspec,
AnnotatedWildcardsA<Object, Object, @Nullable Object> aObjectNullUnspecNullUnspecNull,
AnnotatedWildcardsA<Object, @Nullable Object, Object> aObjectNullUnspecNullNullUnspec,
AnnotatedWildcardsA<Object, @Nullable Object, @Nullable Object> aObjectNullUnspecNullNull,
AnnotatedWildcardsB b
) {
b.superAsIs(aObjectNullUnspecNullUnspecNullUnspec);
b.superAsIs(aObjectNullUnspecNullUnspecNull);
b.superAsIs(aObjectNullUnspecNullNullUnspec);
b.superAsIs(aObjectNullUnspecNullNull);
b.superNullable(aObjectNullUnspecNullUnspecNullUnspec);
b.superNullable(aObjectNullUnspecNullUnspecNull);
b.superNullable(aObjectNullUnspecNullNullUnspec);
b.superNullable(aObjectNullUnspecNullNull);
b.extendsAsIs(aNullUnspecNullUnspecNullUnspec);
b.extendsAsIs(aNullUnspecNullUnspecNull);
b.extendsAsIs(aNullUnspecNullNullUnspec);
b.extendsAsIs(aNullUnspecNullNull);
b.extendsNullable(aNullUnspecNullUnspecNullUnspec);
b.extendsNullable(aNullUnspecNullUnspecNull);
b.extendsNullable(aNullUnspecNullNullUnspec);
b.extendsNullable(aNullUnspecNullNull);
b.noBounds(aNullUnspecNullUnspecNullUnspec);
b.noBounds(aNullUnspecNullUnspecNull);
b.noBounds(aNullUnspecNullNullUnspec);
b.noBounds(aNullUnspecNullNull);
}
}

View File

@@ -1,15 +0,0 @@
import org.jspecify.annotations.*;
@DefaultNotNull
public class DefaultsA {
static class Test {
public Test foo() { return null; }
}
public Test defaultField = null;
@Nullable public Test field = null;
public Test everythingNotNullable(Test x) { return null; }
public Test explicitlyNullnessUnspecified(@NullnessUnspecified Test x) { return null; }
}

View File

@@ -1,13 +0,0 @@
public class DefaultsB {
static void main(DefaultsA a) {
a.everythingNotNullable(null).foo();
a.everythingNotNullable(new DefaultsA.Test()).foo();
a.explicitlyNullnessUnspecified(new DefaultsA.Test()).foo();
a.explicitlyNullnessUnspecified(null).foo();
a.defaultField.foo();
a.field.foo();
}
}

View File

@@ -1,16 +0,0 @@
import org.jspecify.annotations.*;
public class TypeArgumentsFromParameterBoundsA<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {
static public void main(
TypeArgumentsFromParameterBoundsA<TypeArgumentsFromParameterBoundsC.Test, TypeArgumentsFromParameterBoundsC.Test, TypeArgumentsFromParameterBoundsC.Test> aNullUnspecNullUnspecNullUnspec,
TypeArgumentsFromParameterBoundsA<TypeArgumentsFromParameterBoundsC.Test, TypeArgumentsFromParameterBoundsC.Test, @Nullable TypeArgumentsFromParameterBoundsC.Test> aNullUnspecNullUnspecNull,
TypeArgumentsFromParameterBoundsA<TypeArgumentsFromParameterBoundsC.Test, @Nullable TypeArgumentsFromParameterBoundsC.Test, TypeArgumentsFromParameterBoundsC.Test> aNullUnspecNullNullUnspec,
TypeArgumentsFromParameterBoundsA<TypeArgumentsFromParameterBoundsC.Test, @Nullable TypeArgumentsFromParameterBoundsC.Test, @Nullable TypeArgumentsFromParameterBoundsC.Test> aNullUnspecNullNull,
TypeArgumentsFromParameterBoundsC c
) {
c.bar(aNullUnspecNullUnspecNullUnspec);
c.bar(aNullUnspecNullUnspecNull);
c.bar(aNullUnspecNullNullUnspec);
c.bar(aNullUnspecNullNull);
}
}

View File

@@ -1,8 +0,0 @@
import org.jspecify.annotations.*;
@DefaultNotNull
public class TypeArgumentsFromParameterBoundsC {
static public class Test {}
public void bar(TypeArgumentsFromParameterBoundsA<Test, Test, Test> a) {}
}

View File

@@ -1,10 +0,0 @@
import org.jspecify.annotations.*;
@DefaultNotNull
public class TypeParameterBoundsB<T> {
static public class Test {}
public void foo(T t) {}
public <E> void bar(E e) {}
public void boo(Test e) {}
}

View File

@@ -1,12 +0,0 @@
public class TypeParameterBoundsC {
public static void main(TypeParameterBoundsB<@Nullable Object> b1, TypeParameterBoundsB<TypeParameterBoundsB.Test> b2) {
b1.foo(null);
b1.<@Nullable TypeParameterBoundsB.Test>bar(null);
b1.<TypeParameterBoundsB.Test>bar(new TypeParameterBoundsB.Test());
b2.foo(null);
b2.boo(null);
b2.<@Nullable TypeParameterBoundsB.Test>bar(null);
b2.<TypeParameterBoundsB.Test>bar(new TypeParameterBoundsB.Test());
}
}

View File

@@ -1,16 +0,0 @@
import org.jspecify.annotations.*;
public class WildcardsWithDefaultA<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {
public static void main(
WildcardsWithDefaultA<Object, Object, Object> aNullUnspecNullUnspecNullUnspec,
WildcardsWithDefaultA<Object, Object, @Nullable Object> aNullUnspecNullUnspecNull,
WildcardsWithDefaultA<Object, @Nullable Object, Object> aNullUnspecNullNullUnspec,
WildcardsWithDefaultA<Object, @Nullable Object, @Nullable Object> aNullUnspecNullNull,
WildcardsWithDefaultB b
) {
b.noBoundsNotNull(aNullUnspecNullUnspecNullUnspec);
b.noBoundsNotNull(aNullUnspecNullUnspecNull);
b.noBoundsNotNull(aNullUnspecNullNullUnspec);
b.noBoundsNotNull(aNullUnspecNullNull);
}
}

View File

@@ -1,6 +0,0 @@
import org.jspecify.annotations.*;
@DefaultNotNull
public class WildcardsWithDefaultB {
public void noBoundsNotNull(WildcardsWithDefaultA<?, ?, ?> a) {}
}