blob: 80ef0a8002211c5b214ae9c5f85395d8eb8c7e69 [file] [log] [blame]
import com.google.auto.value.AutoValue;
import java.util.Optional;
import org.checkerframework.checker.calledmethods.qual.*;
import org.checkerframework.checker.nullness.qual.*;
/**
* Adapted from the standard AutoValue example code:
* https://github.com/google/auto/blob/master/value/userguide/builders.md
*/
@AutoValue
abstract class Animal {
abstract String name();
abstract @Nullable String habitat();
abstract int numberOfLegs();
// does not need to be explicitly set
abstract Optional<String> extra();
public String getStr() {
return "str";
}
public abstract Builder toBuilder();
static Builder builder() {
return new AutoValue_Animal.Builder();
}
@AutoValue.Builder
abstract static class Builder {
abstract Builder setName(String value);
abstract Builder setNumberOfLegs(int value);
abstract Builder setHabitat(String value);
abstract Builder setExtra(String value);
abstract Animal build();
}
public static void buildSomethingWrong() {
Builder b = builder();
b.setName("Frank");
// :: error: finalizer.invocation
b.build();
}
public static void buildSomethingRight() {
Builder b = builder();
b.setName("Frank");
b.setNumberOfLegs(4);
b.build();
}
public static void buildSomethingRightIncludeOptional() {
Builder b = builder();
b.setName("Frank");
b.setNumberOfLegs(4);
b.setHabitat("jungle");
b.build();
}
public static void buildSomethingWrongFluent() {
// :: error: finalizer.invocation
builder().setName("Frank").build();
}
public static void buildSomethingRightFluent() {
builder().setName("Jim").setNumberOfLegs(7).build();
}
public static void buildWithToBuilder() {
Animal a1 = builder().setName("Jim").setNumberOfLegs(7).build();
a1.toBuilder().build();
}
public static void buildSomethingRightFluentWithLocal() {
Builder b = builder();
b.setName("Jim").setNumberOfLegs(7);
b.build();
}
}