Revert "Add support for List.of(E...)"

This reverts commit dc847f03b0bcc73a361055e4ab2b6f2dcd05b103.

Reason for revert: b/140238638

Change-Id: I5e647defc966933f2c58a2a14361caa92b716ec5
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index 91e5902..f4905df 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -851,21 +851,17 @@
           factory.createProto(factory.intType, factory.intType, factory.intType, factory.intType);
       addProvider(new MethodGenerator(clazz, method, proto, ObjectsMethods::new));
 
-      // List<E> List.of(<args>) for 0 to 10 arguments
+      // List of
       clazz = factory.listDescriptor;
       method = factory.createString("of");
+
+      // From 0 to 10 arguments.
       ArrayList<DexType> parameters = new ArrayList<>();
       for (int i = 0; i <= 10; i++) {
         proto = factory.createProto(factory.listType, parameters);
         addProvider(new MethodGenerator(clazz, method, proto, ListMethods::new));
         parameters.add(factory.objectType);
       }
-
-      // List<E> List.of(E...)
-      clazz = factory.listDescriptor;
-      method = factory.createString("of");
-      proto = factory.createProto(factory.listType, factory.objectArrayType);
-      addProvider(new MethodGenerator(clazz, method, proto, ListMethods::new, "ofVarargs"));
     }
 
     private void initializeJava11MethodProviders(DexItemFactory factory) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/ListMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/ListMethods.java
index 5499367..87f2a62 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/ListMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/ListMethods.java
@@ -7,12 +7,10 @@
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.ir.synthetic.TemplateMethodCode;
 import com.android.tools.r8.utils.InternalOptions;
-import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.Objects;
 
-@SuppressWarnings("unchecked")
 public class ListMethods extends TemplateMethodCode {
 
   public ListMethods(InternalOptions options, DexMethod method, String methodName) {
@@ -24,64 +22,46 @@
   }
 
   public static <E> List<E> of(E e0) {
-    return Collections.singletonList(Objects.requireNonNull(e0));
+    return Collections.singletonList(e0);
   }
 
   public static <E> List<E> of(E e0, E e1) {
-    E[] elements = (E[]) new Object[] { e0, e1 };
-    return List.of(elements);
+    return Collections.unmodifiableList(Arrays.asList(e0, e1));
   }
 
   public static <E> List<E> of(E e0, E e1, E e2) {
-    E[] elements = (E[]) new Object[] { e0, e1, e2 };
-    return List.of(elements);
+    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2));
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3) {
-    E[] elements = (E[]) new Object[] { e0, e1, e2, e3 };
-    return List.of(elements);
+    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3));
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3, E e4) {
-    E[] elements = (E[]) new Object[] { e0, e1, e2, e3, e4 };
-    return List.of(elements);
+    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3, e4));
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3, E e4, E e5) {
-    E[] elements = (E[]) new Object[] { e0, e1, e2, e3, e4, e5 };
-    return List.of(elements);
+    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3, e4, e5));
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3, E e4, E e5, E e6) {
-    E[] elements = (E[]) new Object[] { e0, e1, e2, e3, e4, e5, e6 };
-    return List.of(elements);
+    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3, e4, e5, e6));
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3, E e4, E e5, E e6, E e7) {
-    E[] elements = (E[]) new Object[] { e0, e1, e2, e3, e4, e5, e6, e7 };
-    return List.of(elements);
+    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3, e4, e5, e6, e7));
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8) {
-    E[] elements = (E[]) new Object[] { e0, e1, e2, e3, e4, e5, e6, e7, e8 };
-    return List.of(elements);
+    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3, e4, e5, e6, e7, e8));
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9) {
-    E[] elements = (E[]) new Object[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9 };
-    return List.of(elements);
+    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9));
   }
 
   public static <E> List<E> of(E e0, E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) {
-    E[] elements = (E[]) new Object[] { e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10 };
-    return List.of(elements);
-  }
-
-  public static <E> List<E> ofVarargs(E[] elements) {
-    ArrayList<E> list = new ArrayList<>(elements.length);
-    for (E element : elements) {
-      list.add(Objects.requireNonNull(element));
-    }
-    return Collections.unmodifiableList(list);
+    return Collections.unmodifiableList(Arrays.asList(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10));
   }
 }
