Make eventConsumer types explicit
Bug: 191656218
Change-Id: Ife7d03292d765c36c371fc3aec308029886ee001
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeter.java
index 94d1ce7..8a59f14 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeter.java
@@ -28,6 +28,7 @@
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.FreshLocalProvider;
import com.android.tools.r8.ir.desugar.LocalStackAllocator;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryRetargeterSynthesizerEventConsumer.DesugaredLibraryRetargeterInstructionEventConsumer;
import com.android.tools.r8.utils.collections.DexClassAndMethodSet;
import java.util.Collection;
import java.util.Collections;
@@ -124,7 +125,7 @@
new InvokeRetargetingResult(false, ignored -> null);
private final boolean hasNewInvokeTarget;
- private final Function<DesugaredLibraryRetargeterSynthesizerEventConsumer, DexMethod>
+ private final Function<DesugaredLibraryRetargeterInstructionEventConsumer, DexMethod>
newInvokeTargetSupplier;
static InvokeRetargetingResult createInvokeRetargetingResult(DexMethod retarget) {
@@ -136,7 +137,7 @@
private InvokeRetargetingResult(
boolean hasNewInvokeTarget,
- Function<DesugaredLibraryRetargeterSynthesizerEventConsumer, DexMethod>
+ Function<DesugaredLibraryRetargeterInstructionEventConsumer, DexMethod>
newInvokeTargetSupplier) {
this.hasNewInvokeTarget = hasNewInvokeTarget;
this.newInvokeTargetSupplier = newInvokeTargetSupplier;
@@ -147,7 +148,7 @@
}
public DexMethod getNewInvokeTarget(
- DesugaredLibraryRetargeterSynthesizerEventConsumer eventConsumer) {
+ DesugaredLibraryRetargeterInstructionEventConsumer eventConsumer) {
assert hasNewInvokeTarget();
return newInvokeTargetSupplier.apply(eventConsumer);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterL8Synthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterL8Synthesizer.java
index 4d43106..13a0a6d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterL8Synthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterL8Synthesizer.java
@@ -45,7 +45,7 @@
futures.add(
executorService.submit(
() -> {
- syntheticHelper.ensureEmulatedHolderDispatchMethod(
+ syntheticHelper.ensureProgramEmulatedHolderDispatchMethod(
emulatedDispatchMethod, eventConsumer);
return null;
}));
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSynthesizerEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSynthesizerEventConsumer.java
index 81b65dc..fab6f10 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSynthesizerEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSynthesizerEventConsumer.java
@@ -11,41 +11,16 @@
public interface DesugaredLibraryRetargeterSynthesizerEventConsumer {
- default DesugaredLibraryRetargeterL8SynthesizerEventConsumer asProgramSynthesizer() {
- assert false;
- return null;
- }
-
- default DesugaredLibraryRetargeterInstructionEventConsumer asClasspathSynthesizer() {
- assert false;
- return null;
- }
-
- interface DesugaredLibraryRetargeterL8SynthesizerEventConsumer
- extends DesugaredLibraryRetargeterSynthesizerEventConsumer {
-
- @Override
- default DesugaredLibraryRetargeterL8SynthesizerEventConsumer asProgramSynthesizer() {
- return this;
- }
-
+ interface DesugaredLibraryRetargeterL8SynthesizerEventConsumer {
void acceptDesugaredLibraryRetargeterDispatchProgramClass(DexProgramClass clazz);
}
- interface DesugaredLibraryRetargeterInstructionEventConsumer
- extends DesugaredLibraryRetargeterSynthesizerEventConsumer {
-
- @Override
- default DesugaredLibraryRetargeterInstructionEventConsumer asClasspathSynthesizer() {
- return this;
- }
-
+ interface DesugaredLibraryRetargeterInstructionEventConsumer {
void acceptDesugaredLibraryRetargeterDispatchClasspathClass(DexClasspathClass clazz);
}
interface DesugaredLibraryRetargeterPostProcessingEventConsumer
extends DesugaredLibraryRetargeterInstructionEventConsumer {
-
void acceptInterfaceInjection(DexProgramClass clazz, DexClass newInterface);
void acceptForwardingMethod(ProgramMethod method);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSyntheticHelper.java
index 35ddc35..9569c61 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSyntheticHelper.java
@@ -29,94 +29,100 @@
public DexClass ensureEmulatedHolderDispatchMethod(
DexClassAndMethod emulatedDispatchMethod,
- DesugaredLibraryRetargeterSynthesizerEventConsumer eventConsumer) {
+ DesugaredLibraryRetargeterInstructionEventConsumer eventConsumer) {
assert eventConsumer != null;
+ if (appView.options().isDesugaredLibraryCompilation()) {
+ return appView
+ .getSyntheticItems()
+ .getExistingFixedClass(
+ SyntheticKind.RETARGET_CLASS, emulatedDispatchMethod.getHolder(), appView);
+ }
DexClass interfaceClass =
ensureEmulatedInterfaceDispatchMethod(emulatedDispatchMethod, eventConsumer);
DexMethod itfMethod =
interfaceClass.lookupMethod(emulatedDispatchMethod.getReference()).getReference();
- DexClass holderDispatch;
- if (appView.options().isDesugaredLibraryCompilation()) {
- holderDispatch =
- appView
- .getSyntheticItems()
- .ensureFixedClass(
- SyntheticKind.RETARGET_CLASS,
- emulatedDispatchMethod.getHolder(),
- appView,
- classBuilder ->
- buildHolderDispatchMethod(classBuilder, emulatedDispatchMethod, itfMethod),
- clazz -> {
- DesugaredLibraryRetargeterL8SynthesizerEventConsumer programEventConsumer =
- eventConsumer.asProgramSynthesizer();
- assert programEventConsumer != null;
- programEventConsumer.acceptDesugaredLibraryRetargeterDispatchProgramClass(
- clazz);
- });
- } else {
- ClasspathOrLibraryClass context =
- emulatedDispatchMethod.getHolder().asClasspathOrLibraryClass();
- DesugaredLibraryRetargeterInstructionEventConsumer classpathEventConsumer =
- eventConsumer.asClasspathSynthesizer();
- assert classpathEventConsumer != null;
- assert context != null;
- holderDispatch =
- appView
- .getSyntheticItems()
- .ensureFixedClasspathClass(
- SyntheticKind.RETARGET_CLASS,
- context,
- appView,
- classBuilder ->
- buildHolderDispatchMethod(classBuilder, emulatedDispatchMethod, itfMethod),
- classpathEventConsumer::acceptDesugaredLibraryRetargeterDispatchClasspathClass);
- }
- rewriteType(holderDispatch.type);
- return holderDispatch;
+ ClasspathOrLibraryClass context =
+ emulatedDispatchMethod.getHolder().asClasspathOrLibraryClass();
+ assert context != null;
+ return appView
+ .getSyntheticItems()
+ .ensureFixedClasspathClass(
+ SyntheticKind.RETARGET_CLASS,
+ context,
+ appView,
+ classBuilder ->
+ buildHolderDispatchMethod(classBuilder, emulatedDispatchMethod, itfMethod),
+ clazz -> {
+ eventConsumer.acceptDesugaredLibraryRetargeterDispatchClasspathClass(clazz);
+ rewriteType(clazz.type);
+ });
+ }
+
+ public void ensureProgramEmulatedHolderDispatchMethod(
+ DexClassAndMethod emulatedDispatchMethod,
+ DesugaredLibraryRetargeterL8SynthesizerEventConsumer eventConsumer) {
+ assert eventConsumer != null;
+ assert appView.options().isDesugaredLibraryCompilation();
+ DexClass interfaceClass =
+ ensureEmulatedInterfaceDispatchMethod(emulatedDispatchMethod, eventConsumer);
+ DexMethod itfMethod =
+ interfaceClass.lookupMethod(emulatedDispatchMethod.getReference()).getReference();
+ appView
+ .getSyntheticItems()
+ .ensureFixedClass(
+ SyntheticKind.RETARGET_CLASS,
+ emulatedDispatchMethod.getHolder(),
+ appView,
+ classBuilder ->
+ buildHolderDispatchMethod(classBuilder, emulatedDispatchMethod, itfMethod),
+ clazz -> {
+ eventConsumer.acceptDesugaredLibraryRetargeterDispatchProgramClass(clazz);
+ rewriteType(clazz.type);
+ });
}
public DexClass ensureEmulatedInterfaceDispatchMethod(
DexClassAndMethod emulatedDispatchMethod,
- DesugaredLibraryRetargeterSynthesizerEventConsumer eventConsumer) {
+ DesugaredLibraryRetargeterInstructionEventConsumer eventConsumer) {
assert eventConsumer != null;
- DexClass interfaceDispatch;
if (appView.options().isDesugaredLibraryCompilation()) {
- interfaceDispatch =
- appView
- .getSyntheticItems()
- .ensureFixedClass(
- SyntheticKind.RETARGET_INTERFACE,
- emulatedDispatchMethod.getHolder(),
- appView,
- classBuilder ->
- buildInterfaceDispatchMethod(classBuilder, emulatedDispatchMethod),
- clazz -> {
- DesugaredLibraryRetargeterL8SynthesizerEventConsumer programEventConsumer =
- eventConsumer.asProgramSynthesizer();
- assert programEventConsumer != null;
- programEventConsumer.acceptDesugaredLibraryRetargeterDispatchProgramClass(
- clazz);
- });
- } else {
- DesugaredLibraryRetargeterInstructionEventConsumer classpathEventConsumer =
- eventConsumer.asClasspathSynthesizer();
- assert classpathEventConsumer != null;
- ClasspathOrLibraryClass context =
- emulatedDispatchMethod.getHolder().asClasspathOrLibraryClass();
- assert context != null;
- interfaceDispatch =
- appView
- .getSyntheticItems()
- .ensureFixedClasspathClass(
- SyntheticKind.RETARGET_INTERFACE,
- context,
- appView,
- classBuilder ->
- buildInterfaceDispatchMethod(classBuilder, emulatedDispatchMethod),
- classpathEventConsumer::acceptDesugaredLibraryRetargeterDispatchClasspathClass);
+ return appView
+ .getSyntheticItems()
+ .getExistingFixedClass(
+ SyntheticKind.RETARGET_INTERFACE, emulatedDispatchMethod.getHolder(), appView);
}
- rewriteType(interfaceDispatch.type);
- return interfaceDispatch;
+ ClasspathOrLibraryClass context =
+ emulatedDispatchMethod.getHolder().asClasspathOrLibraryClass();
+ assert context != null;
+ return appView
+ .getSyntheticItems()
+ .ensureFixedClasspathClass(
+ SyntheticKind.RETARGET_INTERFACE,
+ context,
+ appView,
+ classBuilder -> buildInterfaceDispatchMethod(classBuilder, emulatedDispatchMethod),
+ clazz -> {
+ eventConsumer.acceptDesugaredLibraryRetargeterDispatchClasspathClass(clazz);
+ rewriteType(clazz.type);
+ });
+ }
+
+ public DexClass ensureEmulatedInterfaceDispatchMethod(
+ DexClassAndMethod emulatedDispatchMethod,
+ DesugaredLibraryRetargeterL8SynthesizerEventConsumer eventConsumer) {
+ assert appView.options().isDesugaredLibraryCompilation();
+ assert eventConsumer != null;
+ return appView
+ .getSyntheticItems()
+ .ensureFixedClass(
+ SyntheticKind.RETARGET_INTERFACE,
+ emulatedDispatchMethod.getHolder(),
+ appView,
+ classBuilder -> buildInterfaceDispatchMethod(classBuilder, emulatedDispatchMethod),
+ clazz -> {
+ eventConsumer.acceptDesugaredLibraryRetargeterDispatchProgramClass(clazz);
+ rewriteType(clazz.type);
+ });
}
private void buildInterfaceDispatchMethod(
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
index 40b70e4..a86e143 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -508,16 +508,31 @@
DexProgramClass context,
AppView<?> appView,
Consumer<SyntheticProgramClassBuilder> fn) {
- // Obtain the outer synthesizing context in the case the context itself is synthetic.
- // This is to ensure a flat input-type -> synthetic-item mapping.
- SynthesizingContext outerContext =
- context.isProgramClass()
- ? getSynthesizingContext(context.asProgramClass(), appView)
- : SynthesizingContext.fromNonSyntheticInputContext(context.asClasspathOrLibraryClass());
+ SynthesizingContext outerContext = internalGetOuterContext(context, appView);
DexType type = SyntheticNaming.createFixedType(kind, outerContext, appView.dexItemFactory());
return internalCreateClass(kind, fn, outerContext, type, appView.dexItemFactory());
}
+ public DexProgramClass getExistingFixedClass(
+ SyntheticKind kind, DexClass context, AppView<?> appView) {
+ assert kind.isFixedSuffixSynthetic;
+ SynthesizingContext outerContext = internalGetOuterContext(context, appView);
+ DexType type = SyntheticNaming.createFixedType(kind, outerContext, appView.dexItemFactory());
+ DexClass clazz = appView.definitionFor(type);
+ assert clazz != null;
+ assert isSyntheticClass(type);
+ assert clazz.isProgramClass();
+ return clazz.asProgramClass();
+ }
+
+ // Obtain the outer synthesizing context in the case the context itself is synthetic.
+ // This is to ensure a flat input-type -> synthetic-item mapping.
+ private SynthesizingContext internalGetOuterContext(DexClass context, AppView<?> appView) {
+ return context.isProgramClass()
+ ? getSynthesizingContext(context.asProgramClass(), appView)
+ : SynthesizingContext.fromNonSyntheticInputContext(context.asClasspathOrLibraryClass());
+ }
+
/**
* Ensure that a fixed synthetic class exists.
*
@@ -530,12 +545,7 @@
Consumer<SyntheticProgramClassBuilder> fn,
Consumer<DexProgramClass> onCreationConsumer) {
assert kind.isFixedSuffixSynthetic;
- // Obtain the outer synthesizing context in the case the context itself is synthetic.
- // This is to ensure a flat input-type -> synthetic-item mapping.
- SynthesizingContext outerContext =
- context.isProgramClass()
- ? getSynthesizingContext(context.asProgramClass(), appView)
- : SynthesizingContext.fromNonSyntheticInputContext(context.asClasspathOrLibraryClass());
+ SynthesizingContext outerContext = internalGetOuterContext(context, appView);
DexType type = SyntheticNaming.createFixedType(kind, outerContext, appView.dexItemFactory());
// Fast path is that the synthetic is already present. If so it must be a program class.
DexClass clazz = appView.definitionFor(type);