Use that no lambda classes are synthesized during wave processing in R8
Bug: 142233246
Change-Id: Ifb605376adab2c5018c0d32b5ee6011ec6828a36
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
index 9cc26c4..dfb1787 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
@@ -156,8 +156,12 @@
continue;
}
- // We have a descriptor, get or create lambda class.
- LambdaClass lambdaClass = getOrCreateLambdaClass(descriptor, currentType);
+ // We have a descriptor, get the lambda class. In D8, we synthesize the lambda classes
+ // during IR processing, and therefore we may need to create it now.
+ LambdaClass lambdaClass =
+ appView.enableWholeProgramOptimizations()
+ ? getKnownLambdaClass(descriptor, currentType)
+ : getOrCreateLambdaClass(descriptor, currentType);
assert lambdaClass != null;
// We rely on patch performing its work in a way which
@@ -325,6 +329,11 @@
return lambdaClass;
}
+ private LambdaClass getKnownLambdaClass(LambdaDescriptor descriptor, DexType accessedFrom) {
+ DexType lambdaClassType = LambdaClass.createLambdaClassType(this, accessedFrom, descriptor);
+ return getKnown(knownLambdaClasses, lambdaClassType);
+ }
+
private void addRewritingPrefix(DexType type, DexType rewritten, DexType lambdaClassType) {
String javaName = lambdaClassType.toString();
String typeString = type.toString();