// 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 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
  private static String valueWithToString() {
    return ValueToString.ONE.toString();
  }

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

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

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

  @NeverInline
  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
  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
  private static String differentTypeStaticField() {
    return NoToString.DOWN.toString();
  }

  @AssumeMayHaveSideEffects
  @NeverInline
  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
  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());
  }
}
