Support for getting method signature at time of given lens

Bug: 201984767
Change-Id: Ia61832f65073c18f27d844966eb8596fd52a6c33
diff --git a/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java b/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java
index a05960f..8618c4e 100644
--- a/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java
@@ -120,14 +120,6 @@
   }
 
   @Override
-  public DexMethod getOriginalMethodSignature(DexMethod method) {
-    if (extraOriginalMethodSignatures.containsKey(method)) {
-      return extraOriginalMethodSignatures.get(method);
-    }
-    return originalMethodSignatures.getOrDefault(method, method);
-  }
-
-  @Override
   public DexField getRenamedFieldSignature(DexField originalField) {
     return originalFieldSignatures.inverse().getOrDefault(originalField, originalField);
   }
@@ -162,7 +154,10 @@
 
   @Override
   protected DexMethod internalGetPreviousMethodSignature(DexMethod method) {
-    return method;
+    if (extraOriginalMethodSignatures.containsKey(method)) {
+      return extraOriginalMethodSignatures.get(method);
+    }
+    return originalMethodSignatures.getOrDefault(method, method);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/graph/GraphLens.java b/src/main/java/com/android/tools/r8/graph/GraphLens.java
index a81d742..3b816d8 100644
--- a/src/main/java/com/android/tools/r8/graph/GraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/GraphLens.java
@@ -285,7 +285,21 @@
 
   public abstract DexField getOriginalFieldSignature(DexField field);
 
-  public abstract DexMethod getOriginalMethodSignature(DexMethod method);
+  public final DexMethod getOriginalMethodSignature(DexMethod method) {
+    return getOriginalMethodSignature(method, null);
+  }
+
+  public final DexMethod getOriginalMethodSignature(DexMethod method, GraphLens atGraphLens) {
+    GraphLens current = this;
+    DexMethod original = method;
+    while (current.isNonIdentityLens() && current != atGraphLens) {
+      NonIdentityGraphLens nonIdentityLens = current.asNonIdentityLens();
+      original = nonIdentityLens.internalGetPreviousMethodSignature(original);
+      current = nonIdentityLens.getPrevious();
+    }
+    assert atGraphLens == null ? current.isIdentityLens() : (current == atGraphLens);
+    return original;
+  }
 
   public abstract DexField getRenamedFieldSignature(DexField originalField);
 
@@ -856,11 +870,6 @@
     }
 
     @Override
-    public DexMethod getOriginalMethodSignature(DexMethod method) {
-      return method;
-    }
-
-    @Override
     public DexField getRenamedFieldSignature(DexField originalField) {
       return originalField;
     }
@@ -950,11 +959,6 @@
     }
 
     @Override
-    public DexMethod getOriginalMethodSignature(DexMethod method) {
-      return getPrevious().getOriginalMethodSignature(method);
-    }
-
-    @Override
     public DexField getRenamedFieldSignature(DexField originalField) {
       return getPrevious().getRenamedFieldSignature(originalField);
     }
diff --git a/src/main/java/com/android/tools/r8/graph/NestedGraphLens.java b/src/main/java/com/android/tools/r8/graph/NestedGraphLens.java
index 00bd8bb..62ce9d8 100644
--- a/src/main/java/com/android/tools/r8/graph/NestedGraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/NestedGraphLens.java
@@ -130,12 +130,6 @@
   }
 
   @Override
-  public DexMethod getOriginalMethodSignature(DexMethod method) {
-    DexMethod originalMethod = internalGetPreviousMethodSignature(method);
-    return getPrevious().getOriginalMethodSignature(originalMethod);
-  }
-
-  @Override
   public DexField getRenamedFieldSignature(DexField originalField) {
     DexField renamedField = getPrevious().getRenamedFieldSignature(originalField);
     return internalGetNextFieldSignature(renamedField);
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 d949ab2..e63eb5e 100644
--- a/src/main/java/com/android/tools/r8/optimize/FieldRebindingIdentityLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/FieldRebindingIdentityLens.java
@@ -71,11 +71,6 @@
   }
 
   @Override
-  public DexMethod getOriginalMethodSignature(DexMethod method) {
-    return getPrevious().getOriginalMethodSignature(method);
-  }
-
-  @Override
   public DexField getRenamedFieldSignature(DexField originalField) {
     return getPrevious().getRenamedFieldSignature(originalField);
   }
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 8873add..0e6b99f 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLens.java
@@ -100,11 +100,6 @@
   }
 
   @Override
-  public DexMethod getOriginalMethodSignature(DexMethod method) {
-    return getPrevious().getOriginalMethodSignature(method);
-  }
-
-  @Override
   public DexField getRenamedFieldSignature(DexField originalField) {
     return getPrevious().getRenamedFieldSignature(originalField);
   }
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 d202af8..8861f6c 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java
@@ -68,11 +68,6 @@
   }
 
   @Override
-  public DexMethod getOriginalMethodSignature(DexMethod method) {
-    return getPrevious().getOriginalMethodSignature(method);
-  }
-
-  @Override
   public DexField getRenamedFieldSignature(DexField originalField) {
     return getPrevious().getRenamedFieldSignature(originalField);
   }
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 6a6c3bb..c387c1c 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
@@ -27,11 +27,6 @@
   }
 
   @Override
-  public DexMethod getOriginalMethodSignature(DexMethod method) {
-    return getPrevious().getOriginalMethodSignature(internalGetPreviousMethodSignature(method));
-  }
-
-  @Override
   public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied) {
     DexMethod renamedMethod = getPrevious().getRenamedMethodSignature(originalMethod, applied);
     return bridgeToHoistedBridgeMap.getOrDefault(renamedMethod, renamedMethod);
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLens.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLens.java
index f2732f6..ea9f971 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLens.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLens.java
@@ -95,12 +95,6 @@
   }
 
   @Override
-  public DexMethod getOriginalMethodSignature(DexMethod method) {
-    return super.getOriginalMethodSignature(
-        originalMethodSignaturesForBridges.getOrDefault(method, method));
-  }
-
-  @Override
   public MethodLookupResult internalDescribeLookupMethod(
       MethodLookupResult previous, DexMethod context) {
     assert context != null || verifyIsContextFreeForMethod(previous.getReference());
@@ -135,6 +129,12 @@
   }
 
   @Override
+  protected DexMethod internalGetPreviousMethodSignature(DexMethod method) {
+    return super.internalGetPreviousMethodSignature(
+        originalMethodSignaturesForBridges.getOrDefault(method, method));
+  }
+
+  @Override
   protected Type mapInvocationType(DexMethod newMethod, DexMethod originalMethod, Type type) {
     return mapVirtualInterfaceInvocationTypes(appView, newMethod, originalMethod, type);
   }