| // 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.ForceInline; | 
 | 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); | 
 |   } | 
 |  | 
 |   @ForceInline | 
 |   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(); | 
 |   } | 
 |  | 
 |   @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()); | 
 |   } | 
 | } |