Remove shorty from DexProto

The shorty string can be computed directly from the proto and there is
no need to explicitly maintain it. The DEX writer is extended to compute
and amend the indexed strings with the shorty for each proto prior to
writing.

Fixes: b/172206529
Change-Id: I034b2d8242b4af42e182080b2605c3a74abbc1cc
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index bc293d3..c797a4f 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -1384,13 +1384,12 @@
     }
     int offset = dexSection.offset + (Constants.TYPE_PROTO_ID_ITEM_SIZE * index);
     dexReader.position(offset);
-    int shortyIndex = dexReader.getUint();
+    int unusedShortyIndex = dexReader.getUint();
     int returnTypeIndex = dexReader.getUint();
     int parametersOffsetIndex = dexReader.getUint();
-    DexString shorty = indexedItems.getString(shortyIndex);
     DexType returnType = indexedItems.getType(returnTypeIndex);
     DexTypeList parameters = typeListAt(parametersOffsetIndex);
-    return dexItemFactory.createProto(returnType, parameters, shorty);
+    return dexItemFactory.createProto(returnType, parameters);
   }
 
   private DexMethod methodAt(int index) {
diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java
index 686d327..0744b77 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -518,7 +518,8 @@
   }
 
   private void writeProtoItem(DexProto proto) {
-    dest.putInt(mapping.getOffsetFor(proto.shorty));
+    DexString shorty = mapping.getShorty(proto);
+    dest.putInt(mapping.getOffsetFor(shorty));
     dest.putInt(mapping.getOffsetFor(proto.returnType));
     dest.putInt(mixedSectionOffsets.getOffsetFor(proto.parameters));
   }
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
index 73b009b..f44c562 100644
--- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -5,6 +5,7 @@
 
 import static com.android.tools.r8.errors.StartupClassesOverflowDiagnostic.Factory.createStartupClassesOverflowDiagnostic;
 import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
+import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
 
 import com.android.tools.r8.FeatureSplit;
 import com.android.tools.r8.debuginfo.DebugRepresentation;
@@ -25,10 +26,8 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.lens.GraphLens;
-import com.android.tools.r8.graph.lens.InitClassLens;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
 import com.android.tools.r8.naming.ClassNameMapper;
-import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.profile.startup.profile.StartupProfile;
 import com.android.tools.r8.shaking.MainDexInfo;
 import com.android.tools.r8.synthesis.SyntheticNaming;
@@ -43,6 +42,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterators;
+import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import it.unimi.dsi.fastutil.objects.Object2IntMap;
 import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
@@ -50,6 +50,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.IdentityHashMap;
 import java.util.Iterator;
@@ -59,6 +60,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
+import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
 
@@ -629,12 +631,11 @@
 
   public static class VirtualFileIndexedItemCollection implements IndexedItemCollection {
 
-    private final GraphLens graphLens;
-    private final InitClassLens initClassLens;
-    private final NamingLens namingLens;
+    private final DexItemFactory factory;
+    private final Map<String, DexString> shortyCache = new HashMap<>();
 
     private final Set<DexProgramClass> classes = Sets.newIdentityHashSet();
-    private final Set<DexProto> protos = Sets.newIdentityHashSet();
+    private final Map<DexProto, DexString> protos = Maps.newIdentityHashMap();
     private final Set<DexType> types = Sets.newIdentityHashSet();
     private final Set<DexMethod> methods = Sets.newIdentityHashSet();
     private final Set<DexField> fields = Sets.newIdentityHashSet();
@@ -651,9 +652,7 @@
     public final Map<DexMethodHandle, ItemUseInfo> methodHandlesUse = new IdentityHashMap<>();
 
     public VirtualFileIndexedItemCollection(AppView<?> appView) {
-      this.graphLens = appView.graphLens();
-      this.initClassLens = appView.initClassLens();
-      this.namingLens = appView.getNamingLens();
+      this.factory = appView.dexItemFactory();
     }
 
     @Override
@@ -682,7 +681,11 @@
 
     @Override
     public boolean addProto(DexProto proto) {
-      return protos.add(proto);
+      return addProtoWithShorty(proto, protos, shortyCache, this::addString, factory);
+    }
+
+    public boolean addProtoWithoutShorty(DexProto proto) {
+      return addProtoWithShorty(proto, protos, shortyCache, emptyConsumer(), factory);
     }
 
     @Override
@@ -714,6 +717,22 @@
     }
   }
 
