Update forEach() methods on DexProgramClass

Change-Id: I5f96591fa9860de0f54b3c08deb1923d2d726b71
diff --git a/src/main/java/com/android/tools/r8/PrintUses.java b/src/main/java/com/android/tools/r8/PrintUses.java
index c753900..9a26221 100644
--- a/src/main/java/com/android/tools/r8/PrintUses.java
+++ b/src/main/java/com/android/tools/r8/PrintUses.java
@@ -294,9 +294,9 @@
         for (DexType directInterface : directInterfaces) {
           DexProgramClass clazz = asProgramClassOrNull(appInfo.definitionFor(directInterface));
           if (clazz != null) {
-            clazz.forEachProgramVirtualMethod(
-                this::registerMethod,
-                definition -> definition.getReference().name.equals(callSite.methodName));
+            clazz.forEachProgramVirtualMethodMatching(
+                definition -> definition.getReference().name.equals(callSite.methodName),
+                this::registerMethod);
           }
         }
       }
diff --git a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
index 225c208..569fc34 100644
--- a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
@@ -135,43 +135,43 @@
   }
 
   public void forEachProgramMethod(Consumer<ProgramMethod> consumer) {
-    forEachProgramMethod(consumer, alwaysTrue());
+    forEachProgramMethodMatching(alwaysTrue(), consumer);
   }
 
