Revert "Desugar super calls in default methods targeting library"
This reverts commit 8c87f00e04bf7ab69eae417b3b7923226030cb9a.
Reason for revert: Test failures on InterfaceMethodDesugaringTests. testInvokeDefault1 with VM not supporting defualt interface methods.
Change-Id: Ie622e85fd9049dd6855407e2392dc8520ed7b9e2
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java
index b288d9a..a6384e1 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java
@@ -24,7 +24,6 @@
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringCollection;
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.DesugarDescription;
-import com.android.tools.r8.ir.desugar.DesugarDescription.ScanCallback;
import com.android.tools.r8.ir.desugar.FreshLocalProvider;
import com.android.tools.r8.ir.desugar.LocalStackAllocator;
import com.android.tools.r8.ir.optimize.UtilityMethodsForCodeOptimizations;
@@ -106,46 +105,46 @@
getThrowInstructions(
appView,
invoke,
+ resolutionResult,
localStackAllocator,
eventConsumer,
context,
- methodProcessingContext,
- getMethodSynthesizerForThrowing(appView, invoke, resolutionResult, context)))
+ methodProcessingContext))
.build();
}
- public static DesugarDescription computeInvokeAsThrowNSMERewrite(
- AppView<?> appView, CfInvoke invoke, ScanCallback scanCallback) {
- DesugarDescription.Builder builder =
- DesugarDescription.builder()
- .setDesugarRewrite(
- (freshLocalProvider,
- localStackAllocator,
- eventConsumer,
- context,
- methodProcessingContext,
- dexItemFactory) ->
- getThrowInstructions(
- appView,
- invoke,
- localStackAllocator,
- eventConsumer,
- context,
- methodProcessingContext,
- UtilityMethodsForCodeOptimizations
- ::synthesizeThrowNoSuchMethodErrorMethod));
- builder.addScanEffect(scanCallback);
- return builder.build();
- }
-
private static Collection<CfInstruction> getThrowInstructions(
AppView<?> appView,
CfInvoke invoke,
+ MethodResolutionResult resolutionResult,
LocalStackAllocator localStackAllocator,
CfInstructionDesugaringEventConsumer eventConsumer,
ProgramMethod context,
- MethodProcessingContext methodProcessingContext,
- MethodSynthesizerConsumer methodSynthesizerConsumer) {
+ MethodProcessingContext methodProcessingContext) {
+ MethodSynthesizerConsumer methodSynthesizerConsumer = null;
+ if (resolutionResult == null) {
+ methodSynthesizerConsumer =
+ UtilityMethodsForCodeOptimizations::synthesizeThrowNoSuchMethodErrorMethod;
+ } else if (resolutionResult.isSingleResolution()) {
+ if (resolutionResult.getResolvedMethod().isStatic() != invoke.isInvokeStatic()) {
+ methodSynthesizerConsumer =
+ UtilityMethodsForCodeOptimizations::synthesizeThrowIncompatibleClassChangeErrorMethod;
+ }
+ } else if (resolutionResult.isFailedResolution()) {
+ FailedResolutionResult failedResolutionResult = resolutionResult.asFailedResolution();
+ AppInfoWithClassHierarchy appInfo = appView.appInfoForDesugaring();
+ if (failedResolutionResult.isIllegalAccessErrorResult(context.getHolder(), appInfo)) {
+ methodSynthesizerConsumer =
+ UtilityMethodsForCodeOptimizations::synthesizeThrowIllegalAccessErrorMethod;
+ } else if (failedResolutionResult.isNoSuchMethodErrorResult(context.getHolder(), appInfo)) {
+ methodSynthesizerConsumer =
+ UtilityMethodsForCodeOptimizations::synthesizeThrowNoSuchMethodErrorMethod;
+ } else if (failedResolutionResult.isIncompatibleClassChangeErrorResult()) {
+ methodSynthesizerConsumer =
+ UtilityMethodsForCodeOptimizations::synthesizeThrowIncompatibleClassChangeErrorMethod;
+ }
+ }
+
if (methodSynthesizerConsumer == null) {
assert false;
return null;
@@ -199,32 +198,4 @@
}
return replacement;
}
-
- private static MethodSynthesizerConsumer getMethodSynthesizerForThrowing(
- AppView<?> appView,
- CfInvoke invoke,
- MethodResolutionResult resolutionResult,
- ProgramMethod context) {
- if (resolutionResult == null) {
- return UtilityMethodsForCodeOptimizations::synthesizeThrowNoSuchMethodErrorMethod;
- } else if (resolutionResult.isSingleResolution()) {
- if (resolutionResult.getResolvedMethod().isStatic() != invoke.isInvokeStatic()) {
- return UtilityMethodsForCodeOptimizations
- ::synthesizeThrowIncompatibleClassChangeErrorMethod;
- }
- } else if (resolutionResult.isFailedResolution()) {
- FailedResolutionResult failedResolutionResult = resolutionResult.asFailedResolution();
- AppInfoWithClassHierarchy appInfo = appView.appInfoForDesugaring();
- if (failedResolutionResult.isIllegalAccessErrorResult(context.getHolder(), appInfo)) {
- return UtilityMethodsForCodeOptimizations::synthesizeThrowIllegalAccessErrorMethod;
- } else if (failedResolutionResult.isNoSuchMethodErrorResult(context.getHolder(), appInfo)) {
- return UtilityMethodsForCodeOptimizations::synthesizeThrowNoSuchMethodErrorMethod;
- } else if (failedResolutionResult.isIncompatibleClassChangeErrorResult()) {
- return UtilityMethodsForCodeOptimizations
- ::synthesizeThrowIncompatibleClassChangeErrorMethod;
- }
- }
-
- return null;
- }
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
index 8e8541b..bc8ebd0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
@@ -44,7 +44,6 @@
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.MethodPosition;
import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.StringDiagnostic;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
import com.android.tools.r8.utils.structural.Ordered;
import com.google.common.collect.Iterables;
@@ -712,23 +711,7 @@
}
}
- DesugarDescription emulatedInterfaceDesugaring =
- computeEmulatedInterfaceInvokeSpecial(clazz, invokedMethod, context);
- if (!emulatedInterfaceDesugaring.needsDesugaring() && context.isDefaultMethod()) {
- return AlwaysThrowingInstructionDesugaring.computeInvokeAsThrowNSMERewrite(
- appView,
- invoke,
- () ->
- appView
- .reporter()
- .warning(
- new StringDiagnostic(
- "Interface method desugaring has inserted NoSuchMethodError replacing a"
- + " super call in "
- + context.toSourceString(),
- context.getOrigin())));
- }
- return emulatedInterfaceDesugaring;
+ return computeEmulatedInterfaceInvokeSpecial(clazz, invokedMethod, context);
}
private DesugarDescription computeEmulatedInterfaceInvokeSpecial(
diff --git a/src/test/java/com/android/tools/r8/desugaring/interfacemethods/DefaultMethodInvokeSuperOnDefaultLibraryMethodTest.java b/src/test/java/com/android/tools/r8/desugaring/interfacemethods/DefaultMethodInvokeSuperOnDefaultLibraryMethodTest.java
deleted file mode 100644
index 0cb64c8..0000000
--- a/src/test/java/com/android/tools/r8/desugaring/interfacemethods/DefaultMethodInvokeSuperOnDefaultLibraryMethodTest.java
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.desugaring.interfacemethods;
-
-import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
-import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
-import static org.hamcrest.CoreMatchers.allOf;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.junit.Assume.assumeTrue;
-
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.errors.InterfaceDesugarMissingTypeDiagnostic;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.StringDiagnostic;
-import com.android.tools.r8.utils.StringUtils;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.function.Consumer;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameter;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class DefaultMethodInvokeSuperOnDefaultLibraryMethodTest extends TestBase {
-
- @Parameter() public TestParameters parameters;
-
- @Parameters(name = "{0}")
- public static TestParametersCollection data() {
- return getTestParameters().withDexRuntimes().build();
- }
-
- private static final String EXPECTED_OUTPUT = StringUtils.lines("1", "2");
-
- private boolean runtimeHasConsumerInterface(TestParameters parameters) {
- // java,util.function.Consumer was introduced at API level 24.
- return parameters.asDexRuntime().getMinApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N);
- }
-
- @Test
- public void testD8WithDefaultInterfaceMethodDesugaringWithAPIInLibrary() throws Exception {
- testForD8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.T))
- .addInnerClasses(getClass())
- .setMinApi(AndroidApiLevel.I_MR1)
- .compileWithExpectedDiagnostics(
- diagnostics ->
- diagnostics
- .assertOnlyWarnings()
- .assertWarningsMatch(
- allOf(
- diagnosticType(StringDiagnostic.class),
- diagnosticMessage(
- containsString(
- "Interface method desugaring has inserted NoSuchMethodError"
- + " replacing a super call in")),
- diagnosticMessage(containsString("forEachPrint")))))
- .run(parameters.getRuntime(), TestClass.class)
- .applyIf(
- // If the platform does not have java.util.function.Consumer the lambda instantiation
- // will throw NoClassDefFoundError as it implements java.util.function.Consumer.
- // Otherwise, the generated code will throw NoSuchMethodError.
- runtimeHasConsumerInterface(parameters),
- b -> b.assertFailureWithErrorThatThrows(NoSuchMethodError.class),
- b -> b.assertFailureWithErrorThatThrows(NoClassDefFoundError.class));
- }
-
- @Test
- public void testD8WithDefaultInterfaceMethodDesugaringWithoutAPIInLibrary() throws Exception {
- testForD8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.M))
- .addInnerClasses(getClass())
- .setMinApi(AndroidApiLevel.I_MR1)
- .compileWithExpectedDiagnostics(
- diagnostics ->
- diagnostics
- .assertOnlyWarnings()
- .assertWarningsMatch(
- diagnosticType(InterfaceDesugarMissingTypeDiagnostic.class)))
- .run(parameters.getRuntime(), TestClass.class)
- .applyIf(
- // If the platform does not have java.util.function.Consumer the lambda instantiation
- // will throw NoClassDefFoundError as it implements java.util.function.Consumer.
- // Otherwise, the generated code will throw NoSuchMethodError.
- runtimeHasConsumerInterface(parameters),
- b -> b.assertFailureWithErrorThatThrows(NoSuchMethodError.class),
- b -> b.assertFailureWithErrorThatThrows(NoClassDefFoundError.class));
- }
-
- @Test
- public void testD8WithDefaultInterfaceMethodSupport() throws Exception {
- assumeTrue(
- parameters.asDexRuntime().getMinApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N));
- testForD8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.T))
- .addInnerClasses(getClass())
- .setMinApi(AndroidApiLevel.N)
- .run(parameters.getRuntime(), TestClass.class)
- .assertSuccessWithOutput(EXPECTED_OUTPUT);
- }
-
- @Test
- public void testR8WithDefaultInterfaceMethodDesugaringWithAPIInLibrary() throws Exception {
- testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.T))
- .addInnerClasses(getClass())
- .setMinApi(AndroidApiLevel.I_MR1)
- .addKeepMainRule(TestClass.class)
- .run(parameters.getRuntime(), TestClass.class)
- .assertFailureWithErrorThatThrows(NoSuchMethodError.class);
- }
-
- @Test
- public void testR8WithDefaultInterfaceMethodDesugaringWithoutAPIInLibrary() throws Exception {
- testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.M))
- .addInnerClasses(getClass())
- .setMinApi(AndroidApiLevel.I_MR1)
- .addKeepMainRule(TestClass.class)
- .addDontWarn(Consumer.class)
- .run(parameters.getRuntime(), TestClass.class)
- .applyIf(
- // If the platform does not have java.util.function.Consumer the lambda instantiation
- // will throw NoClassDefFoundError as it implements java.util.function.Consumer.
- // Otherwise, the generated code will throw NoSuchMethodError.
- runtimeHasConsumerInterface(parameters),
- b -> b.assertFailureWithErrorThatThrows(NoSuchMethodError.class),
- b -> b.assertFailureWithErrorThatThrows(NoClassDefFoundError.class));
- }
-
- @Test
- public void testR8WithDefaultInterfaceMethodSupport() throws Exception {
- assumeTrue(
- parameters.asDexRuntime().getMinApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N));
- testForR8(parameters.getBackend())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.T))
- .addInnerClasses(getClass())
- .setMinApi(AndroidApiLevel.N)
- .addKeepMainRule(TestClass.class)
- .run(parameters.getRuntime(), TestClass.class)
- .assertSuccessWithOutput(EXPECTED_OUTPUT);
- }
-
- interface IntegerIterable extends Iterable<Integer> {
- default void forEachPrint() {
- Iterable.super.forEach(System.out::println);
- }
- }
-
- static class IntegerIterable1And2 implements IntegerIterable {
-
- @Override
- public Iterator<Integer> iterator() {
- List<Integer> result = new ArrayList<>();
- result.add(1);
- result.add(2);
- return result.iterator();
- }
- }
-
- static class TestClass {
-
- public static void main(String[] args) {
- new IntegerIterable1And2().forEachPrint();
- }
- }
-}