Refactor AutoCloseable desugaring
Bug: b/369520931
Change-Id: Ieab734c0bc34e8bab5c702887e56de83e7901921
diff --git a/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java b/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java
index 43e9841..0728314 100644
--- a/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java
+++ b/src/main/java/com/android/tools/r8/GlobalSyntheticsGenerator.java
@@ -74,7 +74,6 @@
for (SyntheticKind kind : naming.kinds()) {
assert !kind.isGlobal()
|| !kind.isMayOverridesNonProgramType()
- || kind.equals(naming.AUTOCLOSEABLE_TAG)
|| kind.equals(naming.RECORD_TAG)
|| kind.equals(naming.API_MODEL_STUB)
|| kind.equals(naming.METHOD_HANDLES_LOOKUP)
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeter.java
index e845692..703067b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeter.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter;
import static com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.AutoCloseableRetargeterHelper.createCloseMethod;
+import static com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.AutoCloseableRetargeterHelper.lookupSuperIncludingInterfaces;
import com.android.tools.r8.cf.code.CfInstruction;
import com.android.tools.r8.cf.code.CfInvoke;
@@ -125,12 +126,10 @@
private DesugarDescription computeNewTarget(
DexMethod singleTarget, boolean superInvoke, ProgramMethod context) {
if (superInvoke) {
- DexClassAndMethod dexClassAndMethod =
- appView
- .appInfoForDesugaring()
- .lookupSuperTarget(singleTarget, context, appView, appView.appInfoForDesugaring());
- if (dexClassAndMethod != null && dexClassAndMethod.isLibraryMethod()) {
- DexType holderType = dexClassAndMethod.getHolderType();
+ DexClassAndMethod superMethod =
+ lookupSuperIncludingInterfaces(appView, singleTarget, context.getContextClass());
+ if (superMethod != null && superMethod.isLibraryMethod()) {
+ DexType holderType = superMethod.getHolderType();
if (data.superTargetsToRewrite().contains(holderType)) {
return createWithTarget(
singleTarget,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterHelper.java
index 4b40058..3597e57 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterHelper.java
@@ -7,8 +7,10 @@
import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
import com.android.tools.r8.contexts.CompilationContext.UniqueContext;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.MethodAccessFlags;
@@ -171,7 +173,7 @@
appView
.getSyntheticItems()
.createMethod(
- kinds -> kinds.AUTOCLOSEABLE_DISPATCHER,
+ kinds -> kinds.AUTOCLOSEABLE_FORWARDER,
contextSupplier.get(),
appView,
methodBuilder ->
@@ -197,7 +199,7 @@
appView
.getSyntheticItems()
.createMethod(
- kinds -> kinds.AUTOCLOSEABLE_DISPATCHER,
+ kinds -> kinds.THROW_IAE,
contextSupplier.get(),
appView,
methodBuilder ->
@@ -215,4 +217,18 @@
eventConsumer.acceptAutoCloseableDispatchMethod(method, context);
return method;
}
+
+ static DexClassAndMethod lookupSuperIncludingInterfaces(
+ AppView<?> appView, DexMethod target, DexProgramClass context) {
+ DexClassAndMethod superMethod =
+ appView
+ .appInfoForDesugaring()
+ .lookupSuperTarget(target, context, appView, appView.appInfoForDesugaring());
+ if (superMethod != null) {
+ return superMethod;
+ }
+ return appView
+ .appInfoForDesugaring()
+ .lookupMaximallySpecificMethod(context.getContextClass(), target);
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterPostProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterPostProcessor.java
index df4c60f..b45317b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterPostProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterPostProcessor.java
@@ -3,6 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter;
+import static com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.AutoCloseableRetargeterHelper.lookupSuperIncludingInterfaces;
+
import com.android.tools.r8.contexts.CompilationContext.MainThreadContext;
import com.android.tools.r8.contexts.CompilationContext.ProcessorContext;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
@@ -169,11 +171,7 @@
// In desugared library, emulated interface methods can be overridden by retarget lib members.
AppInfoWithClassHierarchy appInfoForDesugaring = appView.appInfoForDesugaring();
assert clazz.lookupVirtualMethod(target) == null;
- DexClassAndMethod superMethod =
- appInfoForDesugaring.lookupSuperTarget(target, clazz, appView, appInfoForDesugaring);
- if (superMethod == null) {
- superMethod = appInfoForDesugaring.lookupMaximallySpecificMethod(clazz, target);
- }
+ DexClassAndMethod superMethod = lookupSuperIncludingInterfaces(appView, target, clazz);
if (superMethod == null
|| !data.superTargetsToRewrite().contains(superMethod.getHolderType())) {
return null;
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
index 1cf3883..1ef8edc 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
@@ -26,7 +26,6 @@
private KindGenerator generator = new KindGenerator();
// Global synthetics.
- public final SyntheticKind AUTOCLOSEABLE_TAG = generator.forGlobalClass();
public final SyntheticKind RECORD_TAG = generator.forGlobalClass();
public final SyntheticKind API_MODEL_STUB = generator.forGlobalClass();
public final SyntheticKind METHOD_HANDLES_LOOKUP = generator.forGlobalClass();
@@ -69,6 +68,8 @@
// Method synthetics.
public final SyntheticKind AUTOCLOSEABLE_DISPATCHER =
generator.forSingleMethodWithGlobalMerging("AutoCloseableDispatcher");
+ public final SyntheticKind AUTOCLOSEABLE_FORWARDER =
+ generator.forSingleMethodWithGlobalMerging("AutoCloseableForwarder");
public final SyntheticKind TYPE_SWITCH_HELPER =
generator.forSingleMethodWithGlobalMerging("TypeSwitch");
public final SyntheticKind ENUM_UNBOXING_CHECK_NOT_ZERO_METHOD =