Remove uses of definitionFor(DexMethod)

Bug: 157616970
Change-Id: I1282385856bbe3dd9c5a64a141975dcb0a1c4bf8
diff --git a/src/main/java/com/android/tools/r8/graph/DexMethod.java b/src/main/java/com/android/tools/r8/graph/DexMethod.java
index 7ae7c48..8a50931 100644
--- a/src/main/java/com/android/tools/r8/graph/DexMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexMethod.java
@@ -57,6 +57,11 @@
   }
 
   @Override
+  public DexEncodedMethod lookupOnClass(DexClass clazz) {
+    return clazz != null ? clazz.lookupMember(this) : null;
+  }
+
+  @Override
   public String toString() {
     return "Method " + holder + "." + name + " " + proto.toString();
   }
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index 9dfa92e..5d5a16e 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -44,6 +44,7 @@
 import com.android.tools.r8.ir.desugar.InterfaceMethodRewriter;
 import com.android.tools.r8.ir.desugar.LambdaDescriptor;
 import com.android.tools.r8.ir.desugar.TwrCloseResourceRewriter;
+import com.android.tools.r8.utils.AssertionUtils;
 import com.android.tools.r8.utils.CollectionUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ListUtils;
@@ -60,7 +61,6 @@
 import java.util.Deque;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
@@ -984,13 +984,13 @@
     assert lens.assertDefinitionsNotModified(
         neverMerge.stream()
             .map(this::definitionFor)
-            .filter(Objects::nonNull)
+            .filter(AssertionUtils::assertNotNull)
             .collect(Collectors.toList()));
 
     assert lens.assertDefinitionsNotModified(
         alwaysInline.stream()
-            .map(this::definitionFor)
-            .filter(Objects::nonNull)
+            .map(method -> method.lookupOnClass(definitionForHolder(method)))
+            .filter(AssertionUtils::assertNotNull)
             .collect(Collectors.toList()));
 
     return new AppInfoWithLiveness(
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
index 5b3e34f..fd29fbc 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
@@ -717,16 +717,19 @@
               if (!include.test(method.holder)) {
                 return;
               }
+              DexProgramClass holder = asProgramClassOrNull(appInfo.definitionForHolder(method));
+              DexEncodedMethod definition = method.lookupOnClass(holder);
+              if (definition == null) {
+                assert false;
+                return;
+              }
               out.print(method.holder.toSourceString() + ": ");
-              DexEncodedMethod encodedMethod = appInfo.definitionFor(method);
-              if (encodedMethod.accessFlags.isConstructor()) {
-                if (encodedMethod.accessFlags.isStatic()) {
-                  out.print(Constants.CLASS_INITIALIZER_NAME);
-                } else {
-                  String holderName = method.holder.toSourceString();
-                  String constrName = holderName.substring(holderName.lastIndexOf('.') + 1);
-                  out.print(constrName);
-                }
+              if (definition.isClassInitializer()) {
+                out.print(Constants.CLASS_INITIALIZER_NAME);
+              } else if (definition.isInstanceInitializer()) {
+                String holderName = method.holder.toSourceString();
+                String constrName = holderName.substring(holderName.lastIndexOf('.') + 1);
+                out.print(constrName);
               } else {
                 out.print(
                     method.proto.returnType.toSourceString() + " " + method.name.toSourceString());
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 6940dde..2b06548 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -49,6 +49,7 @@
 import com.android.tools.r8.ir.synthetic.AbstractSynthesizedCode;
 import com.android.tools.r8.ir.synthetic.ForwardMethodSourceCode;
 import com.android.tools.r8.logging.Log;
+import com.android.tools.r8.utils.AssertionUtils;
 import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.FieldSignatureEquivalence;
 import com.android.tools.r8.utils.MethodSignatureEquivalence;
@@ -75,7 +76,6 @@
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -655,8 +655,8 @@
   private boolean verifyGraphLens(VerticalClassMergerGraphLense graphLense) {
     assert graphLense.assertDefinitionsNotModified(
         appInfo.alwaysInline.stream()
-            .map(appInfo::definitionFor)
-            .filter(Objects::nonNull)
+            .map(method -> method.lookupOnClass(appView.definitionForHolder(method)))
+            .filter(AssertionUtils::assertNotNull)
             .collect(Collectors.toList()));
 
     assert graphLense.assertReferencesNotModified(appInfo.noSideEffects.keySet());
@@ -1824,7 +1824,7 @@
       return true;
     }
 
-    private boolean checkMethodReference(DexMethod method) {
+    private boolean checkMethodReference(DexMethod method, OptionalBool isInterface) {
       if (!foundIllegalAccess) {
         DexType baseType =
             appView.graphLense().lookupType(method.holder.toBaseType(appView.dexItemFactory()));
@@ -1834,8 +1834,12 @@
           for (DexType type : method.proto.parameters.values) {
             checkTypeReference(type);
           }
-          DexEncodedMethod definition = appView.definitionFor(method);
-          if (definition == null || !definition.accessFlags.isPublic()) {
+          ResolutionResult resolutionResult =
+              isInterface.isUnknown()
+                  ? appView.appInfo().unsafeResolveMethodDueToDexFormat(method)
+                  : appView.appInfo().resolveMethod(method, isInterface.isTrue());
+          if (!resolutionResult.isSingleResolution()
+              || !resolutionResult.asSingleResolution().getResolvedMethod().isPublic()) {
             foundIllegalAccess = true;
           }
         }
@@ -1867,7 +1871,7 @@
       assert context != null;
       GraphLenseLookupResult lookup =
           appView.graphLense().lookupMethod(method, context.getReference(), Type.VIRTUAL);
-      return checkMethodReference(lookup.getMethod());
+      return checkMethodReference(lookup.getMethod(), OptionalBool.FALSE);
     }
 
     @Override
@@ -1875,7 +1879,7 @@
       assert context != null;
       GraphLenseLookupResult lookup =
           appView.graphLense().lookupMethod(method, context.getReference(), Type.DIRECT);
-      return checkMethodReference(lookup.getMethod());
+      return checkMethodReference(lookup.getMethod(), OptionalBool.UNKNOWN);
     }
 
     @Override
@@ -1883,7 +1887,7 @@
       assert context != null;
       GraphLenseLookupResult lookup =
           appView.graphLense().lookupMethod(method, context.getReference(), Type.STATIC);
-      return checkMethodReference(lookup.getMethod());
+      return checkMethodReference(lookup.getMethod(), OptionalBool.UNKNOWN);
     }
 
     @Override
@@ -1891,7 +1895,7 @@
       assert context != null;
       GraphLenseLookupResult lookup =
           appView.graphLense().lookupMethod(method, context.getReference(), Type.INTERFACE);
-      return checkMethodReference(lookup.getMethod());
+      return checkMethodReference(lookup.getMethod(), OptionalBool.TRUE);
     }
 
     @Override
@@ -1899,7 +1903,7 @@
       assert context != null;
       GraphLenseLookupResult lookup =
           appView.graphLense().lookupMethod(method, context.getReference(), Type.SUPER);
-      return checkMethodReference(lookup.getMethod());
+      return checkMethodReference(lookup.getMethod(), OptionalBool.UNKNOWN);
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/utils/AssertionUtils.java b/src/main/java/com/android/tools/r8/utils/AssertionUtils.java
new file mode 100644
index 0000000..c185096
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/AssertionUtils.java
@@ -0,0 +1,13 @@
+// Copyright (c) 2020, 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.utils;
+
+public class AssertionUtils {
+
+  public static boolean assertNotNull(Object o) {
+    assert o != null;
+    return true;
+  }
+}