Merge "Apply the prior lense _after_ finding members to be bound."
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index d587efe..13f2404 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -331,6 +331,16 @@
       GraphLense graphLense = GraphLense.getIdentityLense();
 
       if (appInfo.hasLiveness()) {
+        if (options.proguardConfiguration.hasApplyMappingFile()) {
+          SeedMapper seedMapper =
+              SeedMapper.seedMapperFromFile(options.proguardConfiguration.getApplyMappingFile());
+          timing.begin("apply-mapping");
+          graphLense =
+              new ProguardMapApplier(appInfo.withLiveness(), graphLense, seedMapper).run(timing);
+          application = application.asDirect().rewrittenWithLense(graphLense);
+          appInfo = appInfo.withLiveness().rewrittenWithLense(application.asDirect(), graphLense);
+          timing.end();
+        }
         graphLense = new MemberRebindingAnalysis(appInfo.withLiveness(), graphLense).run();
         // Class merging requires inlining.
         if (options.enableClassMerging && options.enableInlining) {
@@ -339,20 +349,11 @@
               new VerticalClassMerger(application, appInfo.withLiveness(), graphLense, timing);
           graphLense = classMerger.run();
           timing.end();
-
+          application = application.asDirect().rewrittenWithLense(graphLense);
           appInfo = appInfo.withLiveness()
-              .prunedCopyFrom(application, classMerger.getRemovedClasses());
+              .prunedCopyFrom(application, classMerger.getRemovedClasses())
+              .rewrittenWithLense(application.asDirect(), graphLense);
         }
-        if (options.proguardConfiguration.hasApplyMappingFile()) {
-          SeedMapper seedMapper =
-              SeedMapper.seedMapperFromFile(options.proguardConfiguration.getApplyMappingFile());
-          timing.begin("apply-mapping");
-          graphLense =
-              new ProguardMapApplier(appInfo.withLiveness(), graphLense, seedMapper).run(timing);
-          timing.end();
-        }
-        application = application.asDirect().rewrittenWithLense(graphLense);
-        appInfo = appInfo.withLiveness().rewrittenWithLense(application.asDirect(), graphLense);
         // Collect switch maps and ordinals maps.
         appInfo = new SwitchMapCollector(appInfo.withLiveness(), options).run();
         appInfo = new EnumOrdinalMapCollector(appInfo.withLiveness(), options).run();
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java
index c159b9d..f5d48fd 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java
@@ -149,27 +149,25 @@
         }
       });
 
-      // We need to handle a lib class that extends another lib class where some members are not
-      // overridden, resulting in absence of definitions. References to those members need to be
-      // redirected via lense as well.
-      if (clazz.isLibraryClass()) {
-        classNaming.forAllFieldNaming(memberNaming -> {
-          if (!appliedMemberNaming.contains(memberNaming)) {
-            DexField pretendedOriginalField =
-                ((FieldSignature) memberNaming.getOriginalSignature())
-                    .toDexField(appInfo.dexItemFactory, from);
-            applyFieldMapping(pretendedOriginalField, memberNaming);
-          }
-        });
-        classNaming.forAllMethodNaming(memberNaming -> {
-          if (!appliedMemberNaming.contains(memberNaming)) {
-            DexMethod pretendedOriginalMethod =
-                ((MethodSignature) memberNaming.getOriginalSignature())
-                    .toDexMethod(appInfo.dexItemFactory, from);
-            applyMethodMapping(pretendedOriginalMethod, memberNaming);
-          }
-        });
-      }
+      // We need to handle a class that extends another class where some members are not overridden,
+      // resulting in absence of definitions. References to those members need to be redirected via
+      // the lense as well.
+      classNaming.forAllFieldNaming(memberNaming -> {
+        if (!appliedMemberNaming.contains(memberNaming)) {
+          DexField pretendedOriginalField =
+              ((FieldSignature) memberNaming.getOriginalSignature())
+                  .toDexField(appInfo.dexItemFactory, from);
+          applyFieldMapping(pretendedOriginalField, memberNaming);
+        }
+      });
+      classNaming.forAllMethodNaming(memberNaming -> {
+        if (!appliedMemberNaming.contains(memberNaming)) {
+          DexMethod pretendedOriginalMethod =
+              ((MethodSignature) memberNaming.getOriginalSignature())
+                  .toDexMethod(appInfo.dexItemFactory, from);
+          applyMethodMapping(pretendedOriginalMethod, memberNaming);
+        }
+      });
     }
 
     private void applyFieldMapping(DexField originalField, MemberNaming memberNaming) {
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
index da7a787..9efd5c8 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -116,7 +116,6 @@
   private void computeMethodRebinding(Set<DexMethod> methods,
       Function<DexMethod, DexEncodedMethod> lookupTarget) {
     for (DexMethod method : methods) {
-      method = lense.lookupMethod(method);
       // We can safely ignore array types, as the corresponding methods are defined in a library.
       if (!method.getHolder().isClassType()) {
         continue;
@@ -150,7 +149,7 @@
             target = bridgeMethod;
           }
         }
-        builder.map(method, validTargetFor(target.method, method));
+        builder.map(method, lense.lookupMethod(validTargetFor(target.method, method)));
       }
     }
   }
@@ -189,7 +188,6 @@
       BiFunction<DexClass, DexField, DexEncodedField> lookupTargetOnClass) {
     for (Map.Entry<DexField, Set<DexEncodedMethod>> entry : fields.entrySet()) {
       DexField field = entry.getKey();
-      field = lense.lookupField(field);
       DexEncodedField target = lookup.apply(field.getHolder(), field);
       // Rebind to the lowest library class or program class. Do not rebind accesses to fields that
       // are not visible from the access context.
@@ -197,7 +195,8 @@
       if (target != null && target.field != field
           && contexts.stream().allMatch(context ->
               isVisibleFromOriginalContext(context.method.getHolder(), target))) {
-        builder.map(field, validTargetFor(target.field, field, lookupTargetOnClass));
+        builder.map(field,
+            lense.lookupField(validTargetFor(target.field, field, lookupTargetOnClass)));
       }
     }
   }