Use retracer for rewriting code

This CL also updated our AssemblyWriter to print the method and arguments.

Bug: b/221855899
Change-Id: I5c5dce3734e8c5fb94dfe9d54a2fef20c23d498c
diff --git a/src/main/java/com/android/tools/r8/cf/CfPrinter.java b/src/main/java/com/android/tools/r8/cf/CfPrinter.java
index 5869f46..65572c8 100644
--- a/src/main/java/com/android/tools/r8/cf/CfPrinter.java
+++ b/src/main/java/com/android/tools/r8/cf/CfPrinter.java
@@ -75,9 +75,8 @@
 import com.android.tools.r8.ir.code.NumericType;
 import com.android.tools.r8.ir.code.Position;
 import com.android.tools.r8.ir.code.ValueType;
-import com.android.tools.r8.naming.ClassNameMapper;
-import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import it.unimi.dsi.fastutil.ints.IntList;
 import it.unimi.dsi.fastutil.objects.Reference2IntMap;
 import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap;
@@ -112,7 +111,7 @@
   private final List<List<LocalVariableInfo>> localsAtLabel;
 
   private final StringBuilder builder = new StringBuilder();
-  private final ClassNameMapper mapper;
+  private final RetracerForCodePrinting retracer;
 
   private int nextInstructionIndex = 0;
   private final int instructionIndexSpace;
