No static methods on Emulate interface
- Static interface methods are moved to the
companion class, and static calls redirected there,
so no need to generate them also on the
emulate interface class.
- Do not generate an emulate interface for Map$Entry
since no default method is present.
Bug:137876068
Change-Id: Id35c9f98609e052d1c1312b65f5a161aac77ac37
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
index 1f049e5..db8f582 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
@@ -139,10 +139,6 @@
initializeEmulatedInterfaceVariables();
}
- private boolean isDefaultOrStatic(DexEncodedMethod method) {
- return method.isDefaultMethod() || method.isStatic();
- }
-
private void initializeEmulatedInterfaceVariables() {
Map<DexType, DexType> emulateLibraryInterface =
options.desugaredLibraryConfiguration.getEmulateLibraryInterface();
@@ -152,7 +148,7 @@
DexClass emulatedInterfaceClass = appView.definitionFor(interfaceType);
if (emulatedInterfaceClass != null) {
for (DexEncodedMethod encodedMethod :
- emulatedInterfaceClass.methods(this::isDefaultOrStatic)) {
+ emulatedInterfaceClass.methods(DexEncodedMethod::isDefaultMethod)) {
emulatedMethods.add(encodedMethod.method.name);
}
}
@@ -639,7 +635,7 @@
DexProgramClass theInterface, Map<DexType, List<DexType>> emulatedInterfacesHierarchy) {
List<DexEncodedMethod> emulationMethods = new ArrayList<>();
for (DexEncodedMethod method : theInterface.methods()) {
- if (isDefaultOrStatic(method)) {
+ if (method.isDefaultMethod()) {
DexMethod libraryMethod =
factory.createMethod(
emulatedInterfaces.get(theInterface.type), method.method.proto, method.method.name);
diff --git a/src/test/java/com/android/tools/r8/desugar/corelib/EmulatedInterfacesTest.java b/src/test/java/com/android/tools/r8/desugar/corelib/EmulatedInterfacesTest.java
index 5e241bb..fe631b5 100644
--- a/src/test/java/com/android/tools/r8/desugar/corelib/EmulatedInterfacesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/corelib/EmulatedInterfacesTest.java
@@ -4,8 +4,11 @@
package com.android.tools.r8.desugar.corelib;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertTrue;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.code.Instruction;
@@ -54,17 +57,11 @@
}
private void assertEmulateInterfaceClassesPresentWithDispatchMethods(CodeInspector inspector) {
- List<FoundClassSubject> dispatchClasses =
- inspector.allClasses().stream()
- .filter(
- clazz ->
- clazz
- .getOriginalName()
- .contains(InterfaceMethodRewriter.EMULATE_LIBRARY_CLASS_NAME_SUFFIX))
- .collect(Collectors.toList());
- int numDispatchClasses = 9;
- assertEquals(numDispatchClasses, dispatchClasses.size());
- for (FoundClassSubject clazz : dispatchClasses) {
+ List<FoundClassSubject> emulatedInterfaces = getEmulatedInterfaces(inspector);
+ int numDispatchClasses = 8;
+ assertThat(inspector.clazz("j$.util.Map$Entry$-EL"), not(isPresent()));
+ assertEquals(numDispatchClasses, emulatedInterfaces.size());
+ for (FoundClassSubject clazz : emulatedInterfaces) {
assertTrue(
clazz.allMethods().stream()
.allMatch(
@@ -76,6 +73,16 @@
}
}
+ private List<FoundClassSubject> getEmulatedInterfaces(CodeInspector inspector) {
+ return inspector.allClasses().stream()
+ .filter(
+ clazz ->
+ clazz
+ .getOriginalName()
+ .contains(InterfaceMethodRewriter.EMULATE_LIBRARY_CLASS_NAME_SUFFIX))
+ .collect(Collectors.toList());
+ }
+
private void assertCollectionMethodsPresentWithCorrectDispatch(CodeInspector inspector) {
DexClass collectionDispatch = inspector.clazz("j$.util.Collection$-EL").getDexClass();
for (DexEncodedMethod method : collectionDispatch.methods()) {