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()) {