Remove deprecated ExtraUnusedNullParameter constructor

Change-Id: I95e049b8abb57816d953c7f263629996b080342e
diff --git a/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java b/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java
index 8459d85..06c5418 100644
--- a/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java
+++ b/src/main/java/com/android/tools/r8/graph/proto/RewrittenPrototypeDescription.java
@@ -20,7 +20,6 @@
 import com.android.tools.r8.ir.code.Position;
 import com.android.tools.r8.ir.code.TypeAndLocalInfoSupplier;
 import com.android.tools.r8.ir.conversion.ExtraParameter;
-import com.android.tools.r8.ir.conversion.ExtraUnusedNullParameter;
 import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfoFixer;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.google.common.collect.ImmutableList;
@@ -252,18 +251,12 @@
         extraParameters, newRewrittenReturnInfo, argumentInfoCollection);
   }
 
-  public RewrittenPrototypeDescription withExtraUnusedNullParameters(
-      int numberOfExtraUnusedNullParameters) {
-    List<ExtraParameter> parameters =
-        Collections.nCopies(numberOfExtraUnusedNullParameters, new ExtraUnusedNullParameter());
-    return withExtraParameters(parameters);
-  }
-
   public RewrittenPrototypeDescription withExtraParameters(ExtraParameter... parameters) {
     return withExtraParameters(Arrays.asList(parameters));
   }
 
-  public RewrittenPrototypeDescription withExtraParameters(List<ExtraParameter> parameters) {
+  public RewrittenPrototypeDescription withExtraParameters(
+      List<? extends ExtraParameter> parameters) {
     if (parameters.isEmpty()) {
       return this;
     }
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java
index 75743d6..14465fd 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMergerGraphLens.java
@@ -272,7 +272,8 @@
       }
     }
 
-    void addExtraParameters(DexMethod methodSignature, List<ExtraParameter> extraParameters) {
+    void addExtraParameters(
+        DexMethod methodSignature, List<? extends ExtraParameter> extraParameters) {
       Set<DexMethod> originalMethodSignatures = methodMap.getKeys(methodSignature);
       if (originalMethodSignatures.isEmpty()) {
         methodExtraParameters
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java
index ddaf731..1c3443b 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/InstanceInitializerMerger.java
@@ -34,7 +34,6 @@
 import it.unimi.dsi.fastutil.ints.Int2ReferenceSortedMap;
 import it.unimi.dsi.fastutil.objects.Reference2IntMap;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
 public class InstanceInitializerMerger {
@@ -317,7 +316,11 @@
             newMethodReferenceTemplate,
             mode.isInitial() ? syntheticArgumentClass.getArgumentClasses() : ImmutableList.of(),
             classMethodsBuilder::isFresh);
-    int extraNulls = newMethodReference.getArity() - newMethodReferenceTemplate.getArity();
+
+    // Compute the extra unused null parameters.
+    List<ExtraUnusedNullParameter> extraUnusedNullParameters =
+        ExtraUnusedNullParameter.computeExtraUnusedNullParameters(
+            newMethodReferenceTemplate, newMethodReference);
 
     // Verify that the merge is a simple renaming in the final round of merging.
     assert mode.isInitial() || newMethodReference == newMethodReferenceTemplate;
@@ -351,7 +354,7 @@
         int classIdentifier = classIdentifiers.getInt(instanceInitializer.getHolderType());
         extraParameters.add(new ExtraConstantIntParameter(classIdentifier));
       }
-      extraParameters.addAll(Collections.nCopies(extraNulls, new ExtraUnusedNullParameter()));
+      extraParameters.addAll(extraUnusedNullParameters);
       lensBuilder.mapMergedConstructor(
           instanceInitializer.getReference(), newMethodReference, extraParameters);
     }
@@ -362,7 +365,11 @@
             .setMethod(newMethodReference)
             .setAccessFlags(getNewAccessFlags())
             .setCode(
-                getNewCode(newMethodReference, syntheticMethodReference, needsClassId, extraNulls))
+                getNewCode(
+                    newMethodReference,
+                    syntheticMethodReference,
+                    needsClassId,
+                    extraUnusedNullParameters.size()))
             .setClassFileVersion(getNewClassFileVersion())
             .setApiLevelForDefinition(representativeMethod.getApiLevelForDefinition())
             .setApiLevelForCode(representativeMethod.getApiLevelForCode())
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
index 0c36573..183664a 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
@@ -30,7 +30,6 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.IdentityHashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
@@ -293,10 +292,10 @@
                 newMethodReference,
                 syntheticArgumentClass.getArgumentClasses(),
                 tryMethod -> !newMethods.contains(tryMethod.getSignature()));