+  private static boolean addProtoWithShorty(
+      DexProto proto,
+      Map<DexProto, DexString> protoToShorty,
+      Map<String, DexString> shortyCache,
+      Consumer<DexString> addShortyDexString,
+      DexItemFactory factory) {
+    if (protoToShorty.containsKey(proto)) {
+      return false;
+    }
+    String shortyString = proto.createShortyString();
+    DexString shorty = shortyCache.computeIfAbsent(shortyString, factory::createString);
+    addShortyDexString.accept(shorty);
+    protoToShorty.put(proto, shorty);
+    return true;
+  }
+
   public static class IndexedItemTransaction implements IndexedItemCollection {
 
     public interface ClassUseCollector {
@@ -863,7 +882,7 @@
 
       @Override
       public boolean addProto(DexProto proto) {
-        collectUse(proto, transaction.protos, base.protos, protosUse);
+        collectUse(proto, transaction.protos.keySet(), base.protos.keySet(), protosUse);
         return true;
       }
 
@@ -956,7 +975,7 @@
     private final Set<DexField> fields = new LinkedHashSet<>();
     private final Set<DexMethod> methods = new LinkedHashSet<>();
     private final Set<DexType> types = new LinkedHashSet<>();
-    private final Set<DexProto> protos = new LinkedHashSet<>();
+    private final Map<DexProto, DexString> protos = new LinkedHashMap<>();
     private final Set<DexString> strings = new LinkedHashSet<>();
     private final Set<DexCallSite> callSites = new LinkedHashSet<>();
     private final Set<DexMethodHandle> methodHandles = new LinkedHashSet<>();
@@ -973,16 +992,16 @@
               : new EmptyIndexedItemUsedByClasses();
     }
 
-    private <T extends DexItem> boolean maybeInsert(T item, Set<T> set, Set<T> baseSet) {
-      return maybeInsert(item, set, baseSet, true);
+    private <T extends DexItem> boolean maybeInsert(T item, Predicate<T> adder, Set<T> baseSet) {
+      return maybeInsert(item, adder, baseSet, true);
     }
 
     private <T extends DexItem> boolean maybeInsert(
-        T item, Set<T> set, Set<T> baseSet, boolean requireCurrentClass) {
+        T item, Predicate<T> adder, Set<T> baseSet, boolean requireCurrentClass) {
       if (baseSet.contains(item)) {
         return false;
       }
-      boolean added = set.add(item);
+      boolean added = adder.test(item);
       assert !added || !requireCurrentClass || classes.contains(currentClass);
       return added;
     }
@@ -1000,7 +1019,7 @@
     public boolean addClass(DexProgramClass dexProgramClass) {
       assert currentClass == null;
       currentClass = dexProgramClass;
-      return maybeInsert(dexProgramClass, classes, base.classes);
+      return maybeInsert(dexProgramClass, classes::add, base.classes);
     }
 
     public void addClassDone() {
@@ -1010,13 +1029,13 @@
     @Override
     public boolean addField(DexField field) {
       assert currentClass != null;
-      return maybeInsert(field, fields, base.fields);
+      return maybeInsert(field, fields::add, base.fields);
     }
 
     @Override
     public boolean addMethod(DexMethod method) {
       assert currentClass != null;
-      return maybeInsert(method, methods, base.methods);
+      return maybeInsert(method, methods::add, base.methods);
     }
 
     @Override
@@ -1025,32 +1044,35 @@
         // Only marker strings can be added outside a class context.
         assert string.startsWith("~~");
       }
-      return maybeInsert(string, strings, base.strings, false);
+      return maybeInsert(string, strings::add, base.strings, false);
     }
 
     @Override
     public boolean addProto(DexProto proto) {
       assert currentClass != null;
-      return maybeInsert(proto, protos, base.protos);
+      return maybeInsert(
+          proto,
+          p -> addProtoWithShorty(p, protos, base.shortyCache, this::addString, base.factory),
+          base.protos.keySet());
     }
 
     @Override
     public boolean addType(DexType type) {
       assert currentClass != null;
       assert SyntheticNaming.verifyNotInternalSynthetic(type);
-      return maybeInsert(type, types, base.types);
+      return maybeInsert(type, types::add, base.types);
     }
 
     @Override
     public boolean addCallSite(DexCallSite callSite) {
       assert currentClass != null;
-      return maybeInsert(callSite, callSites, base.callSites);
+      return maybeInsert(callSite, callSites::add, base.callSites);
     }
 
     @Override
     public boolean addMethodHandle(DexMethodHandle methodHandle) {
       assert currentClass != null;
-      return maybeInsert(methodHandle, methodHandles, base.methodHandles);
+      return maybeInsert(methodHandle, methodHandles::add, base.methodHandles);
     }
 
     int getNumberOfMethods() {
@@ -1077,7 +1099,8 @@
       commitItemsIn(classes, base::addClass);
       commitItemsIn(fields, base::addField);
       commitItemsIn(methods, base::addMethod);
-      commitItemsIn(protos, base::addProto);
+      // The shorty strings are maintained in the transaction strings, so don't add them twice.
+      commitItemsIn(protos.keySet(), base::addProtoWithoutShorty);
       commitItemsIn(types, base::addType);
       commitItemsIn(strings, base::addString);
       commitItemsIn(callSites, base::addCallSite);
diff --git a/src/main/java/com/android/tools/r8/graph/DexCallSite.java b/src/main/java/com/android/tools/r8/graph/DexCallSite.java
index b40ef2b..518a40d 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCallSite.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCallSite.java
@@ -233,7 +233,6 @@
     }
 
     private void write(DexProto proto) throws IOException {
-      write(proto.shorty);
       write(proto.returnType);
       DexType[] params = proto.parameters.values;
       out.writeInt(params.length);
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index 6db28ad..3713b4d 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -2956,21 +2956,15 @@
   }
 
   public DexProto createProto(DexType returnType, DexTypeList parameters) {
-    return createProto(returnType, parameters, createShorty(returnType, parameters.getBacking()));
-  }
-
-  public DexProto createProto(DexType returnType, DexTypeList parameters, DexString shorty) {
     assert !sorted;
-    DexProto proto = new DexProto(shorty, returnType, parameters);
+    DexProto proto = new DexProto(returnType, parameters);
     return canonicalize(protos, proto);
   }
 
   public DexProto createProto(DexType returnType, DexType... parameters) {
     assert !sorted;
     return createProto(
-        returnType,
-        parameters.length == 0 ? DexTypeList.empty() : new DexTypeList(parameters),
-        createShorty(returnType, parameters));
+        returnType, parameters.length == 0 ? DexTypeList.empty() : new DexTypeList(parameters));
   }
 
   public DexProto createProto(DexType returnType, List<DexType> parameters) {
@@ -3033,15 +3027,6 @@
         : ArrayUtils.copyWithSparseChanges(DexType[].class, types, changed);
   }
 
