blob: f06bcbaa2e61df9cd993333f5af90d5a2c4fda3c [file] [log] [blame]
// Test case for Issue 1633:
// https://github.com/typetools/checker-framework/issues/1633
import java.util.function.Supplier;
import org.checkerframework.checker.nullness.qual.*;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.checkerframework.framework.qual.Covariant;
public class Issue1633 {
// supplyNullable is a supplier that may return null.
// supplyNonNull is a supplier that does not return null.
void foo1(Optional1633<String> o, Supplier<@Nullable String> supplyNullable) {
// :: error: (argument)
@Nullable String str = o.orElseGetUnannotated(supplyNullable);
}
void foo2(Optional1633<String> o, Supplier<@Nullable String> supplyNullable) {
@Nullable String str1 = o.orElseGetNullable(supplyNullable);
}
void foo2nw(Optional1633<String> o, Supplier<@Nullable String> supplyNullable) {
@Nullable String str1 = o.orElseGetNullableNoWildcard(supplyNullable);
}
void foo3(Optional1633<String> o, Supplier<@Nullable String> supplyNullable) {
// :: error: (argument)
@Nullable String str2 = o.orElseGetNonNull(supplyNullable);
}
void foo4(Optional1633<String> o, Supplier<@Nullable String> supplyNullable) {
@Nullable String str3 = o.orElseGetPolyNull(supplyNullable);
}
void foo4nw(Optional1633<String> o, Supplier<@Nullable String> supplyNullable) {
@Nullable String str3 = o.orElseGetPolyNullNoWildcard(supplyNullable);
}
void foo41(Optional1633<String> o) {
@SuppressWarnings("return") // https://tinyurl.com/cfissue/979
@Nullable String str3 = o.orElseGetPolyNull(() -> null);
}
void foo41nw(Optional1633<String> o) {
@SuppressWarnings("return") // https://tinyurl.com/cfissue/979
@Nullable String str3 = o.orElseGetPolyNullNoWildcard(() -> null);
}
void foo5(Optional1633<String> o, Supplier<@NonNull String> supplyNonNull) {
@NonNull String str = o.orElseGetUnannotated(supplyNonNull);
}
void foo6(Optional1633<String> o, Supplier<@NonNull String> supplyNonNull) {
// :: error: (assignment)
@NonNull String str1 = o.orElseGetNullable(supplyNonNull);
}
void foo6nw(Optional1633<String> o, Supplier<@NonNull String> supplyNonNull) {
// :: error: (assignment)
@NonNull String str1 = o.orElseGetNullableNoWildcard(supplyNonNull);
}
void foo7(Optional1633<String> o, Supplier<@NonNull String> supplyNonNull) {
@NonNull String str2 = o.orElseGetNonNull(supplyNonNull);
}
void foo8(Optional1633<String> o, Supplier<@NonNull String> supplyNonNull) {
@NonNull String str3 = o.orElseGetPolyNull(supplyNonNull);
}
void foo8nw(Optional1633<String> o, Supplier<@NonNull String> supplyNonNull) {
@NonNull String str3 = o.orElseGetPolyNullNoWildcard(supplyNonNull);
}
}
// From the JDK
@Covariant(0)
final @NonNull class Optional1633<T extends @Nullable Object> {
/** If non-null, the value; if null, indicates no value is present. */
private final @Nullable T value = null;
// TODO: there are conceptually two versions of this method:
// public @Nullable T orElseGet(Supplier<? extends @Nullable T> other) {
// public @NonNull T orElseGet(Supplier<? extends @NonNull T> other) {
// Issue #1633 says that this annotation doesn't help at all:
// public @PolyNull T orElseGet(Supplier<? extends @PolyNull T> other) {
// but it does seem to work in this test case.
public T orElseGetUnannotated(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
public @Nullable T orElseGetNullable(Supplier<@Nullable ? extends @Nullable T> other) {
return value != null ? value : other.get();
}
public @Nullable T orElseGetNullableNoWildcard(Supplier<? extends @Nullable T> other) {
// The commented-out line fails to typecheck due to issue #979
// return value != null ? value : other.get();
if (value != null) {
return value;
} else {
return other.get();
}
}
public @NonNull T orElseGetNonNull(Supplier<@NonNull ? extends @NonNull T> other) {
return value != null ? value : other.get();
}
public @PolyNull T orElseGetPolyNull(Supplier<@PolyNull ? extends @PolyNull T> other) {
return value != null ? value : other.get();
}
public @PolyNull T orElseGetPolyNullNoWildcard(Supplier<? extends @PolyNull T> other) {
// The commented-out line fails to typecheck due to issue #979
// return value != null ? value : other.get();
if (value != null) {
return value;
} else {
return other.get();
}
}
}