Introduce a base RetraceElement interface.

Change-Id: I6ebd2d5342a251144d6cf8ab9e7511185b644abe
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceClassResult.java b/src/main/java/com/android/tools/r8/retrace/RetraceClassResult.java
index 09db8bd..ab7d854 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceClassResult.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceClassResult.java
@@ -31,12 +31,10 @@
       String methodName, int position, List<TypeReference> formalTypes, TypeReference returnType);
 
   @Keep
-  interface Element {
+  interface Element extends RetraceElement<RetraceClassResult> {
 
     RetracedClass getRetracedClass();
 
-    RetraceClassResult getRetraceClassResult();
-
     RetraceSourceFileResult retraceSourceFile(String sourceFile);
 
     RetraceFieldResult lookupField(String fieldName);
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceElement.java b/src/main/java/com/android/tools/r8/retrace/RetraceElement.java
new file mode 100644
index 0000000..6070723
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceElement.java
@@ -0,0 +1,14 @@
+// Copyright (c) 2021, 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.retrace;
+
+/**
+ * Base interface for any element in a retrace result.
+ *
+ * <p>The element represents an unambiguous retracing.
+ */
+public interface RetraceElement<R extends RetraceResult<?>> {
+
+  R getRetraceResultContext();
+}
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceFieldResult.java b/src/main/java/com/android/tools/r8/retrace/RetraceFieldResult.java
index ef52314..f0f2a3d 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceFieldResult.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceFieldResult.java
@@ -11,14 +11,12 @@
 public interface RetraceFieldResult extends RetraceResult<Element> {
 
   @Keep
-  interface Element {
+  interface Element extends RetraceElement<RetraceFieldResult> {
 
     boolean isUnknown();
 
     RetracedField getField();
 
-    RetraceFieldResult getRetraceFieldResult();
-
     RetraceClassResult.Element getClassElement();
 
     RetraceSourceFileResult retraceSourceFile(String sourceFile);
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceFrameResult.java b/src/main/java/com/android/tools/r8/retrace/RetraceFrameResult.java
index f390396..f70f3d2 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceFrameResult.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceFrameResult.java
@@ -13,7 +13,7 @@
 public interface RetraceFrameResult extends RetraceResult<Element> {
 
   @Keep
-  interface Element {
+  interface Element extends RetraceElement<RetraceFrameResult> {
 
     boolean isUnknown();
 
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceMethodResult.java b/src/main/java/com/android/tools/r8/retrace/RetraceMethodResult.java
index 0a4bb50..f565326 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceMethodResult.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceMethodResult.java
@@ -13,14 +13,12 @@
   RetraceFrameResult narrowByPosition(int position);
 
   @Keep
-  interface Element {
+  interface Element extends RetraceElement<RetraceMethodResult> {
 
     boolean isUnknown();
 
     RetracedMethod getRetracedMethod();
 
-    RetraceMethodResult getRetraceMethodResult();
-
     RetraceClassResult.Element getClassElement();
 
     RetraceSourceFileResult retraceSourceFile(String sourceFile);
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceResult.java b/src/main/java/com/android/tools/r8/retrace/RetraceResult.java
index 0fe37a6..1bc6ed6 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceResult.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceResult.java
@@ -17,7 +17,7 @@
  * the result.
  */
 @Keep
-public interface RetraceResult<E> {
+public interface RetraceResult<E extends RetraceElement<?>> {
 
   /** Basic operation over 'elements' which represent a possible non-ambiguous retracing. */
   Stream<E> stream();
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java
index 5028d84..212e8a8 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java
@@ -214,7 +214,7 @@
     }
 
     @Override
-    public RetraceClassResultImpl getRetraceClassResult() {
+    public RetraceClassResultImpl getRetraceResultContext() {
       return classResult;
     }
 
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java
index 4a82482..c3fe597 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java
@@ -115,7 +115,7 @@
     }
 
     @Override
-    public RetraceFieldResultImpl getRetraceFieldResult() {
+    public RetraceFieldResult getRetraceResultContext() {
       return retraceFieldResult;
     }
 
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java
index 47635c7..c4a54b0 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java
@@ -151,6 +151,11 @@
     }
 
     @Override
+    public RetraceFrameResult getRetraceResultContext() {
+      return retraceFrameResult;
+    }
+
+    @Override
     public boolean isUnknown() {
       return methodReference.isUnknown();
     }
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java
index 7922955..251518d 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java
@@ -147,7 +147,7 @@
     }
 
     @Override
-    public RetraceMethodResultImpl getRetraceMethodResult() {
+    public RetraceMethodResult getRetraceResultContext() {
       return retraceMethodResult;
     }