@@ -121,7 +120,7 @@
   public CfPrinter() {
     indent = "";
     labelToIndex = null;
-    mapper = null;
+    retracer = RetracerForCodePrinting.empty();
     instructionIndexSpace = 0;
 
     sortedLabels = Collections.emptyList();
@@ -130,12 +129,12 @@
 
   /** Entry for printing a complete code object. */
   public CfPrinter(CfCode code) {
-    this(code, null, null);
+    this(code, null, RetracerForCodePrinting.empty());
   }
 
   /** Entry for printing a complete method object. */
-  public CfPrinter(CfCode code, DexEncodedMethod method, ClassNameMapper mapper) {
-    this.mapper = mapper;
+  public CfPrinter(CfCode code, DexEncodedMethod method, RetracerForCodePrinting retracer) {
+    this.retracer = retracer;
     indent = "  ";
     instructionIndexSpace = ("" + code.getInstructions().size()).length();
     labelToIndex = new Reference2IntOpenHashMap<>();
@@ -770,56 +769,36 @@
   }
 
   private void appendDescriptor(DexType type) {
-    if (mapper != null) {
-      builder.append(DescriptorUtils.javaTypeToDescriptor(mapper.originalNameOf(type)));
-      return;
-    }
-    builder.append(type.toDescriptorString());
+    builder.append(retracer.toDescriptor(type));
   }
 
   private void appendType(DexType type) {
     if (type.isArrayType() || type.isClassType()) {
       appendClass(type);
     } else {
-      builder.append(type);
+      builder.append(retracer.toDescriptor(type));
     }
   }
 
   private void appendTypeElement(TypeElement type) {
-    builder.append(type.toString());
+    builder.append(type);
   }
 
   private void appendClass(DexType type) {
     assert type.isArrayType() || type.isClassType();
-    if (mapper == null) {
-      builder.append(type.getInternalName());
-    } else if (type == DexItemFactory.nullValueType) {
+    if (type == DexItemFactory.nullValueType) {
       builder.append("NULL");
     } else {
-      builder.append(
-          DescriptorUtils.descriptorToInternalName(
-              DescriptorUtils.javaTypeToDescriptor(mapper.originalNameOf(type))));
+      builder.append(retracer.toDescriptor(type));
     }
   }
 
   private void appendField(DexField field) {
-    if (mapper != null) {
-      builder.append(mapper.originalSignatureOf(field).toString());
-      return;
-    }
-    appendClass(field.holder);
-    builder.append('/').append(field.name);
+    builder.append(retracer.toDescriptor(field));
   }
 
   private void appendMethod(DexMethod method) {
-    if (mapper != null) {
-      MethodSignature signature = mapper.originalSignatureOf(method);
-      builder.append(mapper.originalNameOf(method.holder)).append('.');
-      builder.append(signature.name).append(signature.toDescriptor());
-      return;
-    }
-    builder.append(method.qualifiedName());
-    builder.append(method.proto.toDescriptorString());
+    builder.append(retracer.toDescriptor(method));
   }
 
   private String opcodeName(int opcode) {
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConst.java b/src/main/java/com/android/tools/r8/dex/code/DexConst.java
index 33fdff4..c47c264 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConst.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConst.java
@@ -6,7 +6,7 @@
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.SingleConstant;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 
 public class DexConst extends DexFormat31i implements SingleConstant {
@@ -44,13 +44,13 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString(
         "v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + " (" + decodedValue() + ")");
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString(
         "v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + "  # " + decodedValue());
   }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConst16.java b/src/main/java/com/android/tools/r8/dex/code/DexConst16.java
index 1188df2..d676e03 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConst16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConst16.java
@@ -6,7 +6,7 @@
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.SingleConstant;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 
 public class DexConst16 extends DexFormat21s implements SingleConstant {
@@ -44,7 +44,7 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString(
         "v" + AA + ", " + StringUtils.hexString(decodedValue(), 4) + " (" + decodedValue() + ")");
   }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConst4.java b/src/main/java/com/android/tools/r8/dex/code/DexConst4.java
index 09ecd15..f1dd41c 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConst4.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConst4.java
@@ -6,7 +6,7 @@
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.SingleConstant;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 
 public class DexConst4 extends DexFormat11n implements SingleConstant {
@@ -44,13 +44,13 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString(
         "v" + A + ", " + StringUtils.hexString(decodedValue(), 1) + " (" + decodedValue() + ")");
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString(
         "v" + A + ", " + StringUtils.hexString(decodedValue(), 2) + "  # " + decodedValue());
   }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstHigh16.java b/src/main/java/com/android/tools/r8/dex/code/DexConstHigh16.java
index 2e732ed..82a6aa3 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstHigh16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstHigh16.java
@@ -6,7 +6,7 @@
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.SingleConstant;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 
 public class DexConstHigh16 extends DexFormat21h implements SingleConstant {
@@ -44,13 +44,13 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString(
         "v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + " (" + decodedValue() + ")");
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString(
         "v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + "  # " + decodedValue());
   }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java
index 87964c8..b909f64 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java
@@ -15,7 +15,7 @@
 import com.android.tools.r8.graph.UseRegistry.MethodHandleUse;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
@@ -58,12 +58,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + AA + ", \"" + BBBB.toString() + "\"");
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + AA + ", \"" + BBBB.toString() + "\"");
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java
index 68f49fb..15bee8c 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java
@@ -14,7 +14,7 @@
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
@@ -57,12 +57,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + AA + ", \"" + BBBB.toString() + "\"");
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + AA + ", \"" + BBBB.toString() + "\"");
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstString.java b/src/main/java/com/android/tools/r8/dex/code/DexConstString.java
index 0117785..e143d89 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstString.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstString.java
@@ -13,7 +13,7 @@
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
@@ -75,12 +75,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + AA + ", \"" + BBBB.toString() + "\"");
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + AA + ", \"" + BBBB.toString() + "\"");
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstStringJumbo.java b/src/main/java/com/android/tools/r8/dex/code/DexConstStringJumbo.java
index 725ef8a..e1811ba 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstStringJumbo.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstStringJumbo.java
@@ -6,7 +6,7 @@
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.OffsetToObjectMapping;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 
 public class DexConstStringJumbo extends DexFormat31c {
 
@@ -52,12 +52,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + AA + ", \"" + BBBBBBBB.toString() + "\"");
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + AA + ", \"" + BBBBBBBB.toString() + "\"");
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstWide.java b/src/main/java/com/android/tools/r8/dex/code/DexConstWide.java
index 6fbd6f2..899e221 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstWide.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstWide.java
@@ -6,7 +6,7 @@
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.WideConstant;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 
 public class DexConstWide extends DexFormat51l implements WideConstant {
@@ -44,13 +44,13 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString(
         "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + " (" + decodedValue() + ")");
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString(
         "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + "L  # " + decodedValue());
   }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstWide16.java b/src/main/java/com/android/tools/r8/dex/code/DexConstWide16.java
index e30b886..2cd5ae3 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstWide16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstWide16.java
@@ -6,7 +6,7 @@
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.WideConstant;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 
 public class DexConstWide16 extends DexFormat21s implements WideConstant {
@@ -44,13 +44,13 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString(
         "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + " (" + decodedValue() + ")");
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString(
         "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + "L  # " + decodedValue());
   }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstWide32.java b/src/main/java/com/android/tools/r8/dex/code/DexConstWide32.java
index b315cb9..9797a19 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstWide32.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstWide32.java
@@ -6,7 +6,7 @@
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.WideConstant;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 
 public class DexConstWide32 extends DexFormat31i implements WideConstant {
@@ -44,13 +44,13 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString(
         "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + " (" + decodedValue() + ")");
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString(
         "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + "  # " + decodedValue());
   }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexConstWideHigh16.java b/src/main/java/com/android/tools/r8/dex/code/DexConstWideHigh16.java
index 0eeca93..93b7f34 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexConstWideHigh16.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexConstWideHigh16.java
@@ -6,7 +6,7 @@
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.ir.code.WideConstant;
 import com.android.tools.r8.ir.conversion.IRBuilder;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 
 public class DexConstWideHigh16 extends DexFormat21h implements WideConstant {
@@ -44,13 +44,13 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString(
         "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + " (" + decodedValue() + ")");
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString(
         "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + "L  # " + decodedValue());
   }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFillArrayData.java b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayData.java
index de478d7..0a3974d 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFillArrayData.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayData.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 
 public class DexFillArrayData extends DexFormat31t {
 
@@ -41,7 +41,7 @@
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + AA + ", :label_" + (getOffset() + BBBBBBBB));
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java
index 67d796c..228258d 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java
@@ -8,7 +8,7 @@
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
@@ -91,8 +91,8 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
-    return super.toString(naming)
+  public String toString(RetracerForCodePrinting retracer) {
+    return super.toString(retracer)
         + "[FillArrayPayload], "
         + "width: "
         + element_width
@@ -101,7 +101,7 @@
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     StringBuilder builder = new StringBuilder();
     builder.append("    ");
     builder.append(".array-data ");
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java
index ba9065a..ba29cbe 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java
@@ -9,7 +9,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import java.nio.ShortBuffer;
@@ -56,12 +56,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString(formatRelativeOffset(AA));
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString(":label_" + (getOffset() + AA));
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java
index 3cb41fb..174c89b 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java
@@ -9,7 +9,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import java.nio.ShortBuffer;
 
 abstract class DexFormat10x extends DexBase1Format {
@@ -33,12 +33,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString(null);
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString(null);
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java
index fe02384..09e3fb6 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -70,7 +70,7 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + A + ", #" + B);
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java
index b07478c..393ab88 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import java.nio.ShortBuffer;
@@ -56,12 +56,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + AA);
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + AA);
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java
index 633837d..979bcc7 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -64,12 +64,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + A + ", v" + B);
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + A + ", v" + B);
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java
index 0c0e15e..a03b9c5 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java
@@ -9,7 +9,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import java.nio.ShortBuffer;
@@ -56,12 +56,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("" + AAAA + " " + formatRelativeOffset(AAAA));
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString(":label_" + (getOffset() + AAAA));
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat21c.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21c.java
index b47c6d7..4d25775 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat21c.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21c.java
@@ -5,7 +5,7 @@
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.IndexedDexItem;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -52,13 +52,12 @@
   abstract void internalSubSpecify(StructuralSpecification<DexFormat21c<T>, ?> spec);
 
   @Override
-  public String toString(ClassNameMapper naming) {
-    return formatString(
-        "v" + AA + ", " + (naming == null ? BBBB.toString() : naming.originalNameOf(BBBB)));
+  public String toString(RetracerForCodePrinting retracer) {
+    return formatString("v" + AA + ", " + retracer.toDescriptor(BBBB));
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     // TODO(sgjesse): Add support for smali name mapping.
     return formatSmaliString("v" + AA + ", " + BBBB.toSmaliString());
   }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java
index 97e3529..3d66ad2 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
@@ -67,12 +67,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + AA + ", #" + BBBB);
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + AA + ", " + StringUtils.hexString(BBBB, 4) + "  # " + BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java
index 1c80b33..93cd025 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java
@@ -13,7 +13,7 @@
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -85,12 +85,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + AA + ", " + formatRelativeOffset(BBBB));
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + AA + ", :label_" + (getOffset() + BBBB));
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java
index 687d7e7..222fc09 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
@@ -71,12 +71,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + AA + ", v" + BB + ", #" + CC);
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString(
         "v" + AA + ", v" + BB + ", " + StringUtils.hexString(CC, 2) + "  # " + CC);
   }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat22c.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22c.java
index 2e1246c..68c7839 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat22c.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22c.java
@@ -6,7 +6,7 @@
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.IndexedDexItem;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -57,13 +57,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
-    return formatString(
-        "v" + A + ", v" + B + ", " + (naming == null ? CCCC : naming.originalNameOf(CCCC)));
+  public String toString(RetracerForCodePrinting retracer) {
+    return formatString("v" + A + ", v" + B + ", " + retracer.toDescriptor(CCCC));
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     // TODO(sgjesse): Add support for smali name mapping.
     return formatSmaliString("v" + A + ", v" + B + ", " + CCCC.toSmaliString());
   }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java
index e503467..53d247c 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
@@ -71,12 +71,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + A + ", v" + B + ", #" + CCCC);
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString(
         "v" + A + ", v" + B + ", " + StringUtils.hexString(CCCC, 4) + "  # " + CCCC);
   }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java
