Forward AppView to NonIdentityGraphLens

Change-Id: I479e5040a97e091dff7711e3563319df0d124c9e
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 d93fae1..693d2ac 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.graph.analysis.InitializedClassesInInstanceMethodsAnalysis.InitializedClassesInInstanceMethods;
 import com.android.tools.r8.graph.analysis.ResourceAccessAnalysis.ResourceAnalysisResult;
 import com.android.tools.r8.graph.classmerging.MergedClassesCollection;
+import com.android.tools.r8.graph.lens.ClearCodeRewritingGraphLens;
 import com.android.tools.r8.graph.lens.GraphLens;
 import com.android.tools.r8.graph.lens.InitClassLens;
 import com.android.tools.r8.graph.lens.NonIdentityGraphLens;
@@ -433,10 +434,8 @@
     allCodeProcessed = true;
   }
 
-  public GraphLens clearCodeRewritings() {
-    GraphLens newLens = graphLens.withCodeRewritingsApplied(dexItemFactory());
-    setGraphLens(newLens);
-    return newLens;
+  public void clearCodeRewritings() {
+    setGraphLens(new ClearCodeRewritingGraphLens(withClassHierarchy()));
   }
 
   public AppServices appServices() {
diff --git a/src/main/java/com/android/tools/r8/graph/lens/AppliedGraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/AppliedGraphLens.java
index e6ecef1..866cc8a 100644
--- a/src/main/java/com/android/tools/r8/graph/lens/AppliedGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/AppliedGraphLens.java
@@ -46,7 +46,7 @@
 
   @SuppressWarnings("ReferenceEquality")
   public AppliedGraphLens(AppView<? extends AppInfoWithClassHierarchy> appView) {
-    super(appView.dexItemFactory(), GraphLens.getIdentityLens());
+    super(appView, GraphLens.getIdentityLens());
     for (DexProgramClass clazz : appView.appInfo().classes()) {
       // TODO(b/169395592): If merged classes were removed from the application this would not be
       //  necessary.
diff --git a/src/main/java/com/android/tools/r8/graph/lens/ClearCodeRewritingGraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/ClearCodeRewritingGraphLens.java
index 0b5348c..f53708a 100644
--- a/src/main/java/com/android/tools/r8/graph/lens/ClearCodeRewritingGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/ClearCodeRewritingGraphLens.java
@@ -5,8 +5,9 @@
 package com.android.tools.r8.graph.lens;
 
 import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
+import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
 import com.android.tools.r8.ir.code.InvokeType;
@@ -15,8 +16,8 @@
 // relies on the previous lens for names (getRenamed/Original methods).
 public class ClearCodeRewritingGraphLens extends DefaultNonIdentityGraphLens {
 
-  public ClearCodeRewritingGraphLens(DexItemFactory dexItemFactory, GraphLens previousLens) {
-    super(dexItemFactory, previousLens);
+  public ClearCodeRewritingGraphLens(AppView<? extends AppInfoWithClassHierarchy> appView) {
+    super(appView);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/graph/lens/DefaultNonIdentityGraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/DefaultNonIdentityGraphLens.java
index ffab2e0..df70495 100644
--- a/src/main/java/com/android/tools/r8/graph/lens/DefaultNonIdentityGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/DefaultNonIdentityGraphLens.java
@@ -6,7 +6,6 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription;
@@ -14,11 +13,11 @@
 public class DefaultNonIdentityGraphLens extends NonIdentityGraphLens {
 
   public DefaultNonIdentityGraphLens(AppView<?> appView) {
-    this(appView.dexItemFactory(), appView.graphLens());
+    this(appView, appView.graphLens());
   }
 
-  public DefaultNonIdentityGraphLens(DexItemFactory dexItemFactory, GraphLens previousLens) {
-    super(dexItemFactory, previousLens);
+  public DefaultNonIdentityGraphLens(AppView<?> appView, GraphLens previousLens) {
+    super(appView, previousLens);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java
index 7dfa9ec..a7ef09b 100644
--- a/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/GraphLens.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMember;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
@@ -465,13 +464,6 @@
     return false;
   }
 
-  public GraphLens withCodeRewritingsApplied(DexItemFactory dexItemFactory) {
-    if (hasCodeRewritings()) {
-      return new ClearCodeRewritingGraphLens(dexItemFactory, this);
-    }
-    return this;
-  }
-
   @SuppressWarnings("ReferenceEquality")
   public boolean assertFieldsNotModified(Iterable<DexEncodedField> fields) {
     for (DexEncodedField field : fields) {
diff --git a/src/main/java/com/android/tools/r8/graph/lens/NonIdentityGraphLens.java b/src/main/java/com/android/tools/r8/graph/lens/NonIdentityGraphLens.java
index 33f5aeb..07fac2c 100644
--- a/src/main/java/com/android/tools/r8/graph/lens/NonIdentityGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/lens/NonIdentityGraphLens.java
@@ -17,17 +17,19 @@
 
 public abstract class NonIdentityGraphLens extends GraphLens {
 
+  protected final AppView<?> appView;
   private final DexItemFactory dexItemFactory;
   private GraphLens previousLens;
 
   private final Map<DexType, DexType> arrayTypeCache = new ConcurrentHashMap<>();
 
   public NonIdentityGraphLens(AppView<?> appView) {
-    this(appView.dexItemFactory(), appView.graphLens());
+    this(appView, appView.graphLens());
   }
 
-  public NonIdentityGraphLens(DexItemFactory dexItemFactory, GraphLens previousLens) {
-    this.dexItemFactory = dexItemFactory;
+  public NonIdentityGraphLens(AppView<?> appView, GraphLens previousLens) {
+    this.appView = appView;
+    this.dexItemFactory = appView.dexItemFactory();
     this.previousLens = previousLens;
   }
 
diff --git a/src/main/java/com/android/tools/r8/optimize/FieldRebindingIdentityLens.java b/src/main/java/com/android/tools/r8/optimize/FieldRebindingIdentityLens.java
index 2e641f6..4b71a32 100644
--- a/src/main/java/com/android/tools/r8/optimize/FieldRebindingIdentityLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/FieldRebindingIdentityLens.java
@@ -4,8 +4,9 @@
 
 package com.android.tools.r8.optimize;
 
+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
+import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.lens.DefaultNonIdentityGraphLens;
 import com.android.tools.r8.graph.lens.FieldLookupResult;
 import com.android.tools.r8.graph.lens.GraphLens;
@@ -24,9 +25,9 @@
 
   private FieldRebindingIdentityLens(
       Map<DexField, DexField> nonReboundFieldReferenceToDefinitionMap,
-      DexItemFactory dexItemFactory,
+      AppView<? extends AppInfoWithClassHierarchy> appView,
       GraphLens previousLens) {
-    super(dexItemFactory, previousLens);
+    super(appView, previousLens);
     this.nonReboundFieldReferenceToDefinitionMap = nonReboundFieldReferenceToDefinitionMap;
   }
 
@@ -65,12 +66,12 @@
       nonReboundFieldReferenceToDefinitionMap.put(nonReboundFieldReference, reboundFieldReference);
     }
 
-    FieldRebindingIdentityLens build(DexItemFactory dexItemFactory) {
+    FieldRebindingIdentityLens build(AppView<? extends AppInfoWithClassHierarchy> appView) {
       // This intentionally does not return null when the map is empty. In this case there are no
       // non-rebound field references, but the member rebinding lens is still needed to populate the
       // rebound reference during field lookup.
       return new FieldRebindingIdentityLens(
-          nonReboundFieldReferenceToDefinitionMap, dexItemFactory, GraphLens.getIdentityLens());
+          nonReboundFieldReferenceToDefinitionMap, appView, GraphLens.getIdentityLens());
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLens.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLens.java
index 616ac22..60d5c62 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLens.java
@@ -33,9 +33,9 @@
   private MemberRebindingIdentityLens(
       Map<DexField, DexField> nonReboundFieldReferenceToDefinitionMap,
       Map<DexMethod, DexMethod> nonReboundMethodReferenceToDefinitionMap,
-      DexItemFactory dexItemFactory,
+      AppView<? extends AppInfoWithClassHierarchy> appView,
       GraphLens previousLens) {
-    super(dexItemFactory, previousLens);
+    super(appView, previousLens);
     this.nonReboundFieldReferenceToDefinitionMap = nonReboundFieldReferenceToDefinitionMap;
     this.nonReboundMethodReferenceToDefinitionMap = nonReboundMethodReferenceToDefinitionMap;
   }
@@ -202,7 +202,7 @@
       return new MemberRebindingIdentityLens(
           nonReboundFieldReferenceToDefinitionMap,
           nonReboundMethodReferenceToDefinitionMap,
-          appView.dexItemFactory(),
+          appView,
           previousLens);
     }
   }
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java
index 283581a..6b2903e 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java
@@ -25,7 +25,6 @@
 
 public class MemberRebindingLens extends DefaultNonIdentityGraphLens {
 
-  private final AppView<AppInfoWithLiveness> appView;
   private final Map<InvokeType, Map<DexMethod, DexMethod>> methodMaps;
   private final Map<DexField, DexField> nonReboundFieldReferenceToDefinitionMap;
 
@@ -33,8 +32,7 @@
       AppView<AppInfoWithLiveness> appView,
       Map<InvokeType, Map<DexMethod, DexMethod>> methodMaps,
       Map<DexField, DexField> nonReboundFieldReferenceToDefinitionMap) {
-    super(appView.dexItemFactory(), appView.graphLens());
-    this.appView = appView;
+    super(appView);
     this.methodMaps = methodMaps;
     this.nonReboundFieldReferenceToDefinitionMap = nonReboundFieldReferenceToDefinitionMap;
   }
@@ -111,7 +109,7 @@
           builder.recordDefinitionForNonReboundFieldReference(
               rewrittenNonReboundFieldReference, rewrittenReboundFieldReference);
         });
-    return builder.build(dexItemFactory);
+    return builder.build(appView);
   }
 
   public static class Builder {
diff --git a/src/main/java/com/android/tools/r8/optimize/PublicizerLens.java b/src/main/java/com/android/tools/r8/optimize/PublicizerLens.java
deleted file mode 100644
index 969887e..0000000
--- a/src/main/java/com/android/tools/r8/optimize/PublicizerLens.java
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (c) 2018, 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.optimize;
-
-import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.lens.FieldLookupResult;
-import com.android.tools.r8.graph.lens.GraphLens;
-import com.android.tools.r8.graph.lens.MethodLookupResult;
-import com.android.tools.r8.graph.lens.NestedGraphLens;
-import com.android.tools.r8.ir.code.InvokeType;
-import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.google.common.collect.Sets;
-import java.util.Set;
-
-final class PublicizerLens extends NestedGraphLens {
-
-  private final AppView<?> appView;
-  private final Set<DexMethod> publicizedMethods;
-
-  private PublicizerLens(AppView<?> appView, Set<DexMethod> publicizedMethods) {
-    super(appView, EMPTY_FIELD_MAP, EMPTY_METHOD_MAP, EMPTY_TYPE_MAP);
-    this.appView = appView;
-    this.publicizedMethods = publicizedMethods;
-  }
-
-  @Override
-  protected boolean isLegitimateToHaveEmptyMappings() {
-    // This lens does not map any DexItem's at all.
-    // It will just tweak invoke type for publicized methods from invoke-direct to invoke-virtual.
-    return true;
-  }
-
-  @Override
-  public boolean isPublicizerLens() {
-    return true;
-  }
-
-  @Override
-  protected FieldLookupResult internalDescribeLookupField(FieldLookupResult previous) {
-    return previous;
-  }
-
-  @Override
-  public MethodLookupResult internalDescribeLookupMethod(
-      MethodLookupResult previous, DexMethod context, GraphLens codeLens) {
-    if (previous.getType() == InvokeType.DIRECT
-        && publicizedMethods.contains(previous.getReference())) {
-      assert publicizedMethodIsPresentOnHolder(previous.getReference(), context);
-      return MethodLookupResult.builder(this)
-          .setReference(previous.getReference())
-          .setPrototypeChanges(previous.getPrototypeChanges())
-          .setType(InvokeType.VIRTUAL)
-          .build();
-    }
-    return previous;
-  }
-
-  private boolean publicizedMethodIsPresentOnHolder(DexMethod method, DexMethod context) {
-    MethodLookupResult lookup =
-        appView.graphLens().lookupMethod(method, context, InvokeType.VIRTUAL);
-    DexMethod signatureInCurrentWorld = lookup.getReference();
-    DexClass clazz = appView.definitionFor(signatureInCurrentWorld.holder);
-    assert clazz != null;
-    DexEncodedMethod actualEncodedTarget = clazz.lookupVirtualMethod(signatureInCurrentWorld);
-    assert actualEncodedTarget != null;
-    assert actualEncodedTarget.isPublic();
-    return true;
-  }
-
-  static PublicizedLensBuilder createBuilder() {
-    return new PublicizedLensBuilder();
-  }
-
-  static class PublicizedLensBuilder {
-    private final Set<DexMethod> publicizedMethods = Sets.newIdentityHashSet();
-
-    private PublicizedLensBuilder() {}
-
-    public PublicizerLens build(AppView<AppInfoWithLiveness> appView) {
-      if (publicizedMethods.isEmpty()) {
-        return null;
-      }
-      return new PublicizerLens(appView, publicizedMethods);
-    }
-
-    public void add(DexMethod publicizedMethod) {
-      publicizedMethods.add(publicizedMethod);
-    }
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoistingLens.java b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoistingLens.java
index 694096a..6e8a445 100644
--- a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoistingLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoistingLens.java
@@ -18,7 +18,7 @@
   public BridgeHoistingLens(
       AppView<?> appView,
       BidirectionalManyToOneMap<DexMethod, DexMethod> bridgeToHoistedBridgeMap) {
-    super(appView.dexItemFactory(), appView.graphLens());
+    super(appView);
     this.bridgeToHoistedBridgeMap = bridgeToHoistedBridgeMap;
   }
 
diff --git a/src/main/java/com/android/tools/r8/verticalclassmerging/SingleTypeMapperGraphLens.java b/src/main/java/com/android/tools/r8/verticalclassmerging/SingleTypeMapperGraphLens.java
index 7042bd5..55a1a0a 100644
--- a/src/main/java/com/android/tools/r8/verticalclassmerging/SingleTypeMapperGraphLens.java
+++ b/src/main/java/com/android/tools/r8/verticalclassmerging/SingleTypeMapperGraphLens.java
@@ -23,7 +23,6 @@
 
 public class SingleTypeMapperGraphLens extends NonIdentityGraphLens {
 
-  private final AppView<AppInfoWithLiveness> appView;
   private final VerticalClassMergerGraphLens.Builder lensBuilder;
   private final MutableBidirectionalManyToOneRepresentativeMap<DexType, DexType> mergedClasses;
 
@@ -36,8 +35,7 @@
       MutableBidirectionalManyToOneRepresentativeMap<DexType, DexType> mergedClasses,
       DexProgramClass source,
       DexProgramClass target) {
-    super(appView.dexItemFactory(), GraphLens.getIdentityLens());
-    this.appView = appView;
+    super(appView, GraphLens.getIdentityLens());
     this.lensBuilder = lensBuilder;
     this.mergedClasses = mergedClasses;
     this.source = source;
diff --git a/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerGraphLens.java b/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerGraphLens.java
index e3ad747..eebae8e 100644
--- a/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerGraphLens.java
+++ b/src/main/java/com/android/tools/r8/verticalclassmerging/VerticalClassMergerGraphLens.java
@@ -63,8 +63,6 @@
     MethodLookupResult get(RewrittenPrototypeDescription prototypeChanges);
   }
 
-  private final AppView<?> appView;
-
   private VerticallyMergedClasses mergedClasses;
   private final Map<DexType, Map<DexMethod, GraphLensLookupResultProvider>>
       contextualVirtualToDirectMethodMaps;
@@ -84,7 +82,6 @@
       Map<DexMethod, DexMethod> originalMethodSignaturesForBridges,
       Map<DexMethod, RewrittenPrototypeDescription> prototypeChanges) {
     super(appView, fieldMap, methodMap, mergedClasses.getBidirectionalMap(), newMethodSignatures);
-    this.appView = appView;
     this.mergedClasses = mergedClasses;
     this.contextualVirtualToDirectMethodMaps = contextualVirtualToDirectMethodMaps;
     this.mergedMethods = mergedMethods;