package com.facebook.buck.example;

import java.util.Set;

public final class A<T> {

  // A field that defines a constant, but which is private and should be missing.
  private final static String HIDDEN = "yo";
   // But we do expect this constant to contain the value of "HIDDEN".
  public final static String VISIBLE = HIDDEN + " another literal ";

   // We expect LOCK, but no constant value declaration.
  public static final Object LOCK = new Object();

  // A constant. Because the value of LOCK.toString() is calculated at runtime, the value is
  // omitted.
  public final static String VISIBLE_BUT_WEIRD = HIDDEN + LOCK.toString();

  public void doSomething(String... args) {
  }

  public void foo(Object... foos) {
  }

  public void foo(Object[] foo, Object... foos) {
  }

  // Weird classes defined in methods should not leak out into the ABI.
  public Runnable getThing() {
    class Example implements Runnable {
      public long LONG_NUMBER = Long.MAX_VALUE;
      @Override
      public void run() { }
    }
    return new Example();
  }

  // Ensure that we can nest generics.
  Set<Set<String>> someStrings;

  // And that we correctly report generics when solely defined on the method.
  <X> X getThing(T value) { return null; }

  // A constant, out of order from the others, that should have the value included.
  protected final static int MAGIC = 42;

  // We should keep the deprecated annotation.
  @Deprecated
  protected T doSomethingElse() {
    System.out.println('c'); return null;
  }

  // There's some debate about whether to include overridden methods from parent classes.
  // Include them for for now.
  @Override public String toString() { return super.toString() + "42"; }

  // A nested inner class
  private static class Inner {
    public static final int MEANING_OF_LIFE = 42;
    public String getFoo() { return "foo"; }
  }

  public Inner getInner() { return new Inner(); }

  // Demonstrate nesting to an arbitrary depth
  public static class Outer {
    public class InstanceOuter {
      Outer getOuter() { return Outer.this; }
    }
    Outer getOuter() { return new Outer(); }
  }
}
