// 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.Locale;
import java.util.concurrent.TimeUnit;

class ToStrings {
  enum TypeToString {
    ONE, TWO;

    @Override public String toString() {
      return name().toLowerCase(Locale.US);
    }
  }

  enum ValueToString {
    ONE {

      @Override
      public String toString() {
        return "one";
      }
    },
    TWO
  }

  enum NoToString {
    ONE, TWO;

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

  enum Direction {
    UP, DOWN
  }

  @NeverInline
  private static String typeToString() {
    return TypeToString.ONE.toString();
  }

  @AssumeMayHaveSideEffects
  @NeverInline
  @NeverPropagateValue
  private static String valueWithToString() {
    return ValueToString.ONE.toString();
  }

  @NeverInline
  private static String valueWithoutToString() {
    return ValueToString.TWO.toString();
  }

  @AssumeMayHaveSideEffects
  @NeverInline
  @NeverPropagateValue
  private static String noToString() {
    return NoToString.TWO.toString();
  }

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

  @NeverInline
  @NeverPropagateValue
  private static String multipleUsages() {
    NoToString two = NoToString.TWO;
    // Side-effect instead of concatenation avoids two toString calls.
    System.out.print(two.ordinal());
    return two.toString();
  }

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

  private static String inlined2(NoToString number) {
    return number.toString();
  }

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

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

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

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

  @AssumeMayHaveSideEffects
  @NeverInline
  @NeverPropagateValue
  private static String nonStaticGet() {
    return new ToStrings().two.toString();
  }

  private final NoToString two = NoToString.TWO;

  public static void main(String[] args) {
    System.out.println(typeToString());
    System.out.println(valueWithToString());
    System.out.println(valueWithoutToString());
    System.out.println(noToString());
    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());
  }
}