-  private DexString createShorty(DexType returnType, DexType[] argumentTypes) {
-    StringBuilder shortyBuilder = new StringBuilder();
-    shortyBuilder.append(returnType.toShorty());
-    for (DexType argumentType : argumentTypes) {
-      shortyBuilder.append(argumentType.toShorty());
-    }
-    return createString(shortyBuilder.toString());
-  }
-
   public DexMethod createMethod(DexType holder, DexProto proto, DexString name) {
     assert !sorted;
     DexMethod method = new DexMethod(holder, proto, name, skipNameValidationForTesting);
diff --git a/src/main/java/com/android/tools/r8/graph/DexProto.java b/src/main/java/com/android/tools/r8/graph/DexProto.java
index 745c149..c00c8ce 100644
--- a/src/main/java/com/android/tools/r8/graph/DexProto.java
+++ b/src/main/java/com/android/tools/r8/graph/DexProto.java
@@ -17,15 +17,12 @@
 public class DexProto extends IndexedDexItem
     implements NamingLensComparable<DexProto>, LirConstant {
 
-  public static final DexProto SENTINEL = new DexProto(null, null, null);
+  public static final DexProto SENTINEL = new DexProto(null, null);
 
-  // TODO(b/172206529): Consider removing shorty.
-  public final DexString shorty;
   public final DexType returnType;
   public final DexTypeList parameters;
 
-  DexProto(DexString shorty, DexType returnType, DexTypeList parameters) {
-    this.shorty = shorty;
+  DexProto(DexType returnType, DexTypeList parameters) {
     this.returnType = returnType;
     this.parameters = parameters;
   }
@@ -48,9 +45,7 @@
   public boolean computeEquals(Object other) {
     if (other instanceof DexProto) {
       DexProto o = (DexProto) other;
-      return shorty.equals(o.shorty)
-          && returnType.equals(o.returnType)
-          && parameters.equals(o.parameters);
+      return returnType.equals(o.returnType) && parameters.equals(o.parameters);
     }
     return false;
   }
@@ -102,12 +97,11 @@
 
   @Override
   public String toString() {
-    return "Proto " + shorty + " " + returnType + " " + parameters;
+    return "Proto " + returnType + " " + parameters;
   }
 
   public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) {
     if (indexedItems.addProto(this)) {
-      shorty.collectIndexedItems(indexedItems);
       returnType.collectIndexedItems(appView, indexedItems);
       parameters.collectIndexedItems(appView, indexedItems);
     }
@@ -138,6 +132,15 @@
     return builder.toString();
   }
 
+  public String createShortyString() {
+    StringBuilder shortyBuilder = new StringBuilder();
+    shortyBuilder.append(returnType.toShorty());
+    for (DexType argumentType : parameters.values) {
+      shortyBuilder.append(argumentType.toShorty());
+    }
+    return shortyBuilder.toString();
+  }
+
   @Override
   public LirConstantOrder getLirConstantOrder() {
     return LirConstantOrder.PROTO;
diff --git a/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java b/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java
index 2f957dd..6fbdc33 100644
--- a/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarApplicationReader.java
@@ -125,25 +125,9 @@
     assert isValidDescriptor(desc);
     String returnTypeDescriptor = DescriptorUtils.getReturnTypeDescriptor(desc);
     String[] argumentDescriptors = DescriptorUtils.getArgumentTypeDescriptors(desc);
-    StringBuilder shortyDescriptor = new StringBuilder();
-    shortyDescriptor.append(getShortyDescriptor(returnTypeDescriptor));
-    for (int i = 0; i < argumentDescriptors.length; i++) {
-      shortyDescriptor.append(getShortyDescriptor(argumentDescriptors[i]));
-    }
-    DexProto proto =
-        options.itemFactory.createProto(
-            getTypeFromDescriptor(returnTypeDescriptor),
-            getTypeListFromDescriptors(argumentDescriptors),
-            getString(shortyDescriptor.toString()));
-    return proto;
-  }
-
-  private static String getShortyDescriptor(String descriptor) {
-    if (descriptor.length() == 1) {
-      return descriptor;
-    }
-    assert descriptor.charAt(0) == 'L' || descriptor.charAt(0) == '[';
-    return "L";
+    return options.itemFactory.createProto(
+        getTypeFromDescriptor(returnTypeDescriptor),
+        getTypeListFromDescriptors(argumentDescriptors));
   }
 
   private boolean isValidDescriptor(String desc) {
diff --git a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
index 9b37860..b52eaf3 100644
--- a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
+++ b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
@@ -25,6 +25,7 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
 import java.util.function.Consumer;
 
 public class ObjectToOffsetMapping {
@@ -48,6 +49,8 @@
   private Reference2IntLinkedOpenHashMap<DexString> strings;
   private final Reference2IntLinkedOpenHashMap<DexCallSite> callSites;
   private final Reference2IntLinkedOpenHashMap<DexMethodHandle> methodHandles;
+  // Indirection table of protos to their shorty strings.
+  private final Map<DexProto, DexString> protoToShorty;
 
   private DexString firstJumboString;
 
@@ -58,7 +61,7 @@
       ObjectToOffsetMapping sharedMapping,
       LensCodeRewriterUtils lensCodeRewriter,
       Collection<DexProgramClass> classes,
-      Collection<DexProto> protos,
+      Map<DexProto, DexString> protos,
       Collection<DexType> types,
       Collection<DexMethod> methods,
       Collection<DexField> fields,
@@ -82,6 +85,7 @@
     this.namingLens = appView.getNamingLens();
     this.initClassLens = appView.initClassLens();
     this.lensCodeRewriter = lensCodeRewriter;
+    this.protoToShorty = protos;
     timing.begin("Sort strings");
     if (sharedMapping == null) {
       this.strings =
@@ -103,7 +107,7 @@
     this.classes = sortClasses(classes, visitor);
     timing.end();
     timing.begin("Sort protos");
-    this.protos = createSortedMap(protos, compare(visitor), this::failOnOverflow);
+    this.protos = createSortedMap(protos.keySet(), compare(visitor), this::failOnOverflow);
     timing.end();
     timing.begin("Sort methods");
     this.methods = createSortedMap(methods, compare(visitor), this::failOnOverflow);
@@ -315,6 +319,10 @@
     return keysOrEmpty(methodHandles);
   }
 
+  public DexString getShorty(DexProto proto) {
+    return protoToShorty.get(proto);
+  }
+
   public boolean hasJumboStrings() {
     return firstJumboString != null;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index d016a21..0221302 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -1557,8 +1557,7 @@
       registerIndex += ValueTypeConstraint.OBJECT.requiredRegisters();
     }
 
-    String shorty = callSite.methodProto.shorty.toString();
-
+    String shorty = callSite.methodProto.createShortyString();
     for (int i = 1; i < shorty.length(); i++) {
       ValueTypeConstraint constraint = ValueTypeConstraint.fromTypeDescriptorChar(shorty.charAt(i));
       arguments.add(readRegister(argumentRegisters[registerIndex], constraint));
@@ -1579,8 +1578,7 @@
       register += ValueTypeConstraint.OBJECT.requiredRegisters();
     }
 
-    String shorty = callSite.methodProto.shorty.toString();
-
+    String shorty = callSite.methodProto.createShortyString();
     for (int i = 1; i < shorty.length(); i++) {
       ValueTypeConstraint constraint = ValueTypeConstraint.fromTypeDescriptorChar(shorty.charAt(i));
       arguments.add(readRegister(register, constraint));
@@ -1615,16 +1613,15 @@
       arguments.add(readRegister(argumentRegisters[registerIndex], ValueTypeConstraint.OBJECT));
       registerIndex += ValueTypeConstraint.OBJECT.requiredRegisters();
     }
-    DexString methodShorty;
+    String shorty;
     if (type == InvokeType.POLYMORPHIC) {
-      // The call site signature for invoke polymorphic must be take from call site and not from
+      // The call site signature for invoke polymorphic must be taken from call site and not from
       // the called method.
-      methodShorty = callSiteProto.shorty;
+      shorty = callSiteProto.createShortyString();
     } else {
-      methodShorty = method.proto.shorty;
+      shorty = method.proto.createShortyString();
     }
-    String shorty = methodShorty.toString();
-    for (int i = 1; i < methodShorty.size; i++) {
+    for (int i = 1; i < shorty.length(); i++) {
       ValueTypeConstraint constraint = ValueTypeConstraint.fromTypeDescriptorChar(shorty.charAt(i));
       arguments.add(readRegister(argumentRegisters[registerIndex], constraint));
       registerIndex += constraint.requiredRegisters();
@@ -1679,16 +1676,15 @@
       arguments.add(readRegister(register, ValueTypeConstraint.OBJECT));
       register += ValueTypeConstraint.OBJECT.requiredRegisters();
     }
-    DexString methodShorty;
+    String shorty;
     if (type == InvokeType.POLYMORPHIC) {
-      // The call site signature for invoke polymorphic must be take from call site and not from
+      // The call site signature for invoke polymorphic must be taken from call site and not from
       // the called method.
-      methodShorty = callSiteProto.shorty;
+      shorty = callSiteProto.createShortyString();
     } else {
-      methodShorty = method.proto.shorty;
+      shorty = method.proto.createShortyString();
     }
-    String shorty = methodShorty.toString();
-    for (int i = 1; i < methodShorty.size; i++) {
+    for (int i = 1; i < shorty.length(); i++) {
       ValueTypeConstraint valueTypeConstraint =
           ValueTypeConstraint.fromTypeDescriptorChar(shorty.charAt(i));
       arguments.add(readRegister(register, valueTypeConstraint));
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java b/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
index 3fbcfee..3afabd5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
@@ -169,9 +169,7 @@
     DexProgramClass methodHolder = method.getHolder();
     DexMethod methodReference = method.getReference();
     DexEncodedMethod methodDefinition = method.getDefinition();
-    DexProto newProto =
-        factory.createProto(
-            covariantReturnType, methodReference.proto.parameters, methodReference.proto.shorty);
+    DexProto newProto = factory.createProto(covariantReturnType, methodReference.proto.parameters);
     MethodAccessFlags newAccessFlags = methodDefinition.accessFlags.copy();
     newAccessFlags.setBridge();
     newAccessFlags.setSynthetic();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
index 55bef08..0816edc 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
@@ -1286,7 +1286,7 @@
           }
         }
         assert lastInstruction != null;
-        assert outlineMethod.proto.shorty.toString().length() - 1 == in.size();
+        assert outlineMethod.proto.createShortyString().length() - 1 == in.size();
         if (returnValue != null && !returnValue.isUsed()) {
           returnValue = null;
         }
diff --git a/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java b/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
index 37deb3c..f5b7bfe 100644
--- a/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
+++ b/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
@@ -54,7 +54,7 @@
         null,
         new LensCodeRewriterUtils(appView),
         Collections.emptyList(),
-        Collections.emptyList(),
+        Collections.emptyMap(),
         Collections.emptyList(),
         Collections.emptyList(),
         Collections.emptyList(),