Better facilitate debugging of classes not eligible for repackaging
Change-Id: I924449dcb7f86a78ddc178d1f4bf27eff5e28df9
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramPackage.java b/src/main/java/com/android/tools/r8/graph/ProgramPackage.java
index 81627e9..272f1e9 100644
--- a/src/main/java/com/android/tools/r8/graph/ProgramPackage.java
+++ b/src/main/java/com/android/tools/r8/graph/ProgramPackage.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.graph;
+import com.android.tools.r8.utils.DescriptorUtils;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import java.util.Iterator;
@@ -47,6 +48,10 @@
return packageDescriptor;
}
+ public String getPackageName() {
+ return DescriptorUtils.getJavaTypeFromBinaryName(packageDescriptor);
+ }
+
public void forEachClass(Consumer<DexProgramClass> consumer) {
forEach(consumer);
}
@@ -67,4 +72,9 @@
public Iterator<DexProgramClass> iterator() {
return classes.iterator();
}
+
+ @Override
+ public String toString() {
+ return "ProgramPackage(" + getPackageName() + ")";
+ }
}
diff --git a/src/main/java/com/android/tools/r8/repackaging/RepackagingConstraintGraph.java b/src/main/java/com/android/tools/r8/repackaging/RepackagingConstraintGraph.java
index 191dc0a..ca181fd 100644
--- a/src/main/java/com/android/tools/r8/repackaging/RepackagingConstraintGraph.java
+++ b/src/main/java/com/android/tools/r8/repackaging/RepackagingConstraintGraph.java
@@ -72,7 +72,7 @@
}
private Node createNode(DexDefinition definition) {
- Node node = new Node();
+ Node node = new Node(definition);
nodes.put(definition, node);
return node;
}
@@ -172,7 +172,12 @@
public Iterable<DexProgramClass> computeClassesToRepackage() {
WorkList<Node> worklist = WorkList.newIdentityWorkList(pinnedNodes);
while (worklist.hasNext()) {
- worklist.addIfNotSeen(worklist.next().getNeighbors());
+ Node pinnedNode = worklist.next();
+ for (Node neighbor : pinnedNode.getNeighbors()) {
+ // Mark all the immediate neighbors as ineligible for repackaging and continue the tracing
+ // from the neighbors.
+ worklist.addIfNotSeen(neighbor);
+ }
}
Set<Node> pinnedNodes = worklist.getSeenSet();
List<DexProgramClass> classesToRepackage = new ArrayList<>();
@@ -186,8 +191,13 @@
static class Node {
+ private final DexDefinition definitionForDebugging;
private final Set<Node> neighbors = Sets.newConcurrentHashSet();
+ Node(DexDefinition definitionForDebugging) {
+ this.definitionForDebugging = definitionForDebugging;
+ }
+
public void addNeighbor(Node neighbor) {
neighbors.add(neighbor);
neighbor.neighbors.add(this);
@@ -196,5 +206,10 @@
public Set<Node> getNeighbors() {
return neighbors;
}
+
+ @Override
+ public String toString() {
+ return "Node(" + definitionForDebugging.getReference().toSourceString() + ")";
+ }
}
}