-        int extraNulls = newMethodReference.getArity() - originalMethodReference.getArity();
         lensBuilder.addExtraParameters(
             originalMethodReference,
-            Collections.nCopies(extraNulls, new ExtraUnusedNullParameter()));
+            ExtraUnusedNullParameter.computeExtraUnusedNullParameters(
+                originalMethodReference, newMethodReference));
       } else {
         newMethodReference =
             dexItemFactory.createFreshMethodNameWithoutHolder(
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/ExtraUnusedNullParameter.java b/src/main/java/com/android/tools/r8/ir/conversion/ExtraUnusedNullParameter.java
index 0532a48..cc8a8c7 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/ExtraUnusedNullParameter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/ExtraUnusedNullParameter.java
@@ -6,24 +6,40 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.analysis.type.Nullability;
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.analysis.value.SingleNumberValue;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
 public class ExtraUnusedNullParameter extends ExtraParameter {
 
   private final DexType type;
 
-  @Deprecated
-  public ExtraUnusedNullParameter() {
-    this(null);
-  }
-
   public ExtraUnusedNullParameter(DexType type) {
     this.type = type;
   }
 
+  public static List<ExtraUnusedNullParameter> computeExtraUnusedNullParameters(
+      DexMethod from, DexMethod to) {
+    int numberOfExtraNullParameters = to.getArity() - from.getArity();
+    if (numberOfExtraNullParameters == 0) {
+      return Collections.emptyList();
+    }
+    List<ExtraUnusedNullParameter> extraUnusedNullParameters =
+        new ArrayList<>(numberOfExtraNullParameters);
+    for (int extraUnusedNullParameterIndex = from.getArity();
+        extraUnusedNullParameterIndex < to.getParameters().size();
+        extraUnusedNullParameterIndex++) {
+      DexType extraUnusedNullParameterType = to.getParameter(extraUnusedNullParameterIndex);
+      extraUnusedNullParameters.add(new ExtraUnusedNullParameter(extraUnusedNullParameterType));
+    }
+    return extraUnusedNullParameters;
+  }
+
   @Override
   public DexType getType(DexItemFactory dexItemFactory) {
     assert type != null;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java
index 78bc7e9..d3f9395 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingLens.java
@@ -18,6 +18,7 @@
 import com.android.tools.r8.ir.analysis.value.SingleFieldValue;
 import com.android.tools.r8.ir.analysis.value.SingleValue;
 import com.android.tools.r8.ir.code.Invoke;
+import com.android.tools.r8.ir.conversion.ExtraUnusedNullParameter;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.collections.BidirectionalOneToManyRepresentativeHashMap;
@@ -27,7 +28,9 @@
 import com.android.tools.r8.utils.collections.MutableBidirectionalOneToManyRepresentativeMap;
 import com.android.tools.r8.utils.collections.MutableBidirectionalOneToOneMap;
 import com.google.common.collect.ImmutableMap;
+import java.util.Collections;
 import java.util.IdentityHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -148,7 +151,7 @@
     }
 
     public void move(DexMethod from, DexMethod to, boolean fromStatic, boolean toStatic) {
-      move(from, to, fromStatic, toStatic, 0);
+      move(from, to, fromStatic, toStatic, Collections.emptyList());
     }
 
     public RewrittenPrototypeDescription move(
@@ -156,7 +159,7 @@
         DexMethod to,
         boolean fromStatic,
         boolean toStatic,
-        int numberOfExtraNullParameters) {
+        List<ExtraUnusedNullParameter> extraUnusedNullParameters) {
       assert from != to;
       newMethodSignatures.put(from, to);
       int offsetDiff = 0;
@@ -194,7 +197,7 @@
                   .build();
       RewrittenPrototypeDescription prototypeChanges =
           RewrittenPrototypeDescription.createForRewrittenTypes(returnInfo, builder.build())
-              .withExtraUnusedNullParameters(numberOfExtraNullParameters);
+              .withExtraParameters(extraUnusedNullParameters);
       prototypeChangesPerMethod.put(to, prototypeChanges);
       return prototypeChanges;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
index c054329..3c8bdbc 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -37,6 +37,7 @@
 import com.android.tools.r8.ir.code.NewUnboxedEnumInstance;
 import com.android.tools.r8.ir.code.StaticPut;
 import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.conversion.ExtraUnusedNullParameter;
 import com.android.tools.r8.ir.conversion.IRConverter;
 import com.android.tools.r8.ir.conversion.OneTimeMethodProcessor;
 import com.android.tools.r8.ir.optimize.enums.EnumDataMap.EnumData;
@@ -575,11 +576,12 @@
         method.getName().toString() + (method.isNonPrivateVirtualMethod() ? "$enumunboxing$" : "");
     DexMethod newMethod = factory.createMethod(method.getHolderType(), newProto, newMethodName);
     newMethod = ensureUniqueMethod(method, newMethod);
-    int numberOfExtraNullParameters = newMethod.getArity() - method.getReference().getArity();
+    List<ExtraUnusedNullParameter> extraUnusedNullParameters =
+        ExtraUnusedNullParameter.computeExtraUnusedNullParameters(method.getReference(), newMethod);
     boolean isStatic = method.isStatic();
     RewrittenPrototypeDescription prototypeChanges =
         lensBuilder.move(
-            method.getReference(), newMethod, isStatic, isStatic, numberOfExtraNullParameters);
+            method.getReference(), newMethod, isStatic, isStatic, extraUnusedNullParameters);
     return method.toTypeSubstitutedMethod(
         newMethod,
         builder ->