Remove definitionFor(DexMethod)

Change-Id: I678677fe001c1dae361f2bde41e739c34bd82908
diff --git a/src/main/java/com/android/tools/r8/PrintUses.java b/src/main/java/com/android/tools/r8/PrintUses.java
index 5fe37ab..c94d67c 100644
--- a/src/main/java/com/android/tools/r8/PrintUses.java
+++ b/src/main/java/com/android/tools/r8/PrintUses.java
@@ -120,7 +120,7 @@
 
     @Override
     public boolean registerInvokeStatic(DexMethod method) {
-      DexEncodedMethod target = appInfo.lookupStaticTarget(method, context);
+      DexEncodedMethod target = appInfo.unsafeResolveMethodDueToDexFormat(method).getSingleTarget();
       if (target != null && target.method != method) {
         addType(method.holder);
         addMethod(target.method);
@@ -148,13 +148,13 @@
 
     @Override
     public boolean registerInstanceFieldWrite(DexField field) {
-      addField(field, false);
+      addField(field);
       return false;
     }
 
     @Override
     public boolean registerInstanceFieldRead(DexField field) {
-      addField(field, false);
+      addField(field);
       return false;
     }
 
@@ -166,13 +166,13 @@
 
     @Override
     public boolean registerStaticFieldRead(DexField field) {
-      addField(field, true);
+      addField(field);
       return false;
     }
 
     @Override
     public boolean registerStaticFieldWrite(DexField field) {
-      addField(field, true);
+      addField(field);
       return false;
     }
 
@@ -200,10 +200,9 @@
       return descriptors.contains(type.toDescriptorString());
     }
 
-    private void addField(DexField field, boolean isStatic) {
+    private void addField(DexField field) {
       addType(field.type);
-      DexEncodedField baseField =
-          isStatic ? appInfo.lookupStaticTarget(field) : appInfo.lookupInstanceTarget(field);
+      DexEncodedField baseField = appInfo.resolveField(field).getResolvedField();
       if (baseField != null && baseField.holder() != field.holder) {
         field = baseField.field;
       }
@@ -229,13 +228,14 @@
       addType(method.proto.returnType);
       Set<DexMethod> typeMethods = methods.get(method.holder);
       if (typeMethods != null) {
-        DexEncodedMethod encodedMethod = appInfo.definitionFor(method);
-        assert encodedMethod != null : "Could not find method " + method.toString();
+        DexClass holder = appInfo.definitionForHolder(method);
+        DexEncodedMethod definition = method.lookupOnClass(holder);
+        assert definition != null : "Could not find method " + method.toString();
         if (!allowObfuscation) {
           noObfuscationTypes.add(method.holder);
         }
-        if (encodedMethod.accessFlags.isVisibilityDependingOnPackage()) {
-          keepPackageNames.add(encodedMethod.holder().getPackageName());
+        if (definition.accessFlags.isVisibilityDependingOnPackage()) {
+          keepPackageNames.add(definition.holder().getPackageName());
         }
         typeMethods.add(method);
       }
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfo.java b/src/main/java/com/android/tools/r8/graph/AppInfo.java
index 3706dec..60b8220 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfo.java
@@ -161,21 +161,6 @@
     return definition == null ? Origin.unknown() : definition.origin;
   }
 
-  @Deprecated
-  @Override
-  public DexEncodedMethod definitionFor(DexMethod method) {
-    assert checkIfObsolete();
-    assert method.holder.isClassType();
-    if (!method.holder.isClassType()) {
-      return null;
-    }
-    DexClass clazz = definitionFor(method.holder);
-    if (clazz == null) {
-      return null;
-    }
-    return clazz.getMethodCollection().getMethod(method);
-  }
-
   /**
    * Lookup static method on the method holder, or answers null.
    *
diff --git a/src/main/java/com/android/tools/r8/graph/AppView.java b/src/main/java/com/android/tools/r8/graph/AppView.java
index b4534f5..9763f50 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -226,12 +226,6 @@
     return this.sourceDebugExtensions.get(clazz);
   }
 
-  @Deprecated
-  @Override
-  public final DexEncodedMethod definitionFor(DexMethod method) {
-    return appInfo().definitionFor(method);
-  }
-
   @Override
   public final DexClass definitionFor(DexType type) {
     return appInfo().definitionFor(type);
diff --git a/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java b/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java
index 214e41c..2ec6dbf 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java
@@ -6,9 +6,6 @@
 
 public interface DexDefinitionSupplier {
 
-  @Deprecated
-  DexEncodedMethod definitionFor(DexMethod method);
-
   DexClass definitionFor(DexType type);
 
   DexProgramClass definitionForProgramType(DexType type);
diff --git a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
index 95922dc..ab9be40 100644
--- a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
@@ -73,13 +73,6 @@
     return classpathClasses;
   }
 
-  @Deprecated
-  @Override
-  public DexEncodedMethod definitionFor(DexMethod method) {
-    DexClass clazz = definitionFor(method.holder);
-    return clazz != null ? clazz.lookupMethod(method) : null;
-  }
-
   @Override
   public DexClass definitionFor(DexType type) {
     assert type.isClassType() : "Cannot lookup definition for type: " + type;
diff --git a/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java b/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java
index 5a8f39f..3c7b2d8 100644
--- a/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java
+++ b/src/main/java/com/android/tools/r8/graph/LookupCompletenessHelper.java
@@ -21,7 +21,7 @@
   }
 
   void checkClass(DexClass clazz) {
-    if (pinnedPredicate.isPinned(clazz.type)) {
+    if (pinnedPredicate.isPinned(clazz)) {
       if (pinnedInstantiations == null) {
         pinnedInstantiations = Sets.newIdentityHashSet();
       }
@@ -30,7 +30,7 @@
   }
 
   void checkMethod(DexEncodedMethod method) {
-    if (pinnedPredicate.isPinned(method.method)) {
+    if (pinnedPredicate.isPinned(method)) {
       if (pinnedMethods == null) {
         pinnedMethods = Sets.newIdentityHashSet();
       }
@@ -70,7 +70,7 @@
       }
       DexEncodedMethod methodInClass = parent.lookupVirtualMethod(method);
       if (methodInClass != null
-          && (parent.isNotProgramClass() || pinnedPredicate.isPinned(methodInClass.method))) {
+          && (parent.isNotProgramClass() || pinnedPredicate.isPinned(methodInClass))) {
         return true;
       }
       if (parent.superType != null) {
diff --git a/src/main/java/com/android/tools/r8/graph/PinnedPredicate.java b/src/main/java/com/android/tools/r8/graph/PinnedPredicate.java
index d81becc..5828fd5 100644
--- a/src/main/java/com/android/tools/r8/graph/PinnedPredicate.java
+++ b/src/main/java/com/android/tools/r8/graph/PinnedPredicate.java
@@ -7,5 +7,5 @@
 @FunctionalInterface
 public interface PinnedPredicate {
 
-  boolean isPinned(DexReference reference);
+  boolean isPinned(DexDefinition reference);
 }
diff --git a/src/main/java/com/android/tools/r8/graph/ResolutionResult.java b/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
index 4e96594..d8eab37 100644
--- a/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/ResolutionResult.java
@@ -372,8 +372,7 @@
         // This is assuming that the method is accessible, which implies self/nest access.
         // Only include if the target has code or is native.
         boolean isIncomplete =
-            pinnedPredicate.isPinned(resolvedHolder.type)
-                && pinnedPredicate.isPinned(resolvedMethod.method);
+            pinnedPredicate.isPinned(resolvedHolder) && pinnedPredicate.isPinned(resolvedMethod);
         return LookupResult.createResult(
             Collections.singletonMap(
                 resolvedMethod, DexClassAndMethod.create(resolvedHolder, resolvedMethod)),
@@ -541,18 +540,17 @@
         LambdaDescriptor lambdaInstance, AppInfoWithClassHierarchy appInfo) {
       if (lambdaInstance.getMainMethod().match(resolvedMethod)) {
         DexMethod method = lambdaInstance.implHandle.asMethod();
-        DexClass holder = appInfo.definitionFor(method.holder);
+        DexClass holder = appInfo.definitionForHolder(method);
         if (holder == null) {
           assert false;
           return null;
         }
-        DexEncodedMethod encodedMethod = appInfo.definitionFor(method);
-        if (encodedMethod == null) {
+        DexEncodedMethod definition = holder.lookupMethod(method);
+        if (definition == null) {
           // The targeted method might not exist, eg, Throwable.addSuppressed in an old library.
           return null;
         }
-        return new LookupLambdaTarget(
-            lambdaInstance, DexClassAndMethod.create(holder, encodedMethod));
+        return new LookupLambdaTarget(lambdaInstance, DexClassAndMethod.create(holder, definition));
       }
       return lookupMaximallySpecificDispatchTarget(lambdaInstance, appInfo);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java
index 41f5dc8..416f064 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/ClassInitializationAnalysis.java
@@ -297,7 +297,9 @@
           return false;
         }
       }
-      DexEncodedMethod method = appView.definitionFor(instruction.getInvokedMethod());
+      DexMethod invokedMethod = instruction.getInvokedMethod();
+      DexClass holder = appView.definitionForHolder(invokedMethod);
+      DexEncodedMethod method = invokedMethod.lookupOnClass(holder);
       return method != null && isTypeInitializedBy(instruction, type, method, appView, mode);
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
index 00c88b8..e89d9b0 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
@@ -117,10 +117,10 @@
       return result;
     }
     // Allow optimizing static library invokes in D8.
-    DexClass clazz = appView.definitionFor(getInvokedMethod().holder);
+    DexClass clazz = appView.definitionForHolder(getInvokedMethod());
     if (clazz != null
         && (clazz.isLibraryClass() || appView.libraryMethodOptimizer().isModeled(clazz.type))) {
-      return appView.definitionFor(getInvokedMethod());
+      return clazz.lookupMethod(getInvokedMethod());
     }
     // In D8, we can treat invoke-static instructions as having a single target if the invoke is
     // targeting a method in the enclosing class.
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java b/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
index 2d95115..951a451 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
@@ -130,7 +130,7 @@
       DexClass clazz = appView.definitionFor(holder);
       if (clazz != null
           && (clazz.isLibraryClass() || appView.libraryMethodOptimizer().isModeled(clazz.type))) {
-        DexEncodedMethod singleTargetCandidate = appView.definitionFor(method);
+        DexEncodedMethod singleTargetCandidate = clazz.lookupMethod(method);
         if (singleTargetCandidate != null && (clazz.isFinal() || singleTargetCandidate.isFinal())) {
           return singleTargetCandidate;
         }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
index fbeff68..f1c403b 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.ir.conversion;
 
+import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
+
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexProgramClass;
@@ -126,10 +128,10 @@
             .reprocess
             .forEach(
                 reference -> {
-                  DexEncodedMethod definition = appView.definitionFor(reference);
+                  DexProgramClass clazz =
+                      asProgramClassOrNull(appView.definitionForHolder(reference));
+                  DexEncodedMethod definition = reference.lookupOnClass(clazz);
                   if (definition != null) {
-                    DexProgramClass clazz =
-                        appView.definitionForHolder(definition).asProgramClass();
                     set.createAndAdd(clazz, definition);
                   }
                 });
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
index 9e270af..8a25765 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
@@ -44,6 +44,7 @@
 import static com.android.tools.r8.ir.code.Opcodes.XOR;
 
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexField;
@@ -549,7 +550,8 @@
             {
               InvokeDirect invoke = instruction.asInvokeDirect();
               DexMethod invokedMethod = invoke.getInvokedMethod();
-              DexEncodedMethod singleTarget = appView.definitionFor(invokedMethod);
+              DexClass holder = appView.definitionForHolder(invokedMethod);
+              DexEncodedMethod singleTarget = invokedMethod.lookupOnClass(holder);
               if (singleTarget == null) {
                 return null;
               }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java
index 92c78af..e7e0fe6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java
@@ -7,6 +7,7 @@
 import static com.android.tools.r8.ir.analysis.type.Nullability.maybeNull;
 
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
@@ -101,10 +102,11 @@
   }
 
   private DexEncodedMethod lookupMethod(DexMethod method) {
-    DexEncodedMethod encodedMethod = appView.definitionFor(method);
-    if (encodedMethod != null) {
+    DexClass holder = appView.definitionForHolder(method);
+    DexEncodedMethod definition = method.lookupOnClass(holder);
+    if (definition != null) {
       modeledLibraryTypes.add(method.holder);
-      return encodedMethod;
+      return definition;
     }
     return null;
   }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
index ba814e9..680bd5c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
@@ -121,11 +121,6 @@
     }
 
     @Override
-    public DexEncodedMethod definitionFor(DexMethod method) {
-      throw new Unreachable("Should not be called");
-    }
-
-    @Override
     public DexClass definitionFor(DexType type) {
       // TODO(b/157700128) Metadata cannot at this point keep anything alive. Therefore, if a type
       //  has been pruned it may still be referenced, so we do an early check here to ensure it will
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 87bfd9a..f617c31 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexClasspathClass;
+import com.android.tools.r8.graph.DexDefinition;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexField;
@@ -1338,22 +1339,17 @@
     return isInstantiatedDirectly(clazz) || isPinned(clazz.type) || isInstantiatedInterface(clazz);
   }
 
-  public boolean isPinnedNotProgramOrLibraryOverride(DexReference reference) {
-    if (isPinned(reference)) {
+  public boolean isPinnedNotProgramOrLibraryOverride(DexDefinition definition) {
+    if (isPinned(definition.toReference())) {
       return true;
     }
-    if (reference.isDexMethod()) {
-      DexEncodedMethod method = definitionFor(reference.asDexMethod());
-      return method == null
-          || !method.isProgramMethod(this)
-          || method.isLibraryMethodOverride().isPossiblyTrue();
-    } else {
-      assert reference.isDexType();
-      DexClass clazz = definitionFor(reference.asDexType());
-      return clazz == null
-          || clazz.isNotProgramClass()
-          || isInstantiatedInterface(clazz.asProgramClass());
+    if (definition.isDexEncodedMethod()) {
+      DexEncodedMethod method = definition.asDexEncodedMethod();
+      return !method.isProgramMethod(this) || method.isLibraryMethodOverride().isPossiblyTrue();
     }
+    assert definition.isDexClass();
+    DexClass clazz = definition.asDexClass();
+    return clazz.isNotProgramClass() || isInstantiatedInterface(clazz.asProgramClass());
   }
 
   public SubtypingInfo computeSubtypingInfo() {
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 53057cc..76c9e4c 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -2496,7 +2496,7 @@
             (type, subTypeConsumer, lambdaConsumer) ->
                 objectAllocationInfoCollection.forEachInstantiatedSubType(
                     type, subTypeConsumer, lambdaConsumer, appInfo),
-            reference -> keepInfo.isPinned(reference, appInfo))
+            definition -> keepInfo.isPinned(definition.toReference(), appInfo))
         .forEach(
             target ->
                 markVirtualDispatchTargetAsLive(
@@ -4161,12 +4161,6 @@
       this.enqueuer = enqueuer;
     }
 
-    @Deprecated
-    @Override
-    public DexEncodedMethod definitionFor(DexMethod method) {
-      return enqueuer.definitionFor(method);
-    }
-
     @Override
     public DexClass definitionFor(DexType type) {
       return enqueuer.definitionFor(type);