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() + ")";
+    }
   }
 }