index 17695d7..c276ca1 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java
@@ -13,7 +13,7 @@
 import com.android.tools.r8.ir.code.ValueTypeConstraint;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -89,12 +89,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + A + ", v" + B + ", " + formatRelativeOffset(CCCC));
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + A + ", v" + B + ", :label_" + (getOffset() + CCCC));
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java
index 3c34540..3cd881d 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -66,12 +66,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + AA + ", v" + (int) BBBB);
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + AA + ", v" + (int) BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java
index df098d9..1e1b130 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -70,12 +70,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + AA + ", v" + BB + ", v" + CC);
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + AA + ", v" + BB + ", v" + CC);
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java
index aa744ad..cfd2bf7 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java
@@ -9,7 +9,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import java.nio.ShortBuffer;
@@ -55,12 +55,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString(formatOffset(AAAAAAAA));
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString(":label_" + (getOffset() + AAAAAAAA));
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java
index 8023664..ae0ca6c 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java
@@ -13,7 +13,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -69,9 +69,8 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
-    return formatString(
-        "v" + AA + ", " + (naming == null ? BBBBBBBB : naming.originalNameOf(BBBBBBBB)));
+  public String toString(RetracerForCodePrinting retracer) {
+    return formatString("v" + AA + ", " + retracer.toDescriptor(BBBBBBBB));
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java
index 0795a92..942c5e2 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -65,7 +65,7 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + AA + ", #" + BBBBBBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java
index 320514d..7f26c21 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -80,7 +80,7 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + AA + ", " + formatRelativeOffset(BBBBBBBB));
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java
index 00cf1f4..5389c2f 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java
@@ -11,7 +11,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -68,12 +68,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + AAAA + ", v" + BBBB);
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + AAAA + ", v" + BBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat35c.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat35c.java
index 6e40c73..0f195c1 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat35c.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat35c.java
@@ -5,7 +5,7 @@
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.IndexedDexItem;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralItem;
@@ -94,20 +94,16 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     StringBuilder builder = new StringBuilder();
     appendRegisterArguments(builder, " ");
     builder.append(" ");
-    if (naming == null) {
-      builder.append(BBBB.toSmaliString());
-    } else {
-      builder.append(naming.originalNameOf(BBBB));
-    }
+    builder.append(retracer.toDescriptor(BBBB));
     return formatString(builder.toString());
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     StringBuilder builder = new StringBuilder();
     appendRegisterArguments(builder, ", ");
     builder.append(", ");
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat3rc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat3rc.java
index b0c0204..3d8289c 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat3rc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat3rc.java
@@ -5,7 +5,7 @@
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.IndexedDexItem;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralItem;
@@ -71,20 +71,16 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     StringBuilder builder = new StringBuilder();
     appendRegisterRange(builder);
     builder.append(" ");
-    if (naming == null) {
-      builder.append(BBBB.toSmaliString());
-    } else {
-      builder.append(naming.originalNameOf(BBBB));
-    }
+    builder.append(retracer.toDescriptor(BBBB));
     return formatString(builder.toString());
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     StringBuilder builder = new StringBuilder();
     appendRegisterRange(builder);
     builder.append(", ");
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
index 61a0257..2f4adc5 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
@@ -11,12 +11,11 @@
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
-import com.android.tools.r8.graph.IndexedDexItem;
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.code.Invoke.Type;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -137,7 +136,7 @@
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     StringBuilder builder = new StringBuilder();
     appendRegisterArguments(builder, ", ");
     builder.append(", ");
@@ -149,26 +148,16 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     StringBuilder builder = new StringBuilder();
     appendRegisterArguments(builder, " ");
     builder.append(" ");
-    builder.append(itemToString(BBBB, naming));
+    builder.append(retracer.toDescriptor(BBBB));
     builder.append(", ");
-    builder.append(itemToString(HHHH, naming));
+    builder.append(retracer.toDescriptor(HHHH));
     return formatString(builder.toString());
   }
 
-  private String itemToString(IndexedDexItem indexedDexItem, ClassNameMapper naming) {
-    String str;
-    if (naming == null) {
-      str = indexedDexItem.toSmaliString();
-    } else {
-      str = naming.originalNameOf(indexedDexItem);
-    }
-    return str;
-  }
-
   private void appendRegisterArguments(StringBuilder builder, String separator) {
     builder.append("{ ");
     int[] values = new int[] {C, D, E, F, G};
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
index b795316..8aa065a 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
@@ -15,7 +15,7 @@
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.code.Invoke.Type;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -90,25 +90,17 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     StringBuilder builder = new StringBuilder();
     appendRegisterRange(builder);
     builder.append(" ");
-    if (naming == null) {
-      builder.append(BBBB.toSmaliString());
-    } else {
-      builder.append(naming.originalNameOf(BBBB));
-    }
-    if (naming == null) {
-      builder.append(HHHH.toSmaliString());
-    } else {
-      builder.append(naming.originalNameOf(HHHH));
-    }
+    builder.append(retracer.toDescriptor(BBBB));
+    builder.append(retracer.toDescriptor(HHHH));
     return formatString(builder.toString());
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     StringBuilder builder = new StringBuilder();
     appendRegisterRange(builder);
     builder.append(", ");
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java
index 30ddee5..ddce5ad 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -65,7 +65,7 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     return formatString("v" + AA + ", #" + BBBBBBBBBBBBBBBB);
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java b/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java
index c600656..8591fd9 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java
@@ -16,7 +16,7 @@
 import com.android.tools.r8.ir.code.FieldMemberType;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -144,18 +144,12 @@
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + dest + ", " + clazz.toSmaliString());
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
-    StringBuilder builder = new StringBuilder("v").append(dest).append(", ");
-    if (naming == null) {
-      builder.append(clazz.toSourceString());
-    } else {
-      builder.append(naming.originalNameOf(clazz));
-    }
-    return formatString(builder.toString());
+  public String toString(RetracerForCodePrinting retracer) {
+    return formatString("v" + dest + ", " + retracer.toDescriptor(clazz));
   }
 }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java b/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java
index d5f8183..94812b4 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java
@@ -19,7 +19,7 @@
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.Equatable;
@@ -372,15 +372,15 @@
     throw new InternalCompilerError("Instruction " + payloadUser + " is not a payload user");
   }
 
-  public abstract String toSmaliString(ClassNameMapper naming);
+  public abstract String toSmaliString(RetracerForCodePrinting retracer);
 
   public String toSmaliString() {
-    return toSmaliString((ClassNameMapper) null);
+    return toSmaliString((RetracerForCodePrinting) null);
   }
 
-  public abstract String toString(ClassNameMapper naming);
+  public abstract String toString(RetracerForCodePrinting retracer);
 
-  public String toString(ClassNameMapper naming, DexInstruction payloadUser) {
+  public String toString(RetracerForCodePrinting retracer, DexInstruction payloadUser) {
     throw new InternalCompilerError("Instruction " + payloadUser + " is not a payload user");
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java b/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java
index d34a783..ddaf074 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java
@@ -13,8 +13,8 @@
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.naming.dexitembasedstring.NameComputationInfo;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
 import java.nio.ShortBuffer;
 
@@ -85,13 +85,13 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     // TODO(christofferqa): Apply mapping to item.
     return formatString("v" + AA + ", \"" + BBBB.toString() + "\"");
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     // TODO(christofferqa): Apply mapping to item.
     return formatSmaliString("v" + AA + ", \"" + BBBB.toString() + "\"");
   }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitch.java b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitch.java
index 34029d8..c00a3b4 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitch.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitch.java
@@ -5,7 +5,7 @@
 package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 
 public class DexPackedSwitch extends DexFormat31t {
 
@@ -50,7 +50,7 @@
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + AA + ", :label_" + (getOffset() + BBBBBBBB));
   }
 }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java
