// Test case for Issue 391:
// https://github.com/typetools/checker-framework/issues/391

import org.checkerframework.checker.nullness.qual.EnsuresNonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.checkerframework.checker.nullness.qual.RequiresNonNull;

class ClassA {
    private @Nullable String value = null;

    @EnsuresNonNull("value")
    public void ensuresNonNull() {
        value = "";
    }

    @RequiresNonNull("value")
    public String getValue() {
        return value;
    }
}

public class Issue391 {
    ClassA field = new ClassA();

    @RequiresNonNull("field.value")
    void method() {}

    @EnsuresNonNull("field.value")
    void ensuresNonNull() {
        field.ensuresNonNull();
    }

    void method2() {
        ClassA a = new ClassA();
        // :: error: (contracts.precondition.not.satisfied)
        a.getValue();
        // :: error: (contracts.precondition.not.satisfied)
        method();
    }

    void method3() {
        ensuresNonNull();
        method();

        ClassA a = new ClassA();
        a.ensuresNonNull();
        a.getValue();
    }
}
