// 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.AssumeMayHaveSideEffects;
import com.android.tools.r8.KeepConstantArguments;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.NeverPropagateValue;
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
  }

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

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

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

  @AssumeMayHaveSideEffects
  @NeverInline
  @NeverPropagateValue
  private static String inlined() {
    return inlined2(Number.TWO);
  }

  private static String inlined2(Number number) {
    return number.name();
  }

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

  @AssumeMayHaveSideEffects
  @NeverInline
  @NeverPropagateValue
  private static String differentTypeStaticField() {
    return Number.DOWN.name();
  }

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

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

  @AssumeMayHaveSideEffects
  @NeverInline
  @NeverPropagateValue
  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(differentTypeStaticField());
    System.out.println(nonValueStaticField());
    System.out.println(phi(true));
    System.out.println(nonStaticGet());
  }
}