index d06f619..95f6eed 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java
@@ -7,7 +7,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
@@ -102,12 +102,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
-    return toString(naming, null);
+  public String toString(RetracerForCodePrinting retracer) {
+    return toString(retracer, null);
   }
 
   @Override
-  public String toString(ClassNameMapper naming, DexInstruction payloadUser) {
+  public String toString(RetracerForCodePrinting retracer, DexInstruction payloadUser) {
     StringBuilder builder = new StringBuilder("[PackedSwitchPayload");
     if (payloadUser == null) {
       builder.append(" offsets relative to associated PackedSwitch");
@@ -123,7 +123,7 @@
       }
       StringUtils.appendLeftPadded(builder, (first_key + i) + " -> " + offsetString + "\n", 20);
     }
-    return super.toString(naming) + builder.toString();
+    return super.toString(retracer) + builder.toString();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java b/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java
index 955f67e..3101663 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java
@@ -13,7 +13,7 @@
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.conversion.IRBuilder;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -100,7 +100,7 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
+  public String toString(RetracerForCodePrinting retracer) {
     StringBuilder sb = new StringBuilder();
     sb.append("v").append(outRegister).append(" ");
     appendArguments(sb);
@@ -108,8 +108,8 @@
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
-    return toString(naming);
+  public String toSmaliString(RetracerForCodePrinting retracer) {
+    return toString(retracer);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitch.java b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitch.java
index 4f15ab7..8dfabb6 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitch.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitch.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.dex.code;
 
 import com.android.tools.r8.ir.conversion.IRBuilder;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 
 public class DexSparseSwitch extends DexFormat31t {
 
@@ -49,7 +49,7 @@
   }
 
   @Override
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     return formatSmaliString("v" + AA + ", :label_" + (getOffset() + BBBBBBBB));
   }
 }
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java
index 97d369a..838e4ea 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java
@@ -7,7 +7,7 @@
 import com.android.tools.r8.graph.ObjectToOffsetMapping;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
@@ -108,12 +108,12 @@
   }
 
   @Override
