import org.jmlspecs.annotation.*; // FIXME - this should be able to go away
public class Test {
Object f;
// Using a parameter
void m(Object o) {
@NonNull Object oo = o; // Error because .jml file says o is Nullable
}
void m2(Object o) {
Object oo = o; // Error because .jml file says o is Nullable
}
void m3(Object o) {
@Nullable Object oo = o; // OK
}
void p() {
@NonNull Object oo = new Object();
oo = f; // Error because f is declared Nullable
}
void p2() {
Object oo = new Object();
oo = f; // Error because f is declared Nullable
}
void p3() {
@Nullable Object oo = new Object();
oo = f; // OK
}
// Using a return value
void q() {
@NonNull Object oo = n(); // Error because n is declared nullable
}
// Assigning a return value
Object n() { return null; }
Object nn() { return f; } // Error because f is nullable but nn is not
// Assigning a parameter
void t(Object o) {
o = null; // Error - o is NonNull by default
}
void tt(Object ottm) {
ottm = null; // OK
}
// Using a local variable
void v() {
Object o = new Object();
@NonNull Object oo = o; // OK - o is nonnull by default
}
// Initializing a field
Object fi = null ; // Error - fi is nonnull by default
Object fii = null ; // OK - fii is nullable by declaration
@NonNull Object fiii = null ; // OK - fi is nonnull by declaration here that is ignored
// Assigning a field
void mf() {
fi = null; // Error - fi is nonnull by default
}
void mf2() {
fii = null; // OK - fii is nullable
}
// Using a field
void mf3() {
@NonNull Object q = fi; // OK
}
void mf4() {
@NonNull Object q = fii; // Error
}
Test() { fi = fiii = new Object(); }
}
class A { // NullableByDefault
Object fnn;
Object f;
// Initializing a field
Object fi = null ; // OK - fi is nullable by default
Object fii = null ; // Error - fii is nonnull
@NonNull Object fiii = null ; // OK - fiii is nullable; this declaration is ignored
// Assigning a field
void mf() {
fi = null; // OK - fi is nullable by default
}
void mf2() {
fii = null; // Error - fii is nonnull
}
// Using a field
void mf3() {
@NonNull Object q = fi; // Error - fi is nullable
}
void mf4() {
@NonNull Object q = fii; // OK
}
void m() {
Object o = null; // OK because .jml file says @NullableByDefault
}
// Assigning a return value
Object mnn() {
return f; // Error f is nullable, mnn is non null
}
// Assigning a parameter
void t(Object o) {
o = null; // OK
}
void tt(Object ott) {
ott = null; // Error - ott is NonNull
}
A() { fnn = fii = fiii = new Object(); }
}
class B { // NullableByDefault
// Initializing local variables, using a parameter
void m(Object om) {
@NonNull Object oo = om; // Error because .jml file says o is Nullable
}
void m2(Object om2) {
Object oo = om2; // OK because .jml file says oo is Nullable
}
void m3(Object om3) {
@Nullable Object oo = om3; // OK
}
void mn(Object omn) {
@NonNull Object oo = omn; // OK because .jml file says o is NonNull
}
void mn2(Object omn2) {
Object oo = omn2; // OK because .jml file says o is NonNull
}
void mn3(Object omn3) {
@Nullable Object oo = omn3; // OK
}
// Using a local variable
void v(Object ooo) {
Object o = ooo;
@NonNull Object oo = o; // Error - o is nullable by default
}
}