Add retrace of type references to support %t and %a wildcards

Bug: 145356709
Change-Id: Ie12dbb5bed1bccfac9a755d9d880f8a5b0a7d9f8
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceBase.java b/src/main/java/com/android/tools/r8/retrace/RetraceBase.java
index c5284ea..2874fc8 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceBase.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceBase.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.FieldReference;
 import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.references.TypeReference;
 
 public interface RetraceBase {
 
@@ -16,6 +17,8 @@
 
   RetraceClassResult retrace(ClassReference classReference);
 
+  RetraceTypeResult retrace(TypeReference typeReference);
+
   String retraceSourceFile(ClassReference classReference, String sourceFile);
 
   String retraceSourceFile(
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceBaseImpl.java b/src/main/java/com/android/tools/r8/retrace/RetraceBaseImpl.java
index ff196c1..c60cd91 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceBaseImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceBaseImpl.java
@@ -8,6 +8,7 @@
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.FieldReference;
 import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.references.TypeReference;
 import com.android.tools.r8.utils.Box;
 import com.google.common.collect.Sets;
 import com.google.common.io.Files;
@@ -49,6 +50,11 @@
   }
 
   @Override
+  public RetraceTypeResult retrace(TypeReference typeReference) {
+    return new RetraceTypeResult(typeReference, this);
+  }
+
+  @Override
   public String retraceSourceFile(
       ClassReference obfuscatedClass,
       String sourceFile,
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceTypeResult.java b/src/main/java/com/android/tools/r8/retrace/RetraceTypeResult.java
new file mode 100644
index 0000000..b04d9a8
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceTypeResult.java
@@ -0,0 +1,55 @@
+// Copyright (c) 2019, 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;
+
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.references.TypeReference;
+import com.android.tools.r8.retrace.RetraceTypeResult.Element;
+import java.util.function.Consumer;
+import java.util.stream.Stream;
+
+public class RetraceTypeResult extends Result<Element, RetraceTypeResult> {
+
+  private final TypeReference obfuscatedType;
+  private final RetraceBase retraceBase;
+
+  RetraceTypeResult(TypeReference obfuscatedType, RetraceBase retraceBase) {
+    this.obfuscatedType = obfuscatedType;
+    this.retraceBase = retraceBase;
+  }
+
+  public Stream<Element> stream() {
+    // Handle void and primitive types as single element results.
+    if (obfuscatedType == null || obfuscatedType.isPrimitive()) {
+      return Stream.of(new Element(obfuscatedType));
+    }
+    if (obfuscatedType.isArray()) {
+      int dimensions = obfuscatedType.asArray().getDimensions();
+      return retraceBase.retrace(obfuscatedType.asArray().getBaseType()).stream()
+          .map(base -> new Element(Reference.array(base.getTypeReference(), dimensions)));
+    }
+    return retraceBase.retrace(obfuscatedType.asClass()).stream()
+        .map(clazz -> new Element(clazz.getClassReference()));
+  }
+
+  @Override
+  public RetraceTypeResult forEach(Consumer<Element> resultConsumer) {
+    stream().forEach(resultConsumer);
+    return this;
+  }
+
+  public static class Element {
+
+    private final TypeReference typeReference;
+
+    public Element(TypeReference typeReference) {
+      this.typeReference = typeReference;
+    }
+
+    public TypeReference getTypeReference() {
+      return typeReference;
+    }
+  }
+}