Add finished callback to the desugar graph consumer.
Bug: 138988172
Change-Id: Id040dfcc044b23f8821e4f64eccb05c816253d08
diff --git a/src/main/java/com/android/tools/r8/DesugarGraphConsumer.java b/src/main/java/com/android/tools/r8/DesugarGraphConsumer.java
index d75b2b0..2210490 100644
--- a/src/main/java/com/android/tools/r8/DesugarGraphConsumer.java
+++ b/src/main/java/com/android/tools/r8/DesugarGraphConsumer.java
@@ -21,4 +21,11 @@
* @param dependency Origin of code that is a dependency to compile {@code dependent}.
*/
void accept(Origin dependent, Origin dependency);
+
+ /**
+ * Callback indicating no more dependency edges for the active compilation unit.
+ *
+ * <p>Note: this callback places no other guarantees on number of calls or on which threads.
+ */
+ void finished();
}
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 9b47305..cf2844f 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -366,6 +366,9 @@
}
}
}
+ if (desugarGraphConsumer != null) {
+ desugarGraphConsumer.finished();
+ }
}
public boolean shouldDesugarNests() {
diff --git a/src/test/java/com/android/tools/r8/desugar/graph/DesugarGraphTestConsumer.java b/src/test/java/com/android/tools/r8/desugar/graph/DesugarGraphTestConsumer.java
index 2111b7d..186b01b 100644
--- a/src/test/java/com/android/tools/r8/desugar/graph/DesugarGraphTestConsumer.java
+++ b/src/test/java/com/android/tools/r8/desugar/graph/DesugarGraphTestConsumer.java
@@ -3,6 +3,9 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.desugar.graph;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
import com.android.tools.r8.DesugarGraphConsumer;
import com.android.tools.r8.origin.Origin;
import java.util.Collections;
@@ -13,13 +16,16 @@
public class DesugarGraphTestConsumer implements DesugarGraphConsumer {
+ private boolean finished = false;
private Map<Origin, Set<Origin>> edges = new HashMap<>();
public boolean contains(Origin dependency, Origin dependent) {
+ assertTrue(finished);
return edges.getOrDefault(dependency, Collections.emptySet()).contains(dependent);
}
public int totalEdgeCount() {
+ assertTrue(finished);
int count = 0;
for (Set<Origin> dependents : edges.values()) {
count += dependents.size();
@@ -29,6 +35,13 @@
@Override
public synchronized void accept(Origin dependent, Origin dependency) {
+ assertFalse(finished);
edges.computeIfAbsent(dependency, s -> new HashSet<>()).add(dependent);
}
+
+ @Override
+ public void finished() {
+ assertFalse(finished);
+ finished = true;
+ }
}