// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package com.android.tools.r8.rewrite.enums;

import com.android.tools.r8.ForceInline;
import com.android.tools.r8.NeverInline;
import java.util.concurrent.TimeUnit;

class Names {
  enum Number {
    ONE, TWO;

    public static final Direction DOWN = Direction.DOWN;
    public static final Number DEFAULT = TWO;
  }

  enum Direction {
    UP, DOWN
  }

  @NeverInline
  private static String simple() {
    return Number.TWO.name();
  }

  @NeverInline
  private static String local() {
    Number two = Number.TWO;
    return two.name();
  }

  @NeverInline
  private static String multipleUsages() {
    Number two = Number.TWO;
    return two.ordinal() + two.name();
  }

  @NeverInline
  private static String inlined() {
    return inlined2(Number.TWO);
  }
  @ForceInline
  private static String inlined2(Number number) {
    return number.name();
  }

  @NeverInline
  private static String libraryType() {
    return TimeUnit.SECONDS.name();
  }

  @NeverInline
  private static String wrongTypeStaticField() {
    return Number.DOWN.name();
  }

  @NeverInline
  private static String nonValueStaticField() {
    return Number.DEFAULT.name();
  }

  @NeverInline
  private static String phi(boolean value) {
    Number number = Number.ONE;
    if (value) {
      number = Number.TWO;
    }
    return number.name();
  }

  @NeverInline
  private static String nonStaticGet() {
    return new Names().two.name();
  }
  private final Number two = Number.TWO;

  public static void main(String[] args) {
    System.out.println(simple());
    System.out.println(local());
    System.out.println(multipleUsages());
    System.out.println(inlined());
    System.out.println(libraryType());
    System.out.println(wrongTypeStaticField());
    System.out.println(nonValueStaticField());
    System.out.println(phi(true));
    System.out.println(nonStaticGet());
  }
}