-  public void forEachProgramMethod(
-      Consumer<ProgramMethod> consumer, Predicate<DexEncodedMethod> predicate) {
-    methodCollection.forEachMethod(
-        method -> consumer.accept(new ProgramMethod(this, method)), predicate);
+  public void forEachProgramMethodMatching(
+      Predicate<DexEncodedMethod> predicate, Consumer<ProgramMethod> consumer) {
+    methodCollection.forEachMethodMatching(
+        predicate, method -> consumer.accept(new ProgramMethod(this, method)));
   }
 
   public void forEachProgramMethod(BiConsumer<DexEncodedMethod, ProgramMethod> consumer) {
-    forEachProgramMethod(consumer, alwaysTrue());
+    forEachProgramMethodMatching(alwaysTrue(), consumer);
   }
 
-  public void forEachProgramMethod(
-      BiConsumer<DexEncodedMethod, ProgramMethod> consumer, Predicate<DexEncodedMethod> predicate) {
-    methodCollection.forEachMethod(
-        method -> consumer.accept(method, new ProgramMethod(this, method)), predicate);
+  public void forEachProgramMethodMatching(
+      Predicate<DexEncodedMethod> predicate, BiConsumer<DexEncodedMethod, ProgramMethod> consumer) {
+    methodCollection.forEachMethodMatching(
+        predicate, method -> consumer.accept(method, new ProgramMethod(this, method)));
   }
 
   public void forEachProgramDirectMethod(Consumer<ProgramMethod> consumer) {
-    forEachProgramDirectMethod(consumer, alwaysTrue());
+    forEachProgramDirectMethodMatching(alwaysTrue(), consumer);
   }
 
-  public void forEachProgramDirectMethod(
-      Consumer<ProgramMethod> consumer, Predicate<DexEncodedMethod> predicate) {
-    methodCollection.forEachDirectMethod(
-        method -> consumer.accept(new ProgramMethod(this, method)), predicate);
+  public void forEachProgramDirectMethodMatching(
+      Predicate<DexEncodedMethod> predicate, Consumer<ProgramMethod> consumer) {
+    methodCollection.forEachDirectMethodMatching(
+        predicate, method -> consumer.accept(new ProgramMethod(this, method)));
   }
 
   public void forEachProgramVirtualMethod(Consumer<ProgramMethod> consumer) {
-    forEachProgramVirtualMethod(consumer, alwaysTrue());
+    forEachProgramVirtualMethodMatching(alwaysTrue(), consumer);
   }
 
-  public void forEachProgramVirtualMethod(
-      Consumer<ProgramMethod> consumer, Predicate<DexEncodedMethod> predicate) {
-    methodCollection.forEachVirtualMethod(
-        method -> consumer.accept(new ProgramMethod(this, method)), predicate);
+  public void forEachProgramVirtualMethodMatching(
+      Predicate<DexEncodedMethod> predicate, Consumer<ProgramMethod> consumer) {
+    methodCollection.forEachVirtualMethodMatching(
+        predicate, method -> consumer.accept(new ProgramMethod(this, method)));
   }
 
   public ProgramMethod getProgramClassInitializer() {
diff --git a/src/main/java/com/android/tools/r8/graph/MethodCollection.java b/src/main/java/com/android/tools/r8/graph/MethodCollection.java
index f130908..ac2685a 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodCollection.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodCollection.java
@@ -67,11 +67,11 @@
   }
 
   public void forEachMethod(Consumer<DexEncodedMethod> consumer) {
-    forEachMethod(consumer, alwaysTrue());
+    forEachMethodMatching(alwaysTrue(), consumer);
   }
 
-  public void forEachMethod(
-      Consumer<DexEncodedMethod> consumer, Predicate<DexEncodedMethod> predicate) {
+  public void forEachMethodMatching(
+      Predicate<DexEncodedMethod> predicate, Consumer<DexEncodedMethod> consumer) {
     backing.forEachMethod(
         method -> {
           if (predicate.test(method)) {
@@ -81,11 +81,11 @@
   }
 
   public void forEachDirectMethod(Consumer<DexEncodedMethod> consumer) {
-    forEachDirectMethod(consumer, alwaysTrue());
+    forEachDirectMethodMatching(alwaysTrue(), consumer);
   }
 
-  public void forEachDirectMethod(
-      Consumer<DexEncodedMethod> consumer, Predicate<DexEncodedMethod> predicate) {
+  public void forEachDirectMethodMatching(
+      Predicate<DexEncodedMethod> predicate, Consumer<DexEncodedMethod> consumer) {
     backing.forEachDirectMethod(
         method -> {
           if (predicate.test(method)) {
@@ -95,11 +95,11 @@
   }
 
   public void forEachVirtualMethod(Consumer<DexEncodedMethod> consumer) {
-    forEachVirtualMethod(consumer, alwaysTrue());
+    forEachVirtualMethodMatching(alwaysTrue(), consumer);
   }
 
-  public void forEachVirtualMethod(
-      Consumer<DexEncodedMethod> consumer, Predicate<DexEncodedMethod> predicate) {
+  public void forEachVirtualMethodMatching(
+      Predicate<DexEncodedMethod> predicate, Consumer<DexEncodedMethod> consumer) {
     backing.forEachVirtualMethod(
         method -> {
           if (predicate.test(method)) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
index 2bb03e6..1a6a707 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
@@ -111,9 +111,9 @@
   }
 
   private void processClass(DexProgramClass clazz) {
-    clazz.forEachProgramMethod(
-        method -> method.registerCodeReferences(new TrivialFieldAccessUseRegistry(method)),
-        DexEncodedMethod::hasCode);
+    clazz.forEachProgramMethodMatching(
+        DexEncodedMethod::hasCode,
+        method -> method.registerCodeReferences(new TrivialFieldAccessUseRegistry(method)));
   }
 
   private static boolean canOptimizeField(
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
index 28f97d9..4879783 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
@@ -169,10 +169,10 @@
         .forEachInstantiatedSubType(
             references.extensionRegistryLiteType,
             clazz ->
-                clazz.forEachProgramMethod(
-                    consumer::accept,
+                clazz.forEachProgramMethodMatching(
                     definition ->
-                        references.isFindLiteExtensionByNumberMethod(definition.getReference())),
+                        references.isFindLiteExtensionByNumberMethod(definition.getReference()),
+                    consumer::accept),
             lambda -> {
               assert false;
             });
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilder.java
index e725837..e6f7cb6 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilder.java
@@ -27,7 +27,7 @@
   }
 
   private void processClass(DexProgramClass clazz) {
-    clazz.forEachProgramMethod(this::processMethod, DexEncodedMethod::hasCode);
+    clazz.forEachProgramMethodMatching(DexEncodedMethod::hasCode, this::processMethod);
   }
 
   private void processMethod(ProgramMethod method) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 2bfe820..2b958c5 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -594,12 +594,12 @@
           .setReachabilitySensitive(isReachabilitySensitive);
       convertMethod(new ProgramMethod(clazz, classInitializer));
     }
-    clazz.forEachProgramMethod(
+    clazz.forEachProgramMethodMatching(
+        definition -> !definition.isClassInitializer(),
         (definition, method) -> {
           definition.getMutableOptimizationInfo().setReachabilitySensitive(isReachabilitySensitive);
           convertMethod(method);
-        },
-        definition -> !definition.isClassInitializer());
+        });
   }
 
   private void convertMethod(ProgramMethod method) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java b/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java
index b11b0ef..c707738 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CallSiteOptimizationInfoPropagator.java
@@ -327,13 +327,7 @@
     mode = Mode.REVISIT;
     ProgramMethodSet targetsToRevisit = ProgramMethodSet.create();
     for (DexProgramClass clazz : appView.appInfo().classes()) {
-      clazz.forEachProgramMethod(
-          (definition, method) -> {
-            targetsToRevisit.add(method);
-            if (appView.options().testing.callSiteOptimizationInfoInspector != null) {
-              appView.options().testing.callSiteOptimizationInfoInspector.accept(definition);
-            }
-          },
+      clazz.forEachProgramMethodMatching(
           definition -> {
             assert !definition.isObsolete();
             if (definition.shouldNotHaveCode()
@@ -345,6 +339,12 @@
             CallSiteOptimizationInfo callSiteOptimizationInfo =
                 definition.getCallSiteOptimizationInfo();
             return callSiteOptimizationInfo.hasUsefulOptimizationInfo(appView, definition);
+          },
+          (definition, method) -> {
+            targetsToRevisit.add(method);
+            if (appView.options().testing.callSiteOptimizationInfoInspector != null) {
+              appView.options().testing.callSiteOptimizationInfoInspector.accept(definition);
+            }
           });
     }
     if (revisitedMethods != null) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
index efcf89f..1e95957 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
@@ -287,15 +287,15 @@
       assert previous == null;
 
       // Collect instance methods to be staticized.
-      candidateClass.forEachProgramMethod(
-          methodsToBeStaticized::add,
+      candidateClass.forEachProgramMethodMatching(
           definition -> {
             if (!definition.isStatic()) {
               removedInstanceMethods.add(definition);
               return !definition.isInstanceInitializer();
             }
             return false;
-          });
+          },
+          methodsToBeStaticized::add);
       singletonFields.put(candidate.singletonField.field, candidate);
       DexEncodedMethod getter = candidate.getter.get();
       if (getter != null) {
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 08d06ed..9604389 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -1517,12 +1517,12 @@
 
   private void ensureMethodsContinueToWidenAccess(
       DexProgramClass clazz, ScopedDexMethodSet seen, KeepReason reason) {
-    clazz.forEachProgramVirtualMethod(
-        method -> markMethodAsTargeted(method, reason),
+    clazz.forEachProgramVirtualMethodMatching(
         definition ->
             seen.addMethodIfMoreVisible(definition)
                     == AddMethodIfMoreVisibleResult.ADDED_MORE_VISIBLE
-                && appView.appInfo().methodDefinedInInterfaces(definition, clazz.type));
+                && appView.appInfo().methodDefinedInInterfaces(definition, clazz.type),
+        method -> markMethodAsTargeted(method, reason));
   }
 
   private void markInterfaceTypeAsLiveViaInheritanceClause(
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java b/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
index ac34e73..205cf71 100644
--- a/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
+++ b/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
@@ -49,12 +49,12 @@
       // Super and interfaces are live, no need to add them.
       traceAnnotationsDirectDependencies(clazz.annotations());
       clazz.forEachField(field -> consumer.accept(field.field.type));
-      clazz.forEachProgramMethod(
-          method -> method.registerCodeReferences(codeDirectReferenceCollector),
+      clazz.forEachProgramMethodMatching(
           definition -> {
             traceMethodDirectDependencies(definition.getReference(), consumer);
             return definition.hasCode();
-          });
+          },
+          method -> method.registerCodeReferences(codeDirectReferenceCollector));
     }
   }