diff --git a/src/test/examplesJava9/backport/ListBackportJava9Main.java b/src/test/examplesJava9/backport/ListBackportJava9Main.java
index 4c8ae88..9ad147f 100644
--- a/src/test/examplesJava9/backport/ListBackportJava9Main.java
+++ b/src/test/examplesJava9/backport/ListBackportJava9Main.java
@@ -8,163 +8,59 @@
 
 public class ListBackportJava9Main {
 
-  public static void main(String[] args) {
+  public static void main(String[] args) throws Exception {
     testOf0();
     testOf1();
     testOf2();
     testOf10();
-    testOfVarargs();
   }
 
   private static void testOf0() {
     List<Object> ofObject = List.of();
-    assertEquals(0, ofObject.size());
-    assertMutationNotAllowed(ofObject);
-
     List<Integer> ofInteger = List.of();
-    assertEquals(0, ofInteger.size());
-    assertMutationNotAllowed(ofObject);
+    assertTrue(ofObject instanceof List);
+    assertTrue(ofObject.size() == 0);
+    assertTrue(ofInteger instanceof List);
+    assertTrue(ofInteger.size() == 0);
   }
 
   private static void testOf1() {
-    Object anObject = new Object();
-    List<Object> ofObject = List.of(anObject);
-    assertEquals(1, ofObject.size());
-    assertSame(anObject, ofObject.get(0));
-    assertMutationNotAllowed(ofObject);
-
+    List<Object> ofObject = List.of(new Object());
     List<Integer> ofInteger = List.of(1);
-    assertEquals(1, ofInteger.size());
-    assertEquals(1, ofInteger.get(0));
-
-    try {
-      List.of((Object) null);
-      throw new AssertionError();
-    } catch (NullPointerException expected) {
-    }
+    assertTrue(ofObject instanceof List);
+    assertTrue(ofObject.size() == 1);
+    assertTrue(ofInteger instanceof List);
+    assertTrue(ofInteger.size() == 1);
   }
 
   private static void testOf2() {
-    Object anObject0 = new Object();
-    Object anObject1 = new Object();
-    List<Object> ofObject = List.of(anObject0, anObject1);
-    assertEquals(2, ofObject.size());
-    assertSame(anObject0, ofObject.get(0));
-    assertSame(anObject1, ofObject.get(1));
-    assertMutationNotAllowed(ofObject);
-
+    List<Object> ofObject = List.of(new Object(), new Object());
     List<Integer> ofInteger = List.of(1, 2);
-    assertEquals(2, ofInteger.size());
-    assertEquals(1, ofInteger.get(0));
-    assertEquals(2, ofInteger.get(1));
-
-    List<Object> ofMixed = List.of(anObject0, 1);
-    assertEquals(2, ofMixed.size());
-    assertSame(anObject0, ofMixed.get(0));
-    assertEquals(1, ofMixed.get(1));
-    assertMutationNotAllowed(ofMixed);
-
-    try {
-      List.of(1, null);
-      throw new AssertionError();
-    } catch (NullPointerException expected) {
-    }
+    List<Object> ofMixed = List.of(new Object(), 1);
+    assertTrue(ofObject instanceof List);
+    assertTrue(ofObject.size() == 2);
+    assertTrue(ofInteger instanceof List);
+    assertTrue(ofInteger.size() == 2);
+    assertTrue(ofMixed instanceof List);
+    assertTrue(ofMixed.size() == 2);
   }
 
   private static void testOf10() {
-    Object anObject0 = new Object();
-    Object anObject6 = new Object();
-    Object anObject9 = new Object();
-    List<Object> ofObject =
-        List.of(anObject0, new Object(), new Object(), new Object(), new Object(), new Object(),
-            anObject6, new Object(), new Object(), anObject9);
-    assertEquals(10, ofObject.size());
-    assertSame(anObject0, ofObject.get(0));
-    assertSame(anObject6, ofObject.get(6));
-    assertSame(anObject9, ofObject.get(9));
-    assertMutationNotAllowed(ofObject);
-
+    Object e = new Object();
+    List<Object> ofObject = List.of(e, e, e, e, e, e, e, e, e, e);
     List<Integer> ofInteger = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
-    assertEquals(10, ofInteger.size());
-    assertEquals(0, ofInteger.get(0));
-    assertEquals(6, ofInteger.get(6));
-    assertEquals(9, ofInteger.get(9));
-
-    List<Object> ofMixed = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, anObject9);
-    assertEquals(10, ofMixed.size());
-    assertEquals(0, ofMixed.get(0));
-    assertEquals(6, ofMixed.get(6));
-    assertSame(anObject9, ofMixed.get(9));
-    assertMutationNotAllowed(ofMixed);
-
-    try {
-      List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, null);
-      throw new AssertionError();
-    } catch (NullPointerException expected) {
-    }
+    List<Object> ofMixed = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, e);
+    assertTrue(ofObject instanceof List);
+    assertTrue(ofObject.size() == 10);
+    assertTrue(ofInteger instanceof List);
+    assertTrue(ofInteger.size() == 10);
+    assertTrue(ofMixed instanceof List);
+    assertTrue(ofMixed.size() == 10);
   }
 