-  public String toString(ClassNameMapper naming) {
-    return toString(naming, null);
+  public String toString(RetracerForCodePrinting retracer) {
+    return toString(retracer, null);
   }
 
   @Override
-  public String toString(ClassNameMapper naming, DexInstruction payloadUser) {
+  public String toString(RetracerForCodePrinting retracer, DexInstruction payloadUser) {
     StringBuilder builder = new StringBuilder("[SparseSwitchPayload");
     if (payloadUser == null) {
       builder.append(" offsets relative to associated SparseSwitch");
@@ -129,7 +129,7 @@
       }
       StringUtils.appendLeftPadded(builder, keys[i] + " -> " + offsetString + "\n", 20);
     }
-    return super.toString(naming) + builder.toString();
+    return super.toString(retracer) + builder.toString();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
index 3061f1b..b117cce 100644
--- a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
+++ b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
@@ -12,11 +12,12 @@
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore;
 import com.android.tools.r8.kotlin.Kotlin;
 import com.android.tools.r8.kotlin.KotlinMetadataWriter;
-import com.android.tools.r8.naming.ClassNameMapper;
-import com.android.tools.r8.naming.MemberNaming.FieldSignature;
 import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy;
 import com.android.tools.r8.utils.CfgPrinter;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.StringUtils.BraceType;
 import com.android.tools.r8.utils.Timing;
 import java.io.BufferedReader;
 import java.io.PrintStream;
@@ -34,6 +35,7 @@
   private final Kotlin kotlin;
   private final Timing timing = new Timing("AssemblyWriter");
   private final CompilationContext compilationContext;
+  private final RetracerForCodePrinting retracer;
 
   public AssemblyWriter(
       DexApplication application,
@@ -62,6 +64,8 @@
       this.appInfo = null;
     }
     kotlin = new Kotlin(application.dexItemFactory);
+    retracer =
+        RetracerForCodePrinting.create(application.getProguardMap(), application.options.reporter);
   }
 
   public static String getFileEnding() {
@@ -70,22 +74,17 @@
 
   @Override
   void writeClassHeader(DexProgramClass clazz, PrintStream ps) {
-    String clazzName;
-    if (application.getProguardMap() != null) {
-      clazzName = application.getProguardMap().originalNameOf(clazz.type);
-    } else {
-      clazzName = clazz.type.toSourceString();
-    }
+    String clazzName = retracer.toSourceString(clazz.getType());
     ps.println("# Bytecode for");
     ps.println("# Class: '" + clazzName + "'");
     if (writeAllClassInfo) {
       writeAnnotations(clazz, clazz.annotations(), ps);
       ps.println("# Flags: '" + clazz.accessFlags + "'");
       if (clazz.superType != application.dexItemFactory.objectType) {
-        ps.println("# Extends: '" + clazz.superType.toSourceString() + "'");
+        ps.println("# Extends: '" + retracer.toSourceString(clazz.superType) + "'");
       }
       for (DexType value : clazz.interfaces.values) {
-        ps.println("# Implements: '" + value.toSourceString() + "'");
+        ps.println("# Implements: '" + retracer.toSourceString(value) + "'");
       }
       if (!clazz.getInnerClasses().isEmpty()) {
         ps.println("# InnerClasses:");
@@ -93,10 +92,10 @@
           ps.println(
               "#  Outer: "
                   + (innerClassAttribute.getOuter() != null
-                      ? innerClassAttribute.getOuter().toSourceString()
+                      ? retracer.toSourceString(innerClassAttribute.getOuter())
                       : "-")
                   + ", inner: "
-                  + innerClassAttribute.getInner().toSourceString()
+                  + retracer.toSourceString(innerClassAttribute.getInner())
                   + ", inner name: "
                   + innerClassAttribute.getInnerName()
                   + ", access: "
@@ -107,10 +106,12 @@
       if (enclosingMethodAttribute != null) {
         ps.println("# EnclosingMethod:");
         if (enclosingMethodAttribute.getEnclosingClass() != null) {
-          ps.println("#  Class: " + enclosingMethodAttribute.getEnclosingClass().toSourceString());
+          ps.println(
+              "#  Class: " + retracer.toSourceString(enclosingMethodAttribute.getEnclosingClass()));
         } else {
           ps.println(
-              "#  Method: " + enclosingMethodAttribute.getEnclosingMethod().toSourceString());
+              "#  Method: "
+                  + retracer.toSourceString(enclosingMethodAttribute.getEnclosingMethod()));
         }
       }
     }
@@ -129,14 +130,9 @@
   @Override
   void writeField(DexEncodedField field, PrintStream ps) {
     if (writeFields) {
-      ClassNameMapper naming = application.getProguardMap();
-      FieldSignature fieldSignature =
-          naming != null
-              ? naming.originalSignatureOf(field.getReference())
-              : FieldSignature.fromDexField(field.getReference());
       writeAnnotations(null, field.annotations(), ps);
       ps.print(field.accessFlags + " ");
-      ps.print(fieldSignature);
+      ps.print(retracer.toSourceString(field.getReference()));
       if (field.isStatic() && field.hasExplicitStaticValue()) {
         ps.print(" = " + field.getStaticValue());
       }
@@ -152,13 +148,8 @@
   @Override
   void writeMethod(ProgramMethod method, PrintStream ps) {
     DexEncodedMethod definition = method.getDefinition();
-    ClassNameMapper naming = application.getProguardMap();
-    String methodName =
-        naming != null
-            ? naming.originalSignatureOf(method.getReference()).name
-            : method.getReference().name.toString();
     ps.println("#");
-    ps.println("# Method: '" + methodName + "':");
+    ps.println("# Method: '" + retracer.toSourceString(definition.getReference()) + "':");
     writeAnnotations(null, definition.annotations(), ps);
     ps.println("# " + definition.accessFlags);
     ps.println("#");
@@ -171,7 +162,7 @@
       if (writeIR) {
         writeIR(method, ps);
       } else {
-        ps.println(code.toString(definition, naming));
+        ps.println(code.toString(definition, retracer));
       }
     }
   }
@@ -188,7 +179,7 @@
                 OptimizationFeedbackIgnore.getInstance(),
                 methodProcessor,
                 methodProcessingContext));
-    ps.println(printer.toString());
+    ps.println(printer);
   }
 
   private void writeAnnotations(
@@ -202,9 +193,19 @@
             assert clazz != null : "Kotlin metadata is a class annotation";
             KotlinMetadataWriter.writeKotlinMetadataAnnotation(prefix, annotation, ps, kotlin);
           } else {
-            String annotationString = annotation.toString();
+            StringBuilder sb = new StringBuilder();
+            sb.append(annotation.getVisibility());
+            sb.append(" ");
+            sb.append(retracer.toSourceString(annotation.getAnnotationType()));
+            sb.append(
+                StringUtils.join(
+                    ",",
+                    annotation.annotation.elements,
+                    element ->
+                        element.getName().toString() + " = " + getStringValue(element.getValue()),
+                    BraceType.SQUARE));
             ps.print(
-                new BufferedReader(new StringReader(annotationString))
+                new BufferedReader(new StringReader(sb.toString()))
                     .lines()
                     .collect(
                         Collectors.joining(
@@ -215,6 +216,26 @@
     }
   }
 
+  private String getStringValue(DexValue value) {
+    if (value.isDexValueType()) {
+      return retracer.toSourceString(value.asDexValueType().getValue());
+    } else if (value.isDexValueMethodHandle()) {
+      return retracer.toSourceString(value.asDexValueMethodHandle().value.asMethod());
+    } else if (value.isDexValueMethod()) {
+      return retracer.toSourceString(value.asDexValueMethod().value);
+    } else if (value.isDexItemBasedValueString()) {
+      return retracer.toSourceString(value.asDexItemBasedValueString().value);
+    } else if (value.isDexValueEnum()) {
+      return retracer.toSourceString(value.asDexValueEnum().value);
+    } else if (value.isDexValueField()) {
+      return retracer.toSourceString(value.asDexValueField().value);
+    } else if (value.isDexValueArray()) {
+      return "[" + value.asDexValueArray() + "]";
+    } else {
+      return value.toString();
+    }
+  }
+
   @Override
   void writeClassFooter(DexProgramClass clazz, PrintStream ps) {
 
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index f415e4b..63d7d65 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -38,11 +38,11 @@
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.ThrowingMethodConversionOptions;
 import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
 import com.android.tools.r8.ir.optimize.InliningConstraints;
-import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralItem;
@@ -783,8 +783,8 @@
   }
 
   @Override
-  public String toString(DexEncodedMethod method, ClassNameMapper naming) {
-    return new CfPrinter(this, method, naming).toString();
+  public String toString(DexEncodedMethod method, RetracerForCodePrinting retracer) {
+    return new CfPrinter(this, method, retracer).toString();
   }
 
   public ConstraintWithTarget computeInliningConstraint(
diff --git a/src/main/java/com/android/tools/r8/graph/Code.java b/src/main/java/com/android/tools/r8/graph/Code.java
index 0edeb6f..1077fb9 100644
--- a/src/main/java/com/android/tools/r8/graph/Code.java
+++ b/src/main/java/com/android/tools/r8/graph/Code.java
@@ -13,8 +13,8 @@
 import com.android.tools.r8.ir.code.NumberGenerator;
 import com.android.tools.r8.ir.code.Position;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
-import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import it.unimi.dsi.fastutil.ints.Int2ReferenceMap;
 
 public abstract class Code extends CachedHashValueDexItem {
@@ -71,7 +71,7 @@
   @Override
   public abstract String toString();
 
-  public abstract String toString(DexEncodedMethod method, ClassNameMapper naming);
+  public abstract String toString(DexEncodedMethod method, RetracerForCodePrinting retracer);
 
   public boolean isCfCode() {
     return false;
diff --git a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
index 425c5d5..165ff81 100644
--- a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
@@ -28,10 +28,10 @@
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.ThrowingMethodConversionOptions;
 import com.android.tools.r8.ir.conversion.SyntheticStraightLineSourceCode;
-import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.IteratorUtils;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.google.common.collect.ImmutableList;
 import java.nio.ShortBuffer;
@@ -391,7 +391,7 @@
   }
 
   @Override
-  public String toString(DexEncodedMethod method, ClassNameMapper naming) {
+  public String toString(DexEncodedMethod method, RetracerForCodePrinting retracer) {
     return toString();
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
index 924590f..aff4bff 100644
--- a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
+++ b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
@@ -101,6 +101,10 @@
     return visibility + " " + annotation;
   }
 
+  public int getVisibility() {
+    return visibility;
+  }
+
   public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) {
     annotation.collectIndexedItems(appView, indexedItems);
   }
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotationElement.java b/src/main/java/com/android/tools/r8/graph/DexAnnotationElement.java
index a2be262..aa6aaec 100644
--- a/src/main/java/com/android/tools/r8/graph/DexAnnotationElement.java
+++ b/src/main/java/com/android/tools/r8/graph/DexAnnotationElement.java
@@ -71,4 +71,7 @@
     assert false;
   }
 
+  public DexString getName() {
+    return name;
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java
index ad59604..3d7892f 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -27,9 +27,9 @@
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.ThrowingMethodConversionOptions;
-import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.ArrayUtils;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.structural.Equatable;
 import com.android.tools.r8.utils.structural.HashCodeVisitor;
@@ -449,11 +449,11 @@
 
   @Override
   public String toString() {
-    return toString(null, null);
+    return toString(null, RetracerForCodePrinting.empty());
   }
 
   @Override
-  public String toString(DexEncodedMethod method, ClassNameMapper naming) {
+  public String toString(DexEncodedMethod method, RetracerForCodePrinting retracer) {
     StringBuilder builder = new StringBuilder();
     if (method != null) {
       builder.append(method.toSourceString()).append("\n");
@@ -495,9 +495,9 @@
       builder.append(": ");
       if (insn.isSwitchPayload()) {
         DexInstruction payloadUser = payloadUsers.get(insn.getOffset());
-        builder.append(insn.toString(naming, payloadUser));
+        builder.append(insn.toString(retracer, payloadUser));
       } else {
-        builder.append(insn.toString(naming));
+        builder.append(insn.toString(retracer));
       }
       builder.append('\n');
     }
@@ -542,7 +542,7 @@
     return current;
   }
 
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting retracer) {
     StringBuilder builder = new StringBuilder();
     // Find labeled targets.
     Map<Integer, DexInstruction> payloadUsers = new HashMap<>();
@@ -582,7 +582,7 @@
         DexInstruction payloadUser = payloadUsers.get(dex.getOffset());
         builder.append(dex.toSmaliString(payloadUser)).append('\n');
       } else {
-        builder.append(dex.toSmaliString(naming)).append('\n');
+        builder.append(dex.toSmaliString(retracer)).append('\n');
       }
     }
     if (tries.length > 0) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 985e215..318b353 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -56,7 +56,6 @@
 import com.android.tools.r8.ir.optimize.inliner.WhyAreYouNotInliningReporter;
 import com.android.tools.r8.ir.synthetic.ForwardMethodBuilder;
 import com.android.tools.r8.kotlin.KotlinMethodLevelInfo;
-import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.naming.MemberNaming.Signature;
 import com.android.tools.r8.naming.NamingLens;
@@ -65,6 +64,7 @@
 import com.android.tools.r8.utils.ConsumerUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.OptionalBool;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.Ordered;
@@ -902,7 +902,7 @@
     this.parameterAnnotationsList = parameterAnnotations;
   }
 
-  public String toSmaliString(ClassNameMapper naming) {
+  public String toSmaliString(RetracerForCodePrinting naming) {
     checkIfObsolete();
     StringBuilder builder = new StringBuilder();
     builder.append(".method ");
@@ -1226,7 +1226,7 @@
 
   public String codeToString() {
     checkIfObsolete();
-    return code == null ? "<no code>" : code.toString(this, null);
+    return code == null ? "<no code>" : code.toString(this, RetracerForCodePrinting.empty());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/graph/DexType.java b/src/main/java/com/android/tools/r8/graph/DexType.java
index 36c45bc..e0e2bd6 100644
--- a/src/main/java/com/android/tools/r8/graph/DexType.java
+++ b/src/main/java/com/android/tools/r8/graph/DexType.java
@@ -13,6 +13,7 @@
 import com.android.tools.r8.ir.analysis.type.TypeElement;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.references.TypeReference;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
@@ -56,6 +57,10 @@
     return Reference.classFromDescriptor(toDescriptorString());
   }
 
+  public TypeReference asTypeReference() {
+    return Reference.typeFromDescriptor(toDescriptorString());
+  }
+
   public DynamicTypeWithUpperBound toDynamicType(AppView<AppInfoWithLiveness> appView) {
     return toDynamicType(appView, Nullability.maybeNull());
   }
diff --git a/src/main/java/com/android/tools/r8/graph/InvalidCode.java b/src/main/java/com/android/tools/r8/graph/InvalidCode.java
index 2b9de26..b3016c9 100644
--- a/src/main/java/com/android/tools/r8/graph/InvalidCode.java
+++ b/src/main/java/com/android/tools/r8/graph/InvalidCode.java
@@ -6,8 +6,8 @@
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
-import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 
 public class InvalidCode extends Code {
 
@@ -48,7 +48,7 @@
   }
 
   @Override
-  public String toString(DexEncodedMethod method, ClassNameMapper naming) {
+  public String toString(DexEncodedMethod method, RetracerForCodePrinting retracer) {
     StringBuilder builder = new StringBuilder();
     if (method != null) {
       builder.append(method.toSourceString()).append("\n");
diff --git a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
index d18e823..3ab128b 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
@@ -63,7 +63,6 @@
 import com.android.tools.r8.ir.code.Position.SourcePosition;
 import com.android.tools.r8.ir.code.ValueType;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
-import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.position.MethodPosition;
 import com.android.tools.r8.position.TextPosition;
@@ -74,6 +73,7 @@
 import com.android.tools.r8.utils.ExceptionUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Reporter;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringDiagnostic;
 import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import it.unimi.dsi.fastutil.ints.Int2ReferenceMap;
@@ -295,8 +295,8 @@
   }
 
   @Override
-  public String toString(DexEncodedMethod method, ClassNameMapper naming) {
-    return asCfCode().toString(method, naming);
+  public String toString(DexEncodedMethod method, RetracerForCodePrinting retracer) {
+    return asCfCode().toString(method, retracer);
   }
 
   protected BiFunction<String, String, LazyCfCode> createCodeLocator(ReparseContext context) {
diff --git a/src/main/java/com/android/tools/r8/graph/SmaliWriter.java b/src/main/java/com/android/tools/r8/graph/SmaliWriter.java
index edf7d58..0eff9d1 100644
--- a/src/main/java/com/android/tools/r8/graph/SmaliWriter.java
+++ b/src/main/java/com/android/tools/r8/graph/SmaliWriter.java
@@ -8,6 +8,7 @@
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.Timing;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -31,7 +32,7 @@
     } catch (IOException e) {
       throw new CompilationError("Failed to generate smali sting", e);
     }
-    return new String(os.toByteArray(), StandardCharsets.UTF_8);
+    return os.toString(StandardCharsets.UTF_8);
   }
 
   public static String getFileEnding() {
@@ -67,7 +68,12 @@
   @Override
   void writeMethod(ProgramMethod method, PrintStream ps) {
     ps.append("\n");
-    ps.append(method.getDefinition().toSmaliString(application.getProguardMap()));
+    ps.append(
+        method
+            .getDefinition()
+            .toSmaliString(
+                RetracerForCodePrinting.create(
+                    application.getProguardMap(), application.options.reporter)));
     ps.append("\n");
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java b/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java
index 789bb19..dc18cfe 100644
--- a/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java
+++ b/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java
@@ -19,8 +19,8 @@
 import com.android.tools.r8.ir.code.Position;
 import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
-import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import java.nio.ShortBuffer;
 import java.util.Objects;
@@ -237,7 +237,7 @@
   }
 
   @Override
-  public String toString(DexEncodedMethod method, ClassNameMapper naming) {
+  public String toString(DexEncodedMethod method, RetracerForCodePrinting retracer) {
     return "ThrowExceptionCode";
   }
 }
diff --git a/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java b/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java
index cac6f7a..661cefb 100644
--- a/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java
+++ b/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java
@@ -22,9 +22,9 @@
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.ThrowingMethodConversionOptions;
 import com.android.tools.r8.ir.conversion.SyntheticStraightLineSourceCode;
-import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.google.common.collect.ImmutableList;
 import java.nio.ShortBuffer;
@@ -266,7 +266,7 @@
   }
 
   @Override
-  public String toString(DexEncodedMethod method, ClassNameMapper naming) {
+  public String toString(DexEncodedMethod method, RetracerForCodePrinting retracer) {
     return "ThrowNullCode";
   }
 
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteHorizontalClassMergerCode.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteHorizontalClassMergerCode.java
index c9c8e34..abb1fbf 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteHorizontalClassMergerCode.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteHorizontalClassMergerCode.java
@@ -15,8 +15,8 @@
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
-import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 
 public abstract class IncompleteHorizontalClassMergerCode extends Code {
 
@@ -80,7 +80,7 @@
   public abstract String toString();
 
   @Override
-  public String toString(DexEncodedMethod method, ClassNameMapper naming) {
+  public String toString(DexEncodedMethod method, RetracerForCodePrinting retracer) {
     return toString();
   }
 }
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java
index 2e6cc06..6a030d7 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java
@@ -35,11 +35,11 @@
 import com.android.tools.r8.ir.code.Position.SyntheticPosition;
 import com.android.tools.r8.ir.code.Return;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
-import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.CfVersionUtils;
 import com.android.tools.r8.utils.IterableUtils;
 import com.android.tools.r8.utils.ListUtils;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
 import java.util.ArrayList;
@@ -311,7 +311,7 @@
     }
 
     @Override
-    public String toString(DexEncodedMethod method, ClassNameMapper naming) {
+    public String toString(DexEncodedMethod method, RetracerForCodePrinting retracer) {
       throw new Unreachable();
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java
index 2cab3fb..4a99fb4 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java
@@ -66,12 +66,12 @@
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore;
 import com.android.tools.r8.ir.optimize.outliner.OutlineCollection;
 import com.android.tools.r8.ir.optimize.outliner.Outliner;
-import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.InternalOptions.OutlineOptions;
 import com.android.tools.r8.utils.ListUtils;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.StringUtils.BraceType;
 import com.android.tools.r8.utils.ThreadUtils;
@@ -1830,7 +1830,7 @@
     }
 
     @Override
-    public String toString(DexEncodedMethod method, ClassNameMapper naming) {
+    public String toString(DexEncodedMethod method, RetracerForCodePrinting retracer) {
       return null;
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/code/CheckNotZeroCode.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/code/CheckNotZeroCode.java
index 6e187ae..4e7801c 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/code/CheckNotZeroCode.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/code/CheckNotZeroCode.java
@@ -19,9 +19,9 @@
 import com.android.tools.r8.ir.code.Return;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
 import com.android.tools.r8.ir.optimize.enums.EnumUnboxerImpl;
-import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.IteratorUtils;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 
 /**
  * A special code object used by enum unboxing that supplies IR from an existing method
@@ -128,7 +128,7 @@
   }
 
   @Override
-  public String toString(DexEncodedMethod method, ClassNameMapper naming) {
+  public String toString(DexEncodedMethod method, RetracerForCodePrinting retracer) {
     return toString();
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java
index 8c28b9e..ad0b54c 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java
@@ -21,8 +21,8 @@
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.ThrowingMethodConversionOptions;
 import com.android.tools.r8.ir.conversion.SourceCode;
-import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.RetracerForCodePrinting;
 import java.util.function.Consumer;
 
 public abstract class AbstractSynthesizedCode extends Code {
@@ -73,7 +73,7 @@
 
   @Override
   public final String toString() {
-    return toString(null, null);
+    return toString(null, RetracerForCodePrinting.empty());
   }
 
   @Override
@@ -101,7 +101,7 @@
   }
 
   @Override
-  public final String toString(DexEncodedMethod method, ClassNameMapper naming) {
+  public final String toString(DexEncodedMethod method, RetracerForCodePrinting retracer) {
     return this.getClass().getSimpleName();
   }
 
diff --git a/src/main/java/com/android/tools/r8/references/FieldReference.java b/src/main/java/com/android/tools/r8/references/FieldReference.java
index dab6fd8..90f4b91 100644
--- a/src/main/java/com/android/tools/r8/references/FieldReference.java
+++ b/src/main/java/com/android/tools/r8/references/FieldReference.java
@@ -65,6 +65,14 @@
 
   @Override
   public String toString() {
-    return getHolderClass().toString() + getFieldName() + ":" + getFieldType().getDescriptor();
+    return getHolderClass() + getFieldName() + ":" + getFieldType().getDescriptor();
+  }
+
+  public String toSourceString() {
+    return getFieldType().getTypeName()
+        + " "
+        + getHolderClass().getTypeName()
+        + "."
+        + getFieldName();
   }
 }
diff --git a/src/main/java/com/android/tools/r8/references/MethodReference.java b/src/main/java/com/android/tools/r8/references/MethodReference.java
index 5ef8596..3339916 100644
--- a/src/main/java/com/android/tools/r8/references/MethodReference.java
+++ b/src/main/java/com/android/tools/r8/references/MethodReference.java
@@ -5,7 +5,6 @@
 
 import com.android.tools.r8.Keep;
 import com.android.tools.r8.KeepForRetraceApi;
-import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.StringUtils.BraceType;
 import java.util.List;
@@ -78,8 +77,7 @@
   }
 
   public String getMethodDescriptor() {
-    return StringUtils.join(
-            "", ListUtils.map(getFormalTypes(), TypeReference::getDescriptor), BraceType.PARENS)
+    return StringUtils.join("", getFormalTypes(), TypeReference::getDescriptor, BraceType.PARENS)
         + (getReturnType() == null ? "V" : getReturnType().getDescriptor());
   }
 
@@ -87,4 +85,16 @@
   public String toString() {
     return getHolderClass() + getMethodName() + getMethodDescriptor();
   }
+
+  public String toSourceString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append(returnType == null ? "void" : returnType.getTypeName());
+    sb.append(" ");
+    sb.append(holderClass.getTypeName());
+    sb.append(".");
+    sb.append(methodName);
+    sb.append(
+        StringUtils.join(", ", getFormalTypes(), TypeReference::getTypeName, BraceType.PARENS));
+    return sb.toString();
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/retrace/RetracedClassReference.java b/src/main/java/com/android/tools/r8/retrace/RetracedClassReference.java
index 99e85be..5e6b29b 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetracedClassReference.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetracedClassReference.java
@@ -12,6 +12,8 @@
 
   String getTypeName();
 
+  String getDescriptor();
+
   String getBinaryName();
 
   RetracedTypeReference getRetracedType();
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassReferenceImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassReferenceImpl.java
index ef23ef1..d036009 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassReferenceImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassReferenceImpl.java
@@ -26,6 +26,11 @@
   }
 
   @Override
+  public String getDescriptor() {
+    return classReference.getDescriptor();
+  }
+
+  @Override
   public String getBinaryName() {
     return classReference.getBinaryName();
   }
diff --git a/src/main/java/com/android/tools/r8/utils/RetracerForCodePrinting.java b/src/main/java/com/android/tools/r8/utils/RetracerForCodePrinting.java
new file mode 100644
index 0000000..821be94
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/RetracerForCodePrinting.java
@@ -0,0 +1,175 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.utils;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.graph.DexField;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexReference;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.IndexedDexItem;
+import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.references.FieldReference;
+import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.retrace.RetraceClassElement;
+import com.android.tools.r8.retrace.RetraceElement;
+import com.android.tools.r8.retrace.RetraceFrameResult;
+import com.android.tools.r8.retrace.RetraceResult;
+import com.android.tools.r8.retrace.RetraceStackTraceContext;
+import com.android.tools.r8.retrace.RetracedFieldReference;
+import com.android.tools.r8.retrace.RetracedFieldReference.KnownRetracedFieldReference;
+import com.android.tools.r8.retrace.RetracedMethodReference;
+import com.android.tools.r8.retrace.RetracedMethodReference.KnownRetracedMethodReference;
+import com.android.tools.r8.retrace.Retracer;
+import com.android.tools.r8.retrace.internal.MappingSupplierInternalImpl;
+import com.android.tools.r8.retrace.internal.RetracerImpl;
+import java.util.OptionalInt;
+import java.util.function.Function;
+
+public class RetracerForCodePrinting {
+
+  private static final RetracerForCodePrinting EMPTY = new RetracerForCodePrinting(null);
+
+  public static RetracerForCodePrinting empty() {
+    return EMPTY;
+  }
+
+  private final Retracer retracer;
+
+  private RetracerForCodePrinting(Retracer retracer) {
+    this.retracer = retracer;
+  }
+
+  public static RetracerForCodePrinting create(
+      ClassNameMapper classNameMapper, DiagnosticsHandler handler) {
+    return classNameMapper == null
+        ? empty()
+        : new RetracerForCodePrinting(
+            RetracerImpl.createInternal(
+                MappingSupplierInternalImpl.createInternal(classNameMapper), handler));
+  }
+
+  public <T extends RetraceElement<?>> String joinAmbiguousResults(
+      RetraceResult<T> retraceResult, Function<T, String> nameToString) {
+    return StringUtils.join(" <OR> ", retraceResult.stream(), nameToString);
+  }
+
+  private String typeToString(
+      DexType type,
+      Function<DexType, String> noRetraceString,
+      Function<RetraceClassElement, String> retraceResult) {
+    return retracer == null
+        ? noRetraceString.apply(type)
+        : joinAmbiguousResults(retracer.retraceClass(type.asClassReference()), retraceResult);
+  }
+
+  public String toSourceString(DexType type) {
+    return typeToString(
+        type, DexType::toSourceString, element -> element.getRetracedClass().getTypeName());
+  }
+
+  public String toDescriptor(DexType type) {
+    return typeToString(
+        type, DexType::toDescriptorString, element -> element.getRetracedClass().getDescriptor());
+  }
+
+  private String retraceMethodToString(
+      DexMethod method,
+      Function<DexMethod, String> noRetraceString,
+      Function<KnownRetracedMethodReference, String> knownToString,
+      Function<RetracedMethodReference, String> unknownToString) {
+    if (retracer == null) {
+      return noRetraceString.apply(method);
+    }
+    // TODO(b/169953605): Use retracer.retraceMethod() when we have enough information.
+    MethodReference methodReference = method.asMethodReference();
+    RetraceFrameResult retraceFrameResult =
+        retracer
+            .retraceClass(methodReference.getHolderClass())
+            .lookupMethod(methodReference.getMethodName())
+            .narrowByPosition(RetraceStackTraceContext.empty(), OptionalInt.of(1));
+    return joinAmbiguousResults(
+        retraceFrameResult,
+        element -> {
+          if (element.isUnknown()) {
+            return unknownToString.apply(element.getTopFrame());
+          } else {
+            return knownToString.apply(element.getTopFrame().asKnown());
+          }
+        });
+  }
+
+  public String toSourceString(DexMethod method) {
+    return retraceMethodToString(
+        method,
+        DexMethod::toSourceString,
+        knownRetracedMethodReference ->
+            knownRetracedMethodReference.getMethodReference().toSourceString(),
+        unknown -> unknown.getHolderClass().getDescriptor() + " " + unknown.getMethodName());
+  }
+
+  public String toDescriptor(DexMethod method) {
+    return retraceMethodToString(
+        method,
+        m -> m.asMethodReference().toString(),
+        knownRetracedMethodReference ->
+            knownRetracedMethodReference.getMethodReference().toString(),
+        unknown -> unknown.getHolderClass().getDescriptor() + unknown.getMethodName());
+  }
+
+  private String retraceFieldToString(
+      DexField field,
+      Function<DexField, String> noRetraceString,
+      Function<KnownRetracedFieldReference, String> knownToString,
+      Function<RetracedFieldReference, String> unknownToString) {
+    if (retracer == null) {
+      return noRetraceString.apply(field);
+    }
+    // TODO(b/169953605): Use retracer.retraceField() when we have enough information.
+    FieldReference fieldReference = field.asFieldReference();
+    return joinAmbiguousResults(
+        retracer
+            .retraceClass(fieldReference.getHolderClass())
+            .lookupField(fieldReference.getFieldName()),
+        element -> {
+          if (element.isUnknown()) {
+            return unknownToString.apply(element.getField());
+          } else {
+            return knownToString.apply(element.getField().asKnown());
+          }
+        });
+  }
+
+  public String toSourceString(DexField field) {
+    return retraceFieldToString(
+        field,
+        f -> f.asFieldReference().toSourceString(),
+        known -> known.getFieldReference().toSourceString(),
+        unknown -> unknown.getHolderClass().getDescriptor() + " " + unknown.getFieldName());
+  }
+
+  public String toDescriptor(DexField field) {
+    return retraceFieldToString(
+        field,
+        f -> f.asFieldReference().toString(),
+        known -> known.getFieldReference().toString(),
+        unknown -> unknown.getHolderClass().getDescriptor() + unknown.getFieldName());
+  }
+
+  public String toDescriptor(IndexedDexItem item) {
+    if (!(item instanceof DexReference)) {
+      return item.toString();
+    }
+    return ((DexReference) item).apply(this::toDescriptor, this::toDescriptor, this::toDescriptor);
+  }
+
+  public String toSourceString(IndexedDexItem item) {
+    if (!(item instanceof DexReference)) {
+      return item.toSourceString();
+    }
+    return ((DexReference) item)
+        .apply(this::toSourceString, this::toSourceString, this::toSourceString);
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/utils/StringUtils.java b/src/main/java/com/android/tools/r8/utils/StringUtils.java
index f1e4e18..69cef74 100644
--- a/src/main/java/com/android/tools/r8/utils/StringUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/StringUtils.java
@@ -15,6 +15,8 @@
 import java.util.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 public class StringUtils {
   public static char[] EMPTY_CHAR_ARRAY = {};
@@ -143,6 +145,15 @@
     return join(separator, iterable, fn, BraceType.NONE);
   }
 
+  public static <T> String join(String separator, Stream<T> stream, Function<T, String> fn) {
+    return join(separator, stream.collect(Collectors.toList()), fn, BraceType.NONE);
+  }
+
+  public static <T> String join(
+      String separator, T[] elements, Function<T, String> fn, BraceType brace) {
+    return join(separator, Arrays.asList(elements), fn, brace);
+  }
+
   public static <T> String join(String separator, Iterable<T> iterable, BraceType brace) {
     return join(separator, iterable, Object::toString, brace);
   }