Set compilation state during enum unboxer fixup

Change-Id: I2c1c3707eae7da473dd45dab734dfedb0e9a5cfc
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 7fbfd5a..c92307e 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -201,6 +201,10 @@
     return accessFlags;
   }
 
+  public CompilationState getCompilationState() {
+    return compilationState;
+  }
+
   public DexEncodedMethod getDefaultInterfaceMethodImplementation() {
     return defaultInterfaceMethodImplementation;
   }
@@ -1511,12 +1515,26 @@
       this.method = method;
     }
 
+    public Builder setCompilationState(CompilationState compilationState) {
+      assert this.compilationState == CompilationState.NOT_PROCESSED;
+      this.compilationState = compilationState;
+      return this;
+    }
+
     public Builder setIsLibraryMethodOverride(OptionalBool isLibraryMethodOverride) {
       assert !isLibraryMethodOverride.isUnknown();
       this.isLibraryMethodOverride = isLibraryMethodOverride;
       return this;
     }
 
+    public Builder setIsLibraryMethodOverrideIf(
+        boolean condition, OptionalBool isLibraryMethodOverride) {
+      if (condition) {
+        return setIsLibraryMethodOverride(isLibraryMethodOverride);
+      }
+      return this;
+    }
+
     public Builder setParameterAnnotations(ParameterAnnotationsList parameterAnnotations) {
       this.parameterAnnotations = parameterAnnotations;
       return this;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
index 4df9c8d..280dc9b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -116,28 +116,30 @@
     return encodedMethod.toTypeSubstitutedMethod(newMethod);
   }
 
-  private DexEncodedMethod fixupEncodedMethod(DexEncodedMethod encodedMethod) {
-    DexProto newProto = fixupProto(encodedMethod.proto());
-    if (newProto == encodedMethod.proto()) {
-      return encodedMethod;
+  private DexEncodedMethod fixupEncodedMethod(DexEncodedMethod method) {
+    DexProto newProto = fixupProto(method.proto());
+    if (newProto == method.proto()) {
+      return method;
     }
-    assert !encodedMethod.isClassInitializer();
+    assert !method.isClassInitializer();
     // We add the $enumunboxing$ suffix to make sure we do not create a library override.
     String newMethodName =
-        encodedMethod.getName().toString()
-            + (encodedMethod.isNonPrivateVirtualMethod() ? "$enumunboxing$" : "");
-    DexMethod newMethod = factory.createMethod(encodedMethod.holder(), newProto, newMethodName);
-    newMethod = ensureUniqueMethod(encodedMethod, newMethod);
-    int numberOfExtraNullParameters = newMethod.getArity() - encodedMethod.method.getArity();
-    boolean isStatic = encodedMethod.isStatic();
-    lensBuilder.move(
-        encodedMethod.method, newMethod, isStatic, isStatic, numberOfExtraNullParameters);
-    DexEncodedMethod newEncodedMethod = encodedMethod.toTypeSubstitutedMethod(newMethod);
-    assert !encodedMethod.isLibraryMethodOverride().isTrue()
+        method.getName().toString() + (method.isNonPrivateVirtualMethod() ? "$enumunboxing$" : "");
+    DexMethod newMethod = factory.createMethod(method.getHolderType(), newProto, newMethodName);
+    newMethod = ensureUniqueMethod(method, newMethod);
+    int numberOfExtraNullParameters = newMethod.getArity() - method.method.getArity();
+    boolean isStatic = method.isStatic();
+    lensBuilder.move(method.method, newMethod, isStatic, isStatic, numberOfExtraNullParameters);
+    DexEncodedMethod newEncodedMethod =
+        method.toTypeSubstitutedMethod(
+            newMethod,
+            builder ->
+                builder
+                    .setCompilationState(method.getCompilationState())
+                    .setIsLibraryMethodOverrideIf(
+                        method.isNonPrivateVirtualMethod(), OptionalBool.FALSE));
+    assert !method.isLibraryMethodOverride().isTrue()
         : "Enum unboxing is changing the signature of a library override in a non unboxed class.";
-    if (newEncodedMethod.isNonPrivateVirtualMethod()) {
-      newEncodedMethod.setLibraryMethodOverride(OptionalBool.FALSE);
-    }
     return newEncodedMethod;
   }