-  private static void testOfVarargs() {
-    Object anObject0 = new Object();
-    Object anObject6 = new Object();
-    Object anObject10 = new Object();
-    List<Object> ofObject =
-        List.of(anObject0, new Object(), new Object(), new Object(), new Object(), new Object(),
-            anObject6, new Object(), new Object(), new Object(), anObject10);
-    assertEquals(11, ofObject.size());
-    assertSame(anObject0, ofObject.get(0));
-    assertSame(anObject6, ofObject.get(6));
-    assertSame(anObject10, ofObject.get(10));
-    assertMutationNotAllowed(ofObject);
-
-    List<Integer> ofInteger = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
-    assertEquals(11, ofInteger.size());
-    assertEquals(0, ofInteger.get(0));
-    assertEquals(6, ofInteger.get(6));
-    assertEquals(10, ofInteger.get(10));
-
-    List<Object> ofMixed = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, anObject10);
-    assertEquals(11, ofMixed.size());
-    assertEquals(0, ofMixed.get(0));
-    assertEquals(6, ofMixed.get(6));
-    assertSame(anObject10, ofMixed.get(10));
-    assertMutationNotAllowed(ofMixed);
-
-    // Ensure the supplied mutable array is not used directly since it is mutable.
-    Object[] mutableArray = { anObject0 };
-    List<Object> ofMutableArray = List.of(mutableArray);
-    mutableArray[0] = anObject10;
-    assertSame(anObject0, ofMutableArray.get(0));
-
-    try {
-      List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, null);
-      throw new AssertionError();
-    } catch (NullPointerException expected) {
-    }
-  }
-
-  private static void assertMutationNotAllowed(List<Object> ofObject) {
-    try {
-      ofObject.add(new Object());
-      throw new AssertionError();
-    } catch (UnsupportedOperationException expected) {
-    }
-    try {
-      ofObject.set(0, new Object());
-      throw new AssertionError();
-    } catch (UnsupportedOperationException expected) {
-    }
-  }
-
-  private static void assertSame(Object expected, Object actual) {
-    if (expected != actual) {
-      throw new AssertionError("Expected <" + expected + "> but was <" + actual + ">");
-    }
-  }
-
-  private static void assertEquals(Object expected, Object actual) {
-    if (expected != actual && !expected.equals(actual)) {
-      throw new AssertionError("Expected <" + expected + "> but was <" + actual + ">");
+  private static void assertTrue(boolean value) {
+    if (!value) {
+      throw new AssertionError("Expected <true> but was <false>");
     }
   }
 }