Rewrite NestBasedAccessDesugaring to use DesugaringDescription
Fixes: b/270144056
Change-Id: Ib9f7701bd8f9636281c76cfe4cf74c9dffeed337
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
index c9c2c54..27d7c36 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
@@ -11,7 +11,6 @@
import com.android.tools.r8.cf.code.CfInstruction;
import com.android.tools.r8.cf.code.CfInvoke;
import com.android.tools.r8.cf.code.CfInvokeDynamic;
-import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.Code;
@@ -31,9 +30,8 @@
import com.android.tools.r8.graph.ProgramField;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.desugar.CfInstructionDesugaring;
-import com.android.tools.r8.ir.desugar.CfInstructionDesugaringCollection;
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
-import com.android.tools.r8.ir.desugar.FreshLocalProvider;
+import com.android.tools.r8.ir.desugar.DesugarDescription;
import com.android.tools.r8.ir.desugar.LambdaDescriptor;
import com.android.tools.r8.ir.desugar.LocalStackAllocator;
import com.android.tools.r8.ir.desugar.ProgramAdditions;
@@ -41,7 +39,6 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
-import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -296,17 +293,6 @@
code.asCfCode().getInstructions(), instruction -> needsDesugaring(instruction, method));
}
- @Override
- public boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
- if (instruction.isFieldInstruction()) {
- return needsDesugaring(instruction.asFieldInstruction().getField(), context);
- }
- if (instruction.isInvoke()) {
- return needsDesugaring(instruction.asInvoke().getMethod(), context);
- }
- return false;
- }
-
public boolean needsDesugaring(DexMember<?, ?> memberReference, ProgramMethod context) {
if (!context.getHolder().isInANest() || !memberReference.getHolderType().isClassType()) {
return false;
@@ -324,22 +310,42 @@
}
@Override
- public Collection<CfInstruction> desugarInstruction(
- CfInstruction instruction,
- FreshLocalProvider freshLocalProvider,
- LocalStackAllocator localStackAllocator,
- CfInstructionDesugaringEventConsumer eventConsumer,
- ProgramMethod context,
- MethodProcessingContext methodProcessingContext,
- CfInstructionDesugaringCollection desugaringCollection,
- DexItemFactory dexItemFactory) {
+ public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
if (instruction.isFieldInstruction()) {
- return desugarFieldInstruction(instruction.asFieldInstruction(), context);
+ if (needsDesugaring(instruction.asFieldInstruction().getField(), context)) {
+ return DesugarDescription.builder()
+ .setDesugarRewrite(
+ (freshLocalProvider,
+ localStackAllocator,
+ eventConsumer,
+ ignore, // context
+ methodProcessingContext,
+ desugaringCollection,
+ dexItemFactory) ->
+ desugarFieldInstruction(instruction.asFieldInstruction(), context))
+ .build();
+ } else {
+ return DesugarDescription.nothing();
+ }
}
if (instruction.isInvoke()) {
- return desugarInvokeInstruction(instruction.asInvoke(), localStackAllocator, context);
+ if (needsDesugaring(instruction.asInvoke().getMethod(), context)) {
+ return DesugarDescription.builder()
+ .setDesugarRewrite(
+ (freshLocalProvider,
+ localStackAllocator,
+ eventConsumer,
+ ignore, // context
+ methodProcessingContext,
+ desugaringCollection,
+ dexItemFactory) ->
+ desugarInvokeInstruction(instruction.asInvoke(), localStackAllocator, context))
+ .build();
+ } else {
+ return DesugarDescription.nothing();
+ }
}
- return null;
+ return DesugarDescription.nothing();
}
private List<CfInstruction> desugarFieldInstruction(