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;
+ }
+ }
+}