Pass worklist to EnqueuerFieldAccessAnalysis callbacks

Change-Id: I64ff459a93637d1d624e5d669e6abf1b704b4487
diff --git a/src/main/java/com/android/tools/r8/graph/analysis/EnqueuerFieldAccessAnalysis.java b/src/main/java/com/android/tools/r8/graph/analysis/EnqueuerFieldAccessAnalysis.java
index eee1f34..d8dadc5 100644
--- a/src/main/java/com/android/tools/r8/graph/analysis/EnqueuerFieldAccessAnalysis.java
+++ b/src/main/java/com/android/tools/r8/graph/analysis/EnqueuerFieldAccessAnalysis.java
@@ -7,18 +7,35 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.FieldResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.shaking.EnqueuerWorklist;
 
 public interface EnqueuerFieldAccessAnalysis {
 
-  void traceInstanceFieldRead(
-      DexField field, FieldResolutionResult resolutionResult, ProgramMethod context);
+  default void traceInstanceFieldRead(
+      DexField field,
+      FieldResolutionResult resolutionResult,
+      ProgramMethod context,
+      EnqueuerWorklist worklist) {}
+  ;
 
-  void traceInstanceFieldWrite(
-      DexField field, FieldResolutionResult resolutionResult, ProgramMethod context);
+  default void traceInstanceFieldWrite(
+      DexField field,
+      FieldResolutionResult resolutionResult,
+      ProgramMethod context,
+      EnqueuerWorklist worklist) {}
+  ;
 
-  void traceStaticFieldRead(
-      DexField field, FieldResolutionResult resolutionResult, ProgramMethod context);
+  default void traceStaticFieldRead(
+      DexField field,
+      FieldResolutionResult resolutionResult,
+      ProgramMethod context,
+      EnqueuerWorklist worklist) {}
+  ;
 
-  void traceStaticFieldWrite(
-      DexField field, FieldResolutionResult resolutionResult, ProgramMethod context);
+  default void traceStaticFieldWrite(
+      DexField field,
+      FieldResolutionResult resolutionResult,
+      ProgramMethod context,
+      EnqueuerWorklist worklist) {}
+  ;
 }
diff --git a/src/main/java/com/android/tools/r8/graph/analysis/GetArrayOfMissingTypeVerifyErrorWorkaround.java b/src/main/java/com/android/tools/r8/graph/analysis/GetArrayOfMissingTypeVerifyErrorWorkaround.java
index 74817d0..48ca34d 100644
--- a/src/main/java/com/android/tools/r8/graph/analysis/GetArrayOfMissingTypeVerifyErrorWorkaround.java
+++ b/src/main/java/com/android/tools/r8/graph/analysis/GetArrayOfMissingTypeVerifyErrorWorkaround.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.graph.FieldResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.shaking.Enqueuer;
+import com.android.tools.r8.shaking.EnqueuerWorklist;
 import com.android.tools.r8.shaking.KeepInfo.Joiner;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.InternalOptions;
@@ -61,7 +62,10 @@
 
   @Override
   public void traceInstanceFieldRead(
-      DexField field, FieldResolutionResult resolutionResult, ProgramMethod context) {
+      DexField field,
+      FieldResolutionResult resolutionResult,
+      ProgramMethod context,
+      EnqueuerWorklist worklist) {
     if (isUnsafeToUseFieldOnDalvik(field)) {
       enqueuer.getKeepInfo().joinMethod(context, Joiner::disallowOptimization);
     }
@@ -69,7 +73,10 @@
 
   @Override
   public void traceStaticFieldRead(
-      DexField field, FieldResolutionResult resolutionResult, ProgramMethod context) {
+      DexField field,
+      FieldResolutionResult resolutionResult,
+      ProgramMethod context,
+      EnqueuerWorklist worklist) {
     if (isUnsafeToUseFieldOnDalvik(field)) {
       enqueuer.getKeepInfo().joinMethod(context, Joiner::disallowOptimization);
     }
@@ -95,13 +102,19 @@
 
   @Override
   public void traceInstanceFieldWrite(
-      DexField field, FieldResolutionResult resolutionResult, ProgramMethod context) {
+      DexField field,
+      FieldResolutionResult resolutionResult,
+      ProgramMethod context,
+      EnqueuerWorklist worklist) {
     // Intentionally empty.
   }
 
   @Override
   public void traceStaticFieldWrite(
-      DexField field, FieldResolutionResult resolutionResult, ProgramMethod context) {
+      DexField field,
+      FieldResolutionResult resolutionResult,
+      ProgramMethod context,
+      EnqueuerWorklist worklist) {
     // Intentionally empty.
   }
 }
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 7a0c559..1622376 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -1463,7 +1463,8 @@
     FieldResolutionResult resolutionResult = resolveField(fieldReference, currentMethod);
     fieldAccessAnalyses.forEach(
         analysis ->
-            analysis.traceInstanceFieldRead(fieldReference, resolutionResult, currentMethod));
+            analysis.traceInstanceFieldRead(
+                fieldReference, resolutionResult, currentMethod, workList));
 
     if (resolutionResult.isFailedOrUnknownResolution()) {
       // Must trace the types from the field reference even if it does not exist.
@@ -1521,7 +1522,8 @@
     FieldResolutionResult resolutionResult = resolveField(fieldReference, currentMethod);
     fieldAccessAnalyses.forEach(
         analysis ->
-            analysis.traceInstanceFieldWrite(fieldReference, resolutionResult, currentMethod));
+            analysis.traceInstanceFieldWrite(
+                fieldReference, resolutionResult, currentMethod, workList));
 
     if (resolutionResult.isFailedOrUnknownResolution()) {
       // Must trace the types from the field reference even if it does not exist.
@@ -1576,7 +1578,9 @@
 
     FieldResolutionResult resolutionResult = resolveField(fieldReference, currentMethod);
     fieldAccessAnalyses.forEach(
-        analysis -> analysis.traceStaticFieldRead(fieldReference, resolutionResult, currentMethod));
+        analysis ->
+            analysis.traceStaticFieldRead(
+                fieldReference, resolutionResult, currentMethod, workList));
 
     if (resolutionResult.isFailedOrUnknownResolution()) {
       // Must trace the types from the field reference even if it does not exist.
@@ -1648,7 +1652,8 @@
     FieldResolutionResult resolutionResult = resolveField(fieldReference, currentMethod);
     fieldAccessAnalyses.forEach(
         analysis ->
-            analysis.traceStaticFieldWrite(fieldReference, resolutionResult, currentMethod));
+            analysis.traceStaticFieldWrite(
+                fieldReference, resolutionResult, currentMethod, workList));
 
     if (resolutionResult.isFailedOrUnknownResolution()) {
       // Must trace the types from the field reference even if it does not exist.