// Generated by delombok at Wed Aug 14 15:57:15 PDT 2019
// A test for support for the builder() method in Lombok builders.
public class LombokBuilderExample {
  @lombok.NonNull Object foo;
  @lombok.NonNull Object bar;

  static void test() {
    builder().build();
  }

  @java.lang.SuppressWarnings("all")
  @lombok.Generated
  LombokBuilderExample(@lombok.NonNull final Object foo, @lombok.NonNull final Object bar) {
    if (foo == null) {
      throw new java.lang.NullPointerException("foo is marked non-null but is null");
    }
    if (bar == null) {
      throw new java.lang.NullPointerException("bar is marked non-null but is null");
    }
    this.foo = foo;
    this.bar = bar;
  }

  @java.lang.SuppressWarnings("all")
  @lombok.Generated
  public static class LombokBuilderExampleBuilder {
    @java.lang.SuppressWarnings("all")
    @lombok.Generated
    private Object foo;

    @java.lang.SuppressWarnings("all")
    @lombok.Generated
    private Object bar;

    @java.lang.SuppressWarnings("all")
    @lombok.Generated
    LombokBuilderExampleBuilder() {}

    @java.lang.SuppressWarnings("all")
    @lombok.Generated
    public LombokBuilderExampleBuilder foo(@lombok.NonNull final Object foo) {
      if (foo == null) {
        throw new java.lang.NullPointerException("foo is marked non-null but is null");
      }
      this.foo = foo;
      return this;
    }

    @java.lang.SuppressWarnings("all")
    @lombok.Generated
    public LombokBuilderExampleBuilder bar(@lombok.NonNull final Object bar) {
      if (bar == null) {
        throw new java.lang.NullPointerException("bar is marked non-null but is null");
      }
      this.bar = bar;
      return this;
    }

    @java.lang.SuppressWarnings("all")
    @lombok.Generated
    public LombokBuilderExample build() {
      return new LombokBuilderExample(foo, bar);
    }

    @java.lang.Override
    @java.lang.SuppressWarnings("all")
    @lombok.Generated
    public java.lang.String toString() {
      return "LombokBuilderExample.LombokBuilderExampleBuilder(foo="
          + this.foo
          + ", bar="
          + this.bar
          + ")";
    }
  }

  @java.lang.SuppressWarnings("all")
  @lombok.Generated
  public static LombokBuilderExampleBuilder builder() {
    return new LombokBuilderExampleBuilder();
  }
}
