Merge "Refine inlining constraints with target holder."
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 0990f79..4025180 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
 
   // This field is accessed from release scripts using simple pattern matching.
   // Therefore, changing this field could break our release scripts.
-  public static final String LABEL = "1.3.8-dev";
+  public static final String LABEL = "1.3.9-dev";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstString.java b/src/main/java/com/android/tools/r8/cf/code/CfConstString.java
index 54ae1c6..b2114b3 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstString.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstString.java
@@ -13,7 +13,7 @@
 
 public class CfConstString extends CfInstruction {
 
-  private final DexString string;
+  private DexString string;
 
   public CfConstString(DexString string) {
     this.string = string;
@@ -23,6 +23,10 @@
     return string;
   }
 
+  public void setString(DexString string) {
+    this.string = string;
+  }
+
   @Override
   public void write(MethodVisitor visitor, NamingLens lens) {
     visitor.visitLdcInsn(string.toString());
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
index f276cb2..f5b0a31 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfBuilder.java
@@ -385,6 +385,9 @@
     boolean didPositionChange =
         position.isSome()
             && position != currentPosition
+            // Ignore synthetic positions prior to any actual position, except when inlined
+            // (that is, callerPosition != null).
+            && !(currentPosition.isNone() && position.synthetic && position.callerPosition == null)
             && (options.debug || instruction.instructionTypeCanThrow());
     if (!didLocalsChange && !didPositionChange) {
       return;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
index 92645c4..bc2222f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
@@ -182,7 +182,6 @@
   private CfState state;
   private final CfCode code;
   private final DexEncodedMethod method;
-  private final Position callerPosition;
   private final Origin origin;
 
   private final Reference2IntMap<CfLabel> labelOffsets = new Reference2IntOpenHashMap<>();
@@ -205,7 +204,6 @@
       boolean preserveCaller) {
     this.code = code;
     this.method = method;
-    this.callerPosition = callerPosition;
     this.origin = origin;
     int cfPositionCount = 0;
     for (int i = 0; i < code.getInstructions().size(); i++) {
@@ -328,7 +326,7 @@
   public void buildPrelude(IRBuilder builder) {
     assert !inPrelude;
     inPrelude = true;
-    state.buildPrelude();
+    state.buildPrelude(canonicalPositions.getPreamblePosition());
     setLocalVariableLists();
     buildArgumentInstructions(builder);
     recordStateForTarget(0, state.getSnapshot());
@@ -395,14 +393,8 @@
       if (instruction instanceof CfPosition) {
         CfPosition cfPosition = (CfPosition) instruction;
         Position position = cfPosition.getPosition();
-        Position newPosition =
-            canonicalPositions.getCanonical(
-                new Position(
-                    position.line,
-                    position.file,
-                    position.method,
-                    canonicalPositions.canonicalizeCallerPosition(position.callerPosition)));
-        CfPosition newCfPosition = new CfPosition(cfPosition.getLabel(), newPosition);
+        CfPosition newCfPosition =
+            new CfPosition(cfPosition.getLabel(), getCanonicalPosition(position));
         newCfPosition.buildIR(builder, state, this);
       } else {
         instruction.buildIR(builder, state, this);
@@ -441,7 +433,8 @@
     for (int i = 0; i < stack.length; i++) {
       stack[i] = convertUninitialized(frame.getStack().get(i));
     }
-    state.setStateFromFrame(locals, stack, getDebugPositionAtOffset(currentInstructionIndex));
+    state.setStateFromFrame(
+        locals, stack, getCanonicalDebugPositionAtOffset(currentInstructionIndex));
   }
 
   private DexType convertUninitialized(FrameType type) {
@@ -624,7 +617,7 @@
   }
 
   @Override
-  public Position getDebugPositionAtOffset(int offset) {
+  public Position getCanonicalDebugPositionAtOffset(int offset) {
     while (offset + 1 < code.getInstructions().size()) {
       CfInstruction insn = code.getInstructions().get(offset);
       if (!(insn instanceof CfLabel) && !(insn instanceof CfFrame)) {
@@ -636,13 +629,22 @@
       offset -= 1;
     }
     if (offset < 0) {
-      return Position.noneWithMethod(method.method, callerPosition);
+      return canonicalPositions.getPreamblePosition();
     }
-    return ((CfPosition) code.getInstructions().get(offset)).getPosition();
+    return getCanonicalPosition(((CfPosition) code.getInstructions().get(offset)).getPosition());
   }
 
   @Override
   public Position getCurrentPosition() {
     return state.getPosition();
   }
+
+  private Position getCanonicalPosition(Position position) {
+    return canonicalPositions.getCanonical(
+        new Position(
+            position.line,
+            position.file,
+            position.method,
+            canonicalPositions.canonicalizeCallerPosition(position.callerPosition)));
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfState.java b/src/main/java/com/android/tools/r8/ir/conversion/CfState.java
index 8174797..7f4ee72 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfState.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfState.java
@@ -74,8 +74,8 @@
 
   private static final int MAX_UPDATES = 4;
 
-  public void buildPrelude() {
-    current = new BaseSnapshot();
+  public void buildPrelude(Position preamblePosition) {
+    current = new BaseSnapshot(preamblePosition);
   }
 
   public void clear() {
@@ -92,9 +92,9 @@
     current = new BaseSnapshot(locals, stack, position);
   }
 
-  public void merge(Snapshot snapshot) {
+  public void merge(Snapshot snapshot, Position preamblePosition) {
     if (current == null) {
-      current = snapshot == null ? new BaseSnapshot() : snapshot;
+      current = snapshot == null ? new BaseSnapshot(preamblePosition) : snapshot;
     } else {
       current = merge(current, snapshot, origin);
     }
@@ -312,8 +312,8 @@
     final SlotType[] stack;
     final Position position;
 
-    BaseSnapshot() {
-      this(0, 0, Position.none());
+    BaseSnapshot(Position preamblePosition) {
+      this(0, 0, preamblePosition);
     }
 
     BaseSnapshot(int locals, int stack, Position position) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
index 9a9b836..10bf6a5 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
@@ -184,7 +184,7 @@
   }
 
   @Override
-  public Position getDebugPositionAtOffset(int offset) {
+  public Position getCanonicalDebugPositionAtOffset(int offset) {
     DexDebugEntry entry = getDebugEntryAtOffset(offset);
     return entry == null
         ? canonicalPositions.getPreamblePosition()
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index 963cf41..62450d4 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -592,7 +592,7 @@
     int moveExceptionDest = source.getMoveExceptionRegister(targetIndex);
     if (moveExceptionDest >= 0) {
       Value out = writeRegister(moveExceptionDest, ValueType.OBJECT, ThrowingInfo.NO_THROW, null);
-      Position position = source.getDebugPositionAtOffset(moveExceptionItem.targetOffset);
+      Position position = source.getCanonicalDebugPositionAtOffset(moveExceptionItem.targetOffset);
       MoveException moveException = new MoveException(out);
       moveException.setPosition(position);
       currentBlock.add(moveException);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index eef5967..00c3754 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexApplication.Builder;
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
@@ -51,6 +52,7 @@
 import com.android.tools.r8.ir.optimize.lambda.LambdaMerger;
 import com.android.tools.r8.ir.regalloc.LinearScanRegisterAllocator;
 import com.android.tools.r8.ir.regalloc.RegisterAllocator;
+import com.android.tools.r8.kotlin.KotlinInfo;
 import com.android.tools.r8.logging.Log;
 import com.android.tools.r8.naming.IdentifierNameStringMarker;
 import com.android.tools.r8.shaking.protolite.ProtoLitePruner;
@@ -647,9 +649,10 @@
     printC1VisualizerHeader(method);
     printMethod(code, "Initial IR (SSA)");
 
-    if (method.getCode() != null && method.getCode().isJarCode() &&
-        appInfo.definitionFor(method.method.holder).hasKotlinInfo()) {
-      computeKotlinNotNullParamHints(feedback, method, code);
+    DexClass holder = appInfo.definitionFor(method.method.holder);
+    if (method.getCode() != null && method.getCode().isJarCode()
+        && holder.hasKotlinInfo()) {
+      computeKotlinNotNullParamHints(feedback, holder.getKotlinInfo(), method, code);
     }
 
     if (options.canHaveArtStringNewInitBug()) {
@@ -807,8 +810,19 @@
   }
 
   private void computeKotlinNotNullParamHints(
-      OptimizationFeedback feedback, DexEncodedMethod method, IRCode code) {
-    // Try to infer Kotlin non-null parameter check to use it as a hint.
+      OptimizationFeedback feedback, KotlinInfo kotlinInfo, DexEncodedMethod method, IRCode code) {
+    // Use non-null parameter hints in Kotlin metadata if available.
+    if (kotlinInfo.hasNonNullParameterHints()) {
+      BitSet hintFromMetadata = kotlinInfo.lookupNonNullParameterHint(
+          method.method.name.toString(), method.method.proto.toDescriptorString());
+      if (hintFromMetadata != null) {
+        if (hintFromMetadata.length() > 0) {
+          feedback.setKotlinNotNullParamHints(method, hintFromMetadata);
+        }
+        return;
+      }
+    }
+    // Otherwise, fall back to inspecting the code.
     List<Value> arguments = code.collectArguments(true);
     BitSet paramsCheckedForNull = new BitSet();
     DexMethod checkParameterIsNotNull =
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
index 23d9a73..1170dab 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
@@ -493,7 +493,7 @@
       // Don't include line changes when processing a label. Doing so will end up emitting local
       // writes after the line has changed and thus causing locals to become visible too late.
       currentPosition =
-          getDebugPositionAtOffset(
+          getCanonicalDebugPositionAtOffset(
               ((instructionIndex > 0) && (insn instanceof LabelNode))
                   ? instructionIndex - 1
                   : instructionIndex);
@@ -2832,7 +2832,7 @@
   }
 
   @Override
-  public Position getDebugPositionAtOffset(int offset) {
+  public Position getCanonicalDebugPositionAtOffset(int offset) {
     if (offset == EXCEPTIONAL_SYNC_EXIT_OFFSET) {
       return getExceptionalExitPosition();
     }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index 1877053..e9b789a 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -39,17 +39,17 @@
 import com.android.tools.r8.ir.code.StaticPut;
 import com.android.tools.r8.ir.code.Value;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 public class LensCodeRewriter {
 
   private final GraphLense graphLense;
   private final AppInfoWithSubtyping appInfo;
 
-  private final Map<DexProto, DexProto> protoFixupCache = new HashMap<>();
+  private final Map<DexProto, DexProto> protoFixupCache = new ConcurrentHashMap<>();
 
   public LensCodeRewriter(GraphLense graphLense, AppInfoWithSubtyping appInfo) {
     this.graphLense = graphLense;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/SourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/SourceCode.java
index bf2b51f..2bc2aa1 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/SourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/SourceCode.java
@@ -27,7 +27,7 @@
 
   Position getCurrentPosition();
 
-  Position getDebugPositionAtOffset(int offset);
+  Position getCanonicalDebugPositionAtOffset(int offset);
 
   /**
    * Trace block structure of the source-program.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
index 73812ec..505d192 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
@@ -1107,7 +1107,7 @@
     }
 
     @Override
-    public Position getDebugPositionAtOffset(int offset) {
+    public Position getCanonicalDebugPositionAtOffset(int offset) {
       throw new Unreachable();
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java
index c64d8ed..991d371 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java
@@ -214,7 +214,7 @@
   }
 
   @Override
-  public Position getDebugPositionAtOffset(int offset) {
+  public Position getCanonicalDebugPositionAtOffset(int offset) {
     throw new Unreachable();
   }
 
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java
index 74184a5..d15ed5a 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java
@@ -4,7 +4,12 @@
 
 package com.android.tools.r8.kotlin;
 
+import static kotlinx.metadata.Flag.Property.IS_VAR;
+
 import kotlinx.metadata.KmClassVisitor;
+import kotlinx.metadata.KmConstructorVisitor;
+import kotlinx.metadata.KmFunctionVisitor;
+import kotlinx.metadata.KmPropertyVisitor;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
 
 public class KotlinClass extends KotlinInfo<KotlinClassMetadata.Class> {
@@ -20,13 +25,30 @@
   }
 
   @Override
-  void validateMetadata(KotlinClassMetadata.Class metadata) {
-    ClassMetadataVisitor visitor = new ClassMetadataVisitor();
+  void processMetadata(KotlinClassMetadata.Class metadata) {
     // To avoid lazy parsing/verifying metadata.
-    metadata.accept(visitor);
+    metadata.accept(new ClassVisitorForNonNullParameterHints());
   }
 
-  private static class ClassMetadataVisitor extends KmClassVisitor {
+  private class ClassVisitorForNonNullParameterHints extends KmClassVisitor {
+    @Override
+    public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
+      return new NonNullParameterHintCollector.FunctionVisitor(nonNullparamHints);
+    }
+
+    @Override
+    public KmConstructorVisitor visitConstructor(int ctorFlags) {
+      return new NonNullParameterHintCollector.ConstructorVisitor(nonNullparamHints);
+    }
+
+    @Override
+    public KmPropertyVisitor visitProperty(
+        int propertyFlags, String name, int getterFlags, int setterFlags) {
+      if (IS_VAR.invoke(propertyFlags)) {
+        return new NonNullParameterHintCollector.PropertyVisitor(nonNullparamHints);
+      }
+      return null;
+    }
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java
index 62db3d1..de8a12a 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java
@@ -20,7 +20,7 @@
   }
 
   @Override
-  void validateMetadata(KotlinClassMetadata.MultiFileClassFacade metadata) {
+  void processMetadata(KotlinClassMetadata.MultiFileClassFacade metadata) {
     // No worries about lazy parsing/verifying, since no API to explore metadata details.
   }
 
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java
index da66e6c..225e63a 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java
@@ -4,7 +4,11 @@
 
 package com.android.tools.r8.kotlin;
 
+import static kotlinx.metadata.Flag.Property.IS_VAR;
+
+import kotlinx.metadata.KmFunctionVisitor;
 import kotlinx.metadata.KmPackageVisitor;
+import kotlinx.metadata.KmPropertyVisitor;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
 
 public final class KotlinClassPart extends KotlinInfo<KotlinClassMetadata.MultiFileClassPart> {
@@ -21,12 +25,25 @@
   }
 
   @Override
-  void validateMetadata(KotlinClassMetadata.MultiFileClassPart metadata) {
+  void processMetadata(KotlinClassMetadata.MultiFileClassPart metadata) {
     // To avoid lazy parsing/verifying metadata.
-    metadata.accept(new MultiFileClassPartMetadataVisitor());
+    metadata.accept(new PackageVisitorForNonNullParameterHints());
   }
 
-  private static class MultiFileClassPartMetadataVisitor extends KmPackageVisitor {
+  private class PackageVisitorForNonNullParameterHints extends KmPackageVisitor {
+    @Override
+    public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
+      return new NonNullParameterHintCollector.FunctionVisitor(nonNullparamHints);
+    }
+
+    @Override
+    public KmPropertyVisitor visitProperty(
+        int propertyFlags, String name, int getterFlags, int setterFlags) {
+      if (IS_VAR.invoke(propertyFlags)) {
+        return new NonNullParameterHintCollector.PropertyVisitor(nonNullparamHints);
+      }
+      return null;
+    }
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java
index bcb70ed..2f9477e 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java
@@ -4,7 +4,11 @@
 
 package com.android.tools.r8.kotlin;
 
+import static kotlinx.metadata.Flag.Property.IS_VAR;
+
+import kotlinx.metadata.KmFunctionVisitor;
 import kotlinx.metadata.KmPackageVisitor;
+import kotlinx.metadata.KmPropertyVisitor;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
 
 public final class KotlinFile extends KotlinInfo<KotlinClassMetadata.FileFacade> {
@@ -21,12 +25,25 @@
   }
 
   @Override
-  void validateMetadata(KotlinClassMetadata.FileFacade metadata) {
+  void processMetadata(KotlinClassMetadata.FileFacade metadata) {
     // To avoid lazy parsing/verifying metadata.
-    metadata.accept(new FileFacadeMetadataVisitor());
+    metadata.accept(new PackageVisitorForNonNullParameterHints());
   }
 
-  private static class FileFacadeMetadataVisitor extends KmPackageVisitor {
+  private class PackageVisitorForNonNullParameterHints extends KmPackageVisitor {
+    @Override
+    public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
+      return new NonNullParameterHintCollector.FunctionVisitor(nonNullparamHints);
+    }
+
+    @Override
+    public KmPropertyVisitor visitProperty(
+        int propertyFlags, String name, int getterFlags, int setterFlags) {
+      if (IS_VAR.invoke(propertyFlags)) {
+        return new NonNullParameterHintCollector.PropertyVisitor(nonNullparamHints);
+      }
+      return null;
+    }
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
index 702e0eb..7cc8aa1 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
@@ -4,22 +4,25 @@
 
 package com.android.tools.r8.kotlin;
 
+import com.google.common.collect.HashBasedTable;
+import java.util.BitSet;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
 
 // Provides access to kotlin information.
 public abstract class KotlinInfo<MetadataKind extends KotlinClassMetadata> {
   MetadataKind metadata;
+  final HashBasedTable<String, String, BitSet> nonNullparamHints = HashBasedTable.create();
 
   KotlinInfo() {
   }
 
   KotlinInfo(MetadataKind metadata) {
-    validateMetadata(metadata);
+    processMetadata(metadata);
     this.metadata = metadata;
   }
 
-  // Subtypes will define how to validate the given metadata.
-  abstract void validateMetadata(MetadataKind metadata);
+  // Subtypes will define how to process the given metadata.
+  abstract void processMetadata(MetadataKind metadata);
 
   public enum Kind {
     Class, File, Synthetic, Part, Facade
@@ -66,4 +69,12 @@
   public KotlinClassFacade asClassFacade() {
     return null;
   }
+
+  public boolean hasNonNullParameterHints() {
+    return !nonNullparamHints.isEmpty();
+  }
+
+  public BitSet lookupNonNullParameterHint(String name, String descriptor) {
+    return nonNullparamHints.get(name, descriptor);
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java
index 4660800..fc11f8c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java
@@ -5,6 +5,7 @@
 package com.android.tools.r8.kotlin;
 
 import com.android.tools.r8.graph.DexClass;
+import kotlinx.metadata.KmFunctionVisitor;
 import kotlinx.metadata.KmLambdaVisitor;
 import kotlinx.metadata.jvm.KotlinClassMetadata;
 
@@ -32,21 +33,23 @@
   }
 
   private KotlinSyntheticClass(Flavour flavour, KotlinClassMetadata.SyntheticClass metadata) {
+    super(metadata);
     this.flavour = flavour;
-    validateMetadata(metadata);
-    this.metadata = metadata;
   }
 
   @Override
-  void validateMetadata(KotlinClassMetadata.SyntheticClass metadata) {
+  void processMetadata(KotlinClassMetadata.SyntheticClass metadata) {
     if (metadata.isLambda()) {
-      SyntheticClassMetadataVisitor visitor = new SyntheticClassMetadataVisitor();
       // To avoid lazy parsing/verifying metadata.
-      metadata.accept(visitor);
+      metadata.accept(new LambdaVisitorForNonNullParameterHints());
     }
   }
 
-  private static class SyntheticClassMetadataVisitor extends KmLambdaVisitor {
+  private class LambdaVisitorForNonNullParameterHints extends KmLambdaVisitor {
+    @Override
+    public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
+      return new NonNullParameterHintCollector.FunctionVisitor(nonNullparamHints);
+    }
   }
 
   public boolean isLambda() {
diff --git a/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java b/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java
new file mode 100644
index 0000000..21b9409
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java
@@ -0,0 +1,184 @@
+// Copyright (c) 2018, 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.kotlin;
+
+import static kotlinx.metadata.Flag.Type.IS_NULLABLE;
+
+import com.google.common.collect.HashBasedTable;
+import java.util.BitSet;
+import kotlinx.metadata.KmConstructorExtensionVisitor;
+import kotlinx.metadata.KmConstructorVisitor;
+import kotlinx.metadata.KmExtensionType;
+import kotlinx.metadata.KmFunctionExtensionVisitor;
+import kotlinx.metadata.KmFunctionVisitor;
+import kotlinx.metadata.KmPropertyExtensionVisitor;
+import kotlinx.metadata.KmPropertyVisitor;
+import kotlinx.metadata.KmTypeVisitor;
+import kotlinx.metadata.KmValueParameterVisitor;
+import kotlinx.metadata.jvm.JvmConstructorExtensionVisitor;
+import kotlinx.metadata.jvm.JvmFieldSignature;
+import kotlinx.metadata.jvm.JvmFunctionExtensionVisitor;
+import kotlinx.metadata.jvm.JvmMethodSignature;
+import kotlinx.metadata.jvm.JvmPropertyExtensionVisitor;
+
+class NonNullParameterHintCollector {
+
+  static class FunctionVisitor extends KmFunctionVisitor {
+
+    private final HashBasedTable<String, String, BitSet> paramHints;
+
+    private BitSet paramHint = new BitSet();
+    private int paramIndex = 0;
+    private String name = "";
+    private String descriptor = "";
+
+    FunctionVisitor(HashBasedTable<String, String, BitSet> paramHints) {
+      this.paramHints = paramHints;
+    }
+
+    @Override
+    public KmTypeVisitor visitReceiverParameterType(int typeFlags) {
+      if (!IS_NULLABLE.invoke(typeFlags)) {
+        paramHint.set(paramIndex);
+      }
+      paramIndex++;
+      return null;
+    }
+
+    @Override
+    public KmValueParameterVisitor visitValueParameter(int paramFlags, String paramName) {
+      return new KmValueParameterVisitor() {
+        @Override
+        public KmTypeVisitor visitType(int typeFlags) {
+          if (!IS_NULLABLE.invoke(typeFlags)) {
+            paramHint.set(paramIndex);
+          }
+          paramIndex++;
+          return null;
+        }
+      };
+    }
+
+    @Override
+    public KmFunctionExtensionVisitor visitExtensions(KmExtensionType type) {
+      if (type != JvmFunctionExtensionVisitor.TYPE) {
+        return null;
+      }
+      return new JvmFunctionExtensionVisitor() {
+        @Override
+        public void visit(JvmMethodSignature desc) {
+          name = desc.getName();
+          descriptor = desc.getDesc();
+        }
+      };
+    }
+
+    @Override
+    public void visitEnd() {
+      if (name.isEmpty() || descriptor.isEmpty()) {
+        return;
+      }
+      paramHints.put(name, descriptor, paramHint);
+    }
+  }
+
+  static class ConstructorVisitor extends KmConstructorVisitor {
+    private final HashBasedTable<String, String, BitSet> paramHints;
+
+    private BitSet paramHint = new BitSet();
+    private int paramIndex = 0;
+    private final String name = "<init>";
+    private String descriptor = "";
+
+    ConstructorVisitor(HashBasedTable<String, String, BitSet> paramHints) {
+      this.paramHints = paramHints;
+    }
+
+    @Override
+    public KmValueParameterVisitor visitValueParameter(int paramFlags, String paramName) {
+      return new KmValueParameterVisitor() {
+        @Override
+        public KmTypeVisitor visitType(int typeFlags) {
+          if (!IS_NULLABLE.invoke(typeFlags)) {
+            paramHint.set(paramIndex);
+          }
+          paramIndex++;
+          return null;
+        }
+      };
+    }
+
+    @Override
+    public KmConstructorExtensionVisitor visitExtensions(KmExtensionType type) {
+      if (type != JvmConstructorExtensionVisitor.TYPE) {
+        return null;
+      }
+      return new JvmConstructorExtensionVisitor() {
+        @Override
+        public void visit(JvmMethodSignature desc) {
+          assert name.equals(desc.getName());
+          descriptor = desc.getDesc();
+        }
+      };
+    }
+
+    @Override
+    public void visitEnd() {
+      if (descriptor.isEmpty()) {
+        return;
+      }
+      paramHints.put(name, descriptor, paramHint);
+    }
+  }
+
+  static class PropertyVisitor extends KmPropertyVisitor {
+    private final HashBasedTable<String, String, BitSet> paramHints;
+
+    private BitSet paramHint = new BitSet();
+    private int paramIndex = 0;
+    private String name = "";
+    private String descriptor = "";
+
+    PropertyVisitor(HashBasedTable<String, String, BitSet> paramHints) {
+      this.paramHints = paramHints;
+    }
+
+    @Override
+    public KmTypeVisitor visitReturnType(int typeFlags) {
+      if (!IS_NULLABLE.invoke(typeFlags)) {
+        paramHint.set(paramIndex);
+      }
+      paramIndex++;
+      return null;
+    }
+
+    @Override
+    public KmPropertyExtensionVisitor visitExtensions(KmExtensionType type) {
+      if (type != JvmPropertyExtensionVisitor.TYPE) {
+        return null;
+      }
+      return new JvmPropertyExtensionVisitor() {
+        @Override
+        public void visit(
+            JvmFieldSignature fieldDesc,
+            JvmMethodSignature getterDesc,
+            JvmMethodSignature setterDesc) {
+          if (setterDesc != null) {
+            name = setterDesc.getName();
+            descriptor = setterDesc.getDesc();
+          }
+        }
+      };
+    }
+
+    @Override
+    public void visitEnd() {
+      if (name.isEmpty() || descriptor.isEmpty()) {
+        return;
+      }
+      paramHints.put(name, descriptor, paramHint);
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
index 2fd66d0..d92de6b 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
@@ -5,9 +5,12 @@
 
 import static com.android.tools.r8.utils.DescriptorUtils.descriptorToJavaType;
 
+import com.android.tools.r8.cf.code.CfConstString;
+import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.code.ConstString;
 import com.android.tools.r8.code.ConstStringJumbo;
 import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.graph.CfCode;
 import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedField;
@@ -34,9 +37,7 @@
   private final Set<DexItem> identifierNameStrings;
 
   IdentifierMinifier(
-      AppInfoWithLiveness appInfo,
-      ProguardClassFilter adaptClassStrings,
-      NamingLens lens) {
+      AppInfoWithLiveness appInfo, ProguardClassFilter adaptClassStrings, NamingLens lens) {
     this.appInfo = appInfo;
     this.adaptClassStrings = adaptClassStrings;
     this.lens = lens;
@@ -86,17 +87,29 @@
     if (code == null) {
       return;
     }
-    assert code.isDexCode();
-    DexCode dexCode = code.asDexCode();
-    for (Instruction instr : dexCode.instructions) {
-      if (instr instanceof ConstString) {
-        ConstString cnst = (ConstString) instr;
-        DexString dexString = cnst.getString();
-        cnst.BBBB = getRenamedStringLiteral(dexString);
-      } else if (instr instanceof ConstStringJumbo) {
-        ConstStringJumbo cnst = (ConstStringJumbo) instr;
-        DexString dexString = cnst.getString();
-        cnst.BBBBBBBB = getRenamedStringLiteral(dexString);
+    if (code.isDexCode()) {
+      DexCode dexCode = code.asDexCode();
+      for (Instruction instr : dexCode.instructions) {
+        if (instr instanceof ConstString) {
+          ConstString cnst = (ConstString) instr;
+          DexString dexString = cnst.getString();
+          cnst.BBBB = getRenamedStringLiteral(dexString);
+        } else if (instr instanceof ConstStringJumbo) {
+          ConstStringJumbo cnst = (ConstStringJumbo) instr;
+          DexString dexString = cnst.getString();
+          cnst.BBBBBBBB = getRenamedStringLiteral(dexString);
+        }
+      }
+    } else {
+      assert code.isCfCode();
+      CfCode cfCode = code.asCfCode();
+
+      for (CfInstruction instr : cfCode.getInstructions()) {
+        if (instr instanceof CfConstString) {
+          CfConstString cnst = (CfConstString) instr;
+          DexString dexString = cnst.getString();
+          cnst.setString(getRenamedStringLiteral(dexString));
+        }
       }
     }
   }
@@ -153,19 +166,32 @@
     if (code == null) {
       return;
     }
-    assert code.isDexCode();
-    DexCode dexCode = code.asDexCode();
-    for (Instruction instr : dexCode.instructions) {
-      if (instr instanceof ConstString
-          && ((ConstString) instr).getString() instanceof DexItemBasedString) {
-        ConstString cnst = (ConstString) instr;
-        DexItemBasedString itemBasedString = (DexItemBasedString) cnst.getString();
-        cnst.BBBB = materialize(itemBasedString);
-      } else if (instr instanceof ConstStringJumbo
-          && ((ConstStringJumbo) instr).getString() instanceof DexItemBasedString) {
-        ConstStringJumbo cnst = (ConstStringJumbo) instr;
-        DexItemBasedString itemBasedString = (DexItemBasedString) cnst.getString();
-        cnst.BBBBBBBB = materialize(itemBasedString);
+    if (code.isDexCode()) {
+      DexCode dexCode = code.asDexCode();
+      for (Instruction instr : dexCode.instructions) {
+        if (instr instanceof ConstString
+            && ((ConstString) instr).getString() instanceof DexItemBasedString) {
+          ConstString cnst = (ConstString) instr;
+          DexItemBasedString itemBasedString = (DexItemBasedString) cnst.getString();
+          cnst.BBBB = materialize(itemBasedString);
+        } else if (instr instanceof ConstStringJumbo
+            && ((ConstStringJumbo) instr).getString() instanceof DexItemBasedString) {
+          ConstStringJumbo cnst = (ConstStringJumbo) instr;
+          DexItemBasedString itemBasedString = (DexItemBasedString) cnst.getString();
+          cnst.BBBBBBBB = materialize(itemBasedString);
+        }
+      }
+    } else {
+      assert code.isCfCode();
+      CfCode cfCode = code.asCfCode();
+
+      for (CfInstruction instr : cfCode.getInstructions()) {
+        if (instr instanceof CfConstString
+            && ((CfConstString) instr).getString() instanceof DexItemBasedString) {
+          CfConstString cnst = (CfConstString) instr;
+          DexItemBasedString itemBasedString = (DexItemBasedString) cnst.getString();
+          cnst.setString(materialize(itemBasedString));
+        }
       }
     }
   }
@@ -184,5 +210,4 @@
       return lens.lookupName((DexField) itemBasedString.basedOn);
     }
   }
-
 }
diff --git a/src/test/java/com/android/tools/r8/CfFrontendExamplesTest.java b/src/test/java/com/android/tools/r8/CfFrontendExamplesTest.java
index 4f749b5..70e8445 100644
--- a/src/test/java/com/android/tools/r8/CfFrontendExamplesTest.java
+++ b/src/test/java/com/android/tools/r8/CfFrontendExamplesTest.java
@@ -303,6 +303,7 @@
     R8Command command =
         R8Command.builder()
             .addProgramFiles(inputJar)
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setMode(CompilationMode.DEBUG)
             .setOutput(outputJar, OutputMode.ClassFile)
             .build();
diff --git a/src/test/java/com/android/tools/r8/R8CFExamplesTests.java b/src/test/java/com/android/tools/r8/R8CFExamplesTests.java
index 377bfc0..2dbfb37 100644
--- a/src/test/java/com/android/tools/r8/R8CFExamplesTests.java
+++ b/src/test/java/com/android/tools/r8/R8CFExamplesTests.java
@@ -101,7 +101,7 @@
     Path outputJar = temp.getRoot().toPath().resolve(outputName);
     ToolHelper.runR8(
         R8Command.builder()
-            .addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setMode(mode)
             .addProgramFiles(inputJar)
             .setOutput(outputJar, OutputMode.ClassFile)
diff --git a/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
index c773989..f0e758d 100644
--- a/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
@@ -8,8 +8,7 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Path;
@@ -37,7 +36,7 @@
       for (UnaryOperator<R8Command.Builder> transformation : builderTransformations) {
         builder = transformation.apply(builder);
       }
-      builder.addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P));
+      builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
       R8Command command =
           builder.addProgramFiles(inputFile).setOutput(out, OutputMode.ClassFile).build();
       ToolHelper.runR8(command, this::combinedOptionConsumer);
@@ -62,8 +61,8 @@
       }
 
       if (!dexInspectorChecks.isEmpty()) {
-        DexInspector inspector = new DexInspector(out);
-        for (Consumer<DexInspector> check : dexInspectorChecks) {
+        CodeInspector inspector = new CodeInspector(out);
+        for (Consumer<CodeInspector> check : dexInspectorChecks) {
           check.accept(inspector);
         }
       }
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index 801abae..180a5f8 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -22,7 +22,7 @@
 import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
 import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.base.Charsets;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableListMultimap;
@@ -2059,10 +2059,10 @@
 
   private void failWithDexDiff(File originalFile, File processedFile)
       throws IOException, ExecutionException {
-    DexInspector inspectOriginal =
-        new DexInspector(originalFile.toPath().toAbsolutePath());
-    DexInspector inspectProcessed =
-        new DexInspector(processedFile.toPath().toAbsolutePath());
+    CodeInspector inspectOriginal =
+        new CodeInspector(originalFile.toPath().toAbsolutePath());
+    CodeInspector inspectProcessed =
+        new CodeInspector(processedFile.toPath().toAbsolutePath());
     StringBuilder builderOriginal = new StringBuilder();
     StringBuilder builderProcessed = new StringBuilder();
     inspectOriginal.forAllClasses((clazz) -> builderOriginal.append(clazz.dumpMethods()));
@@ -2077,10 +2077,10 @@
     List<ComparisonFailure> errors;
     try {
       // Parse all the verification errors.
-      DexInspector processed = new DexInspector(processedFile.toPath());
-      DexInspector original = DEX_COMPARE_WITH_DEX_REFERENCE_ON_FAILURE
-          ? new DexInspector(referenceFile.toPath())
-          : new DexInspector(inputFiles.stream().map(Paths::get).collect(Collectors.toList()));
+      CodeInspector processed = new CodeInspector(processedFile.toPath());
+      CodeInspector original = DEX_COMPARE_WITH_DEX_REFERENCE_ON_FAILURE
+          ? new CodeInspector(referenceFile.toPath())
+          : new CodeInspector(inputFiles.stream().map(Paths::get).collect(Collectors.toList()));
       List<ArtErrorInfo> errorInfo = ArtErrorParser.parse(verificationError.getMessage());
       errors = ListUtils.map(errorInfo, (error) ->
           new ComparisonFailure(
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
index 36a5fb3..71f4559 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
@@ -12,8 +12,8 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.OffOrAuto;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
@@ -174,7 +174,7 @@
         .run();
   }
 
-  private void checkLambdaCount(DexInspector inspector, int expectedCount, String prefix) {
+  private void checkLambdaCount(CodeInspector inspector, int expectedCount, String prefix) {
     int count = 0;
     for (FoundClassSubject clazz : inspector.allClasses()) {
       if (clazz.isSynthesizedJavaLambdaClass() &&
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesCommon.java b/src/test/java/com/android/tools/r8/R8RunExamplesCommon.java
index 3d3b4e7..008c6b9 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesCommon.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesCommon.java
@@ -161,11 +161,15 @@
         break;
       }
       case R8: {
-        R8Command command =
-            addInputFile(R8Command.builder())
-                .setOutput(getOutputFile(), outputMode)
-                .setMode(mode)
-                .build();
+          R8Command command =
+              addInputFile(R8Command.builder())
+                  .addLibraryFiles(
+                      output == Output.CF
+                          ? ToolHelper.getJava8RuntimeJar()
+                          : ToolHelper.getDefaultAndroidJar())
+                  .setOutput(getOutputFile(), outputMode)
+                  .setMode(mode)
+                  .build();
         ExceptionUtils.withR8CompilationHandler(
             command.getReporter(),
             () ->
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
index 2a17917..f638575 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
@@ -17,11 +17,11 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.OffOrAuto;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
-import com.android.tools.r8.utils.dexinspector.FoundMethodSubject;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InvokeInstructionSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.ByteStreams;
@@ -62,7 +62,7 @@
     AndroidApiLevel androidJarVersion = null;
 
     final List<Consumer<InternalOptions>> optionConsumers = new ArrayList<>();
-    final List<Consumer<DexInspector>> dexInspectorChecks = new ArrayList<>();
+    final List<Consumer<CodeInspector>> dexInspectorChecks = new ArrayList<>();
     final List<UnaryOperator<B>> builderTransformations = new ArrayList<>();
 
     TestRunner(String testName, String packageName, String mainClass) {
@@ -73,7 +73,7 @@
 
     abstract C self();
 
-    C withDexCheck(Consumer<DexInspector> check) {
+    C withDexCheck(Consumer<CodeInspector> check) {
       dexInspectorChecks.add(check);
       return self();
     }
@@ -155,8 +155,8 @@
       }
 
       if (!dexInspectorChecks.isEmpty()) {
-        DexInspector inspector = new DexInspector(out);
-        for (Consumer<DexInspector> check : dexInspectorChecks) {
+        CodeInspector inspector = new CodeInspector(out);
+        for (Consumer<CodeInspector> check : dexInspectorChecks) {
           check.accept(inspector);
         }
       }
@@ -495,10 +495,10 @@
             mainDexClasses);
 
     // Collect main dex types.
-    DexInspector fullInspector =  getMainDexInspector(fullDexes);
-    DexInspector indexedIntermediateInspector =
+    CodeInspector fullInspector =  getMainDexInspector(fullDexes);
+    CodeInspector indexedIntermediateInspector =
         getMainDexInspector(dexesThroughIndexedIntermediate);
-    DexInspector filePerInputClassIntermediateInspector =
+    CodeInspector filePerInputClassIntermediateInspector =
         getMainDexInspector(dexesThroughFilePerInputClassIntermediate);
     Collection<String> fullMainClasses = new HashSet<>();
     fullInspector.forAllClasses(
@@ -578,12 +578,12 @@
     }
   }
 
-  protected DexInspector getMainDexInspector(Path zip)
+  protected CodeInspector getMainDexInspector(Path zip)
       throws ZipException, IOException, ExecutionException {
     try (ZipFile zipFile = new ZipFile(zip.toFile(), StandardCharsets.UTF_8)) {
       try (InputStream in =
           zipFile.getInputStream(zipFile.getEntry(ToolHelper.DEFAULT_DEX_FILENAME))) {
-        return new DexInspector(
+        return new CodeInspector(
             AndroidApp.builder()
                 .addDexProgramData(ByteStreams.toByteArray(in), Origin.unknown())
                 .build());
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
index aa17280..7f15eca 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
@@ -16,10 +16,10 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.OffOrAuto;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
-import com.android.tools.r8.utils.dexinspector.FoundMethodSubject;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.ByteStreams;
@@ -57,7 +57,7 @@
     Integer androidJarVersion = null;
 
     final List<Consumer<InternalOptions>> optionConsumers = new ArrayList<>();
-    final List<Consumer<DexInspector>> dexInspectorChecks = new ArrayList<>();
+    final List<Consumer<CodeInspector>> dexInspectorChecks = new ArrayList<>();
     final List<UnaryOperator<B>> builderTransformations = new ArrayList<>();
 
     TestRunner(String testName, String packageName, String mainClass) {
@@ -68,7 +68,7 @@
 
     abstract C self();
 
-    C withDexCheck(Consumer<DexInspector> check) {
+    C withDexCheck(Consumer<CodeInspector> check) {
       dexInspectorChecks.add(check);
       return self();
     }
@@ -150,8 +150,8 @@
       }
 
       if (!dexInspectorChecks.isEmpty()) {
-        DexInspector inspector = new DexInspector(out);
-        for (Consumer<DexInspector> check : dexInspectorChecks) {
+        CodeInspector inspector = new CodeInspector(out);
+        for (Consumer<CodeInspector> check : dexInspectorChecks) {
           check.accept(inspector);
         }
       }
@@ -255,12 +255,12 @@
     }
   }
 
-  protected DexInspector getMainDexInspector(Path zip)
+  protected CodeInspector getMainDexInspector(Path zip)
       throws ZipException, IOException, ExecutionException {
     try (ZipFile zipFile = new ZipFile(zip.toFile(), StandardCharsets.UTF_8)) {
       try (InputStream in =
           zipFile.getInputStream(zipFile.getEntry(ToolHelper.DEFAULT_DEX_FILENAME))) {
-        return new DexInspector(
+        return new CodeInspector(
             AndroidApp.builder()
                 .addDexProgramData(ByteStreams.toByteArray(in), Origin.unknown())
                 .build());
diff --git a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
index d1894fb..f149cba 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
@@ -6,7 +6,7 @@
 
 import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
 import static com.android.tools.r8.utils.FileUtils.ZIP_EXTENSION;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
@@ -17,12 +17,12 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.OffOrAuto;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
-import com.android.tools.r8.utils.dexinspector.FoundMethodSubject;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.io.IOException;
@@ -54,7 +54,7 @@
     Integer androidJarVersion = null;
 
     final List<Consumer<InternalOptions>> optionConsumers = new ArrayList<>();
-    final List<Consumer<DexInspector>> dexInspectorChecks = new ArrayList<>();
+    final List<Consumer<CodeInspector>> dexInspectorChecks = new ArrayList<>();
     final List<UnaryOperator<B>> builderTransformations = new ArrayList<>();
 
     TestRunner(String testName, String packageName, String mainClass) {
@@ -65,7 +65,7 @@
 
     abstract C self();
 
-    C withDexCheck(Consumer<DexInspector> check) {
+    C withDexCheck(Consumer<CodeInspector> check) {
       dexInspectorChecks.add(check);
       return self();
     }
@@ -147,8 +147,8 @@
       }
 
       if (!dexInspectorChecks.isEmpty()) {
-        DexInspector inspector = new DexInspector(out);
-        for (Consumer<DexInspector> check : dexInspectorChecks) {
+        CodeInspector inspector = new CodeInspector(out);
+        for (Consumer<CodeInspector> check : dexInspectorChecks) {
           check.accept(inspector);
         }
       }
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 2d951fa..d5ef221 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -25,9 +25,9 @@
 import com.android.tools.r8.utils.PreloadedClassFileProvider;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
 import com.android.tools.r8.utils.ZipUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
@@ -533,6 +533,25 @@
     return result.stdout;
   }
 
+  /** Run application on Java with the specified main class and provided arguments. */
+  protected String runOnJava(AndroidApp app, Class mainClass, String... args) throws IOException {
+    return runOnJava(app, mainClass, Arrays.asList(args));
+  }
+
+  /** Run application on Java with the specified main class and provided arguments. */
+  protected String runOnJava(AndroidApp app, Class mainClass, List<String> args)
+      throws IOException {
+    return runOnJava(app, mainClass.getCanonicalName(), args);
+  }
+
+  /** Run application on Java with the specified main class and provided arguments. */
+  protected String runOnJava(AndroidApp app, String mainClass, List<String> args)
+      throws IOException {
+    Path out = File.createTempFile("junit", ".zip", temp.getRoot()).toPath();
+    app.writeToZip(out, OutputMode.ClassFile);
+    return ToolHelper.runJava(out, mainClass).stdout;
+  }
+
   protected ProcessResult runOnJavaRaw(String main, byte[]... classes) throws IOException {
     return runOnJavaRaw(main, Arrays.asList(classes));
   }
@@ -580,7 +599,7 @@
   }
 
   protected DexEncodedMethod getMethod(
-      DexInspector inspector,
+      CodeInspector inspector,
       String className,
       String returnType,
       String methodName,
@@ -599,7 +618,7 @@
       String methodName,
       List<String> parameters) {
     try {
-      DexInspector inspector = new DexInspector(application);
+      CodeInspector inspector = new CodeInspector(application);
       return getMethod(inspector, className, returnType, methodName, parameters);
     } catch (Exception e) {
       return null;
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 2767df7..2499b5f 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -533,6 +533,10 @@
     return getArtDir(version) + "/" + binary;
   }
 
+  public static Path getJava8RuntimeJar() {
+    return Paths.get(JAVA_8_RUNTIME);
+  }
+
   public static Path getDefaultAndroidJar() {
     return getAndroidJar(AndroidApiLevel.getDefault());
   }
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java
index 706b50b..80541e8 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.accessrelaxation;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPublic;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPublic;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
@@ -16,9 +16,9 @@
 import com.android.tools.r8.VmTestRunner;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import org.junit.runner.RunWith;
 
 @RunWith(VmTestRunner.class)
@@ -57,15 +57,15 @@
     assertEquals(jvmOutput, adjustedArtOutput);
   }
 
-  static void assertPublic(DexInspector dexInspector, Class clazz, MethodSignature signature) {
-    ClassSubject classSubject = dexInspector.clazz(clazz);
+  static void assertPublic(CodeInspector codeInspector, Class clazz, MethodSignature signature) {
+    ClassSubject classSubject = codeInspector.clazz(clazz);
     assertThat(classSubject, isPresent());
     MethodSubject methodSubject = classSubject.method(signature);
     assertThat(methodSubject, isPublic());
   }
 
-  static void assertNotPublic(DexInspector dexInspector, Class clazz, MethodSignature signature) {
-    ClassSubject classSubject = dexInspector.clazz(clazz);
+  static void assertNotPublic(CodeInspector codeInspector, Class clazz, MethodSignature signature) {
+    ClassSubject classSubject = codeInspector.clazz(clazz);
     assertThat(classSubject, isPresent());
     MethodSubject methodSubject = classSubject.method(signature);
     assertThat(methodSubject, not(isPublic()));
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java
index 713c467..d90ae45 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.accessrelaxation;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
@@ -11,8 +11,8 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import java.util.List;
@@ -185,9 +185,9 @@
     });
     compareJvmAndArt(app, mainClass);
 
-    DexInspector dexInspector = new DexInspector(app);
+    CodeInspector codeInspector = new CodeInspector(app);
     for (Class clazz : CLASSES) {
-      ClassSubject classSubject = dexInspector.clazz(clazz);
+      ClassSubject classSubject = codeInspector.clazz(clazz);
       assertThat(classSubject, isPresent());
       classSubject.getDexClass().forEachMethod(m -> {
         assertTrue(!m.isInstanceInitializer() || m.isPublicMethod());
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java
index 4459699..787568b 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.accessrelaxation;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -24,8 +24,8 @@
 import com.android.tools.r8.smali.SmaliBuilder.MethodSignature;
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import java.util.function.Consumer;
@@ -62,7 +62,7 @@
   private void run(
       SmaliBuilder builder,
       String expectedException,
-      Consumer<DexInspector> inspectorConsumer) throws Exception {
+      Consumer<CodeInspector> inspectorConsumer) throws Exception {
     AndroidApp app = buildApplication(builder);
     List<String> pgConfigs = ImmutableList.of(
         keepMainProguardConfiguration(CLASS_NAME),
@@ -82,7 +82,7 @@
       assertEquals(1, artResult.exitCode);
       assertThat(artResult.stderr, containsString(expectedException));
     }
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     inspectorConsumer.accept(inspector);
   }
 
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java
index 9bfd4e2..5b641dc 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java
@@ -18,7 +18,7 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
@@ -62,20 +62,20 @@
     AndroidApp app = ToolHelper.runR8(builder.build());
     compareJvmAndArt(app, mainClass);
 
-    DexInspector dexInspector = new DexInspector(app);
-    assertPublic(dexInspector, A.class,
+    CodeInspector codeInspector = new CodeInspector(app);
+    assertPublic(codeInspector, A.class,
         new MethodSignature("baz", STRING, ImmutableList.of()));
-    assertPublic(dexInspector, A.class,
+    assertPublic(codeInspector, A.class,
         new MethodSignature("bar", STRING, ImmutableList.of()));
-    assertPublic(dexInspector, A.class,
+    assertPublic(codeInspector, A.class,
         new MethodSignature("bar", STRING, ImmutableList.of("int")));
-    assertPublic(dexInspector, A.class,
+    assertPublic(codeInspector, A.class,
         new MethodSignature("blah", STRING, ImmutableList.of("int")));
 
-    assertPublic(dexInspector, B.class,
+    assertPublic(codeInspector, B.class,
         new MethodSignature("blah", STRING, ImmutableList.of("int")));
 
-    assertPublic(dexInspector, BB.class,
+    assertPublic(codeInspector, BB.class,
         new MethodSignature("blah", STRING, ImmutableList.of("int")));
   }
 
@@ -110,24 +110,24 @@
     AndroidApp app = ToolHelper.runR8(builder.build());
     compareJvmAndArt(app, mainClass);
 
-    DexInspector dexInspector = new DexInspector(app);
-    assertPublic(dexInspector, Base.class,
+    CodeInspector codeInspector = new CodeInspector(app);
+    assertPublic(codeInspector, Base.class,
         new MethodSignature("foo", STRING, ImmutableList.of()));
 
     // Base#foo?() can't be publicized due to Itf<1>#foo<1>().
-    assertNotPublic(dexInspector, Base.class,
+    assertNotPublic(codeInspector, Base.class,
         new MethodSignature("foo1", STRING, ImmutableList.of()));
-    assertNotPublic(dexInspector, Base.class,
+    assertNotPublic(codeInspector, Base.class,
         new MethodSignature("foo2", STRING, ImmutableList.of()));
 
     // Sub?#bar1(int) can be publicized as they don't bother each other.
-    assertPublic(dexInspector, Sub1.class,
+    assertPublic(codeInspector, Sub1.class,
         new MethodSignature("bar1", STRING, ImmutableList.of("int")));
-    assertPublic(dexInspector, Sub2.class,
+    assertPublic(codeInspector, Sub2.class,
         new MethodSignature("bar1", STRING, ImmutableList.of("int")));
 
     // Sub2#bar2(int) is unique throughout the hierarchy, hence publicized.
-    assertPublic(dexInspector, Sub2.class,
+    assertPublic(codeInspector, Sub2.class,
         new MethodSignature("bar2", STRING, ImmutableList.of("int")));
   }
 }
diff --git a/src/test/java/com/android/tools/r8/bisect/BisectTest.java b/src/test/java/com/android/tools/r8/bisect/BisectTest.java
index a692b9e..5252f08 100644
--- a/src/test/java/com/android/tools/r8/bisect/BisectTest.java
+++ b/src/test/java/com/android/tools/r8/bisect/BisectTest.java
@@ -16,7 +16,7 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -81,7 +81,7 @@
   }
 
   private Result command(DexApplication application) {
-    DexInspector inspector = new DexInspector(application);
+    CodeInspector inspector = new CodeInspector(application);
     if (inspector
         .clazz(ERRONEOUS_CLASS)
         .method(erroneousMethodSignature.returnType,
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java b/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
index 77b251d..37d3914 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.bridgeremoval;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -16,9 +16,9 @@
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import org.junit.Test;
@@ -129,7 +129,7 @@
 
     AndroidApp processedApp = runAndVerifyOnJvmAndArt(jasminBuilder, mainClassName, proguardConfig);
 
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject absSubject = inspector.clazz(absCls.name);
     assertThat(absSubject, isPresent());
     ClassSubject cls1Subject = inspector.clazz(cls1.name);
@@ -236,7 +236,7 @@
 
     AndroidApp processedApp = runAndVerifyOnJvmAndArt(jasminBuilder, mainClassName, proguardConfig);
 
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject baseSubject = inspector.clazz(baseCls.name);
     assertThat(baseSubject, isPresent());
     ClassSubject cls1Subject = inspector.clazz(cls1.name);
@@ -332,7 +332,7 @@
 
     AndroidApp processedApp = runAndVerifyOnJvmAndArt(jasminBuilder, mainClassName, proguardConfig);
 
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject baseSubject = inspector.clazz(baseCls.name);
     assertThat(baseSubject, isPresent());
     ClassSubject subSubject = inspector.clazz(subCls.name);
@@ -408,7 +408,7 @@
     String proguardConfig = keepMainProguardConfiguration(mainClass.name, false, false);
     AndroidApp processedApp = runAndVerifyOnJvmAndArt(jasminBuilder, mainClassName, proguardConfig);
 
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject baseSubject = inspector.clazz(cls.name);
     assertThat(baseSubject, isPresent());
 
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/EmptyBridgeTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/EmptyBridgeTest.java
index 8fcf7a3..9c525b5 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/EmptyBridgeTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/EmptyBridgeTest.java
@@ -3,16 +3,16 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.bridgeremoval;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
@@ -53,7 +53,7 @@
             + "-keep class " + absClassName + "{ *; }";
     AndroidApp processedApp = compileWithR8(jasminBuilder.build(), proguardConfig);
 
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject classSubject = inspector.clazz(absClassName);
     assertThat(classSubject, isPresent());
     MethodSubject methodSubject = classSubject.method("void", "emptyBridge", ImmutableList.of());
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/RemoveVisibilityBridgeMethodsTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/RemoveVisibilityBridgeMethodsTest.java
index 272406f..c19b308 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/RemoveVisibilityBridgeMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/RemoveVisibilityBridgeMethodsTest.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.bridgeremoval;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
@@ -17,9 +17,9 @@
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Method;
 import java.nio.file.Path;
@@ -34,7 +34,7 @@
         Outer.class,
         Main.class);
     String proguardConfig = keepMainProguardConfiguration(Main.class, true, obfuscate);
-    DexInspector inspector = new DexInspector(compileWithR8(classes, proguardConfig));
+    CodeInspector inspector = new CodeInspector(compileWithR8(classes, proguardConfig));
 
     List<Method> removedMethods = ImmutableList.of(
         Outer.SubClass.class.getMethod("method"),
@@ -116,7 +116,7 @@
     String artResult = runOnArt(optimizedApp, mainClassName);
     assertEquals(javaResult.stdout, artResult);
 
-    DexInspector inspector = new DexInspector(optimizedApp);
+    CodeInspector inspector = new CodeInspector(optimizedApp);
 
     ClassSubject classSubject = inspector.clazz(superClass.name);
     assertThat(classSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java
index f1eddcd..4535b6f 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java
@@ -7,8 +7,8 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.TestBase;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Method;
 import java.util.List;
@@ -32,7 +32,7 @@
         SimpleObservableList.class,
         Main.class);
     String proguardConfig = keepMainAllowAccessModification(Main.class, obfuscate);
-    DexInspector inspector = new DexInspector(compileWithR8(classes, proguardConfig));
+    CodeInspector inspector = new CodeInspector(compileWithR8(classes, proguardConfig));
 
     // The bridge for registerObserver cannot be removed.
     Method registerObserver =
diff --git a/src/test/java/com/android/tools/r8/cf/BootstrapTest.java b/src/test/java/com/android/tools/r8/cf/BootstrapTest.java
index 7fdad0d..90b64900 100644
--- a/src/test/java/com/android/tools/r8/cf/BootstrapTest.java
+++ b/src/test/java/com/android/tools/r8/cf/BootstrapTest.java
@@ -102,7 +102,7 @@
     ToolHelper.runR8(
         R8Command.builder()
             .setMode(mode)
-            .addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setProgramConsumer(new ClassFileConsumer.ArchiveConsumer(outputJar, true))
             .addProgramFiles(inputJar)
             .addProguardConfigurationFiles(pgConfigFile)
diff --git a/src/test/java/com/android/tools/r8/cf/IdenticalCatchHandlerTest.java b/src/test/java/com/android/tools/r8/cf/IdenticalCatchHandlerTest.java
index d285dc6..450e6d0 100644
--- a/src/test/java/com/android/tools/r8/cf/IdenticalCatchHandlerTest.java
+++ b/src/test/java/com/android/tools/r8/cf/IdenticalCatchHandlerTest.java
@@ -19,11 +19,10 @@
 import com.android.tools.r8.graph.DexCode.Try;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.Sets;
 import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
 import it.unimi.dsi.fastutil.ints.IntSet;
-import java.nio.file.Paths;
 import java.util.Set;
 import org.junit.Test;
 
@@ -52,7 +51,7 @@
     AndroidApp inputApp =
         AndroidApp.builder()
             .addClassProgramData(inputBytes, Origin.unknown())
-            .addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .build();
     assertEquals(2, countCatchHandlers(inputApp));
     AndroidApp outputDexApp = ToolHelper.runR8(inputApp);
@@ -64,7 +63,7 @@
   }
 
   private int countCatchHandlers(AndroidApp inputApp) throws Exception {
-    DexInspector inspector = new DexInspector(inputApp, o -> o.enableCfFrontend = true);
+    CodeInspector inspector = new CodeInspector(inputApp, o -> o.enableCfFrontend = true);
     DexClass dexClass = inspector.clazz(TestClass.class).getDexClass();
     Code code = dexClass.virtualMethods()[0].getCode();
     if (code.isCfCode()) {
diff --git a/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java b/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java
index e1d110c..7db1d61 100644
--- a/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java
@@ -18,9 +18,8 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.Collections;
 import java.util.List;
 import org.junit.Assert;
@@ -52,7 +51,7 @@
     R8.run(
         R8Command.builder()
             .setMode(CompilationMode.DEBUG)
-            .addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setProgramConsumer(appBuilder.wrapClassFileConsumer(new ArchiveConsumer(outPath)))
             .addClassProgramData(inputClass, Origin.unknown())
             .build());
@@ -70,7 +69,7 @@
 
   private static CfInvokeDynamic findFirstInMethod(AndroidApp app) throws Exception {
     String returnType = "void";
-    DexInspector inspector = new DexInspector(app, o -> o.enableCfFrontend = true);
+    CodeInspector inspector = new CodeInspector(app, o -> o.enableCfFrontend = true);
     List<String> args = Collections.singletonList(String[].class.getTypeName());
     DexEncodedMethod method = inspector.clazz(CLASS).method(returnType, METHOD, args).getMethod();
     CfCode code = method.getCode().asCfCode();
diff --git a/src/test/java/com/android/tools/r8/cf/NestedExceptionTestRunner.java b/src/test/java/com/android/tools/r8/cf/NestedExceptionTestRunner.java
index c0a5455..a60eda9 100644
--- a/src/test/java/com/android/tools/r8/cf/NestedExceptionTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/NestedExceptionTestRunner.java
@@ -29,7 +29,7 @@
         R8Command.builder()
             .setMode(CompilationMode.DEBUG)
             .addClassProgramData(ToolHelper.getClassAsBytes(CLASS), Origin.unknown())
-            .addLibraryFiles(ToolHelper.getAndroidJar(ToolHelper.getMinApiLevelForDexVm()))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setProgramConsumer(sink.wrapClassFileConsumer(null))
             .build());
     Path out = temp.newFolder().toPath().resolve("test.jar");
diff --git a/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java b/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java
index 6196081..e4f9249 100644
--- a/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java
@@ -15,7 +15,7 @@
 import com.android.tools.r8.graph.JarCode;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidAppConsumers;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.util.ArrayList;
 import java.util.Collections;
 import org.junit.Test;
@@ -37,7 +37,7 @@
             .addLibraryFiles(ToolHelper.getAndroidJar(ToolHelper.getMinApiLevelForDexVm()))
             .setProgramConsumer(a.wrapClassFileConsumer(null))
             .build());
-    DexInspector inspector = new DexInspector(a.build());
+    CodeInspector inspector = new CodeInspector(a.build());
     DexEncodedMethod method =
         inspector.clazz(CLASS).method("void", "noop", Collections.emptyList()).getMethod();
     ArrayList<AbstractInsnNode> insns = new ArrayList<>();
diff --git a/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java
index 91e7b5d..6f3c97a 100644
--- a/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.classmerging;
 
 import static com.android.tools.r8.smali.SmaliBuilder.buildCode;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -30,10 +30,10 @@
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import java.io.IOException;
@@ -83,11 +83,11 @@
             .setDisableMinification(true)
             .build(),
         optionsConsumer);
-    inspector = new DexInspector(
+    inspector = new CodeInspector(
         Paths.get(temp.getRoot().getCanonicalPath()).resolve("classes.dex"));
   }
 
-  private DexInspector inspector;
+  private CodeInspector inspector;
 
   private final List<String> CAN_BE_MERGED = ImmutableList.of(
       "classmerging.GenericInterface",
@@ -152,7 +152,7 @@
         ImmutableSet.of(
             "classmerging.ConflictInGeneratedNameTest",
             "classmerging.ConflictInGeneratedNameTest$B");
-    DexInspector inspector =
+    CodeInspector inspector =
         runTestOnInput(
             main,
             readProgramFiles(programFiles),
@@ -603,7 +603,7 @@
             "classmerging.ExceptionTest",
             "classmerging.ExceptionTest$ExceptionB",
             "classmerging.ExceptionTest$Exception2");
-    DexInspector inspector = runTest(main, programFiles, preservedClassNames::contains);
+    CodeInspector inspector = runTest(main, programFiles, preservedClassNames::contains);
 
     ClassSubject mainClass = inspector.clazz(main);
     assertThat(mainClass, isPresent());
@@ -645,7 +645,7 @@
     // Sanity check that there is actually an invoke-interface instruction in the input. We need
     // to make sure that this invoke-interface instruction is translated to invoke-virtual after
     // the classes A and B are merged.
-    DexInspector inputInspector = new DexInspector(app);
+    CodeInspector inputInspector = new CodeInspector(app);
     ClassSubject clazz = inputInspector.clazz("classmerging.MergeDefaultMethodIntoClassTest");
     assertThat(clazz, isPresent());
     MethodSubject method = clazz.method("void", "main", ImmutableList.of("java.lang.String[]"));
@@ -773,12 +773,12 @@
     runTest(main, programFiles, preservedClassNames::contains);
   }
 
-  private DexInspector runTest(
+  private CodeInspector runTest(
       String main, Path[] programFiles, Predicate<String> preservedClassNames) throws Exception {
     return runTest(main, programFiles, preservedClassNames, getProguardConfig(EXAMPLE_KEEP));
   }
 
-  private DexInspector runTest(
+  private CodeInspector runTest(
       String main,
       Path[] programFiles,
       Predicate<String> preservedClassNames,
@@ -788,13 +788,13 @@
         main, readProgramFiles(programFiles), preservedClassNames, proguardConfig);
   }
 
-  private DexInspector runTestOnInput(
+  private CodeInspector runTestOnInput(
       String main, AndroidApp input, Predicate<String> preservedClassNames, String proguardConfig)
       throws Exception {
     return runTestOnInput(main, input, preservedClassNames, proguardConfig, this::configure);
   }
 
-  private DexInspector runTestOnInput(
+  private CodeInspector runTestOnInput(
       String main,
       AndroidApp input,
       Predicate<String> preservedClassNames,
@@ -802,8 +802,8 @@
       Consumer<InternalOptions> optionsConsumer)
       throws Exception {
     AndroidApp output = compileWithR8(input, proguardConfig, optionsConsumer);
-    DexInspector inputInspector = new DexInspector(input);
-    DexInspector outputInspector = new DexInspector(output);
+    CodeInspector inputInspector = new CodeInspector(input);
+    CodeInspector outputInspector = new CodeInspector(output);
     // Check that all classes in [preservedClassNames] are in fact preserved.
     for (FoundClassSubject classSubject : inputInspector.allClasses()) {
       String className = classSubject.getOriginalName();
diff --git a/src/test/java/com/android/tools/r8/code/NativeMethodWithCodeTest.java b/src/test/java/com/android/tools/r8/code/NativeMethodWithCodeTest.java
index d524d7c..5b4f1d4 100644
--- a/src/test/java/com/android/tools/r8/code/NativeMethodWithCodeTest.java
+++ b/src/test/java/com/android/tools/r8/code/NativeMethodWithCodeTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
@@ -17,9 +17,9 @@
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Path;
@@ -102,7 +102,7 @@
 
   private MethodSubject getNativeMethod(String mainClassName, AndroidApp processedApp)
       throws IOException, ExecutionException {
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject mainSubject = inspector.clazz(mainClassName);
     return mainSubject.method("void", "n1", ImmutableList.of("java.lang.String"));
   }
diff --git a/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java b/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java
index 7d27c5e..2521e02 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java
@@ -12,9 +12,9 @@
 import com.android.tools.r8.code.ReturnVoid;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.smali.SmaliBuilder;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
@@ -44,11 +44,11 @@
         keepMainProguardConfiguration(CLASS_NAME),
         "-dontshrink",
         "-dontoptimize");
-    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+    CodeInspector inspector = runCompatProguard(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
-    MethodSubject method = clazz.method(DexInspector.MAIN);
+    MethodSubject method = clazz.method(CodeInspector.MAIN);
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
@@ -80,11 +80,11 @@
         keepMainProguardConfiguration(CLASS_NAME),
         "-dontshrink",
         "-dontoptimize");
-    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+    CodeInspector inspector = runCompatProguard(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
-    MethodSubject method = clazz.method(DexInspector.MAIN);
+    MethodSubject method = clazz.method(CodeInspector.MAIN);
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
@@ -117,11 +117,11 @@
         keepMainProguardConfiguration(CLASS_NAME),
         "-dontshrink",
         "-dontoptimize");
-    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+    CodeInspector inspector = runCompatProguard(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
-    MethodSubject method = clazz.method(DexInspector.MAIN);
+    MethodSubject method = clazz.method(CodeInspector.MAIN);
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
diff --git a/src/test/java/com/android/tools/r8/compatproguard/CompatProguardSmaliTestBase.java b/src/test/java/com/android/tools/r8/compatproguard/CompatProguardSmaliTestBase.java
index 0d5849b..ea450e4 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/CompatProguardSmaliTestBase.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/CompatProguardSmaliTestBase.java
@@ -10,12 +10,12 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.smali.SmaliTestBase;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.nio.file.Path;
 import java.util.List;
 
 class CompatProguardSmaliTestBase extends SmaliTestBase {
-  DexInspector runCompatProguard(SmaliBuilder builder, List<String> proguardConfigurations)
+  CodeInspector runCompatProguard(SmaliBuilder builder, List<String> proguardConfigurations)
       throws Exception {
     Path dexOutputDir = temp.newFolder().toPath();
     R8Command.Builder commandBuilder =
@@ -23,6 +23,6 @@
             .setOutput(dexOutputDir, OutputMode.DexIndexed)
             .addProguardConfiguration(proguardConfigurations, Origin.unknown());
     ToolHelper.getAppBuilder(commandBuilder).addDexProgramData(builder.compile(), Origin.unknown());
-    return new DexInspector(ToolHelper.runR8(commandBuilder.build()));
+    return new CodeInspector(ToolHelper.runR8(commandBuilder.build()));
   }
 }
diff --git a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
index 3d9c912..6aa8805 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
@@ -12,9 +12,9 @@
 import com.android.tools.r8.code.ReturnVoid;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.smali.SmaliBuilder;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
@@ -39,11 +39,11 @@
         keepMainProguardConfiguration(CLASS_NAME),
         "-dontshrink",
         "-dontoptimize");
-    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+    CodeInspector inspector = runCompatProguard(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
-    MethodSubject method = clazz.method(DexInspector.MAIN);
+    MethodSubject method = clazz.method(CodeInspector.MAIN);
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
@@ -70,11 +70,11 @@
         "-dontshrink",
         "-dontoptimize",
         "-dontobfuscate");
-    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+    CodeInspector inspector = runCompatProguard(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
-    MethodSubject method = clazz.method(DexInspector.MAIN);
+    MethodSubject method = clazz.method(CodeInspector.MAIN);
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
diff --git a/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java b/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java
index e478115..5771019 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java
@@ -15,9 +15,9 @@
 import com.android.tools.r8.code.ReturnVoid;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.smali.SmaliBuilder;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
@@ -45,11 +45,11 @@
         keepMainProguardConfiguration(CLASS_NAME),
         "-dontshrink",
         "-dontoptimize");
-    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+    CodeInspector inspector = runCompatProguard(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
-    MethodSubject method = clazz.method(DexInspector.MAIN);
+    MethodSubject method = clazz.method(CodeInspector.MAIN);
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
@@ -85,11 +85,11 @@
         keepMainProguardConfiguration(CLASS_NAME),
         "-dontshrink",
         "-dontoptimize");
-    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+    CodeInspector inspector = runCompatProguard(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
-    MethodSubject method = clazz.method(DexInspector.MAIN);
+    MethodSubject method = clazz.method(CodeInspector.MAIN);
     assertTrue(method.isPresent());
 
     DexCode code = method.getMethod().getCode().asDexCode();
diff --git a/src/test/java/com/android/tools/r8/debug/ArrayDimensionGreaterThanSevenTestRunner.java b/src/test/java/com/android/tools/r8/debug/ArrayDimensionGreaterThanSevenTestRunner.java
index 7866e1b..bcc70c6 100644
--- a/src/test/java/com/android/tools/r8/debug/ArrayDimensionGreaterThanSevenTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/ArrayDimensionGreaterThanSevenTestRunner.java
@@ -36,6 +36,7 @@
         R8Command.builder()
             .addClassProgramData(ToolHelper.getClassAsBytes(CLASS), Origin.unknown())
             .setMode(CompilationMode.DEBUG)
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setOutput(cfOut, OutputMode.ClassFile)
             .build(),
         optionsConsumer);
diff --git a/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java b/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java
index f010357..29b0e17 100644
--- a/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java
+++ b/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java
@@ -55,7 +55,9 @@
       config = new DexDebugTestConfig(outjar);
     } else {
       assert (runtimeKind == RuntimeKind.CF);
-      builder.setOutput(outjar, OutputMode.ClassFile);
+      builder
+          .setOutput(outjar, OutputMode.ClassFile)
+          .addLibraryFiles(ToolHelper.getJava8RuntimeJar());
       config = new CfDebugTestConfig(outjar);
     }
 
diff --git a/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java b/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java
index 6de20c6..6dccf0b 100644
--- a/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java
+++ b/src/test/java/com/android/tools/r8/debug/ExamplesDebugTest.java
@@ -51,6 +51,7 @@
     ToolHelper.runR8(
         R8Command.builder()
             .addProgramFiles(input)
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setMode(CompilationMode.DEBUG)
             .setOutput(output, OutputMode.ClassFile)
             .build(),
diff --git a/src/test/java/com/android/tools/r8/debug/IincDebugTestRunner.java b/src/test/java/com/android/tools/r8/debug/IincDebugTestRunner.java
index bc390b9..a275e6b 100644
--- a/src/test/java/com/android/tools/r8/debug/IincDebugTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/IincDebugTestRunner.java
@@ -17,7 +17,6 @@
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.debug.DebugTestBase.JUnit3Wrapper.DebuggeeState;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.stream.Stream;
 import org.junit.Assume;
 import org.junit.Test;
@@ -115,7 +114,7 @@
             .setProgramConsumer(consumer)
             .addProgramFiles(inputJar);
     if ((consumer instanceof ClassFileConsumer)) {
-      builder.addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME));
+      builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
     } else {
       builder.addLibraryFiles(ToolHelper.getAndroidJar(ToolHelper.getMinApiLevelForDexVm()));
     }
diff --git a/src/test/java/com/android/tools/r8/debug/LineNumberOptimizationTest.java b/src/test/java/com/android/tools/r8/debug/LineNumberOptimizationTest.java
index 6e1c05f..5cbe03d 100644
--- a/src/test/java/com/android/tools/r8/debug/LineNumberOptimizationTest.java
+++ b/src/test/java/com/android/tools/r8/debug/LineNumberOptimizationTest.java
@@ -60,7 +60,9 @@
     DebugTestConfig config = null;
 
     if (runtimeKind == RuntimeKind.CF) {
-      builder.setOutput(outjar, OutputMode.ClassFile);
+      builder
+          .setOutput(outjar, OutputMode.ClassFile)
+          .addLibraryFiles(ToolHelper.getJava8RuntimeJar());
       config = new CfDebugTestConfig(outjar);
     } else {
       assert (runtimeKind == RuntimeKind.DEX);
diff --git a/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java b/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java
index d0f9d20..09a46e5 100644
--- a/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java
+++ b/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java
@@ -7,9 +7,9 @@
 
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.jasmin.JasminBuilder;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.Collections;
@@ -53,8 +53,8 @@
   }
 
   private void runTest(DebugTestConfig config) throws Throwable {
-    DexInspector inspector =
-        new DexInspector(
+    CodeInspector inspector =
+        new CodeInspector(
             (config instanceof CfDebugTestConfig)
                 ? Collections.singletonList(config.getPaths().get(1).resolve(className + ".class"))
                 : config.getPaths());
diff --git a/src/test/java/com/android/tools/r8/debug/MinificationTest.java b/src/test/java/com/android/tools/r8/debug/MinificationTest.java
index 1bb357f..1b51cd8 100644
--- a/src/test/java/com/android/tools/r8/debug/MinificationTest.java
+++ b/src/test/java/com/android/tools/r8/debug/MinificationTest.java
@@ -16,8 +16,8 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.Collection;
@@ -80,7 +80,6 @@
       proguardConfigurations = builder.build();
     }
 
-    AndroidApiLevel minSdk = ToolHelper.getMinApiLevelForDexVm();
     Path outputPath = temp.getRoot().toPath().resolve("classes.zip");
     Path proguardMap = writeProguardMap ? temp.getRoot().toPath().resolve("proguard.map") : null;
     OutputMode outputMode =
@@ -89,10 +88,12 @@
         R8Command.builder()
             .addProgramFiles(DEBUGGEE_JAR)
             .setOutput(outputPath, outputMode)
-            .setMode(CompilationMode.DEBUG)
-            .addLibraryFiles(ToolHelper.getAndroidJar(minSdk));
-    if (runtimeKind != RuntimeKind.CF) {
-      builder.setMinApiLevel(minSdk.getLevel());
+            .setMode(CompilationMode.DEBUG);
+    if (runtimeKind == RuntimeKind.DEX) {
+      AndroidApiLevel minSdk = ToolHelper.getMinApiLevelForDexVm();
+      builder.setMinApiLevel(minSdk.getLevel()).addLibraryFiles(ToolHelper.getAndroidJar(minSdk));
+    } else if (runtimeKind == RuntimeKind.CF) {
+      builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
     }
     if (proguardMap != null) {
       builder.setProguardMapOutputPath(proguardMap);
@@ -187,7 +188,7 @@
       throws Throwable {
     Path proguardMap = config.getProguardMap();
     String mappingFile = proguardMap == null ? null : proguardMap.toString();
-    DexInspector inspector = new DexInspector(config.getPaths(), mappingFile);
+    CodeInspector inspector = new CodeInspector(config.getPaths(), mappingFile);
     ClassSubject clazz = inspector.clazz(className);
     assertTrue(clazz.isPresent());
     if (method != null) {
diff --git a/src/test/java/com/android/tools/r8/debug/NopDebugTestRunner.java b/src/test/java/com/android/tools/r8/debug/NopDebugTestRunner.java
index 3ea4017..813a873 100644
--- a/src/test/java/com/android/tools/r8/debug/NopDebugTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/NopDebugTestRunner.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.debug.DebugTestBase.JUnit3Wrapper.DebuggeeState;
 import com.android.tools.r8.utils.DescriptorUtils;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.stream.Stream;
 import org.junit.Assume;
 import org.junit.Test;
@@ -47,7 +46,7 @@
     Path outputJar = temp.getRoot().toPath().resolve(outputName);
     ToolHelper.runR8(
         R8Command.builder()
-            .addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setMode(CompilationMode.DEBUG)
             .addProgramFiles(inputJar)
             .setOutput(outputJar, OutputMode.ClassFile)
diff --git a/src/test/java/com/android/tools/r8/debug/R8CfDebugTestResourcesConfig.java b/src/test/java/com/android/tools/r8/debug/R8CfDebugTestResourcesConfig.java
index e4a88f0..67b7c1a 100644
--- a/src/test/java/com/android/tools/r8/debug/R8CfDebugTestResourcesConfig.java
+++ b/src/test/java/com/android/tools/r8/debug/R8CfDebugTestResourcesConfig.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.R8;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
 import java.nio.file.Path;
@@ -21,14 +20,13 @@
 
   private static synchronized AndroidApp getCompiledResources() throws Throwable {
     if (compiledResources == null) {
-      AndroidApiLevel minApi = ToolHelper.getMinApiLevelForDexVm();
       AndroidAppConsumers sink = new AndroidAppConsumers();
       R8.run(
           R8Command.builder()
               .setMode(CompilationMode.DEBUG)
               .addProgramFiles(DebugTestBase.DEBUGGEE_JAR)
               .setProgramConsumer(sink.wrapClassFileConsumer(null))
-              .addLibraryFiles(ToolHelper.getAndroidJar(minApi))
+              .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
               .build());
       compiledResources = sink.build();
     }
diff --git a/src/test/java/com/android/tools/r8/debuginfo/DebugInfoInspector.java b/src/test/java/com/android/tools/r8/debuginfo/DebugInfoInspector.java
index aa8bc0c..3ccf46d 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/DebugInfoInspector.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/DebugInfoInspector.java
@@ -20,7 +20,7 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.StringUtils;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.HashSet;
@@ -49,13 +49,13 @@
     }
   }
 
-  public DebugInfoInspector(DexInspector inspector, String clazz, MethodSignature method) {
+  public DebugInfoInspector(CodeInspector inspector, String clazz, MethodSignature method) {
     this(inspector.clazz(clazz).method(method).getMethod(), inspector.getFactory());
   }
 
   public DebugInfoInspector(AndroidApp app, String clazz, MethodSignature method)
       throws IOException, ExecutionException {
-    this(new DexInspector(app), clazz, method);
+    this(new CodeInspector(app), clazz, method);
   }
 
   public boolean hasLocalsInfo() {
diff --git a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java
index c67cf32..0f8ac65 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java
@@ -40,33 +40,49 @@
 @RunWith(Parameterized.class)
 public class InliningWithoutPositionsTestRunner {
 
+  enum Backend {
+    CF,
+    DEX
+  }
+
   private static final String TEST_CLASS = "InliningWithoutPositionsTestSource";
   private static final String TEST_PACKAGE = "com.android.tools.r8.debuginfo";
 
   @ClassRule public static TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
 
+  private final Backend backend;
   private final boolean mainPos;
   private final boolean foo1Pos;
   private final boolean barPos;
   private final boolean foo2Pos;
   private final Location throwLocation;
 
-  @Parameters(name = "main/foo1/bar/foo2 positions: {0}/{1}/{2}/{3}, throwLocation: {4}")
+  @Parameters(name = "{0}: main/foo1/bar/foo2 positions: {1}/{2}/{3}/{4}, throwLocation: {5}")
   public static Collection<Object[]> data() {
     List<Object[]> testCases = new ArrayList<>();
+    for (Backend backend : Backend.values()) {
     for (int i = 0; i < 16; ++i) {
       for (Location throwLocation : Location.values()) {
         if (throwLocation != Location.MAIN) {
-          testCases.add(
-              new Object[] {(i & 1) != 0, (i & 2) != 0, (i & 4) != 0, (i & 8) != 0, throwLocation});
+            testCases.add(
+                new Object[] {
+                  backend, (i & 1) != 0, (i & 2) != 0, (i & 4) != 0, (i & 8) != 0, throwLocation
+                });
         }
       }
+      }
     }
     return testCases;
   }
 
   public InliningWithoutPositionsTestRunner(
-      boolean mainPos, boolean foo1Pos, boolean barPos, boolean foo2Pos, Location throwLocation) {
+      Backend backend,
+      boolean mainPos,
+      boolean foo1Pos,
+      boolean barPos,
+      boolean foo2Pos,
+      Location throwLocation) {
+    this.backend = backend;
     this.mainPos = mainPos;
     this.foo1Pos = foo1Pos;
     this.barPos = barPos;
@@ -79,33 +95,45 @@
     // See InliningWithoutPositionsTestSourceDump for the code compiled here.
     Path testClassDir = temp.newFolder(TEST_PACKAGE.split(".")).toPath();
     Path testClassPath = testClassDir.resolve(TEST_CLASS + ".class");
-    Path outputDexPath = temp.newFolder().toPath();
+    Path outputPath = temp.newFolder().toPath();
 
     Files.write(
         testClassPath,
         InliningWithoutPositionsTestSourceDump.dump(
             mainPos, foo1Pos, barPos, foo2Pos, throwLocation));
 
-    AndroidApiLevel minSdk = ToolHelper.getMinApiLevelForDexVm();
     Path proguardMapPath = testClassDir.resolve("proguard.map");
 
-    ToolHelper.runR8(
+    R8Command.Builder builder =
         R8Command.builder()
             .addProgramFiles(testClassPath)
-            .setMinApiLevel(minSdk.getLevel())
-            .addLibraryFiles(ToolHelper.getAndroidJar(minSdk))
-            .setOutput(outputDexPath, OutputMode.DexIndexed)
             .setMode(CompilationMode.RELEASE)
-            .setProguardMapOutputPath(proguardMapPath)
-            .build(),
-        options -> options.inliningInstructionLimit = 20);
+            .setProguardMapOutputPath(proguardMapPath);
+    if (backend == Backend.DEX) {
+      AndroidApiLevel minSdk = ToolHelper.getMinApiLevelForDexVm();
+      builder
+          .setMinApiLevel(minSdk.getLevel())
+          .addLibraryFiles(ToolHelper.getAndroidJar(minSdk))
+          .setOutput(outputPath, OutputMode.DexIndexed);
+    } else {
+      assert (backend == Backend.CF);
+      builder
+          .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
+          .setOutput(outputPath, OutputMode.ClassFile);
+    }
 
-    ArtCommandBuilder artCommandBuilder = new ArtCommandBuilder();
-    artCommandBuilder.appendClasspath(outputDexPath.resolve("classes.dex").toString());
-    artCommandBuilder.setMainClass(TEST_PACKAGE + "." + TEST_CLASS);
+    ToolHelper.runR8(builder.build(), options -> options.inliningInstructionLimit = 40);
 
-    ProcessResult result = ToolHelper.runArtRaw(artCommandBuilder);
+    ProcessResult result;
+    if (backend == Backend.DEX) {
+      ArtCommandBuilder artCommandBuilder = new ArtCommandBuilder();
+      artCommandBuilder.appendClasspath(outputPath.resolve("classes.dex").toString());
+      artCommandBuilder.setMainClass(TEST_PACKAGE + "." + TEST_CLASS);
 
+      result = ToolHelper.runArtRaw(artCommandBuilder);
+    } else {
+      result = ToolHelper.runJava(outputPath, TEST_PACKAGE + "." + TEST_CLASS);
+    }
     assertNotEquals(result.exitCode, 0);
 
     // Verify stack trace.
diff --git a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestSourceDump.java b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestSourceDump.java
index 53d6df3..c72a9c5 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestSourceDump.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestSourceDump.java
@@ -61,8 +61,7 @@
       }
   */
   public static byte[] dump(
-      boolean mainPos, boolean foo1Pos, boolean barPos, boolean foo2Pos, Location throwLocation)
-      throws Exception {
+      boolean mainPos, boolean foo1Pos, boolean barPos, boolean foo2Pos, Location throwLocation) {
     ClassWriter cw = new ClassWriter(0);
     FieldVisitor fv;
     MethodVisitor mv;
diff --git a/src/test/java/com/android/tools/r8/debuginfo/KotlinDebugInfoTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/KotlinDebugInfoTestRunner.java
index 103c07f..80279d5 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/KotlinDebugInfoTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/KotlinDebugInfoTestRunner.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import org.junit.Test;
 
 public class KotlinDebugInfoTestRunner extends TestBase {
@@ -74,7 +73,7 @@
             .setProgramConsumer(consumer)
             .addProgramFiles(inputJar);
     if ((consumer instanceof ClassFileConsumer)) {
-      builder.addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME));
+      builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
     } else {
       builder.addLibraryFiles(ToolHelper.getAndroidJar(ToolHelper.getMinApiLevelForDexVm()));
     }
diff --git a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
index f37b5ed..3b1e30a 100644
--- a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
+++ b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
@@ -26,7 +26,7 @@
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.Files;
 import java.nio.file.Path;
@@ -127,7 +127,7 @@
     AndroidApp application = AndroidApp.builder()
         .addDexProgramData(Files.toByteArray(originalDexFile.toFile()), Origin.unknown())
         .build();
-    DexInspector inspector = new DexInspector(application);
+    CodeInspector inspector = new CodeInspector(application);
     DexEncodedMethod method = getMethod(
         inspector,
         "android.databinding.DataBinderMapperImpl",
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
index 7c4c250..f1c8742 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
@@ -21,8 +21,8 @@
 import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.dexsplitter.DexSplitter.Options;
 import com.android.tools.r8.utils.FeatureClassMapping.FeatureMappingException;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import java.io.FileNotFoundException;
@@ -363,7 +363,7 @@
 
     // Ensure that the Class1 is actually in the correct split. Note that Class2 would have been
     // shaken away.
-    DexInspector inspector = new DexInspector(base, proguardMap.toString());
+    CodeInspector inspector = new CodeInspector(base, proguardMap.toString());
     ClassSubject subject = inspector.clazz("dexsplitsample.Class1");
     assertTrue(subject.isPresent());
     assertTrue(subject.isRenamed());
diff --git a/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java b/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
index 8cba9a0..39b5ff8 100644
--- a/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
@@ -23,7 +23,7 @@
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.Collections;
@@ -77,7 +77,7 @@
 
     AndroidApp application = buildApplication(builder);
     AppInfo appInfo = getAppInfo(application);
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod method = getMethod(inspector, DEFAULT_CLASS_NAME, "int", "x",
         ImmutableList.of());
     assertNull(appInfo.lookupVirtualTarget(method.method.holder, method.method));
@@ -147,7 +147,7 @@
 
     AndroidApp application = buildApplication(builder);
     AppInfo appInfo = getAppInfo(application);
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
 
     DexMethod methodXOnTestSuper =
         getMethod(inspector, "TestSuper", "int", "x", ImmutableList.of()).method;
diff --git a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
index 3987e0a..2ec38b4 100644
--- a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
+++ b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
@@ -30,10 +30,10 @@
 import com.android.tools.r8.utils.ArtErrorParser.ArtErrorParserException;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ListUtils;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
-import com.android.tools.r8.utils.dexinspector.FoundFieldSubject;
-import com.android.tools.r8.utils.dexinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.FoundFieldSubject;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
 import com.google.common.io.ByteStreams;
 import com.google.common.io.Closer;
 import java.io.File;
@@ -132,8 +132,8 @@
       if (referenceApk == null) {
         throw e;
       }
-      DexInspector theirs = new DexInspector(Paths.get(referenceApk));
-      DexInspector ours = new DexInspector(out);
+      CodeInspector theirs = new CodeInspector(Paths.get(referenceApk));
+      CodeInspector ours = new CodeInspector(out);
       List<ArtErrorInfo> errors;
       try {
         errors = ArtErrorParser.parse(e.getMessage());
@@ -194,8 +194,8 @@
   public void assertIdenticalApplicationsUpToCode(
       AndroidApp app1, AndroidApp app2, boolean allowNewClassesInApp2)
       throws IOException, ExecutionException {
-    DexInspector inspect1 = new DexInspector(app1);
-    DexInspector inspect2 = new DexInspector(app2);
+    CodeInspector inspect1 = new CodeInspector(app1);
+    CodeInspector inspect2 = new CodeInspector(app2);
 
     class Pair<T> {
       private T first;
@@ -213,7 +213,7 @@
     // Collect all classes from both inspectors, indexed by finalDescriptor.
     Map<String, Pair<FoundClassSubject>> allClasses = new HashMap<>();
 
-    BiConsumer<DexInspector, Boolean> collectClasses =
+    BiConsumer<CodeInspector, Boolean> collectClasses =
         (inspector, selectFirst) -> {
           inspector.forAllClasses(
               clazz -> {
diff --git a/src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java b/src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java
index c011f6f..68daeb8 100644
--- a/src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java
+++ b/src/test/java/com/android/tools/r8/invalid/DuplicateDefinitionsTest.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.invalid;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
@@ -13,8 +13,8 @@
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.jasmin.JasminTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.io.ByteArrayOutputStream;
 import java.io.PrintStream;
@@ -54,7 +54,7 @@
             "Ignoring an implementation of the method `void C.method()` because "
                 + "it has multiple definitions"));
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz("C");
     assertThat(clazz, isPresent());
 
@@ -89,7 +89,7 @@
     assertThat(output, containsString("Field `C C.fld` has multiple definitions"));
     assertThat(output, containsString("Field `C C.staticFld` has multiple definitions"));
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz("C");
     assertThat(clazz, isPresent());
 
diff --git a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
index f02098a..b66e6e0 100644
--- a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
@@ -22,7 +22,7 @@
 import com.android.tools.r8.utils.AndroidAppConsumers;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.IOException;
 import java.util.List;
 import java.util.ListIterator;
@@ -61,7 +61,7 @@
       String returnType,
       String methodName,
       List<String> parameters) {
-    DexInspector inspector = new DexInspector(application);
+    CodeInspector inspector = new CodeInspector(application);
     return getMethod(inspector, className, returnType, methodName, parameters);
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/PhiDefinitionsTestRunner.java b/src/test/java/com/android/tools/r8/ir/PhiDefinitionsTestRunner.java
index 4f2bdeb..ba43a10 100644
--- a/src/test/java/com/android/tools/r8/ir/PhiDefinitionsTestRunner.java
+++ b/src/test/java/com/android/tools/r8/ir/PhiDefinitionsTestRunner.java
@@ -17,7 +17,6 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import java.io.IOException;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import org.junit.Test;
 
 public class PhiDefinitionsTestRunner extends TestBase {
@@ -111,7 +110,7 @@
             .setProgramConsumer(consumer)
             .addProgramFiles(inputJar);
     if (consumer instanceof ClassFileConsumer) {
-      builder.addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME));
+      builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
     } else {
       builder.addLibraryFiles(ToolHelper.getAndroidJar(ToolHelper.getMinApiLevelForDexVm()));
     }
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java
index de97052..59bd91b 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java
@@ -36,7 +36,7 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableMap;
 import java.util.Map;
 import java.util.function.BiConsumer;
@@ -56,8 +56,8 @@
         new ApplicationReader(app, TEST_OPTIONS, new Timing("NullabilityTest.appReader"))
             .read().toDirect();
     AppInfo appInfo = new AppInfo(dexApplication);
-    DexInspector dexInspector = new DexInspector(appInfo.app);
-    DexEncodedMethod foo = dexInspector.clazz(mainClass.getName()).method(signature).getMethod();
+    CodeInspector codeInspector = new CodeInspector(appInfo.app);
+    DexEncodedMethod foo = codeInspector.clazz(mainClass.getName()).method(signature).getMethod();
     IRCode irCode = foo.buildIR(appInfo, TEST_OPTIONS, Origin.unknown());
     NonNullTracker nonNullTracker = new NonNullTracker();
     nonNullTracker.addNonNull(irCode);
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
index 286fb56..d3efebe 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
@@ -33,7 +33,7 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Smali;
 import com.android.tools.r8.utils.Timing;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.nio.charset.StandardCharsets;
@@ -116,7 +116,7 @@
 
   // Simple one path with a lot of arithmetic operations.
   private static void arithmetic(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod subtract =
         inspector.clazz("Test")
             .method(
@@ -131,7 +131,7 @@
 
   // A couple branches, along with some recursive calls.
   private static void fibonacci(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod fib =
         inspector.clazz("Test")
             .method(new MethodSignature("fibonacci", "int", ImmutableList.of("int")))
@@ -145,7 +145,7 @@
 
   // fill-array-data
   private static void fillArrayData(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod test1 =
         inspector.clazz("Test")
             .method(new MethodSignature("test1", "int[]", ImmutableList.of()))
@@ -176,7 +176,7 @@
 
   // filled-new-array
   private static void filledNewArray(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod test4 =
         inspector.clazz("Test")
             .method(new MethodSignature("test4", "int[]", ImmutableList.of()))
@@ -207,7 +207,7 @@
 
   // Make sure the analysis does not hang.
   private static void infiniteLoop(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod loop2 =
         inspector.clazz("Test")
             .method(new MethodSignature("loop2", "void", ImmutableList.of()))
@@ -226,7 +226,7 @@
 
   // move-exception
   private static void tryCatch(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod test2 =
         inspector.clazz("Test")
             .method(new MethodSignature("test2_throw", "int", ImmutableList.of()))
@@ -244,7 +244,7 @@
 
   // One very complicated example.
   private static void typeConfusion(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod method =
         inspector.clazz("TestObject")
             .method(
@@ -264,7 +264,7 @@
 
   // One more complicated example.
   private static void typeConfusion5(AppInfo appInfo) {
-    DexInspector inspector = new DexInspector(appInfo.app);
+    CodeInspector inspector = new CodeInspector(appInfo.app);
     DexEncodedMethod method =
         inspector.clazz("TestObject")
             .method(
diff --git a/src/test/java/com/android/tools/r8/ir/desugar/annotations/CovariantReturnTypeAnnotationTransformerTest.java b/src/test/java/com/android/tools/r8/ir/desugar/annotations/CovariantReturnTypeAnnotationTransformerTest.java
index 6aecc60..f1f2842 100644
--- a/src/test/java/com/android/tools/r8/ir/desugar/annotations/CovariantReturnTypeAnnotationTransformerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/desugar/annotations/CovariantReturnTypeAnnotationTransformerTest.java
@@ -4,16 +4,16 @@
 
 package com.android.tools.r8.ir.desugar.annotations;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.AsmTestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.util.Collections;
 import org.junit.Assert;
 import org.junit.Test;
@@ -155,7 +155,7 @@
   }
 
   private void checkPresenceOfSyntheticMethods(AndroidApp output) throws Exception {
-    DexInspector inspector = new DexInspector(output);
+    CodeInspector inspector = new CodeInspector(output);
 
     // Get classes A, B, and C.
     ClassSubject clazzA = inspector.clazz(A.class.getCanonicalName());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/B87341268.java b/src/test/java/com/android/tools/r8/ir/optimize/B87341268.java
index 11c7c0f..ac3952d 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/B87341268.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/B87341268.java
@@ -3,20 +3,20 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.optimize;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import org.junit.Test;
 
 public class B87341268 extends TestBase {
   @Test
   public void test() throws Exception {
     AndroidApp app = compileWithD8(readClasses(TestClass.class));
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(TestClass.class);
     assertThat(clazz, isPresent());
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java
index 5a2bc22..0eac6bb 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java
@@ -19,8 +19,8 @@
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -43,7 +43,7 @@
   @Test
   public void testWriteOnlyField_putObject_gone() throws Exception {
     Path processedApp = runR8(EXAMPLE_KEEP);
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject clazz = inspector.clazz(WRITE_ONLY_FIELD + ".WriteOnlyCls");
     clazz.forAllMethods(
         methodSubject -> {
@@ -71,7 +71,7 @@
   @Test
   public void testWriteOnlyField_dontoptimize() throws Exception {
     Path processedApp = runR8(DONT_OPTIMIZE);
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject clazz = inspector.clazz(WRITE_ONLY_FIELD + ".WriteOnlyCls");
     clazz.forAllMethods(
         methodSubject -> {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java
index 2ef43fd..9993b68 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java
@@ -28,7 +28,7 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.util.function.Consumer;
 import org.junit.Test;
 
@@ -46,8 +46,8 @@
         new ApplicationReader(app, TEST_OPTIONS, new Timing("NonNullMarkerTest.appReader"))
             .read().toDirect();
     AppInfo appInfo = new AppInfo(dexApplication);
-    DexInspector dexInspector = new DexInspector(appInfo.app);
-    DexEncodedMethod foo = dexInspector.clazz(testClass.getName()).method(signature).getMethod();
+    CodeInspector codeInspector = new CodeInspector(appInfo.app);
+    DexEncodedMethod foo = codeInspector.clazz(testClass.getName()).method(signature).getMethod();
     IRCode irCode = foo.buildIR(appInfo, TEST_OPTIONS, Origin.unknown());
     checkCountOfNonNull(irCode, 0);
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
index 7284384..dd7756b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
@@ -30,9 +30,9 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Files;
@@ -145,14 +145,14 @@
 
   private void dump(Path path, String title) throws Throwable {
     System.out.println(title + ":");
-    DexInspector inspector = new DexInspector(path.toAbsolutePath());
+    CodeInspector inspector = new CodeInspector(path.toAbsolutePath());
     inspector.clazz("inlining.Inlining").forAllMethods(m -> dump(m.getMethod()));
     System.out.println(title + " size: " + Files.size(path));
   }
 
   @Test
   public void checkNoInvokes() throws Throwable {
-    DexInspector inspector = new DexInspector(getGeneratedDexFile().toAbsolutePath(),
+    CodeInspector inspector = new CodeInspector(getGeneratedDexFile().toAbsolutePath(),
         getGeneratedProguardMap());
     ClassSubject clazz = inspector.clazz("inlining.Inlining");
 
@@ -189,8 +189,8 @@
 
   @Test
   public void invokeOnNullableReceiver() throws Exception {
-    DexInspector inspector =
-        new DexInspector(getGeneratedDexFile().toAbsolutePath(), getGeneratedProguardMap());
+    CodeInspector inspector =
+        new CodeInspector(getGeneratedDexFile().toAbsolutePath(), getGeneratedProguardMap());
     ClassSubject clazz = inspector.clazz("inlining.Nullability");
     MethodSubject m = clazz.method("int", "inlinable", ImmutableList.of("inlining.A"));
     DexCode code;
@@ -257,8 +257,8 @@
 
   @Test
   public void invokeOnNonNullReceiver() throws Exception {
-    DexInspector inspector =
-        new DexInspector(getGeneratedDexFile().toAbsolutePath(), getGeneratedProguardMap());
+    CodeInspector inspector =
+        new CodeInspector(getGeneratedDexFile().toAbsolutePath(), getGeneratedProguardMap());
     ClassSubject clazz = inspector.clazz("inlining.Nullability");
     MethodSubject m = clazz.method("int", "conditionalOperator", ImmutableList.of("inlining.A"));
     assertTrue(m.isPresent());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java b/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java
index 43b728e..ad0ae87 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java
@@ -17,7 +17,7 @@
 import com.android.tools.r8.ir.optimize.nonnull.NonNullAfterInvoke;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import java.util.List;
@@ -32,10 +32,10 @@
     AndroidApp app = buildAndroidApp(ToolHelper.getClassAsBytes(testClass));
     AndroidApp r8Result = compileWithR8(app,
         "-keep class " + testClass.getCanonicalName() + " { *; }");
-    DexInspector dexInspector = new DexInspector(r8Result);
+    CodeInspector codeInspector = new CodeInspector(r8Result);
     for (MethodSignature signature : signatures) {
       DexEncodedMethod method =
-          dexInspector.clazz(testClass.getName()).method(signature).getMethod();
+          codeInspector.clazz(testClass.getName()).method(signature).getMethod();
       long count = Arrays.stream(method.getCode().asDexCode().instructions)
           .filter(SimplifyIfNotNullTest::isIf).count();
       assertEquals(0, count);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java
index d40e202..793da3c 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java
@@ -46,8 +46,8 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.Sets;
 import java.nio.file.Path;
 import java.util.Collections;
@@ -81,7 +81,7 @@
     String artOutput = runOnArt(app, TrivialTestClass.class);
     assertEquals(javaOutput, artOutput);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(TrivialTestClass.class);
 
     assertEquals(
@@ -153,7 +153,7 @@
     String artOutput = runOnArt(app, BuildersTestClass.class);
     assertEquals(javaOutput, artOutput);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(BuildersTestClass.class);
 
     assertEquals(
@@ -238,7 +238,7 @@
     String artOutput = runOnArt(app, CodeTestClass.class);
     assertEquals(javaOutput, artOutput);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(C.class);
 
     assertEquals(
@@ -274,7 +274,7 @@
     String artOutput = runOnArt(app, InvalidRootsTestClass.class);
     assertEquals(javaOutput, artOutput);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(InvalidRootsTestClass.class);
 
     assertEquals(
@@ -315,7 +315,7 @@
     String artOutput = runOnArt(app, LambdasTestClass.class);
     assertEquals(javaOutput, artOutput);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(LambdasTestClass.class);
 
     assertEquals(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeInterfaceToInvokeVirtualTest.java b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeInterfaceToInvokeVirtualTest.java
index 0ae7971..c5d6261 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeInterfaceToInvokeVirtualTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeInterfaceToInvokeVirtualTest.java
@@ -24,8 +24,8 @@
 import com.android.tools.r8.ir.optimize.devirtualize.invokeinterface.Main;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import org.junit.Test;
@@ -67,9 +67,9 @@
     Path out = temp.getRoot().toPath();
     AndroidApp processedApp = runR8(originalApp, Main.class, out);
 
-    DexInspector dexInspector = new DexInspector(processedApp);
-    ClassSubject clazz = dexInspector.clazz(main);
-    DexEncodedMethod m = clazz.method(DexInspector.MAIN).getMethod();
+    CodeInspector codeInspector = new CodeInspector(processedApp);
+    ClassSubject clazz = codeInspector.clazz(main);
+    DexEncodedMethod m = clazz.method(CodeInspector.MAIN).getMethod();
     DexCode code = m.getCode().asDexCode();
     long numOfInvokeInterface = filterInstructionKind(code, InvokeInterface.class).count();
     // List#add, List#get
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java
index 4b603952..5cdaac8 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java
@@ -22,9 +22,9 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.nio.file.Path;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -57,7 +57,7 @@
     String artOutput = runOnArt(app, InterfaceTargetsTestClass.class);
     assertEquals(javaOutput, artOutput);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(InterfaceTargetsTestClass.class);
 
     assertFalse(getMethodSubject(clazz,
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java b/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java
index c79e50e..2c66eb1 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.regalloc;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertThat;
@@ -11,8 +11,8 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.util.List;
 import java.util.Map;
 import org.junit.Test;
@@ -21,7 +21,7 @@
   @Test
   public void test1() throws Exception {
     AndroidApp app = compileWithD8(readClasses(TestClass.class));
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(TestClass.class);
     assertThat(clazz, isPresent());
   }
@@ -29,7 +29,7 @@
   @Test
   public void test2() throws Exception {
     AndroidApp app = compileWithD8(readClasses(OtherTestClass.class));
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(OtherTestClass.class);
     assertThat(clazz, isPresent());
     ToolHelper.ProcessResult d8Result = runOnArtRaw(app, OtherTestClass.class.getCanonicalName());
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/B79405526.java b/src/test/java/com/android/tools/r8/ir/regalloc/B79405526.java
index 36156eb..4065493 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/B79405526.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/B79405526.java
@@ -4,20 +4,20 @@
 
 package com.android.tools.r8.ir.regalloc;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import org.junit.Test;
 
 public class B79405526 extends TestBase {
   @Test
   public void test() throws Exception {
     AndroidApp app = compileWithD8(readClasses(TestClass.class));
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazz = inspector.clazz(TestClass.class);
     assertThat(clazz, isPresent());
     // Throws if a method in TestClass does not verify.
diff --git a/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java b/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java
index d8861b6..6f8d39c 100644
--- a/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java
+++ b/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java
@@ -11,7 +11,7 @@
 import com.android.tools.r8.utils.ArtErrorParser;
 import com.android.tools.r8.utils.ArtErrorParser.ArtErrorInfo;
 import com.android.tools.r8.utils.ArtErrorParser.ArtErrorParserException;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -60,8 +60,8 @@
     } catch (AssertionError e) {
       AndroidApp fromDexApp =
           ToolHelper.runR8(dexFromDX(), options -> options.ignoreMissingClasses = true);
-      DexInspector fromDex = new DexInspector(fromDexApp);
-      DexInspector fromJar = new DexInspector(result);
+      CodeInspector fromDex = new CodeInspector(fromDexApp);
+      CodeInspector fromJar = new CodeInspector(result);
       List<ArtErrorInfo> errors;
       try {
         errors = ArtErrorParser.parse(e.getMessage());
diff --git a/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java b/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java
index ed9194e..7e90163 100644
--- a/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java
+++ b/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java
@@ -7,7 +7,7 @@
 
 import com.android.tools.r8.ir.desugar.InterfaceMethodRewriter;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
@@ -33,9 +33,9 @@
     JasminBuilder builder = buildClass();
     AndroidApp androidApp = compileWithD8(builder);
 
-    DexInspector dexInspector = new DexInspector(androidApp);
+    CodeInspector codeInspector = new CodeInspector(androidApp);
     assertFalse(
-        dexInspector
+        codeInspector
             .clazz("LMyAnnotation" + InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX + ";")
             .isAnnotation());
   }
diff --git a/src/test/java/com/android/tools/r8/jasmin/DebugLocalTests.java b/src/test/java/com/android/tools/r8/jasmin/DebugLocalTests.java
index b56824d..a6505c8 100644
--- a/src/test/java/com/android/tools/r8/jasmin/DebugLocalTests.java
+++ b/src/test/java/com/android/tools/r8/jasmin/DebugLocalTests.java
@@ -12,9 +12,9 @@
 import com.android.tools.r8.jasmin.JasminBuilder.ClassFileVersion;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
@@ -101,7 +101,7 @@
     AndroidApp jasminApp = builder.build();
     AndroidApp d8App = ToolHelper.runD8(jasminApp);
 
-    DexInspector inspector = new DexInspector(d8App);
+    CodeInspector inspector = new CodeInspector(d8App);
     ClassSubject classSubject = inspector.clazz("Test");
     MethodSubject methodSubject = classSubject.method(foo);
     DexCode code = methodSubject.getMethod().getCode().asDexCode();
diff --git a/src/test/java/com/android/tools/r8/jasmin/JumboStringTests.java b/src/test/java/com/android/tools/r8/jasmin/JumboStringTests.java
index c7a32b3..40928ee 100644
--- a/src/test/java/com/android/tools/r8/jasmin/JumboStringTests.java
+++ b/src/test/java/com/android/tools/r8/jasmin/JumboStringTests.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
@@ -91,7 +91,7 @@
     AndroidApp d8App = ToolHelper.runD8(jasminApp);
     assertEquals(expected, runOnArt(d8App, clazz.name));
 
-    DexInspector inspector = new DexInspector(d8App);
+    CodeInspector inspector = new CodeInspector(d8App);
     for (Entry<String, MethodSignature> entry : classes.entrySet()) {
       DebugInfoInspector info = new DebugInfoInspector(inspector, entry.getKey(), entry.getValue());
       info.checkStartLine(1);
diff --git a/src/test/java/com/android/tools/r8/jasmin/JumpSubroutineTests.java b/src/test/java/com/android/tools/r8/jasmin/JumpSubroutineTests.java
index ec18fac..fd68772 100644
--- a/src/test/java/com/android/tools/r8/jasmin/JumpSubroutineTests.java
+++ b/src/test/java/com/android/tools/r8/jasmin/JumpSubroutineTests.java
@@ -16,7 +16,6 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import org.junit.Test;
 
 public class JumpSubroutineTests extends JasminTestBase {
@@ -40,7 +39,7 @@
         R8Command.builder()
             .addProgramFiles(inputJar)
             .setOutput(outputJar, OutputMode.ClassFile)
-            .addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .build(),
         options -> options.enableCfFrontend = true);
     ProcessResult processResult = ToolHelper.runJava(outputJar, main);
diff --git a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
index c2dd7b1..4919227 100644
--- a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
+++ b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
@@ -14,9 +14,9 @@
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
-import com.android.tools.r8.utils.dexinspector.AnnotationSubject;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.AnnotationSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.nio.file.Files;
@@ -132,9 +132,9 @@
 
     compileWithR8(INPUT_PATH, outputPath, SHRINK_NO_KEEP_CONFIG);
 
-    DexInspector dexInspector =
-        new DexInspector(outputPath.resolve("classes.dex"), getGeneratedProguardMap());
-    ClassSubject classSubject = dexInspector.clazz("HelloKt");
+    CodeInspector codeInspector =
+        new CodeInspector(outputPath.resolve("classes.dex"), getGeneratedProguardMap());
+    ClassSubject classSubject = codeInspector.clazz("HelloKt");
     AnnotationSubject annotationSubject =
         classSubject.annotation("dalvik.annotation.SourceDebugExtension");
     Assert.assertFalse(annotationSubject.isPresent());
@@ -147,8 +147,8 @@
         new ReadSourceDebugExtensionAttribute(Opcodes.ASM6, null);
     classReader.accept(sourceDebugExtensionReader, 0);
 
-    DexInspector dexInspector = new DexInspector(androidApp);
-    ClassSubject classSubject = dexInspector.clazz("HelloKt");
+    CodeInspector codeInspector = new CodeInspector(androidApp);
+    ClassSubject classSubject = codeInspector.clazz("HelloKt");
 
     AnnotationSubject annotationSubject =
         classSubject.annotation("dalvik.annotation.SourceDebugExtension");
diff --git a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
index 4fd1d8d..4405565 100644
--- a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
@@ -23,10 +23,10 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -112,7 +112,7 @@
     }));
   }
 
-  protected ClassSubject checkClassIsKept(DexInspector inspector, String className) {
+  protected ClassSubject checkClassIsKept(CodeInspector inspector, String className) {
     checkClassExistsInInput(className);
     ClassSubject classSubject = inspector.clazz(className);
     assertNotNull(classSubject);
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
index a28d0c5..67afdd7 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
@@ -17,8 +17,8 @@
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -55,7 +55,7 @@
         clazz.interfaces.size() == 1;
   }
 
-  private static Predicate<DexType> createLambdaCheck(DexInspector inspector) {
+  private static Predicate<DexType> createLambdaCheck(CodeInspector inspector) {
     Set<DexType> lambdaClasses = inspector.allClasses().stream()
         .filter(clazz -> isLambda(clazz.getDexClass()))
         .map(clazz -> clazz.getDexClass().type)
@@ -67,7 +67,7 @@
   public void testJStyleLambdas() throws Exception {
     final String mainClassName = "class_inliner_lambda_j_style.MainKt";
     runTest("class_inliner_lambda_j_style", mainClassName, false, (app) -> {
-      DexInspector inspector = new DexInspector(app);
+      CodeInspector inspector = new CodeInspector(app);
       assertTrue(
           inspector.clazz("class_inliner_lambda_j_style.MainKt$testStateful$1").isPresent());
       assertTrue(
@@ -77,7 +77,7 @@
     });
 
     runTest("class_inliner_lambda_j_style", mainClassName, true, (app) -> {
-      DexInspector inspector = new DexInspector(app);
+      CodeInspector inspector = new CodeInspector(app);
       Predicate<DexType> lambdaCheck = createLambdaCheck(inspector);
       ClassSubject clazz = inspector.clazz(mainClassName);
 
@@ -112,7 +112,7 @@
   public void testKStyleLambdas() throws Exception {
     final String mainClassName = "class_inliner_lambda_k_style.MainKt";
     runTest("class_inliner_lambda_k_style", mainClassName, false, (app) -> {
-      DexInspector inspector = new DexInspector(app);
+      CodeInspector inspector = new CodeInspector(app);
       assertTrue(inspector.clazz(
           "class_inliner_lambda_k_style.MainKt$testKotlinSequencesStateless$1").isPresent());
       assertTrue(inspector.clazz(
@@ -135,7 +135,7 @@
     });
 
     runTest("class_inliner_lambda_k_style", mainClassName, true, (app) -> {
-      DexInspector inspector = new DexInspector(app);
+      CodeInspector inspector = new CodeInspector(app);
       Predicate<DexType> lambdaCheck = createLambdaCheck(inspector);
       ClassSubject clazz = inspector.clazz(mainClassName);
 
@@ -186,7 +186,7 @@
   public void testDataClass() throws Exception {
     final String mainClassName = "class_inliner_data_class.MainKt";
     runTest("class_inliner_data_class", mainClassName, true, (app) -> {
-      DexInspector inspector = new DexInspector(app);
+      CodeInspector inspector = new CodeInspector(app);
       ClassSubject clazz = inspector.clazz(mainClassName);
       assertTrue(collectAccessedTypes(
           type -> !type.toSourceString().startsWith("java."),
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java
index 658e89a..e43e94c 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java
@@ -14,7 +14,7 @@
 import com.android.tools.r8.ir.optimize.lambda.CaptureSignature;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.Lists;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -139,21 +139,21 @@
   }
 
   static class Verifier {
-    final DexInspector dexInspector;
+    final CodeInspector codeInspector;
     final List<DexClass> lambdas = new ArrayList<>();
     final List<DexClass> groups = new ArrayList<>();
 
     Verifier(AndroidApp app) throws IOException, ExecutionException {
-      this(new DexInspector(app));
+      this(new CodeInspector(app));
     }
 
-    Verifier(DexInspector dexInspector) {
-      this.dexInspector = dexInspector;
+    Verifier(CodeInspector codeInspector) {
+      this.codeInspector = codeInspector;
       initGroupsAndLambdas();
     }
 
     private void initGroupsAndLambdas() {
-      dexInspector.forAllClasses(clazz -> {
+      codeInspector.forAllClasses(clazz -> {
         DexClass dexClass = clazz.getDexClass();
         if (isLambdaOrGroup(dexClass)) {
           if (isLambdaGroupClass(dexClass)) {
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinxMetadataExtensionsServiceTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinxMetadataExtensionsServiceTest.java
index 233bb24..87b9487 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinxMetadataExtensionsServiceTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinxMetadataExtensionsServiceTest.java
@@ -20,7 +20,7 @@
 import com.android.tools.r8.kotlin.KotlinLambdaMergingTest.Verifier;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -60,7 +60,7 @@
         "No MetadataExtensions instances found in the classpath")));
     assertTrue(Files.exists(output));
 
-    DexInspector inspector = new DexInspector(output);
+    CodeInspector inspector = new CodeInspector(output);
     Verifier verifier = new Verifier(inspector);
     String pkg = "lambdas_kstyle_trivial";
     verifier.assertLambdaGroups(
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
index 53b7925..4b1b404 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
@@ -16,9 +16,9 @@
 import com.android.tools.r8.kotlin.TestKotlinClass.Visibility;
 import com.android.tools.r8.naming.MemberNaming;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
 import java.nio.file.Path;
 import java.util.Collections;
 import org.junit.Assert;
@@ -65,8 +65,8 @@
     String mainClass = addMainToClasspath("properties.CompanionPropertiesKt",
         "companionProperties_usePrimitiveProp");
     runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
       String propertyName = "primitiveProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, "int", propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -94,8 +94,8 @@
     String mainClass = addMainToClasspath("properties.CompanionPropertiesKt",
         "companionProperties_usePrivateProp");
     runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
       String propertyName = "privateProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -124,8 +124,8 @@
     String mainClass = addMainToClasspath("properties.CompanionPropertiesKt",
         "companionProperties_useInternalProp");
     runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
       String propertyName = "internalProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -153,8 +153,8 @@
     String mainClass = addMainToClasspath("properties.CompanionPropertiesKt",
         "companionProperties_usePublicProp");
     runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
       String propertyName = "publicProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -182,8 +182,8 @@
     String mainClass = addMainToClasspath("properties.CompanionLateInitPropertiesKt",
         "companionLateInitProperties_usePrivateLateInitProp");
     runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
       String propertyName = "privateLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -210,8 +210,8 @@
     String mainClass = addMainToClasspath("properties.CompanionLateInitPropertiesKt",
         "companionLateInitProperties_useInternalLateInitProp");
     runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
       String propertyName = "internalLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -234,8 +234,8 @@
     String mainClass = addMainToClasspath("properties.CompanionLateInitPropertiesKt",
         "companionLateInitProperties_usePublicLateInitProp");
     runTest(PROPERTIES_PACKAGE_NAME, mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
       String propertyName = "publicLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -258,9 +258,9 @@
     String mainClass = addMainToClasspath("accessors.AccessorKt",
         "accessor_accessPropertyFromCompanionClass");
     runTest("accessors", mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
-      ClassSubject companionClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
+      ClassSubject companionClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "property";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -288,9 +288,9 @@
     String mainClass = addMainToClasspath("accessors.AccessorKt",
         "accessor_accessPropertyFromOuterClass");
     runTest("accessors", mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
-      ClassSubject companionClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
+      ClassSubject companionClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "property";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -318,8 +318,8 @@
     String mainClass = addMainToClasspath(testedClass.className + "Kt",
         "noUseOfPropertyAccessorFromInnerClass");
     runTest("accessors", mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, testedClass.getClassName());
 
       for (String propertyName : testedClass.properties.keySet()) {
         MemberNaming.MethodSignature getterAccessor =
@@ -340,8 +340,8 @@
     String mainClass = addMainToClasspath(testedClass.className + "Kt",
         "usePrivatePropertyAccessorFromInnerClass");
     runTest("accessors", mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, testedClass.getClassName());
 
       String propertyName = "privateProp";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING,
@@ -371,8 +371,8 @@
     String mainClass = addMainToClasspath(testedClass.className + "Kt",
         "usePrivateLateInitPropertyAccessorFromInnerClass");
     runTest("accessors", mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, testedClass.getClassName());
 
       String propertyName = "privateLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING,
@@ -402,8 +402,8 @@
     String mainClass = addMainToClasspath(testedClass.className + "Kt",
         "noUseOfPropertyAccessorFromLambda");
     runTest("accessors", mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "property";
 
       MemberNaming.MethodSignature getterAccessor =
@@ -423,8 +423,8 @@
     String mainClass = addMainToClasspath(testedClass.className + "Kt",
         "usePropertyAccessorFromLambda");
     runTest("accessors", mainClass, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "property";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName);
       assertFalse(fieldSubject.getField().accessFlags.isStatic());
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
index 45f74af..58eae89 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
@@ -8,9 +8,9 @@
 import com.android.tools.r8.kotlin.TestKotlinClass.Visibility;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.util.Collections;
 import java.util.function.Consumer;
 import org.junit.Test;
@@ -44,8 +44,8 @@
         new MethodSignature("testDataClassGetters", "void", Collections.emptyList());
     final String extraRules = keepClassMethod(mainClassName, testMethodSignature);
     runTest("dataclass", mainClassName, extraRules, disableClassInliner, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject dataClass = checkClassIsKept(dexInspector, TEST_DATA_CLASS.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject dataClass = checkClassIsKept(codeInspector, TEST_DATA_CLASS.getClassName());
 
       // Getters should be removed after inlining, which is possible only if access is relaxed.
       final boolean areGetterPresent = !allowAccessModification;
@@ -60,7 +60,7 @@
       checkMethodIsRemoved(dataClass, COPY_METHOD);
       checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD);
 
-      ClassSubject classSubject = checkClassIsKept(dexInspector, mainClassName);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, mainClassName);
       MethodSubject testMethod = checkMethodIsKept(classSubject, testMethodSignature);
       DexCode dexCode = getDexCode(testMethod);
       if (allowAccessModification) {
@@ -79,8 +79,8 @@
         new MethodSignature("testAllDataClassComponentFunctions", "void", Collections.emptyList());
     final String extraRules = keepClassMethod(mainClassName, testMethodSignature);
     runTest("dataclass", mainClassName, extraRules, disableClassInliner, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject dataClass = checkClassIsKept(dexInspector, TEST_DATA_CLASS.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject dataClass = checkClassIsKept(codeInspector, TEST_DATA_CLASS.getClassName());
 
       // ComponentN functions should be removed after inlining, which is possible only if access
       // is relaxed.
@@ -96,7 +96,7 @@
       checkMethodIsRemoved(dataClass, COPY_METHOD);
       checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD);
 
-      ClassSubject classSubject = checkClassIsKept(dexInspector, mainClassName);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, mainClassName);
       MethodSubject testMethod = checkMethodIsKept(classSubject, testMethodSignature);
       DexCode dexCode = getDexCode(testMethod);
       if (allowAccessModification) {
@@ -114,8 +114,8 @@
         new MethodSignature("testSomeDataClassComponentFunctions", "void", Collections.emptyList());
     final String extraRules = keepClassMethod(mainClassName, testMethodSignature);
     runTest("dataclass", mainClassName, extraRules, disableClassInliner, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject dataClass = checkClassIsKept(dexInspector, TEST_DATA_CLASS.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject dataClass = checkClassIsKept(codeInspector, TEST_DATA_CLASS.getClassName());
 
       boolean component2IsPresent = !allowAccessModification;
       checkMethodisKeptOrRemoved(dataClass, COMPONENT2_METHOD, component2IsPresent);
@@ -131,7 +131,7 @@
       checkMethodIsRemoved(dataClass, COPY_METHOD);
       checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD);
 
-      ClassSubject classSubject = checkClassIsKept(dexInspector, mainClassName);
+      ClassSubject classSubject = checkClassIsKept(codeInspector, mainClassName);
       MethodSubject testMethod = checkMethodIsKept(classSubject, testMethodSignature);
       DexCode dexCode = getDexCode(testMethod);
       if (allowAccessModification) {
@@ -149,8 +149,8 @@
         new MethodSignature("testDataClassCopy", "void", Collections.emptyList());
     final String extraRules = keepClassMethod(mainClassName, testMethodSignature);
     runTest("dataclass", mainClassName, extraRules, disableClassInliner, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject dataClass = checkClassIsKept(dexInspector, TEST_DATA_CLASS.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject dataClass = checkClassIsKept(codeInspector, TEST_DATA_CLASS.getClassName());
 
       checkMethodIsRemoved(dataClass, COPY_METHOD);
       checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD);
@@ -164,8 +164,8 @@
         new MethodSignature("testDataClassCopyWithDefault", "void", Collections.emptyList());
     final String extraRules = keepClassMethod(mainClassName, testMethodSignature);
     runTest("dataclass", mainClassName, extraRules, disableClassInliner, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject dataClass = checkClassIsKept(dexInspector, TEST_DATA_CLASS.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject dataClass = checkClassIsKept(codeInspector, TEST_DATA_CLASS.getClassName());
 
       checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD);
     });
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
index c764974..c90df04 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
@@ -5,8 +5,8 @@
 package com.android.tools.r8.kotlin;
 
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import java.util.Collections;
@@ -27,9 +27,9 @@
             "java.lang.String", Lists.newArrayList("java.lang.String", "java.lang.String")));
 
     runTest("intrinsics", "intrinsics.IntrinsicsKt", extraRules, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
+      CodeInspector codeInspector = new CodeInspector(app);
       ClassSubject intrinsicsClass = checkClassIsKept(
-          dexInspector, KOTLIN_INTRINSICS_CLASS.getClassName());
+          codeInspector, KOTLIN_INTRINSICS_CLASS.getClassName());
 
       checkMethodsPresence(intrinsicsClass,
           ImmutableMap.<MethodSignature, Boolean>builder()
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
index 03c2873..89ff81d 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
@@ -11,9 +11,9 @@
 import com.android.tools.r8.naming.MemberNaming;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
 import java.util.Map.Entry;
 import java.util.function.Consumer;
 import org.junit.Test;
@@ -93,8 +93,8 @@
     String mainClass = addMainToClasspath("properties/MutablePropertyKt",
         "mutableProperty_noUseOfProperties");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           MUTABLE_PROPERTY_CLASS.getClassName());
       for (Entry<String, KotlinProperty> property : MUTABLE_PROPERTY_CLASS.properties.entrySet()) {
         MethodSignature getter = MUTABLE_PROPERTY_CLASS.getGetterForProperty(property.getKey());
@@ -116,8 +116,8 @@
     String mainClass = addMainToClasspath("properties/MutablePropertyKt",
         "mutableProperty_usePrivateProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           MUTABLE_PROPERTY_CLASS.getClassName());
       String propertyName = "privateProp";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName);
@@ -138,8 +138,8 @@
     String mainClass = addMainToClasspath("properties/MutablePropertyKt",
         "mutableProperty_useProtectedProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           MUTABLE_PROPERTY_CLASS.getClassName());
       String propertyName = "protectedProp";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName);
@@ -161,8 +161,8 @@
     String mainClass = addMainToClasspath("properties/MutablePropertyKt",
         "mutableProperty_useInternalProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           MUTABLE_PROPERTY_CLASS.getClassName());
       String propertyName = "internalProp";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName);
@@ -184,8 +184,8 @@
     String mainClass = addMainToClasspath("properties/MutablePropertyKt",
         "mutableProperty_usePublicProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           MUTABLE_PROPERTY_CLASS.getClassName());
       String propertyName = "publicProp";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName);
@@ -207,8 +207,8 @@
     String mainClass = addMainToClasspath("properties/MutablePropertyKt",
         "mutableProperty_usePrimitiveProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           MUTABLE_PROPERTY_CLASS.getClassName());
       String propertyName = "primitiveProp";
       FieldSubject fieldSubject = checkFieldIsKept(classSubject, "int", propertyName);
@@ -232,8 +232,8 @@
     String mainClass = addMainToClasspath("properties/LateInitPropertyKt",
         "lateInitProperty_noUseOfProperties");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           LATE_INIT_PROPERTY_CLASS.getClassName());
       for (Entry<String, KotlinProperty> property : LATE_INIT_PROPERTY_CLASS.properties.entrySet()) {
         MethodSignature getter = LATE_INIT_PROPERTY_CLASS.getGetterForProperty(property.getKey());
@@ -256,8 +256,8 @@
     String mainClass = addMainToClasspath(
         "properties/LateInitPropertyKt", "lateInitProperty_usePrivateLateInitProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           LATE_INIT_PROPERTY_CLASS.getClassName());
       String propertyName = "privateLateInitProp";
       FieldSubject fieldSubject = classSubject.field(JAVA_LANG_STRING, propertyName);
@@ -279,8 +279,8 @@
     String mainClass = addMainToClasspath("properties/LateInitPropertyKt",
         "lateInitProperty_useProtectedLateInitProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           LATE_INIT_PROPERTY_CLASS.getClassName());
       String propertyName = "protectedLateInitProp";
       FieldSubject fieldSubject = classSubject.field(JAVA_LANG_STRING, propertyName);
@@ -300,8 +300,8 @@
     String mainClass = addMainToClasspath(
         "properties/LateInitPropertyKt", "lateInitProperty_useInternalLateInitProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           LATE_INIT_PROPERTY_CLASS.getClassName());
       String propertyName = "internalLateInitProp";
       FieldSubject fieldSubject = classSubject.field(JAVA_LANG_STRING, propertyName);
@@ -319,8 +319,8 @@
     String mainClass = addMainToClasspath(
         "properties/LateInitPropertyKt", "lateInitProperty_usePublicLateInitProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           LATE_INIT_PROPERTY_CLASS.getClassName());
       String propertyName = "publicLateInitProp";
       FieldSubject fieldSubject = classSubject.field(JAVA_LANG_STRING, propertyName);
@@ -338,8 +338,8 @@
     String mainClass = addMainToClasspath(
         "properties/UserDefinedPropertyKt", "userDefinedProperty_noUseOfProperties");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           USER_DEFINED_PROPERTY_CLASS.getClassName());
       for (String propertyName : USER_DEFINED_PROPERTY_CLASS.properties.keySet()) {
         checkMethodIsRemoved(classSubject,
@@ -355,8 +355,8 @@
     String mainClass = addMainToClasspath(
         "properties/UserDefinedPropertyKt", "userDefinedProperty_useProperties");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject classSubject = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject classSubject = checkClassIsKept(codeInspector,
           USER_DEFINED_PROPERTY_CLASS.getClassName());
       String propertyName = "durationInSeconds";
       // The 'wrapper' property is not assigned to a backing field, it only relies on the wrapped
@@ -381,10 +381,10 @@
     String mainClass = addMainToClasspath(
         "properties.CompanionPropertiesKt", "companionProperties_usePrimitiveProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector,
           "properties.CompanionProperties");
-      ClassSubject companionClass = checkClassIsKept(dexInspector,
+      ClassSubject companionClass = checkClassIsKept(codeInspector,
           COMPANION_PROPERTY_CLASS.getClassName());
       String propertyName = "primitiveProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, "int", propertyName);
@@ -412,10 +412,10 @@
     String mainClass = addMainToClasspath(
         "properties.CompanionPropertiesKt", "companionProperties_usePrivateProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector,
           "properties.CompanionProperties");
-      ClassSubject companionClass = checkClassIsKept(dexInspector,
+      ClassSubject companionClass = checkClassIsKept(codeInspector,
           COMPANION_PROPERTY_CLASS.getClassName());
       String propertyName = "privateProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
@@ -446,10 +446,10 @@
     String mainClass = addMainToClasspath(
         "properties.CompanionPropertiesKt", "companionProperties_useInternalProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector,
           "properties.CompanionProperties");
-      ClassSubject companionClass = checkClassIsKept(dexInspector,
+      ClassSubject companionClass = checkClassIsKept(codeInspector,
           COMPANION_PROPERTY_CLASS.getClassName());
       String propertyName = "internalProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
@@ -477,10 +477,10 @@
     String mainClass = addMainToClasspath(
         "properties.CompanionPropertiesKt", "companionProperties_usePublicProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector,
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector,
           "properties.CompanionProperties");
-      ClassSubject companionClass = checkClassIsKept(dexInspector,
+      ClassSubject companionClass = checkClassIsKept(codeInspector,
           COMPANION_PROPERTY_CLASS.getClassName());
       String propertyName = "publicProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
@@ -509,9 +509,9 @@
     String mainClass = addMainToClasspath("properties.CompanionLateInitPropertiesKt",
         "companionLateInitProperties_usePrivateLateInitProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
-      ClassSubject companionClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
+      ClassSubject companionClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "privateLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -540,9 +540,9 @@
     String mainClass = addMainToClasspath("properties.CompanionLateInitPropertiesKt",
         "companionLateInitProperties_useInternalLateInitProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
-      ClassSubject companionClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
+      ClassSubject companionClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "internalLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -564,9 +564,9 @@
     String mainClass = addMainToClasspath("properties.CompanionLateInitPropertiesKt",
         "companionLateInitProperties_usePublicLateInitProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject outerClass = checkClassIsKept(dexInspector, testedClass.getOuterClassName());
-      ClassSubject companionClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
+      ClassSubject companionClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "publicLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -588,8 +588,8 @@
     String mainClass = addMainToClasspath(
         "properties.ObjectPropertiesKt", "objectProperties_usePrimitiveProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "primitiveProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, "int", propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -615,8 +615,8 @@
     String mainClass = addMainToClasspath(
         "properties.ObjectPropertiesKt", "objectProperties_usePrivateProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "privateProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -642,8 +642,8 @@
     String mainClass = addMainToClasspath(
         "properties.ObjectPropertiesKt", "objectProperties_useInternalProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "internalProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -669,8 +669,8 @@
     String mainClass = addMainToClasspath(
         "properties.ObjectPropertiesKt", "objectProperties_usePublicProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "publicProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -696,8 +696,8 @@
     String mainClass = addMainToClasspath(
         "properties.ObjectPropertiesKt", "objectProperties_useLateInitPrivateProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "privateLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -723,8 +723,8 @@
     String mainClass = addMainToClasspath(
         "properties.ObjectPropertiesKt", "objectProperties_useLateInitInternalProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "internalLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -746,8 +746,8 @@
     String mainClass = addMainToClasspath(
         "properties.ObjectPropertiesKt", "objectProperties_useLateInitPublicProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "publicLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -769,8 +769,8 @@
     String mainClass = addMainToClasspath(
         "properties.FilePropertiesKt", "fileProperties_usePrimitiveProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "primitiveProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, "int", propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -796,8 +796,8 @@
     String mainClass = addMainToClasspath(
         "properties.FilePropertiesKt", "fileProperties_usePrivateProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "privateProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -822,8 +822,8 @@
     String mainClass = addMainToClasspath(
         "properties.FilePropertiesKt", "fileProperties_useInternalProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "internalProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -848,8 +848,8 @@
     String mainClass = addMainToClasspath(
         "properties.FilePropertiesKt", "fileProperties_usePublicProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "publicProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -875,8 +875,8 @@
     String mainClass = addMainToClasspath(
         "properties.FilePropertiesKt", "fileProperties_useLateInitPrivateProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject fileClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject fileClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "privateLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(fileClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -901,8 +901,8 @@
     String mainClass = addMainToClasspath(
         "properties.FilePropertiesKt", "fileProperties_useLateInitInternalProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "internalLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
@@ -925,8 +925,8 @@
     String mainClass = addMainToClasspath(
         "properties.FilePropertiesKt", "fileProperties_useLateInitPublicProp");
     runTest(PACKAGE_NAME, mainClass, disableClassInliningAndMerging, (app) -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject objectClass = checkClassIsKept(dexInspector, testedClass.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject objectClass = checkClassIsKept(codeInspector, testedClass.getClassName());
       String propertyName = "publicLateInitProp";
       FieldSubject fieldSubject = checkFieldIsKept(objectClass, JAVA_LANG_STRING, propertyName);
       assertTrue(fieldSubject.getField().accessFlags.isStatic());
diff --git a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
index fd41344..12fdaf9 100644
--- a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
@@ -10,9 +10,9 @@
 import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import org.junit.Test;
@@ -35,8 +35,8 @@
     final String mainClassName = ex1.getClassName();
     final String extraRules = keepAllMembers(mainClassName);
     runTest(FOLDER, mainClassName, extraRules, app -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject clazz = checkClassIsKept(dexInspector, ex1.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject clazz = checkClassIsKept(codeInspector, ex1.getClassName());
 
       MethodSubject testMethod = checkMethodIsKept(clazz, testMethodSignature);
       DexCode dexCode = getDexCode(testMethod);
@@ -61,8 +61,8 @@
     final String mainClassName = ex2.getClassName();
     final String extraRules = keepAllMembers(mainClassName);
     runTest(FOLDER, mainClassName, extraRules, app -> {
-      DexInspector dexInspector = new DexInspector(app);
-      ClassSubject clazz = checkClassIsKept(dexInspector, ex2.getClassName());
+      CodeInspector codeInspector = new CodeInspector(app);
+      ClassSubject clazz = checkClassIsKept(codeInspector, ex2.getClassName());
 
       MethodSubject testMethod = checkMethodIsKept(clazz, testMethodSignature);
       DexCode dexCode = getDexCode(testMethod);
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
index dc5347e..fc41672 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -66,8 +66,8 @@
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.Timing;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import java.io.IOException;
@@ -484,7 +484,7 @@
         .forEach(
             p -> {
               try {
-                DexInspector i = new DexInspector(AndroidApp.builder().addProgramFiles(p).build());
+                CodeInspector i = new CodeInspector(AndroidApp.builder().addProgramFiles(p).build());
                 assertFalse("Found " + clazz + " in file " + p, i.clazz(clazz).isPresent());
               } catch (IOException | ExecutionException e) {
                 e.printStackTrace();
@@ -519,7 +519,7 @@
       throws IOException, ExecutionException, ProguardRuleParserException,
       CompilationFailedException {
     AndroidApp originalApp = AndroidApp.builder().addProgramFiles(app).build();
-    DexInspector originalInspector = new DexInspector(originalApp);
+    CodeInspector originalInspector = new CodeInspector(originalApp);
     for (String clazz : mainDex) {
       assertTrue("Class " + clazz + " does not exist in input",
           originalInspector.clazz(clazz).isPresent());
@@ -583,8 +583,8 @@
       assertTrue("Output run only produced one dex file.",
           1 < Files.list(outDir).filter(FileUtils::isDexFile).count());
     }
-    DexInspector inspector =
-        new DexInspector(
+    CodeInspector inspector =
+        new CodeInspector(
             AndroidApp.builder().addProgramFiles(outDir.resolve("classes.dex")).build());
     for (String clazz : mainDex) {
       if (!inspector.clazz(clazz).isPresent()) {
@@ -771,7 +771,7 @@
     }
 
     @Override
-    public Position getDebugPositionAtOffset(int offset) {
+    public Position getCanonicalDebugPositionAtOffset(int offset) {
       throw new Unreachable();
     }
 
diff --git a/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java b/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java
index fea8160..c1741c9 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java
@@ -23,7 +23,7 @@
 import com.android.tools.r8.VmTestRunner;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Paths;
 import java.util.ArrayList;
@@ -84,7 +84,7 @@
         .setMainDexListConsumer(
             (string, handler) -> mainDexList.content = string)
         .build();
-    DexInspector inspector = new DexInspector(ToolHelper.runR8(command));
+    CodeInspector inspector = new CodeInspector(ToolHelper.runR8(command));
     assertTrue(inspector.clazz("instrumentationtest.InstrumentationTest").isPresent());
     assertTrue(mainDexList.content.contains("junit/framework/TestCase.class"));
     // TODO(72794301): Two copies of this message is a bit over the top.
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java b/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java
index d3805d9..6c6e69d 100644
--- a/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java
+++ b/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.memberrebinding;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
@@ -17,9 +17,9 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.List;
@@ -74,10 +74,10 @@
       options.enableInlining = false;
       options.enableClassMerging = false;
     });
-    DexInspector dexInspector = new DexInspector(processedApp);
-    ClassSubject classSubject = dexInspector.clazz(TestMain.class);
+    CodeInspector codeInspector = new CodeInspector(processedApp);
+    ClassSubject classSubject = codeInspector.clazz(TestMain.class);
     assertThat(classSubject, isPresent());
-    MethodSubject methodSubject = classSubject.method(DexInspector.MAIN);
+    MethodSubject methodSubject = classSubject.method(CodeInspector.MAIN);
     assertThat(methodSubject, isPresent());
     DexCode dexCode = methodSubject.getMethod().getCode().asDexCode();
     assertTrue(dexCode.instructions[2] instanceof InvokeVirtual);
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
index c2ec4b7..80379e0 100644
--- a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
+++ b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
@@ -12,11 +12,11 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldAccessInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldAccessInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Path;
@@ -55,8 +55,8 @@
   private final Frontend kind;
   private final Path originalDex;
   private final Path programFile;
-  private final Consumer<DexInspector> inspection;
-  private final Consumer<DexInspector> originalInspection;
+  private final Consumer<CodeInspector> inspection;
+  private final Consumer<CodeInspector> originalInspection;
   private final int minApiLevel;
 
   @Rule
@@ -101,9 +101,9 @@
     return !invoke.holder().is("java.io.PrintStream");
   }
 
-  private static void inspectOriginalMain(DexInspector inspector) {
+  private static void inspectOriginalMain(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding.Memberrebinding")
-        .method(DexInspector.MAIN);
+        .method(CodeInspector.MAIN);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(MemberRebindingTest::coolInvokes);
     assertTrue(iterator.next().holder().is("memberrebinding.ClassAtBottomOfChain"));
@@ -129,9 +129,9 @@
     assertFalse(iterator.hasNext());
   }
 
-  private static void inspectMain(DexInspector inspector) {
+  private static void inspectMain(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding.Memberrebinding")
-        .method(DexInspector.MAIN);
+        .method(CodeInspector.MAIN);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(MemberRebindingTest::coolInvokes);
     assertTrue(iterator.next().holder().is("memberrebinding.ClassAtBottomOfChain"));
@@ -160,9 +160,9 @@
     assertFalse(iterator.hasNext());
   }
 
-  private static void inspectOriginalMain2(DexInspector inspector) {
+  private static void inspectOriginalMain2(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding2.Memberrebinding")
-        .method(DexInspector.MAIN);
+        .method(CodeInspector.MAIN);
     Iterator<FieldAccessInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isFieldAccess);
     // Run through instance put, static put, instance get and instance get.
@@ -176,9 +176,9 @@
     assertFalse(iterator.hasNext());
   }
 
-  private static void inspectMain2(DexInspector inspector) {
+  private static void inspectMain2(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding2.Memberrebinding")
-        .method(DexInspector.MAIN);
+        .method(CodeInspector.MAIN);
     Iterator<FieldAccessInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isFieldAccess);
     // Run through instance put, static put, instance get and instance get.
@@ -195,7 +195,7 @@
   public static MethodSignature TEST =
       new MethodSignature("test", "void", new String[]{});
 
-  private static void inspectOriginal3(DexInspector inspector) {
+  private static void inspectOriginal3(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding3.Memberrebinding").method(TEST);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
@@ -205,7 +205,7 @@
     assertFalse(iterator.hasNext());
   }
 
-  private static void inspect3(DexInspector inspector) {
+  private static void inspect3(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding3.Memberrebinding").method(TEST);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
@@ -215,7 +215,7 @@
     assertFalse(iterator.hasNext());
   }
 
-  private static void inspectOriginal4(DexInspector inspector) {
+  private static void inspectOriginal4(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding4.Memberrebinding").method(TEST);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
@@ -224,7 +224,7 @@
     assertFalse(iterator.hasNext());
   }
 
-  private static void inspect4(DexInspector inspector) {
+  private static void inspect4(CodeInspector inspector) {
     MethodSubject main = inspector.clazz("memberrebinding4.Memberrebinding").method(TEST);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
@@ -243,14 +243,14 @@
     final String name;
     final Frontend kind;
     final AndroidVersion version;
-    final Consumer<DexInspector> originalInspection;
-    final Consumer<DexInspector> processedInspection;
+    final Consumer<CodeInspector> originalInspection;
+    final Consumer<CodeInspector> processedInspection;
 
     private TestConfiguration(String name,
         Frontend kind,
         AndroidVersion version,
-        Consumer<DexInspector> originalInspection,
-        Consumer<DexInspector> processedInspection) {
+        Consumer<CodeInspector> originalInspection,
+        Consumer<CodeInspector> processedInspection) {
       this.name = name;
       this.kind = kind;
       this.version = version;
@@ -261,8 +261,8 @@
     public static void add(ImmutableList.Builder<TestConfiguration> builder,
         String name,
         AndroidVersion version,
-        Consumer<DexInspector> originalInspection,
-        Consumer<DexInspector> processedInspection) {
+        Consumer<CodeInspector> originalInspection,
+        Consumer<CodeInspector> processedInspection) {
       if (version == AndroidVersion.PRE_N) {
         builder.add(new TestConfiguration(name, Frontend.DEX, version, originalInspection,
             processedInspection));
@@ -330,11 +330,11 @@
     Path processed = Paths.get(out, "classes.dex");
 
     if (kind == Frontend.DEX) {
-      DexInspector inspector = new DexInspector(originalDex);
+      CodeInspector inspector = new CodeInspector(originalDex);
       originalInspection.accept(inspector);
     }
 
-    DexInspector inspector = new DexInspector(processed);
+    CodeInspector inspector = new CodeInspector(processed);
     inspection.accept(inspector);
 
     // We don't run Art, as the test R8RunExamplesTest already does that.
diff --git a/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java b/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
index 9b120e6..d7d0538 100644
--- a/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
+++ b/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
@@ -6,6 +6,7 @@
 
 import static org.junit.Assert.assertTrue;
 
+import com.android.tools.r8.ClassFileConsumer;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.R8Command;
@@ -13,22 +14,46 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.CfInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject.JumboStringMode;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
+@RunWith(Parameterized.class)
 public class MoveStringConstantsTest extends TestBase {
-  private void runTest(Consumer<DexInspector> inspection) throws Exception {
+
+  private Backend backend;
+
+  @Parameters(name = "Backend: {0}")
+  public static Collection<Backend> data() {
+    return Arrays.asList(Backend.values());
+  }
+
+  private void runTest(Consumer<CodeInspector> inspection) throws Exception {
     R8Command.Builder builder = R8Command.builder();
     builder.addProgramFiles(ToolHelper.getClassFileForTestClass(TestClass.class));
     builder.addProgramFiles(ToolHelper.getClassFileForTestClass(Utils.class));
-    builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
+    builder.addLibraryFiles(
+        backend == Backend.DEX
+            ? ToolHelper.getDefaultAndroidJar()
+            : ToolHelper.getJava8RuntimeJar());
+    assert (backend == Backend.CF || backend == Backend.DEX);
+    builder.setProgramConsumer(
+        backend == Backend.DEX
+            ? DexIndexedConsumer.emptyConsumer()
+            : ClassFileConsumer.emptyConsumer());
     builder.setMode(CompilationMode.RELEASE);
     builder.addProguardConfiguration(
         ImmutableList.of(
@@ -37,14 +62,35 @@
             "-allowaccessmodification"
         ),
         Origin.unknown());
-    AndroidApp app = ToolHelper.runR8(builder.build());
-    inspection.accept(new DexInspector(app));
+    AndroidApp app =
+        ToolHelper.runR8(
+            builder.build(),
+            options -> {
+              // This test relies on that TestClass.java/Utils.check will be inlined.
+              // Its size must fit into the inlining instruction limit. For CF, the default
+              // setting (5) is just too small.
+              options.inliningInstructionLimit = 10;
+            });
+    inspection.accept(
+        new CodeInspector(
+            app,
+            options -> {
+              options.enableCfFrontend = true;
+            }));
 
-    // Run on Art to check generated code against verifier.
-    runOnArt(app, TestClass.class);
+    if (backend == Backend.DEX) {
+      // Run on Art to check generated code against verifier.
+      runOnArt(app, TestClass.class);
+    } else {
+      runOnJava(app, TestClass.class);
+    }
   }
 
-  private void validate(DexInspector inspector) {
+  public MoveStringConstantsTest(Backend backend) {
+    this.backend = backend;
+  }
+
+  private void validate(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(TestClass.class);
     assertTrue(clazz.isPresent());
 
@@ -53,37 +99,41 @@
         clazz.method("void", "foo", ImmutableList.of(
             "java.lang.String", "java.lang.String", "java.lang.String", "java.lang.String"));
     assertTrue(methodThrowToBeInlined.isPresent());
-    validateSequence(methodThrowToBeInlined.iterateInstructions(),
+    assert (backend == Backend.DEX || backend == Backend.CF);
+    Predicate<InstructionSubject> nullCheck =
+        backend == Backend.DEX
+            ? InstructionSubject::isIfEqz
+            : insn -> ((CfInstructionSubject) insn).isIfNull();
+    validateSequence(
+        methodThrowToBeInlined.iterateInstructions(),
         // 'if' with "foo#1" is flipped.
-        InstructionSubject::isIfEqz,
+        nullCheck,
 
         // 'if' with "foo#2" is removed along with the constant.
 
         // 'if' with "foo#3" is removed so now we have unconditional call.
-        insn -> insn.isConstString("StringConstants::foo#3"),
+        insn -> insn.isConstString("StringConstants::foo#3", JumboStringMode.DISALLOW),
         InstructionSubject::isInvokeStatic,
         InstructionSubject::isThrow,
 
         // 'if's with "foo#4" and "foo#5" are flipped, but their throwing branches
         // are not moved to the end of the code (area for improvement?).
-        insn -> insn.isConstString("StringConstants::foo#4"),
-        InstructionSubject::isIfEqz, // Flipped if
+        insn -> insn.isConstString("StringConstants::foo#4", JumboStringMode.DISALLOW),
+        nullCheck, // Flipped if
         InstructionSubject::isGoto, // Jump around throwing branch.
         InstructionSubject::isInvokeStatic, // Throwing branch.
         InstructionSubject::isThrow,
-
-        insn -> insn.isConstString("StringConstants::foo#5"),
-        InstructionSubject::isIfEqz, // Flipped if
+        insn -> insn.isConstString("StringConstants::foo#5", JumboStringMode.DISALLOW),
+        nullCheck, // Flipped if
         InstructionSubject::isReturnVoid, // Final return statement.
         InstructionSubject::isInvokeStatic, // Throwing branch.
         InstructionSubject::isThrow,
 
         // After 'if' with "foo#1" flipped, always throwing branch
         // moved here along with the constant.
-        insn -> insn.isConstString("StringConstants::foo#1"),
+        insn -> insn.isConstString("StringConstants::foo#1", JumboStringMode.DISALLOW),
         InstructionSubject::isInvokeStatic,
-        InstructionSubject::isThrow
-    );
+        InstructionSubject::isThrow);
   }
 
   @SafeVarargs
diff --git a/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java b/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
index 39d7f0b..aaecd58 100644
--- a/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
@@ -21,11 +21,11 @@
 import com.android.tools.r8.shaking.ProguardRuleParserException;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
-import com.android.tools.r8.utils.dexinspector.NewInstanceInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.NewInstanceInstructionSubject;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -114,8 +114,8 @@
                     pgConfig -> pgConfig.setApplyMappingFile(proguardMap))
                 .build());
 
-    DexInspector inspector = createDexInspector(instrApp);
-    MethodSubject main = inspector.clazz("applymapping044.Main").method(DexInspector.MAIN);
+    CodeInspector inspector = createDexInspector(instrApp);
+    MethodSubject main = inspector.clazz("applymapping044.Main").method(CodeInspector.MAIN);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
     // B#m()
@@ -169,8 +169,8 @@
                 .build());
 
     // Make sure the given proguard map is indeed applied.
-    DexInspector inspector = createDexInspector(outputApp);
-    MethodSubject main = inspector.clazz("applymapping044.Main").method(DexInspector.MAIN);
+    CodeInspector inspector = createDexInspector(outputApp);
+    MethodSubject main = inspector.clazz("applymapping044.Main").method(CodeInspector.MAIN);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
     // B#m() -> y#n()
@@ -211,9 +211,9 @@
     assertEquals("p", original_f.invokedMethod().name.toString());
   }
 
-  private static DexInspector createDexInspector(AndroidApp outputApp)
+  private static CodeInspector createDexInspector(AndroidApp outputApp)
       throws IOException, ExecutionException {
-    return new DexInspector(
+    return new CodeInspector(
         outputApp,
         o -> {
           o.enableCfFrontend = true;
@@ -236,8 +236,8 @@
                 .build());
 
     // Make sure the given proguard map is indeed applied.
-    DexInspector inspector = createDexInspector(outputApp);
-    MethodSubject main = inspector.clazz("naming001.D").method(DexInspector.MAIN);
+    CodeInspector inspector = createDexInspector(outputApp);
+    MethodSubject main = inspector.clazz("naming001.D").method(CodeInspector.MAIN);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
     // mapping-105 simply includes: naming001.D#keep -> peek
@@ -268,8 +268,8 @@
                 .build());
 
     // Make sure the given proguard map is indeed applied.
-    DexInspector inspector = createDexInspector(outputApp);
-    MethodSubject main = inspector.clazz("naming001.D").method(DexInspector.MAIN);
+    CodeInspector inspector = createDexInspector(outputApp);
+    MethodSubject main = inspector.clazz("naming001.D").method(CodeInspector.MAIN);
 
     Iterator<InstructionSubject> iterator = main.iterateInstructions();
     // naming001.E is renamed to a.a, so first instruction must be: new-instance La/a;
@@ -300,7 +300,11 @@
   private R8Command.Builder getCommandForInstrumentation(
       Path out, Path flag, Path mainApp, Path instrApp) throws IOException {
     return R8Command.builder()
-        .addLibraryFiles(ToolHelper.getDefaultAndroidJar(), mainApp)
+        .addLibraryFiles(
+            backend == Backend.DEX
+                ? ToolHelper.getDefaultAndroidJar()
+                : ToolHelper.getJava8RuntimeJar(),
+            mainApp)
         .addProgramFiles(instrApp)
         .setOutput(out, backend == Backend.DEX ? OutputMode.DexIndexed : OutputMode.ClassFile)
         .addProguardConfigurationFiles(flag);
@@ -309,7 +313,10 @@
   private R8Command.Builder getCommandForApps(Path out, Path flag, Path... jars)
       throws IOException {
     return R8Command.builder()
-        .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
+        .addLibraryFiles(
+            backend == Backend.DEX
+                ? ToolHelper.getDefaultAndroidJar()
+                : ToolHelper.getJava8RuntimeJar())
         .addProgramFiles(jars)
         .setOutput(out, backend == Backend.DEX ? OutputMode.DexIndexed : OutputMode.ClassFile)
         .addProguardConfigurationFiles(flag);
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
index 58e17d1..a9ee851 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
@@ -6,28 +6,29 @@
 import static com.android.tools.r8.utils.DescriptorUtils.descriptorToJavaType;
 import static com.android.tools.r8.utils.DescriptorUtils.isValidJavaType;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.ConstStringJumbo;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexValue.DexValueString;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.ListUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.ConstStringInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject.JumboStringMode;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
+import com.google.common.collect.Streams;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
@@ -47,15 +48,20 @@
 
   private final String appFileName;
   private final List<String> keepRulesFiles;
-  private final Consumer<DexInspector> inspection;
+  private final Consumer<CodeInspector> inspection;
+  private final Backend backend;
 
   public IdentifierMinifierTest(
+      Backend backend,
       String test,
       List<String> keepRulesFiles,
-      Consumer<DexInspector> inspection) {
-    this.appFileName = ToolHelper.EXAMPLES_BUILD_DIR + test + "/classes.dex";
+      Consumer<CodeInspector> inspection) {
+    assert backend == Backend.DEX || backend == Backend.CF;
+    this.appFileName =
+        ToolHelper.EXAMPLES_BUILD_DIR + test + (backend == Backend.DEX ? "/classes.dex" : ".jar");
     this.keepRulesFiles = keepRulesFiles;
     this.inspection = inspection;
+    this.backend = backend;
   }
 
   private AndroidApp processedApp;
@@ -65,25 +71,34 @@
     Path out = temp.getRoot().toPath();
     R8Command.Builder builder =
         ToolHelper.addProguardConfigurationConsumer(
-            R8Command.builder(),
-            pgConfig -> {
-              pgConfig.setPrintMapping(true);
-              pgConfig.setPrintMappingFile(out.resolve(ToolHelper.DEFAULT_PROGUARD_MAP_FILE));
-            })
-            .setOutput(out, OutputMode.DexIndexed)
-            .addProguardConfigurationFiles(ListUtils.map(keepRulesFiles, Paths::get))
-            .addLibraryFiles(ToolHelper.getDefaultAndroidJar());
+                R8Command.builder(),
+                pgConfig -> {
+                  pgConfig.setPrintMapping(true);
+                  pgConfig.setPrintMappingFile(out.resolve(ToolHelper.DEFAULT_PROGUARD_MAP_FILE));
+                })
+            .setOutput(out, backend == Backend.DEX ? OutputMode.DexIndexed : OutputMode.ClassFile)
+            .addProguardConfigurationFiles(ListUtils.map(keepRulesFiles, Paths::get));
+    if (backend == Backend.DEX) {
+      builder.addLibraryFiles(ToolHelper.getDefaultAndroidJar());
+    } else if (backend == Backend.CF) {
+      builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
+    }
     ToolHelper.getAppBuilder(builder).addProgramFiles(Paths.get(appFileName));
     processedApp = ToolHelper.runR8(builder.build(), o -> o.debug = false);
   }
 
   @Test
   public void identiferMinifierTest() throws Exception {
-    DexInspector dexInspector = new DexInspector(processedApp);
-    inspection.accept(dexInspector);
+    CodeInspector codeInspector =
+        new CodeInspector(
+            processedApp,
+            options -> {
+              options.enableCfFrontend = true;
+            });
+    inspection.accept(codeInspector);
   }
 
-  @Parameters(name = "test: {0} keep: {1}")
+  @Parameters(name = "[{0}] test: {1} keep: {2}")
   public static Collection<Object[]> data() {
     List<String> tests = Arrays.asList(
         "adaptclassstrings",
@@ -92,7 +107,7 @@
         "getmembers",
         "identifiernamestring");
 
-    Map<String, Consumer<DexInspector>> inspections = new HashMap<>();
+    Map<String, Consumer<CodeInspector>> inspections = new HashMap<>();
     inspections.put("adaptclassstrings:keep-rules-1.txt", IdentifierMinifierTest::test1_rule1);
     inspections.put("adaptclassstrings:keep-rules-2.txt", IdentifierMinifierTest::test1_rule2);
     inspections.put(
@@ -103,25 +118,38 @@
     inspections.put("identifiernamestring:keep-rules-2.txt", IdentifierMinifierTest::test2_rule2);
     inspections.put("identifiernamestring:keep-rules-3.txt", IdentifierMinifierTest::test2_rule3);
 
-    return NamingTestBase.createTests(tests, inspections);
+    Collection<Object[]> parameters = NamingTestBase.createTests(tests, inspections);
+
+    // Duplicate parameters for each backend.
+    List<Object[]> parametersWithBackend = new ArrayList<>();
+    for (Backend backend : Backend.values()) {
+      for (Object[] row : parameters) {
+        Object[] newRow = new Object[row.length + 1];
+        newRow[0] = backend;
+        System.arraycopy(row, 0, newRow, 1, row.length);
+        parametersWithBackend.add(newRow);
+      }
+    }
+
+    return parametersWithBackend;
   }
 
   // Without -adaptclassstrings
-  private static void test1_rule1(DexInspector inspector) {
+  private static void test1_rule1(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("adaptclassstrings.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    Code mainCode = main.getMethod().getCode();
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
-    int renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
+    int renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundMain);
     assertEquals(0, renamedYetFoundIdentifierCount);
 
     ClassSubject aClass = inspector.clazz("adaptclassstrings.A");
     MethodSubject bar = aClass.method("void", "bar", ImmutableList.of());
-    Code barCode = bar.getMethod().getCode();
-    verifyPresenceOfConstString(barCode.asDexCode().instructions);
-    renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, barCode.asDexCode().instructions);
+    assertTrue(bar instanceof FoundMethodSubject);
+    FoundMethodSubject foundBar = (FoundMethodSubject) bar;
+    verifyPresenceOfConstString(foundBar);
+    renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundBar);
     assertEquals(0, renamedYetFoundIdentifierCount);
 
     renamedYetFoundIdentifierCount =
@@ -130,21 +158,21 @@
   }
 
   // With -adaptclassstrings *.*A
-  private static void test1_rule2(DexInspector inspector) {
+  private static void test1_rule2(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("adaptclassstrings.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    Code mainCode = main.getMethod().getCode();
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
-    int renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
+    int renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundMain);
     assertEquals(0, renamedYetFoundIdentifierCount);
 
     ClassSubject aClass = inspector.clazz("adaptclassstrings.A");
     MethodSubject bar = aClass.method("void", "bar", ImmutableList.of());
-    Code barCode = bar.getMethod().getCode();
-    verifyPresenceOfConstString(barCode.asDexCode().instructions);
-    renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, barCode.asDexCode().instructions);
+    assertTrue(bar instanceof FoundMethodSubject);
+    FoundMethodSubject foundBar = (FoundMethodSubject) bar;
+    verifyPresenceOfConstString(foundBar);
+    renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundBar);
     assertEquals(1, renamedYetFoundIdentifierCount);
 
     renamedYetFoundIdentifierCount =
@@ -152,64 +180,66 @@
     assertEquals(1, renamedYetFoundIdentifierCount);
   }
 
-  private static void test_atomicfieldupdater(DexInspector inspector) {
+  private static void test_atomicfieldupdater(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("atomicfieldupdater.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    Code mainCode = main.getMethod().getCode();
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
 
     ClassSubject a = inspector.clazz("atomicfieldupdater.A");
-    Set<Instruction> constStringInstructions =
-        getRenamedMemberIdentifierConstStrings(a, mainCode.asDexCode().instructions);
+    Set<InstructionSubject> constStringInstructions =
+        getRenamedMemberIdentifierConstStrings(a, foundMain);
     assertEquals(3, constStringInstructions.size());
   }
 
-  private static void test_forname(DexInspector inspector) {
+  private static void test_forname(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("forname.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    Code mainCode = main.getMethod().getCode();
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
-    int renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
+    int renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundMain);
     assertEquals(1, renamedYetFoundIdentifierCount);
   }
 
-  private static void test_getmembers(DexInspector inspector) {
+  private static void test_getmembers(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("getmembers.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    Code mainCode = main.getMethod().getCode();
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
 
     ClassSubject a = inspector.clazz("getmembers.A");
-    Set<Instruction> constStringInstructions =
-        getRenamedMemberIdentifierConstStrings(a, mainCode.asDexCode().instructions);
+    Set<InstructionSubject> constStringInstructions =
+        getRenamedMemberIdentifierConstStrings(a, foundMain);
     assertEquals(2, constStringInstructions.size());
 
     ClassSubject b = inspector.clazz("getmembers.B");
     MethodSubject inliner = b.method("java.lang.String", "inliner", ImmutableList.of());
-    Code inlinerCode = inliner.getMethod().getCode();
-    constStringInstructions =
-        getRenamedMemberIdentifierConstStrings(a, inlinerCode.asDexCode().instructions);
+    assertTrue(inliner instanceof FoundMethodSubject);
+    FoundMethodSubject foundInliner = (FoundMethodSubject) inliner;
+    constStringInstructions = getRenamedMemberIdentifierConstStrings(a, foundInliner);
     assertEquals(1, constStringInstructions.size());
   }
 
   // Without -identifiernamestring
-  private static void test2_rule1(DexInspector inspector) {
+  private static void test2_rule1(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("identifiernamestring.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    Code mainCode = main.getMethod().getCode();
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
-    int renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
+    int renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundMain);
     assertEquals(0, renamedYetFoundIdentifierCount);
 
     ClassSubject aClass = inspector.clazz("identifiernamestring.A");
     MethodSubject aInit =
         aClass.method("void", "<init>", ImmutableList.of());
-    Code initCode = aInit.getMethod().getCode();
-    verifyPresenceOfConstString(initCode.asDexCode().instructions);
-    renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, initCode.asDexCode().instructions);
+    assertTrue(aInit instanceof FoundMethodSubject);
+    FoundMethodSubject foundAInit = (FoundMethodSubject) aInit;
+    verifyPresenceOfConstString(foundAInit);
+    renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundAInit);
     assertEquals(0, renamedYetFoundIdentifierCount);
 
     renamedYetFoundIdentifierCount =
@@ -218,24 +248,22 @@
   }
 
   // With -identifiernamestring for annotations and name-based filters
-  private static void test2_rule2(DexInspector inspector) {
+  private static void test2_rule2(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("identifiernamestring.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    assertTrue(main.isPresent());
-    Code mainCode = main.getMethod().getCode();
-    assertTrue(mainCode.isDexCode());
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
-    int renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
+    int renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundMain);
     assertEquals(1, renamedYetFoundIdentifierCount);
 
     ClassSubject aClass = inspector.clazz("identifiernamestring.A");
     MethodSubject aInit =
         aClass.method("void", "<init>", ImmutableList.of());
-    Code initCode = aInit.getMethod().getCode();
-    verifyPresenceOfConstString(initCode.asDexCode().instructions);
-    renamedYetFoundIdentifierCount =
-        countRenamedClassIdentifier(inspector, initCode.asDexCode().instructions);
+    assertTrue(aInit instanceof FoundMethodSubject);
+    FoundMethodSubject foundAInit = (FoundMethodSubject) aInit;
+    verifyPresenceOfConstString(foundAInit);
+    renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, foundAInit);
     assertEquals(1, renamedYetFoundIdentifierCount);
 
     renamedYetFoundIdentifierCount =
@@ -244,62 +272,54 @@
   }
 
   // With -identifiernamestring for reflective methods
-  private static void test2_rule3(DexInspector inspector) {
+  private static void test2_rule3(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("identifiernamestring.Main");
-    MethodSubject main = mainClass.method(DexInspector.MAIN);
-    assertTrue(main.isPresent());
-    Code mainCode = main.getMethod().getCode();
-    assertTrue(mainCode.isDexCode());
-    verifyPresenceOfConstString(mainCode.asDexCode().instructions);
+    MethodSubject main = mainClass.method(CodeInspector.MAIN);
+    assertTrue(main instanceof FoundMethodSubject);
+    FoundMethodSubject foundMain = (FoundMethodSubject) main;
+    verifyPresenceOfConstString(foundMain);
 
     ClassSubject b = inspector.clazz("identifiernamestring.B");
-    Set<Instruction> constStringInstructions =
-        getRenamedMemberIdentifierConstStrings(b, mainCode.asDexCode().instructions);
+    Set<InstructionSubject> constStringInstructions =
+        getRenamedMemberIdentifierConstStrings(b, foundMain);
     assertEquals(2, constStringInstructions.size());
   }
 
-  private static void verifyPresenceOfConstString(Instruction[] instructions) {
-    boolean presence =
-        Arrays.stream(instructions)
-            .anyMatch(instr -> instr instanceof ConstString || instr instanceof ConstStringJumbo);
-    assertTrue(presence);
+  private static void verifyPresenceOfConstString(FoundMethodSubject method) {
+    assertTrue(
+        method
+            .iterateInstructions(instruction -> instruction.isConstString(JumboStringMode.ALLOW))
+            .hasNext());
   }
 
-  private static String retrieveString(Instruction instr) {
-    if (instr instanceof ConstString) {
-      ConstString cnst = (ConstString) instr;
-      return cnst.getString().toString();
-    } else if (instr instanceof ConstStringJumbo) {
-      ConstStringJumbo cnst = (ConstStringJumbo) instr;
-      return cnst.getString().toString();
-    }
-    return null;
-  }
-
-  private static Stream<Instruction> getConstStringInstructions(Instruction[] instructions) {
-    return Arrays.stream(instructions)
-        .filter(instr -> instr instanceof ConstString || instr instanceof ConstStringJumbo);
+  private static Stream<InstructionSubject> getConstStringInstructions(FoundMethodSubject method) {
+    return Streams.stream(method.iterateInstructions())
+        .filter(instr -> instr.isConstString(JumboStringMode.ALLOW));
   }
 
   private static int countRenamedClassIdentifier(
-      DexInspector inspector, Instruction[] instructions) {
-    return getConstStringInstructions(instructions)
-        .reduce(0, (cnt, instr) -> {
-          String cnstString = retrieveString(instr);
-          assertNotNull(cnstString);
-          if (isValidJavaType(cnstString)) {
-            ClassSubject classSubject = inspector.clazz(cnstString);
-            if (classSubject.isRenamed()
-                && descriptorToJavaType(classSubject.getFinalDescriptor()).equals(cnstString)) {
-              return cnt + 1;
-            }
-          }
-          return cnt;
-        }, Integer::sum);
+      CodeInspector inspector, FoundMethodSubject method) {
+    return getConstStringInstructions(method)
+        .reduce(
+            0,
+            (cnt, instr) -> {
+              assert (instr instanceof ConstStringInstructionSubject);
+              String cnstString =
+                  ((ConstStringInstructionSubject) instr).getString().toSourceString();
+              if (isValidJavaType(cnstString)) {
+                ClassSubject classSubject = inspector.clazz(cnstString);
+                if (classSubject.isRenamed()
+                    && descriptorToJavaType(classSubject.getFinalDescriptor()).equals(cnstString)) {
+                  return cnt + 1;
+                }
+              }
+              return cnt;
+            },
+            Integer::sum);
   }
 
   private static int countRenamedClassIdentifier(
-      DexInspector inspector, DexEncodedField[] fields) {
+      CodeInspector inspector, DexEncodedField[] fields) {
     return Arrays.stream(fields)
         .filter(encodedField -> encodedField.getStaticValue() instanceof DexValueString)
         .reduce(0, (cnt, encodedField) -> {
@@ -316,22 +336,27 @@
         }, Integer::sum);
   }
 
-  private static Set<Instruction> getRenamedMemberIdentifierConstStrings(
-      ClassSubject clazz, Instruction[] instructions) {
-    Set<Instruction> result = Sets.newIdentityHashSet();
-    getConstStringInstructions(instructions).forEach(instr -> {
-      String cnstString = retrieveString(instr);
-      clazz.forAllMethods(foundMethodSubject -> {
-        if (foundMethodSubject.getFinalSignature().name.equals(cnstString)) {
-          result.add(instr);
-        }
-      });
-      clazz.forAllFields(foundFieldSubject -> {
-        if (foundFieldSubject.getFinalSignature().name.equals(cnstString)) {
-          result.add(instr);
-        }
-      });
-    });
+  private static Set<InstructionSubject> getRenamedMemberIdentifierConstStrings(
+      ClassSubject clazz, FoundMethodSubject method) {
+    Set<InstructionSubject> result = Sets.newIdentityHashSet();
+    getConstStringInstructions(method)
+        .forEach(
+            instr -> {
+              String cnstString =
+                  ((ConstStringInstructionSubject) instr).getString().toSourceString();
+              clazz.forAllMethods(
+                  foundMethodSubject -> {
+                    if (foundMethodSubject.getFinalSignature().name.equals(cnstString)) {
+                      result.add(instr);
+                    }
+                  });
+              clazz.forAllFields(
+                  foundFieldSubject -> {
+                    if (foundFieldSubject.getFinalSignature().name.equals(cnstString)) {
+                      result.add(instr);
+                    }
+                  });
+            });
     return result;
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
index 41e514a..28884cc 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
@@ -26,9 +26,9 @@
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.smali.SmaliBuilder.MethodSignature;
 import com.android.tools.r8.smali.SmaliTestBase;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
@@ -52,7 +52,7 @@
         "-identifiernamestring class " + CLASS_NAME + " { java.lang.String aClassName; }",
         "-keep class " + CLASS_NAME,
         "-dontoptimize");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -84,7 +84,7 @@
         "-identifiernamestring class " + CLASS_NAME + " { java.lang.String aClassName; }",
         "-keep class " + CLASS_NAME,
         "-dontoptimize");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -126,7 +126,7 @@
         "-keep class " + CLASS_NAME,
         "-keep,allowobfuscation class " + BOO,
         "-dontoptimize");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -163,7 +163,7 @@
         "-identifiernamestring class " + CLASS_NAME + " { static java.lang.String sClassName; }",
         "-keep class " + CLASS_NAME,
         "-dontoptimize");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -194,7 +194,7 @@
         "-identifiernamestring class " + CLASS_NAME + " { static java.lang.String sClassName; }",
         "-keep class " + CLASS_NAME,
         "-dontoptimize");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -232,7 +232,7 @@
         "-keep class " + CLASS_NAME,
         "-keep,allowobfuscation class " + BOO,
         "-dontoptimize");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -262,7 +262,7 @@
         "-identifiernamestring class " + CLASS_NAME + " { static java.lang.String sClassName; }",
         "-keep class " + CLASS_NAME + " { static java.lang.String sClassName; }",
         "-dontshrink");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -284,7 +284,7 @@
         "-keep class " + CLASS_NAME + " { static java.lang.String sClassName; }",
         "-keep,allowobfuscation class " + BOO,
         "-dontshrink");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -308,7 +308,7 @@
         "-keep class " + CLASS_NAME + " { static java.lang.String sFieldName; }",
         "-keep,allowobfuscation class " + BOO + " { <fields>; }",
         "-dontshrink");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -332,7 +332,7 @@
         "-keep class " + CLASS_NAME + " { static java.lang.String sMethodName; }",
         "-keep,allowobfuscation class " + BOO + " { <methods>; }",
         "-dontshrink");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -362,7 +362,7 @@
     List<String> pgConfigs = ImmutableList.of(
         "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
         "-keep class " + CLASS_NAME);
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -404,7 +404,7 @@
     List<String> pgConfigs = ImmutableList.of(
         "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
         "-keep class " + CLASS_NAME);
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -450,7 +450,7 @@
         "-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
         "-keep class " + CLASS_NAME,
         "-keep,allowobfuscation class " + BOO);
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -504,7 +504,7 @@
             + "}",
         "-keep class " + CLASS_NAME,
         "-keep class R { *; }");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -554,7 +554,7 @@
             + "}",
         "-keep class " + CLASS_NAME,
         "-keep,allowobfuscation class R { *; }");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -611,7 +611,7 @@
             + "}",
         "-keep class " + CLASS_NAME,
         "-keep class R { *; }");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -672,7 +672,7 @@
             + "}",
         "-keep class " + CLASS_NAME,
         "-keep,allowobfuscation class R { *; }");
-    DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
+    CodeInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
 
     ClassSubject clazz = inspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
@@ -696,8 +696,8 @@
     assertNotEquals("foo", constString.getString().toString());
   }
 
-  private DexInspector getInspectorAfterRunR8(
+  private CodeInspector getInspectorAfterRunR8(
       SmaliBuilder builder, List<String> proguardConfigurations) throws Exception {
-    return new DexInspector(runR8(builder, proguardConfigurations));
+    return new CodeInspector(runR8(builder, proguardConfigurations));
   }
 }
diff --git a/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java b/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java
index c7c74e9..02bca3a 100644
--- a/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java
+++ b/src/test/java/com/android/tools/r8/naming/LambdaRenamingTestRunner.java
@@ -20,7 +20,6 @@
 import com.android.tools.r8.utils.FileUtils;
 import java.io.IOException;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -129,7 +128,7 @@
     Path outPg = temp.getRoot().toPath().resolve(outName);
     ProcessResult proguardResult =
         ToolHelper.runProguard6Raw(
-            inputJar, outPg, Paths.get(ToolHelper.JAVA_8_RUNTIME), pgConfig, null);
+            inputJar, outPg, ToolHelper.getJava8RuntimeJar(), pgConfig, null);
     System.out.println(proguardResult.stdout);
     if (proguardResult.exitCode != 0) {
       System.out.println(proguardResult.stderr);
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
index e081f18..a5bbdf6 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.naming;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
@@ -29,8 +29,8 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.util.Arrays;
@@ -303,12 +303,12 @@
   public void runTest(
       ImmutableMap<String, String> signatures,
       Consumer<DiagnosticsChecker> diagnostics,
-      Consumer<DexInspector> inspect)
+      Consumer<CodeInspector> inspect)
       throws Exception {
     DiagnosticsChecker checker = new DiagnosticsChecker();
     assert (backend == Backend.CF || backend == Backend.DEX);
-    DexInspector inspector =
-        new DexInspector(
+    CodeInspector inspector =
+        new CodeInspector(
             ToolHelper.runR8(
                 R8Command.builder(checker)
                     .addClassProgramData(dumpSimple(signatures.get("Simple")), Origin.unknown())
@@ -376,7 +376,7 @@
 
   private void testSingleClass(String name, String signature,
       Consumer<DiagnosticsChecker> diagnostics,
-      Consumer<DexInspector> inspector)
+      Consumer<CodeInspector> inspector)
       throws Exception {
     ImmutableMap<String, String> signatures = ImmutableMap.of(name, signature);
     runTest(signatures, diagnostics, inspector);
@@ -390,7 +390,7 @@
     assertEquals(0, checker.warnings.size());
   }
 
-  private void noInspection(DexInspector inspector) {
+  private void noInspection(CodeInspector inspector) {
   }
 
   private void noSignatureAttribute(ClassSubject clazz) {
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
index 02ec163..c470661 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.naming;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
@@ -30,9 +30,9 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.util.Arrays;
@@ -159,17 +159,17 @@
     return cw.toByteArray();
   }
 
-  private FieldSubject lookupAnX(DexInspector inspector) {
+  private FieldSubject lookupAnX(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("Fields");
     return clazz.field("java.lang.String", "anX");
   }
 
-  private FieldSubject lookupAnArrayOfX(DexInspector inspector) {
+  private FieldSubject lookupAnArrayOfX(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("Fields");
     return clazz.field("java.lang.String[]", "anArrayOfX");
   }
 
-  private FieldSubject lookupAFieldsOfX(DexInspector inspector) {
+  private FieldSubject lookupAFieldsOfX(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("Fields");
     return clazz.field("Fields", "aFieldsOfX");
   }
@@ -177,12 +177,12 @@
   public void runTest(
       ImmutableMap<String, String> signatures,
       Consumer<DiagnosticsChecker> diagnostics,
-      Consumer<DexInspector> inspect)
+      Consumer<CodeInspector> inspect)
       throws Exception {
     DiagnosticsChecker checker = new DiagnosticsChecker();
     assert (backend == Backend.CF || backend == Backend.DEX);
-    DexInspector inspector =
-        new DexInspector(
+    CodeInspector inspector =
+        new CodeInspector(
             ToolHelper.runR8(
                 R8Command.builder(checker)
                     .addClassProgramData(dumpFields(signatures), Origin.unknown())
@@ -242,7 +242,7 @@
 
   private void testSingleField(String name, String signature,
       Consumer<DiagnosticsChecker> diagnostics,
-      Consumer<DexInspector> inspector)
+      Consumer<CodeInspector> inspector)
       throws Exception {
     ImmutableMap<String, String> signatures = ImmutableMap.of(name, signature);
     runTest(signatures, diagnostics, inspector);
@@ -256,7 +256,7 @@
     assertEquals(0, checker.warnings.size());
   }
 
-  private void noInspection(DexInspector inspector) {
+  private void noInspection(CodeInspector inspector) {
   }
 
   private void noSignatureAttribute(FieldSubject field) {
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
index efc9855..aa5307d 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.naming;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
@@ -33,9 +33,9 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.util.Arrays;
@@ -178,19 +178,19 @@
     return cw.toByteArray();
   }
 
-  private MethodSubject lookupGeneric(DexInspector inspector) {
+  private MethodSubject lookupGeneric(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("Methods");
     return clazz.method(
         "java.lang.Throwable", "generic", ImmutableList.of("java.lang.Throwable", "Methods$Inner"));
   }
 
-  private MethodSubject lookupParameterizedReturn(DexInspector inspector) {
+  private MethodSubject lookupParameterizedReturn(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("Methods");
     return clazz.method(
         "Methods$Inner", "parameterizedReturn", ImmutableList.of());
   }
 
-  private MethodSubject lookupParameterizedArguments(DexInspector inspector) {
+  private MethodSubject lookupParameterizedArguments(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("Methods");
     return clazz.method(
         "void", "parameterizedArguments", ImmutableList.of("java.lang.Throwable", "Methods$Inner"));
@@ -199,12 +199,12 @@
   public void runTest(
       ImmutableMap<String, String> signatures,
       Consumer<DiagnosticsChecker> diagnostics,
-      Consumer<DexInspector> inspect)
+      Consumer<CodeInspector> inspect)
       throws Exception {
     DiagnosticsChecker checker = new DiagnosticsChecker();
     assert (backend == Backend.CF || backend == Backend.DEX);
-    DexInspector inspector =
-        new DexInspector(
+    CodeInspector inspector =
+        new CodeInspector(
             ToolHelper.runR8(
                 R8Command.builder(checker)
                     .addClassProgramData(dumpMethods(signatures), Origin.unknown())
@@ -263,7 +263,7 @@
 
   private void testSingleMethod(String name, String signature,
       Consumer<DiagnosticsChecker> diagnostics,
-      Consumer<DexInspector> inspector)
+      Consumer<CodeInspector> inspector)
       throws Exception {
     ImmutableMap<String, String> signatures = ImmutableMap.of(name, signature);
     runTest(signatures, diagnostics, inspector);
@@ -277,7 +277,7 @@
     assertEquals(0, checker.warnings.size());
   }
 
-  private void noInspection(DexInspector inspector) {
+  private void noInspection(CodeInspector inspector) {
   }
 
   private void noSignatureAttribute(MethodSubject method) {
diff --git a/src/test/java/com/android/tools/r8/naming/WarnReflectiveAccessTest.java b/src/test/java/com/android/tools/r8/naming/WarnReflectiveAccessTest.java
index 25e2358..829cdd0 100644
--- a/src/test/java/com/android/tools/r8/naming/WarnReflectiveAccessTest.java
+++ b/src/test/java/com/android/tools/r8/naming/WarnReflectiveAccessTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.naming;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -21,8 +21,8 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.KeepingDiagnosticHandler;
 import com.android.tools.r8.utils.Reporter;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Method;
 import java.nio.file.Path;
@@ -113,8 +113,8 @@
         enableMinification, forceProguardCompatibility);
 
     String main = WarnReflectiveAccessTestMain.class.getCanonicalName();
-    DexInspector dexInspector = new DexInspector(processedApp);
-    ClassSubject mainSubject = dexInspector.clazz(main);
+    CodeInspector codeInspector = new CodeInspector(processedApp);
+    ClassSubject mainSubject = codeInspector.clazz(main);
     assertThat(mainSubject, isPresent());
 
     ProcessResult javaOutput = runOnJavaRaw(main, classes);
diff --git a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
index 4e46637..fd38d36 100644
--- a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
+++ b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.naming.b72391662;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -17,9 +17,9 @@
 import com.android.tools.r8.naming.b72391662.subpackage.OtherPackageTestClass;
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import java.util.List;
@@ -60,9 +60,9 @@
     AndroidApp app = runShrinkerRaw(shrinker, CLASSES, config);
     assertEquals("123451234567\nABC\n", runOnArt(app, mainClass.getCanonicalName()));
 
-    DexInspector dexInspector =
-        isR8(shrinker) ? new DexInspector(app) : new DexInspector(app, proguardMap);
-    ClassSubject testClass = dexInspector.clazz(TestClass.class);
+    CodeInspector codeInspector =
+        isR8(shrinker) ? new CodeInspector(app) : new CodeInspector(app, proguardMap);
+    ClassSubject testClass = codeInspector.clazz(TestClass.class);
     assertThat(testClass, isPresent());
 
     // Test the totally unused method.
@@ -150,9 +150,9 @@
     AndroidApp app = runShrinkerRaw(shrinker, CLASSES, config);
     assertEquals("123451234567\nABC\n", runOnArt(app, mainClass.getCanonicalName()));
 
-    DexInspector dexInspector =
-        isR8(shrinker) ? new DexInspector(app) : new DexInspector(app, proguardMap);
-    ClassSubject testClass = dexInspector.clazz(TestClass.class);
+    CodeInspector codeInspector =
+        isR8(shrinker) ? new CodeInspector(app) : new CodeInspector(app, proguardMap);
+    ClassSubject testClass = codeInspector.clazz(TestClass.class);
     assertThat(testClass, isPresent());
 
     // Test the totally unused method.
@@ -247,9 +247,9 @@
     AndroidApp app = runShrinkerRaw(shrinker, CLASSES, config);
     assertEquals("123451234567\nABC\n", runOnArt(app, mainClass.getCanonicalName()));
 
-    DexInspector dexInspector =
-        isR8(shrinker) ? new DexInspector(app) : new DexInspector(app, proguardMap);
-    ClassSubject testClass = dexInspector.clazz(TestClass.class);
+    CodeInspector codeInspector =
+        isR8(shrinker) ? new CodeInspector(app) : new CodeInspector(app, proguardMap);
+    ClassSubject testClass = codeInspector.clazz(TestClass.class);
     assertThat(testClass, isPresent());
 
     // Test the totally unused method.
diff --git a/src/test/java/com/android/tools/r8/naming/b80083341/B80083341.java b/src/test/java/com/android/tools/r8/naming/b80083341/B80083341.java
index 1b7d842..9791142 100644
--- a/src/test/java/com/android/tools/r8/naming/b80083341/B80083341.java
+++ b/src/test/java/com/android/tools/r8/naming/b80083341/B80083341.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.naming.b80083341;
 
 import static com.android.tools.r8.utils.DescriptorUtils.getClassNameFromDescriptor;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -12,8 +12,8 @@
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.VmTestRunner;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
@@ -40,7 +40,7 @@
         PackagePrivateClass.class, PackagePrivateClass.Itf.class, PackagePrivateClass.Impl.class
     ));
     AndroidApp processedApp = compileWithR8(app, String.join(System.lineSeparator(), config));
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject mainSubject = inspector.clazz(mainClass);
     assertThat(mainSubject, isPresent());
 
diff --git a/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java b/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java
index 0feddfd..f289674 100644
--- a/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java
+++ b/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java
@@ -18,8 +18,8 @@
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import org.junit.Test;
@@ -60,8 +60,8 @@
     Path out = temp.getRoot().toPath();
     AndroidApp processedApp = runR8(originalApp, FieldUpdater.class, out, overloadaggressively);
 
-    DexInspector dexInspector = new DexInspector(processedApp);
-    ClassSubject a = dexInspector.clazz(A.class.getCanonicalName());
+    CodeInspector codeInspector = new CodeInspector(processedApp);
+    ClassSubject a = codeInspector.clazz(A.class.getCanonicalName());
     DexEncodedField f1 = a.field("int", "f1").getField();
     assertNotNull(f1);
     DexEncodedField f2 = a.field("java.lang.Object", "f2").getField();
@@ -112,8 +112,8 @@
     Path out = temp.getRoot().toPath();
     AndroidApp processedApp = runR8(originalApp, FieldResolution.class, out, overloadaggressively);
 
-    DexInspector dexInspector = new DexInspector(processedApp);
-    ClassSubject a = dexInspector.clazz(A.class.getCanonicalName());
+    CodeInspector codeInspector = new CodeInspector(processedApp);
+    ClassSubject a = codeInspector.clazz(A.class.getCanonicalName());
     DexEncodedField f1 = a.field("int", "f1").getField();
     assertNotNull(f1);
     DexEncodedField f3 = a.field(B.class.getCanonicalName(), "f3").getField();
@@ -157,8 +157,8 @@
     Path out = temp.getRoot().toPath();
     AndroidApp processedApp = runR8(originalApp, MethodResolution.class, out, overloadaggressively);
 
-    DexInspector dexInspector = new DexInspector(processedApp);
-    ClassSubject b = dexInspector.clazz(B.class.getCanonicalName());
+    CodeInspector codeInspector = new CodeInspector(processedApp);
+    ClassSubject b = codeInspector.clazz(B.class.getCanonicalName());
     DexEncodedMethod m1 =
         b.method("int", "getF1", ImmutableList.of()).getMethod();
     assertNotNull(m1);
diff --git a/src/test/java/com/android/tools/r8/naming/overloadaggressively/ValidNameConflictTest.java b/src/test/java/com/android/tools/r8/naming/overloadaggressively/ValidNameConflictTest.java
index 6e3e30a..efead2d 100644
--- a/src/test/java/com/android/tools/r8/naming/overloadaggressively/ValidNameConflictTest.java
+++ b/src/test/java/com/android/tools/r8/naming/overloadaggressively/ValidNameConflictTest.java
@@ -14,10 +14,10 @@
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.jasmin.JasminTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import java.util.List;
@@ -94,8 +94,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(CLASS_NAME);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
     FieldSubject f1 = clazz.field("java.lang.String", "same");
     assertTrue(f1.isPresent());
@@ -122,8 +122,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(CLASS_NAME);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
     FieldSubject f1 = clazz.field("java.lang.String", "same");
     assertTrue(f1.isPresent());
@@ -152,8 +152,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(CLASS_NAME);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
     FieldSubject f1 = clazz.field("java.lang.String", "same");
     assertTrue(f1.isPresent());
@@ -179,8 +179,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(CLASS_NAME);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
     FieldSubject f1 = clazz.field("java.lang.String", "same");
     assertTrue(f1.isPresent());
@@ -207,8 +207,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(CLASS_NAME);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(CLASS_NAME);
     assertTrue(clazz.isPresent());
     FieldSubject f1 = clazz.field("java.lang.String", "same");
     assertTrue(f1.isPresent());
@@ -263,8 +263,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(ANOTHER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(clazz.isPresent());
     MethodSubject m1 = clazz.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -291,8 +291,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(ANOTHER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(clazz.isPresent());
     MethodSubject m1 = clazz.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -321,8 +321,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(ANOTHER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(clazz.isPresent());
     MethodSubject m1 = clazz.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -348,8 +348,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(ANOTHER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(clazz.isPresent());
     MethodSubject m1 = clazz.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -376,8 +376,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject clazz = dexInspector.clazz(ANOTHER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject clazz = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(clazz.isPresent());
     MethodSubject m1 = clazz.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -445,8 +445,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject sup = dexInspector.clazz(SUPER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject sup = codeInspector.clazz(SUPER_CLASS);
     assertTrue(sup.isPresent());
     MethodSubject m1 = sup.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -456,7 +456,7 @@
     assertFalse(m2.isRenamed());
     assertEquals(m1.getFinalName(), m2.getFinalName());
 
-    ClassSubject sub = dexInspector.clazz(ANOTHER_CLASS);
+    ClassSubject sub = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(sub.isPresent());
     MethodSubject subM1 = sub.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(subM1.isPresent());
@@ -487,8 +487,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject sup = dexInspector.clazz(SUPER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject sup = codeInspector.clazz(SUPER_CLASS);
     assertTrue(sup.isPresent());
     MethodSubject m1 = sup.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -498,7 +498,7 @@
     assertTrue(m2.isRenamed());
     assertEquals(m1.getFinalName(), m2.getFinalName());
 
-    ClassSubject sub = dexInspector.clazz(ANOTHER_CLASS);
+    ClassSubject sub = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(sub.isPresent());
     MethodSubject subM1 = sub.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(subM1.isPresent());
@@ -531,8 +531,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject sup = dexInspector.clazz(SUPER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject sup = codeInspector.clazz(SUPER_CLASS);
     assertTrue(sup.isPresent());
     MethodSubject m1 = sup.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -542,7 +542,7 @@
     assertTrue(m2.isRenamed());
     assertEquals(m1.getFinalName(), m2.getFinalName());
 
-    ClassSubject sub = dexInspector.clazz(ANOTHER_CLASS);
+    ClassSubject sub = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(sub.isPresent());
     MethodSubject subM1 = sub.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(subM1.isPresent());
@@ -572,8 +572,8 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
-    ClassSubject sup = dexInspector.clazz(SUPER_CLASS);
+    CodeInspector codeInspector = new CodeInspector(app);
+    ClassSubject sup = codeInspector.clazz(SUPER_CLASS);
     assertTrue(sup.isPresent());
     MethodSubject m1 = sup.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -583,7 +583,7 @@
     assertTrue(m2.isRenamed());
     assertNotEquals(m1.getFinalName(), m2.getFinalName());
 
-    ClassSubject sub = dexInspector.clazz(ANOTHER_CLASS);
+    ClassSubject sub = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(sub.isPresent());
     MethodSubject subM1 = sub.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(subM1.isPresent());
@@ -614,9 +614,9 @@
         "-dontshrink");
     AndroidApp app = compileWithR8(builder, pgConfigs, null);
 
-    DexInspector dexInspector = new DexInspector(app);
+    CodeInspector codeInspector = new CodeInspector(app);
 
-    ClassSubject sup = dexInspector.clazz(SUPER_CLASS);
+    ClassSubject sup = codeInspector.clazz(SUPER_CLASS);
     assertTrue(sup.isPresent());
     MethodSubject m1 = sup.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(m1.isPresent());
@@ -626,7 +626,7 @@
     assertTrue(m2.isRenamed());
     assertEquals(m1.getFinalName(), m2.getFinalName());
 
-    ClassSubject sub = dexInspector.clazz(ANOTHER_CLASS);
+    ClassSubject sub = codeInspector.clazz(ANOTHER_CLASS);
     assertTrue(sub.isPresent());
     MethodSubject subM1 = sub.method("java.lang.String", "same", ImmutableList.of());
     assertTrue(subM1.isPresent());
diff --git a/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java b/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
index 8ae31f7..73dcdb3 100644
--- a/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
+++ b/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
@@ -7,31 +7,61 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import com.android.tools.r8.ClassFileConsumer;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.cf.code.CfStackInstruction.Opcode;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.DexInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.CfInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.DexInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject.JumboStringMode;
+import com.android.tools.r8.utils.codeinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.function.BiConsumer;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
+@RunWith(Parameterized.class)
 public class NeverReturnsNormallyTest extends TestBase {
+
+  private Backend backend;
+
+  @Parameters(name = "Backend: {0}")
+  public static Collection<Backend> data() {
+    return Arrays.asList(Backend.values());
+  }
+
+  public NeverReturnsNormallyTest(Backend backend) {
+    this.backend = backend;
+  }
+
   private void runTest(
-      BiConsumer<DexInspector, CompilationMode> inspection,
+      BiConsumer<CodeInspector, CompilationMode> inspection,
       boolean enableClassInliner, CompilationMode mode) throws Exception {
     R8Command.Builder builder = R8Command.builder();
     builder.addProgramFiles(ToolHelper.getClassFileForTestClass(TestClass.class));
-    builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
+    assert (backend == Backend.DEX || backend == Backend.CF);
+    builder.setProgramConsumer(
+        backend == Backend.DEX
+            ? DexIndexedConsumer.emptyConsumer()
+            : ClassFileConsumer.emptyConsumer());
+    builder.addLibraryFiles(
+        backend == Backend.DEX
+            ? ToolHelper.getDefaultAndroidJar()
+            : ToolHelper.getJava8RuntimeJar());
     builder.setMode(mode);
     builder.addProguardConfiguration(
         ImmutableList.of(
@@ -47,18 +77,28 @@
             "}",
             "",
             "-dontobfuscate",
-            "-allowaccessmodification"
-        ),
+            "-allowaccessmodification"),
         Origin.unknown());
-    AndroidApp app = ToolHelper.runR8(builder.build(),
-        opts -> opts.enableClassInlining = enableClassInliner);
-    inspection.accept(new DexInspector(app), mode);
+    AndroidApp app =
+        ToolHelper.runR8(builder.build(), opts -> opts.enableClassInlining = enableClassInliner);
+    inspection.accept(
+        new CodeInspector(
+            app,
+            options -> {
+              options.enableCfFrontend = true;
+            }),
+        mode);
 
-    // Run on Art to check generated code against verifier.
-    runOnArt(app, TestClass.class);
+    if (backend == Backend.DEX) {
+      // Run on Art to check generated code against verifier.
+      runOnArt(app, TestClass.class);
+    } else {
+      runOnJava(app, TestClass.class);
+    }
   }
 
-  private void validate(DexInspector inspector, CompilationMode mode) {
+  private void validate(CodeInspector inspector, CompilationMode mode) {
+    assert (backend == Backend.DEX || backend == Backend.CF);
     ClassSubject clazz = inspector.clazz(TestClass.class);
     assertTrue(clazz.isPresent());
 
@@ -78,39 +118,34 @@
     assertTrue(methodThrowToBeInlined.isPresent());
     Iterator<InstructionSubject> instructions = methodThrowToBeInlined.iterateInstructions();
     // Call, followed by throw null.
-    assertTrue(nextInstruction(instructions).isConstString());
-    InstructionSubject insn = nextInstruction(instructions);
+    InstructionSubject insn = nextInstructionSkippingCfPositionAndLabel(instructions);
+    assertTrue(insn != null && insn.isConstString(JumboStringMode.ALLOW));
+    insn = nextInstruction(instructions);
     assertTrue(insn.isInvoke());
     assertTrue(((InvokeInstructionSubject) insn)
         .invokedMethod().name.toString().equals("throwNpe"));
-    insn = nextInstruction(instructions);
-    assertTrue(insn instanceof DexInstructionSubject && ((DexInstructionSubject) insn).isConst4());
-    assertTrue(nextInstruction(instructions).isThrow());
-    assertFalse(instructions.hasNext());
+    verifyTrailingPattern(instructions);
 
     // Check the instruction used for testInlinedIntoVoidMethod
     MethodSubject methodTestInlinedIntoVoidMethod =
         clazz.method("void", "testInlinedIntoVoidMethod", ImmutableList.of());
     assertTrue(methodTestInlinedIntoVoidMethod.isPresent());
     instructions = methodTestInlinedIntoVoidMethod.iterateInstructions();
+    insn = nextInstructionSkippingCfPositionAndLabel(instructions);
     if (mode == CompilationMode.DEBUG) {
       // Not inlined call to throwToBeInlined.
-      insn = nextInstruction(instructions);
       assertTrue(insn.isInvoke());
       assertTrue(((InvokeInstructionSubject) insn)
           .invokedMethod().name.toString().equals("throwToBeInlined"));
     } else {
       // Inlined code from throwToBeInlined.
-      assertTrue(nextInstruction(instructions).isConstString());
+      assertTrue(insn.isConstString(JumboStringMode.ALLOW));
       insn = nextInstruction(instructions);
       assertTrue(insn.isInvoke());
       assertTrue(((InvokeInstructionSubject) insn)
           .invokedMethod().name.toString().equals("throwNpe"));
     }
-    insn = nextInstruction(instructions);
-    assertTrue(insn instanceof DexInstructionSubject && ((DexInstructionSubject) insn).isConst4());
-    assertTrue(nextInstruction(instructions).isThrow());
-    assertFalse(instructions.hasNext());
+    verifyTrailingPattern(instructions);
 
     // Check the instruction used for testInlinedIntoVoidMethod
     MethodSubject methodOuterTrivial =
@@ -118,14 +153,11 @@
     assertTrue(methodOuterTrivial.isPresent());
     instructions = methodOuterTrivial.iterateInstructions();
     // Call, followed by [nop, goto]
-    insn = nextInstruction(instructions);
+    insn = nextInstructionSkippingCfPositionAndLabel(instructions);
     assertTrue(insn.isInvoke());
     assertTrue(((InvokeInstructionSubject) insn)
         .invokedMethod().name.toString().equals("innerNotReachable"));
-    insn = nextInstruction(instructions);
-    assertTrue(insn instanceof DexInstructionSubject && ((DexInstructionSubject) insn).isConst4());
-    assertTrue(nextInstruction(instructions).isThrow());
-    assertFalse(instructions.hasNext());
+    verifyTrailingPattern(instructions);
   }
 
   private InstructionSubject nextInstruction(Iterator<InstructionSubject> instructions) {
@@ -133,6 +165,39 @@
     return instructions.next();
   }
 
+  private InstructionSubject nextInstructionSkippingCfPositionAndLabel(
+      Iterator<InstructionSubject> instructions) {
+    InstructionSubject insn = null;
+    while (instructions.hasNext()) {
+      insn = instructions.next();
+      if (!(insn instanceof CfInstructionSubject)) {
+        break;
+      }
+      CfInstructionSubject cfInsn = (CfInstructionSubject) insn;
+      if (!cfInsn.isLabel() && !cfInsn.isPosition()) {
+        break;
+      }
+    }
+    return insn;
+  }
+
+  private void verifyTrailingPattern(Iterator<InstructionSubject> instructions) {
+    InstructionSubject insn = nextInstruction(instructions);
+    if (backend == Backend.DEX) {
+      assertTrue(
+          insn instanceof DexInstructionSubject && ((DexInstructionSubject) insn).isConst4());
+    } else {
+      assertTrue(insn instanceof CfInstructionSubject);
+      assertTrue(((CfInstructionSubject) insn).isStackInstruction(Opcode.Pop));
+      assertTrue(instructions.hasNext());
+      insn = instructions.next();
+      assertTrue(insn instanceof CfInstructionSubject);
+      assertTrue(((CfInstructionSubject) insn).isConstNull());
+    }
+    assertTrue(nextInstruction(instructions).isThrow());
+    assertFalse(instructions.hasNext());
+  }
+
   @Test
   public void test() throws Exception {
     runTest(this::validate, true, CompilationMode.DEBUG);
diff --git a/src/test/java/com/android/tools/r8/regress/B76025099.java b/src/test/java/com/android/tools/r8/regress/B76025099.java
index 68f6fe0..c7a093f 100644
--- a/src/test/java/com/android/tools/r8/regress/B76025099.java
+++ b/src/test/java/com/android/tools/r8/regress/B76025099.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.regress;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -20,9 +20,9 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.io.File;
 import java.nio.file.Files;
@@ -104,7 +104,7 @@
 
   private void verifyFieldAccess(AndroidApp processedApp, ProcessResult jvmOutput)
       throws Exception {
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject impl = inspector.clazz(Impl.class);
     assertThat(impl, isPresent());
     MethodSubject init = impl.init(ImmutableList.of("java.lang.String"));
diff --git a/src/test/java/com/android/tools/r8/regress/Regress37740372.java b/src/test/java/com/android/tools/r8/regress/Regress37740372.java
index 1d2c6fe..e6ac9f8 100644
--- a/src/test/java/com/android/tools/r8/regress/Regress37740372.java
+++ b/src/test/java/com/android/tools/r8/regress/Regress37740372.java
@@ -18,8 +18,8 @@
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.util.Base64;
 import java.util.Set;
 import org.junit.Test;
@@ -129,7 +129,7 @@
   }
 
   private void checkApplicationOnlyHasJavaLangObject(AndroidApp app) throws Throwable {
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     inspector.forAllClasses(this::assertIsJavaLangObjet);
   }
 
diff --git a/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java b/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
index abf43b2..91d8460 100644
--- a/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
+++ b/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.regress.b111250398;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -16,10 +16,10 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import org.junit.Test;
@@ -236,7 +236,7 @@
         .count();
   }
 
-  private void check(DexInspector inspector, int mfOnBGets, int msfOnBGets) {
+  private void check(CodeInspector inspector, int mfOnBGets, int msfOnBGets) {
     ClassSubject classA = inspector.clazz(A.class);
     assertThat(classA, isPresent());
     MethodSubject mfOnA = classA.method("void", "mf", ImmutableList.of());
@@ -293,20 +293,20 @@
 
   @Test
   public void testSeparateCompilation() throws Exception {
-    DexInspector inspector =
-        new DexInspector(compileWithD8(readClasses(A.class, B.class), this::releaseMode));
+    CodeInspector inspector =
+        new CodeInspector(compileWithD8(readClasses(A.class, B.class), this::releaseMode));
     check(inspector, 5, 5);
   }
 
   @Test
   public void testWholeProgram() throws Exception {
-    DexInspector inspector =
-        new DexInspector(compileWithR8(readClasses(A.class, B.class), this::releaseMode));
+    CodeInspector inspector =
+        new CodeInspector(compileWithR8(readClasses(A.class, B.class), this::releaseMode));
     check(inspector, 1, 1);
   }
 
   private void checkMixed(AndroidApp app) throws Exception{
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject classC = inspector.clazz(C.class);
     assertThat(classC, isPresent());
     MethodSubject totalDays = classC.method("int", "totalDays", ImmutableList.of());
@@ -341,7 +341,7 @@
   }
 
   private void checkDaggerSingleProviderGet(AndroidApp app) throws Exception {
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     MethodSubject get =
         inspector.clazz(SingleCheck.class).method("java.lang.Object", "get", ImmutableList.of());
     assertThat(get, isPresent());
diff --git a/src/test/java/com/android/tools/r8/regress/b69825683/Regress69825683Test.java b/src/test/java/com/android/tools/r8/regress/b69825683/Regress69825683Test.java
index 9cc17af..3421cfe 100644
--- a/src/test/java/com/android/tools/r8/regress/b69825683/Regress69825683Test.java
+++ b/src/test/java/com/android/tools/r8/regress/b69825683/Regress69825683Test.java
@@ -13,8 +13,8 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
@@ -34,7 +34,7 @@
         Origin.unknown());
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
     AndroidApp app = ToolHelper.runR8(builder.build(), o -> o.enableClassInlining = false);
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     List<FoundClassSubject> classes = inspector.allClasses();
 
     // Check that the synthetic class is still present.
@@ -67,7 +67,7 @@
         Origin.unknown());
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
     AndroidApp app = ToolHelper.runR8(builder.build(), o -> o.enableClassInlining = false);
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     List<FoundClassSubject> classes = inspector.allClasses();
 
     // Check that the synthetic class is still present.
diff --git a/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java b/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
index 448e472..a052d86 100644
--- a/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
+++ b/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
@@ -15,9 +15,9 @@
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
@@ -431,7 +431,7 @@
 
   private void checkPathParserMethods(AndroidApp app, Class testClass, int a, int b)
       throws Exception {
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     DexItemFactory factory = inspector.getFactory();
     ClassSubject clazz = inspector.clazz(testClass);
     MethodSubject drawArc = clazz.method(
@@ -484,7 +484,7 @@
       assert compiler == Tool.R8;
       app = compileWithR8(app, "-keep class * { *; }", o -> o.minApiLevel = apiLevel.getLevel());
     }
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     DexItemFactory factory = inspector.getFactory();
     ClassSubject clazz = inspector.clazz(testClass);
     MethodSubject arcToBezier = clazz.method(
diff --git a/src/test/java/com/android/tools/r8/resolution/B77944861.java b/src/test/java/com/android/tools/r8/resolution/B77944861.java
index a35adbc..2118b44 100644
--- a/src/test/java/com/android/tools/r8/resolution/B77944861.java
+++ b/src/test/java/com/android/tools/r8/resolution/B77944861.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.resolution;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -20,9 +20,9 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -64,8 +64,8 @@
     ProcessResult jvmOutput = ToolHelper.runJava(ImmutableList.of(jarPath), mainName);
     assertEquals(0, jvmOutput.exitCode);
     AndroidApp processedApp = runR8(readJar(jarPath), SomeView.class, out);
-    DexInspector dexInspector = new DexInspector(processedApp);
-    ClassSubject view = dexInspector.clazz("regress_77944861.SomeView");
+    CodeInspector codeInspector = new CodeInspector(processedApp);
+    ClassSubject view = codeInspector.clazz("regress_77944861.SomeView");
     assertThat(view, isPresent());
     String className = "regress_77944861.inner.TopLevelPolicy$MobileIconState";
     MethodSubject initView = view.method("java.lang.String", "get", ImmutableList.of(className));
diff --git a/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java b/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java
index ca62dee..fff9ac3 100644
--- a/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java
@@ -19,9 +19,9 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.function.Consumer;
@@ -149,7 +149,7 @@
         ImmutableList.of(testClass),
         keepMainProguardConfiguration(testClass, true, false),
         options -> options.enableInlining = false);
-    DexInspector x = new DexInspector(app);
+    CodeInspector x = new CodeInspector(app);
 
     ClassSubject clazz = x.clazz(ClassWithAssertions.class);
     assertTrue(clazz.isPresent());
@@ -166,6 +166,7 @@
     R8Command command =
         ToolHelper.prepareR8CommandBuilder(readClasses(ClassWithAssertions.class))
             .setMode(CompilationMode.DEBUG)
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .setOutput(outputJar, OutputMode.ClassFile)
             .build();
     ToolHelper.runR8(command, consumer);
diff --git a/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java b/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java
index f92b1dc..16b7922 100644
--- a/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java
+++ b/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java
@@ -10,11 +10,11 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
 import com.android.tools.r8.utils.StringUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -65,8 +65,8 @@
 
     Path dexPath = outputPath.resolve("classes.dex");
 
-    DexInspector dexInspector = new DexInspector(dexPath);
-    ClassSubject classSubject = dexInspector.clazz("rewrite.LongCompare");
+    CodeInspector codeInspector = new CodeInspector(dexPath);
+    ClassSubject classSubject = codeInspector.clazz("rewrite.LongCompare");
     MethodSubject methodSubject = classSubject
         .method("int", "simpleCompare", Arrays.asList("long", "long"));
     // Check that exception handler is removed since it is no longer needed.
diff --git a/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java b/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java
index c3037f8..278bc8b 100644
--- a/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java
@@ -11,11 +11,11 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
 import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -75,8 +75,8 @@
 
     Path dexPath = outputPath.resolve("classes.dex");
 
-    DexInspector dexInspector = new DexInspector(dexPath);
-    ClassSubject classSubject = dexInspector.clazz("rewrite.RequireNonNull");
+    CodeInspector codeInspector = new CodeInspector(dexPath);
+    ClassSubject classSubject = codeInspector.clazz("rewrite.RequireNonNull");
     MethodSubject methodSubject = classSubject
         .method("java.lang.Object", "nonnullRemove", Collections.emptyList());
 
diff --git a/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java b/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
index 5fe2abd..d3784ee 100644
--- a/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
@@ -26,8 +26,8 @@
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.StringUtils;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import org.junit.Test;
 
 public class StaticValuesTest extends SmaliTestBase {
@@ -94,7 +94,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     // Test is running without tree-shaking, so the empty <clinit> is not removed.
     assertTrue(
         inspector.clazz("Test").clinit().getMethod().getCode().asDexCode().isEmptyVoidMethod());
@@ -178,7 +178,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     MethodSubject clinit = inspector.clazz("Test").clinit();
     // Nothing changed in the class initializer.
     assertEquals(5, clinit.getMethod().getCode().asDexCode().instructions.length);
@@ -219,7 +219,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     // Test is running without tree-shaking, so the empty <clinit> is not removed.
     assertTrue(
         inspector.clazz("Test").clinit().getMethod().getCode().asDexCode().isEmptyVoidMethod());
@@ -261,7 +261,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     // Test is running without tree-shaking, so the empty <clinit> is not removed.
     assertTrue(
         inspector.clazz("Test").clinit().getMethod().getCode().asDexCode().isEmptyVoidMethod());
@@ -311,7 +311,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     // Test is running without tree-shaking, so the empty <clinit> is not removed.
     assertTrue(
         inspector.clazz("Test").clinit().getMethod().getCode().asDexCode().isEmptyVoidMethod());
@@ -384,7 +384,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     assertTrue(inspector.clazz("Test").clinit().isPresent());
 
     DexValue value;
@@ -471,7 +471,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     assertTrue(inspector.clazz(className).isPresent());
     // Test is running without tree-shaking, so the empty <clinit> is not removed.
     assertTrue(
@@ -520,7 +520,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     assertTrue(inspector.clazz(className).isPresent());
     assertTrue(inspector.clazz(className).clinit().isPresent());
 
@@ -553,7 +553,7 @@
     AndroidApp originalApplication = buildApplication(builder);
     AndroidApp processedApplication = processApplication(originalApplication);
 
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     MethodSubject clinit = inspector.clazz("Test").clinit();
     // Nothing changed in the class initializer.
     assertEquals(3, clinit.getMethod().getCode().asDexCode().instructions.length);
diff --git a/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingJarTest.java b/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingJarTest.java
index 7ea9cdd..bffcfc5 100644
--- a/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingJarTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingJarTest.java
@@ -19,8 +19,8 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.StringUtils;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -282,7 +282,7 @@
     appBuilder.addProgramFiles(ToolHelper.getClassFileForTestClass(CheckSwitchInTestClass.class));
     AndroidApp app = compileWithR8(appBuilder.build());
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     MethodSubject method = inspector.clazz("Test").method("int", "test", ImmutableList.of("int"));
     DexCode code = method.getMethod().getCode().asDexCode();
 
diff --git a/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java b/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
index 7eae052..b2bcb4e 100644
--- a/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Paths;
 import java.util.List;
@@ -45,7 +45,7 @@
         .setProgramConsumer(DexIndexedConsumer.emptyConsumer())
         .build();
     AndroidApp result = ToolHelper.runR8(command);
-    DexInspector inspector = new DexInspector(result);
+    CodeInspector inspector = new CodeInspector(result);
     Assert.assertFalse(inspector.clazz(SWITCHMAP_CLASS_NAME).isPresent());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java b/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java
index 9242842..89cbbbe 100644
--- a/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java
@@ -9,7 +9,7 @@
 import com.android.tools.r8.shaking.classkinds.Enum;
 import com.android.tools.r8.shaking.classkinds.Interface;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
 import java.util.Collection;
@@ -59,7 +59,7 @@
       Assert.assertTrue(classes.isEmpty());
       return;
     }
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     HashSet<java.lang.Class<?>> expected = Sets.newHashSet(classes);
     CLASSES_TO_INCLUDE.forEach(c -> {
       Assert.assertEquals(expected.contains(c), inspector.clazz(c).isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java b/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java
index 5fa8edc..2b4865d 100644
--- a/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
@@ -17,8 +17,8 @@
 import com.android.tools.r8.naming.MemberNaming.FieldSignature;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import org.junit.Test;
@@ -126,7 +126,7 @@
     assertThat(artResult.stdout, containsString(impl2.name));
     assertEquals(-1, artResult.stderr.indexOf("DoFieldPut"));
 
-    DexInspector inspector = new DexInspector(processedApp);
+    CodeInspector inspector = new CodeInspector(processedApp);
     ClassSubject itf1Subject = inspector.clazz(itf1.name);
     assertThat(itf1Subject, isPresent());
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java b/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java
index 474af4d..12ef651 100644
--- a/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java
+++ b/src/test/java/com/android/tools/r8/shaking/InstantiatedLambdasTestRunner.java
@@ -19,7 +19,6 @@
 import com.android.tools.r8.utils.FileUtils;
 import java.io.IOException;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -122,7 +121,7 @@
     Path outPg = temp.getRoot().toPath().resolve(outName);
     ProcessResult proguardResult =
         ToolHelper.runProguard6Raw(
-            inputJar, outPg, Paths.get(ToolHelper.JAVA_8_RUNTIME), pgConfig, null);
+            inputJar, outPg, ToolHelper.getJava8RuntimeJar(), pgConfig, null);
     System.out.println(proguardResult.stdout);
     if (proguardResult.exitCode != 0) {
       System.out.println(proguardResult.stderr);
diff --git a/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesTest.java b/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesTest.java
index c6ccc61..59098d3 100644
--- a/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesTest.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.shaking;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -14,6 +14,7 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import com.android.tools.r8.ClassFileConsumer;
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.DataResourceProvider;
 import com.android.tools.r8.DexIndexedConsumer;
@@ -31,7 +32,7 @@
 import com.android.tools.r8.origin.PathOrigin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.ByteStreams;
 import com.google.common.io.CharSource;
@@ -39,12 +40,16 @@
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.jar.JarOutputStream;
 import java.util.zip.ZipEntry;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
 class A {
   private static String buildClassName(String className) {
@@ -65,7 +70,20 @@
 
 }
 
+@RunWith(Parameterized.class)
 public class LibraryProvidedProguardRulesTest extends TestBase {
+
+  private Backend backend;
+
+  @Parameters(name = "Backend: {0}")
+  public static Collection<Backend> data() {
+    return Arrays.asList(Backend.values());
+  }
+
+  public LibraryProvidedProguardRulesTest(Backend backend) {
+    this.backend = backend;
+  }
+
   private void addTextJarEntry(JarOutputStream out, String name, String content) throws Exception {
     out.putNextEntry(new ZipEntry(name));
     ByteStreams.copy(
@@ -84,11 +102,19 @@
     }
 
     try {
-      R8Command command = (handler != null ? R8Command.builder(handler) : R8Command.builder())
-          .addProgramFiles(jar)
-          .setProgramConsumer(DexIndexedConsumer.emptyConsumer())
-          .build();
-      return ToolHelper.runR8(command);
+      R8Command.Builder builder =
+          (handler != null ? R8Command.builder(handler) : R8Command.builder()).addProgramFiles(jar);
+      if (backend == Backend.DEX) {
+        builder
+            .setProgramConsumer(DexIndexedConsumer.emptyConsumer())
+            .addLibraryFiles(ToolHelper.getDefaultAndroidJar());
+      } else {
+        assert backend == Backend.CF;
+        builder
+            .setProgramConsumer(ClassFileConsumer.emptyConsumer())
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar());
+      }
+      return ToolHelper.runR8(builder.build());
     } catch (CompilationFailedException e) {
       assertNotNull(handler);
       return null;
@@ -103,7 +129,7 @@
   @Test
   public void keepOnlyA() throws Exception {
     AndroidApp app = runTest("-keep class " + A.class.getTypeName() +" {}", null);
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     assertThat(inspector.clazz(A.class), isPresent());
     assertThat(inspector.clazz(B.class), not(isPresent()));
   }
@@ -111,7 +137,7 @@
   @Test
   public void keepOnlyB() throws Exception {
     AndroidApp app = runTest("-keep class **B {}", null);
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     assertThat(inspector.clazz(A.class), not(isPresent()));
     assertThat(inspector.clazz(B.class), isPresent());
   }
@@ -119,7 +145,7 @@
   @Test
   public void keepBoth() throws Exception {
     AndroidApp app = runTest("-keep class ** {}", null);
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     assertThat(inspector.clazz(A.class), isPresent());
     assertThat(inspector.clazz(B.class), isPresent());
   }
@@ -127,7 +153,7 @@
   @Test
   public void multipleFiles() throws Exception {
     AndroidApp app = runTest(ImmutableList.of("-keep class **A {}", "-keep class **B {}"), null);
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     assertThat(inspector.clazz(A.class), isPresent());
     assertThat(inspector.clazz(B.class), isPresent());
   }
@@ -186,10 +212,19 @@
   public void throwingDataResourceProvider() throws Exception {
     DiagnosticsChecker checker = new DiagnosticsChecker();
     try {
-      R8Command command = R8Command.builder(checker)
-          .addProgramResourceProvider(new TestProvider())
-          .setProgramConsumer(DexIndexedConsumer.emptyConsumer())
-          .build();
+      R8Command.Builder builder =
+          R8Command.builder(checker).addProgramResourceProvider(new TestProvider());
+      if (backend == Backend.DEX) {
+        builder
+            .setProgramConsumer(DexIndexedConsumer.emptyConsumer())
+            .addLibraryFiles(ToolHelper.getDefaultAndroidJar());
+      } else {
+        assert backend == Backend.CF;
+        builder
+            .setProgramConsumer(ClassFileConsumer.emptyConsumer())
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar());
+      }
+      builder.build();
       fail("Should not succeed");
     } catch (CompilationFailedException e) {
       DiagnosticsChecker.checkDiagnostic(
diff --git a/src/test/java/com/android/tools/r8/shaking/PrintUsageTest.java b/src/test/java/com/android/tools/r8/shaking/PrintUsageTest.java
index bce2e8b..3b5a830 100644
--- a/src/test/java/com/android/tools/r8/shaking/PrintUsageTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/PrintUsageTest.java
@@ -41,8 +41,14 @@
 @RunWith(Parameterized.class)
 public class PrintUsageTest {
 
+  private enum Backend {
+    CF,
+    DEX
+  }
+
   private static final String PRINT_USAGE_FILE_SUFFIX = "-print-usage.txt";
 
+  private final Backend backend;
   private final String test;
   private final String programFile;
   private final List<String> keepRulesFiles;
@@ -52,9 +58,11 @@
   public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
 
   public PrintUsageTest(
+      Backend backend,
       String test,
       List<String> keepRulesFiles,
       Consumer<PrintUsageInspector> inspection) {
+    this.backend = backend;
     this.test = test;
     this.programFile = ToolHelper.EXAMPLES_BUILD_DIR + test + ".jar";
     this.keepRulesFiles = keepRulesFiles;
@@ -64,22 +72,29 @@
   @Before
   public void runR8andGetPrintUsage() throws Exception {
     Path out = temp.getRoot().toPath();
-    R8Command command =
+    R8Command.Builder builder =
         ToolHelper.addProguardConfigurationConsumer(
                 R8Command.builder(),
                 pgConfig -> {
                   pgConfig.setPrintUsage(true);
                   pgConfig.setPrintUsageFile(out.resolve(test + PRINT_USAGE_FILE_SUFFIX));
                 })
-            .setOutput(out, OutputMode.DexIndexed)
             .addProgramFiles(Paths.get(programFile))
-            .addProguardConfigurationFiles(ListUtils.map(keepRulesFiles, Paths::get))
-            .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
-            .build();
-    ToolHelper.runR8(command, options -> {
-      // Disable inlining to make this test not depend on inlining decisions.
-      options.enableInlining = false;
-    });
+            .addProguardConfigurationFiles(ListUtils.map(keepRulesFiles, Paths::get));
+
+    if (backend == Backend.DEX) {
+      builder
+          .setOutput(out, OutputMode.DexIndexed)
+          .addLibraryFiles(ToolHelper.getDefaultAndroidJar());
+    } else {
+      builder.setOutput(out, OutputMode.ClassFile).addLibraryFiles(ToolHelper.getJava8RuntimeJar());
+    }
+    ToolHelper.runR8(
+        builder.build(),
+        options -> {
+          // Disable inlining to make this test not depend on inlining decisions.
+          options.enableInlining = false;
+        });
   }
 
   @Test
@@ -106,6 +121,7 @@
     inspections.put("shaking12:keep-rules-printusage.txt", PrintUsageTest::inspectShaking12);
 
     List<Object[]> testCases = new ArrayList<>();
+    for (Backend backend : Backend.values()) {
     Set<String> usedInspections = new HashSet<>();
     for (String test : tests) {
       File[] keepFiles = new File(ToolHelper.EXAMPLES_DIR + test)
@@ -115,11 +131,13 @@
         Consumer<PrintUsageInspector> inspection =
             getTestOptionalParameter(inspections, usedInspections, test, keepName);
         if (inspection != null) {
-          testCases.add(new Object[]{test, ImmutableList.of(keepFile.getPath()), inspection});
+            testCases.add(
+                new Object[] {backend, test, ImmutableList.of(keepFile.getPath()), inspection});
         }
       }
     }
-    assert usedInspections.size() == inspections.size();
+      assert usedInspections.size() == inspections.size();
+    }
     return testCases;
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
index 22b6790..748866e 100644
--- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -31,7 +31,7 @@
 import com.android.tools.r8.utils.InternalOptions.PackageObfuscationMode;
 import com.android.tools.r8.utils.KeepingDiagnosticHandler;
 import com.android.tools.r8.utils.Reporter;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.io.File;
 import java.io.IOException;
@@ -1844,7 +1844,7 @@
           ImmutableList.of(proguardConfig, additionalProguardConfig),
           null);
       assertEquals(0, result.exitCode);
-      DexInspector proguardInspector = new DexInspector(readJar(proguardedJar));
+      CodeInspector proguardInspector = new CodeInspector(readJar(proguardedJar));
       assertEquals(1, proguardInspector.allClasses().size());
     }
   }
@@ -1867,7 +1867,7 @@
           ImmutableList.of(proguardConfig, additionalProguardConfig),
           null);
       assertEquals(0, result.exitCode);
-      DexInspector proguardInspector = new DexInspector(readJar(proguardedJar));
+      CodeInspector proguardInspector = new CodeInspector(readJar(proguardedJar));
       assertEquals(1, proguardInspector.allClasses().size());
     }
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
index 24d4ba5..9eb7815 100644
--- a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
@@ -17,10 +17,10 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FoundFieldSubject;
-import com.android.tools.r8.utils.dexinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundFieldSubject;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -137,7 +137,7 @@
         });
   }
 
-  protected static void checkSameStructure(DexInspector ref, DexInspector inspector) {
+  protected static void checkSameStructure(CodeInspector ref, CodeInspector inspector) {
     ref.forAllClasses(refClazz -> checkSameStructure(refClazz,
         inspector.clazz(refClazz.getDexClass().toSourceString())));
   }
@@ -167,18 +167,18 @@
   }
 
   protected void runTest(
-      Consumer<DexInspector> inspection,
+      Consumer<CodeInspector> inspection,
       BiConsumer<String, String> outputComparator,
-      BiConsumer<DexInspector, DexInspector> dexComparator,
+      BiConsumer<CodeInspector, CodeInspector> dexComparator,
       List<String> keepRulesFiles)
       throws Exception {
     runTest(inspection, outputComparator, dexComparator, keepRulesFiles, null);
   }
 
   protected void runTest(
-      Consumer<DexInspector> inspection,
+      Consumer<CodeInspector> inspection,
       BiConsumer<String, String> outputComparator,
-      BiConsumer<DexInspector, DexInspector> dexComparator,
+      BiConsumer<CodeInspector, CodeInspector> dexComparator,
       List<String> keepRulesFiles,
       Consumer<InternalOptions> optionsConsumer)
       throws Exception {
@@ -193,7 +193,7 @@
     if (backend == Backend.CF) {
       jarLibraries =
           ImmutableList.of(
-              Paths.get(ToolHelper.JAVA_8_RUNTIME),
+              ToolHelper.getJava8RuntimeJar(),
               Paths.get(ToolHelper.EXAMPLES_BUILD_DIR + "shakinglib.jar"));
     } else {
       jarLibraries =
@@ -218,8 +218,8 @@
         Assert.assertEquals(resultInput.toString(), resultOutput.toString());
       }
       if (inspection != null) {
-        DexInspector inspector =
-            new DexInspector(
+        CodeInspector inspector =
+            new CodeInspector(
                 out,
                 minify.isMinify()
                     ? proguardMap.toString()
@@ -249,8 +249,8 @@
       }
 
       if (dexComparator != null) {
-        DexInspector ref = new DexInspector(Paths.get(originalDex));
-        DexInspector inspector = new DexInspector(out,
+        CodeInspector ref = new CodeInspector(Paths.get(originalDex));
+        CodeInspector inspector = new CodeInspector(out,
             minify.isMinify() ? proguardMap.toString()
                 : null);
         dexComparator.accept(ref, inspector);
@@ -263,7 +263,7 @@
     }
 
     if (inspection != null) {
-      DexInspector inspector = new DexInspector(out,
+      CodeInspector inspector = new CodeInspector(out,
           minify.isMinify() ? proguardMap.toString()
               : null);
       inspection.accept(inspector);
diff --git a/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
index d739348..eab5197 100644
--- a/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
@@ -15,15 +15,15 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
 
 public class DefaultMethodsTest extends TestBase {
-  private void runTest(List<String> additionalKeepRules, Consumer<DexInspector> inspection)
+  private void runTest(List<String> additionalKeepRules, Consumer<CodeInspector> inspection)
       throws Exception {
     R8Command.Builder builder = R8Command.builder();
     builder.addProgramFiles(ToolHelper.getClassFileForTestClass(InterfaceWithDefaultMethods.class));
@@ -40,20 +40,20 @@
         Origin.unknown());
     builder.addProguardConfiguration(additionalKeepRules, Origin.unknown());
     AndroidApp app = ToolHelper.runR8(builder.build(), o -> o.enableClassInlining = false);
-    inspection.accept(new DexInspector(app));
+    inspection.accept(new CodeInspector(app));
   }
 
-  private void interfaceNotKept(DexInspector inspector) {
+  private void interfaceNotKept(CodeInspector inspector) {
     assertFalse(inspector.clazz(InterfaceWithDefaultMethods.class).isPresent());
   }
 
-  private void defaultMethodNotKept(DexInspector inspector) {
+  private void defaultMethodNotKept(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(InterfaceWithDefaultMethods.class);
     assertTrue(clazz.isPresent());
     assertFalse(clazz.method("int", "method", ImmutableList.of()).isPresent());
   }
 
-  private void defaultMethodKept(DexInspector inspector) {
+  private void defaultMethodKept(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(InterfaceWithDefaultMethods.class);
     assertTrue(clazz.isPresent());
     MethodSubject method = clazz.method("int", "method", ImmutableList.of());
@@ -61,7 +61,7 @@
     assertFalse(method.isAbstract());
   }
 
-  private void defaultMethodAbstract(DexInspector inspector) {
+  private void defaultMethodAbstract(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(InterfaceWithDefaultMethods.class);
     assertTrue(clazz.isPresent());
     MethodSubject method = clazz.method("int", "method", ImmutableList.of());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/InliningClassVersionTest.java b/src/test/java/com/android/tools/r8/shaking/examples/InliningClassVersionTest.java
index 7fcb318..ba0d468 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/InliningClassVersionTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/InliningClassVersionTest.java
@@ -17,7 +17,6 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.google.common.io.ByteStreams;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.Collections;
 import java.util.List;
 import org.junit.Test;
@@ -147,7 +146,7 @@
     ToolHelper.runR8(
         R8Command.builder()
             .addProgramFiles(inputJar)
-            .addLibraryFiles(Paths.get(ToolHelper.JAVA_8_RUNTIME))
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
             .addProguardConfiguration(keepRule, Origin.unknown())
             .setOutput(outputJar, OutputMode.ClassFile)
             .build());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking11Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking11Test.java
index f7889ee..f65c1d4 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking11Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking11Test.java
@@ -5,7 +5,7 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -53,24 +53,24 @@
         ImmutableList.of("src/test/examples/shaking11/keep-rules-keep-method.txt"));
   }
 
-  private static void shaking11OnlyOneClassKept(DexInspector dexInspector) {
-    Assert.assertFalse(dexInspector.clazz("shaking11.Subclass").isPresent());
-    Assert.assertTrue(dexInspector.clazz("shaking11.SubclassWithMethod").isPresent());
+  private static void shaking11OnlyOneClassKept(CodeInspector codeInspector) {
+    Assert.assertFalse(codeInspector.clazz("shaking11.Subclass").isPresent());
+    Assert.assertTrue(codeInspector.clazz("shaking11.SubclassWithMethod").isPresent());
   }
 
-  private static void shaking11BothMethodsKept(DexInspector dexInspector) {
+  private static void shaking11BothMethodsKept(CodeInspector codeInspector) {
     Assert.assertFalse(
-        dexInspector
+        codeInspector
             .clazz("shaking11.Subclass")
             .method("void", "aMethod", Collections.emptyList())
             .isPresent());
     Assert.assertTrue(
-        dexInspector
+        codeInspector
             .clazz("shaking11.SuperClass")
             .method("void", "aMethod", Collections.emptyList())
             .isPresent());
     Assert.assertTrue(
-        dexInspector
+        codeInspector
             .clazz("shaking11.SubclassWithMethod")
             .method("void", "aMethod", Collections.emptyList())
             .isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking12Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking12Test.java
index d58d975..710635d 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking12Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking12Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -54,7 +54,7 @@
         ImmutableList.of("src/test/examples/shaking12/keep-rules-printusage.txt"));
   }
 
-  private static void shaking12OnlyInstantiatedClassesHaveConstructors(DexInspector inspector) {
+  private static void shaking12OnlyInstantiatedClassesHaveConstructors(CodeInspector inspector) {
     ClassSubject animalClass = inspector.clazz("shaking12.AnimalClass");
     Assert.assertTrue(animalClass.isPresent());
     Assert.assertFalse(animalClass.method("void", "<init>", Collections.emptyList()).isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java
index 6cfcd87..2157cd3 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java
@@ -5,11 +5,11 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldAccessInstructionSubject;
-import com.android.tools.r8.utils.dexinspector.InstructionSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldAccessInstructionSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -49,7 +49,7 @@
         ImmutableList.of("src/test/examples/shaking13/keep-rules.txt"));
   }
 
-  private static void shaking13EnsureFieldWritesCorrect(DexInspector inspector) {
+  private static void shaking13EnsureFieldWritesCorrect(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("shaking13.Shaking");
     MethodSubject testMethod = mainClass.method("void", "fieldTest", Collections.emptyList());
     Assert.assertTrue(testMethod.isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking14Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking14Test.java
index 8ea939a..820afc2 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking14Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking14Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/shaking14/keep-rules.txt"));
   }
 
-  private static void shaking14EnsureRightStaticMethodsLive(DexInspector inspector) {
+  private static void shaking14EnsureRightStaticMethodsLive(CodeInspector inspector) {
     ClassSubject superclass = inspector.clazz("shaking14.Superclass");
     Assert.assertFalse(superclass.method("int", "aMethod", ImmutableList.of("int")).isPresent());
     Assert.assertFalse(
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java
index 1651fca..1dd353e 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java
@@ -5,10 +5,10 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -48,7 +48,7 @@
         ImmutableList.of("src/test/examples/shaking15/keep-rules.txt"));
   }
 
-  private static void shaking15testDictionary(DexInspector inspector) {
+  private static void shaking15testDictionary(CodeInspector inspector) {
     inspector.forAllClasses((clazz) -> checkClassAndMemberInDictionary(clazz));
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking17Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking17Test.java
index ba01d2f..fac36d6 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking17Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking17Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -45,7 +45,7 @@
         ImmutableList.of("src/test/examples/shaking17/keep-rules.txt"));
   }
 
-  private static void abstractMethodRemains(DexInspector inspector) {
+  private static void abstractMethodRemains(CodeInspector inspector) {
     ClassSubject programClass = inspector.clazz("shaking17.AbstractProgramClass");
     Assert.assertTrue(programClass.isPresent());
     Assert.assertTrue(
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking18Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking18Test.java
index 26ea045..b691046 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking18Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking18Test.java
@@ -5,7 +5,7 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -43,7 +43,7 @@
         ImmutableList.of("src/test/examples/shaking18/keep-rules.txt"));
   }
 
-  private static void unusedRemoved(DexInspector inspector) {
+  private static void unusedRemoved(CodeInspector inspector) {
     // TODO(b/80455722): Change to assertFalse when tree-shaking detects this case.
     Assert.assertTrue(
         "DerivedUnused should be removed", inspector.clazz("shaking18.DerivedUnused").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking19Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking19Test.java
index 0c662bb..f30bcac 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking19Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking19Test.java
@@ -3,15 +3,15 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking.examples;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -52,7 +52,7 @@
         opt -> opt.enableClassMerging = false);
   }
 
-  private static void unusedRemoved(DexInspector inspector) {
+  private static void unusedRemoved(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("shaking19.Shaking$A");
     assertThat(clazz, isPresent());
 
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking1Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking1Test.java
index 6b90ec9..17cfb7f 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking1Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking1Test.java
@@ -6,8 +6,8 @@
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
 import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -165,7 +165,7 @@
             "src/test/proguard/valid/empty.flags"));
   }
 
-  private static void shaking1IsCorrectlyRepackaged(DexInspector inspector) {
+  private static void shaking1IsCorrectlyRepackaged(CodeInspector inspector) {
     inspector.forAllClasses(
         clazz -> {
           String descriptor = clazz.getFinalDescriptor();
@@ -176,7 +176,7 @@
         });
   }
 
-  private static void shaking1HasNoClassUnused(DexInspector inspector) {
+  private static void shaking1HasNoClassUnused(CodeInspector inspector) {
     Assert.assertFalse(inspector.clazz("shaking1.Unused").isPresent());
     ClassSubject used = inspector.clazz("shaking1.Used");
     Assert.assertTrue(used.isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking2Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking2Test.java
index 4c2cfe1..5f87781 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking2Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking2Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -60,7 +60,7 @@
         null, null, null, ImmutableList.of("src/test/examples/shaking2/keep-rules-printusage.txt"));
   }
 
-  private static void shaking2SuperClassIsAbstract(DexInspector inspector) {
+  private static void shaking2SuperClassIsAbstract(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("shaking2.SuperClass");
     Assert.assertTrue(clazz.isAbstract());
     Assert.assertTrue(clazz.method("void", "virtualMethod", Collections.emptyList()).isAbstract());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking3Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking3Test.java
index 3996622..6ed0099 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking3Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking3Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -89,12 +89,12 @@
         ImmutableList.of("src/test/examples/shaking3/keep-no-abstract-classes.txt"));
   }
 
-  private static void shaking3HasNoPrivateClass(DexInspector inspector) {
+  private static void shaking3HasNoPrivateClass(CodeInspector inspector) {
     Assert.assertTrue(inspector.clazz("shaking3.B").isPresent());
     Assert.assertFalse(inspector.clazz("shaking3.AnAbstractClass").isPresent());
   }
 
-  private static void shaking3HasNoClassB(DexInspector inspector) {
+  private static void shaking3HasNoClassB(CodeInspector inspector) {
     Assert.assertFalse(inspector.clazz("shaking3.B").isPresent());
     ClassSubject classA = inspector.clazz("shaking3.A");
     Assert.assertTrue(classA.isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking5Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking5Test.java
index ad13070..7484255 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking5Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking5Test.java
@@ -5,7 +5,7 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/shaking5/keep-rules.txt"));
   }
 
-  private static void shaking5Inspection(DexInspector inspector) {
+  private static void shaking5Inspection(CodeInspector inspector) {
     Assert.assertFalse(
         inspector
             .clazz("shaking5.Superclass")
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking6Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking6Test.java
index 9fb2029..f5733cc 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking6Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking6Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -72,7 +72,7 @@
         ImmutableList.of("src/test/examples/shaking6/keep-public.txt"));
   }
 
-  private static void hasNoPublicMethodsButPrivate(DexInspector inspector) {
+  private static void hasNoPublicMethodsButPrivate(CodeInspector inspector) {
     inspector.forAllClasses(
         clazz ->
             clazz.forAllMethods(
@@ -88,7 +88,7 @@
             .isPresent());
   }
 
-  private static void hasOnlyIntJustAMethod(DexInspector inspector) {
+  private static void hasOnlyIntJustAMethod(CodeInspector inspector) {
     Assert.assertFalse(
         inspector
             .clazz("shaking6.Superclass")
@@ -105,7 +105,7 @@
         subclass.method("int", "justAMethod", Collections.singletonList("double")).isPresent());
   }
 
-  private static void hasNoPrivateJustAMethod(DexInspector inspector) {
+  private static void hasNoPrivateJustAMethod(CodeInspector inspector) {
     Assert.assertFalse(
         inspector
             .clazz("shaking6.Superclass")
@@ -122,7 +122,7 @@
         subclass.method("int", "justAMethod", Collections.singletonList("double")).isPresent());
   }
 
-  private static void hasNoPrivateMethods(DexInspector inspector) {
+  private static void hasNoPrivateMethods(CodeInspector inspector) {
     inspector.forAllClasses(
         clazz ->
             clazz.forAllMethods(
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking7Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking7Test.java
index b44f3aa..9d2faf3 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking7Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking7Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -71,7 +71,7 @@
         ImmutableList.of("src/test/examples/shaking7/keep-public-theIntField-fields.txt"));
   }
 
-  private static void shaking7HasOnlyDoubleFields(DexInspector inspector) {
+  private static void shaking7HasOnlyDoubleFields(CodeInspector inspector) {
     inspector.forAllClasses(
         clazz -> {
           clazz.forAllFields(
@@ -86,7 +86,7 @@
     Assert.assertFalse(inspector.clazz("shaking7.Liar").field("int", "theDoubleField").isPresent());
   }
 
-  private static void shaking7HasOnlyPublicFieldsNamedTheIntField(DexInspector inspector) {
+  private static void shaking7HasOnlyPublicFieldsNamedTheIntField(CodeInspector inspector) {
     inspector.forAllClasses(
         clazz -> {
           clazz.forAllFields(
@@ -104,7 +104,7 @@
     Assert.assertTrue(liar.field("double", "theIntField").isPresent());
   }
 
-  private static void shaking7HasOnlyPublicFields(DexInspector inspector) {
+  private static void shaking7HasOnlyPublicFields(CodeInspector inspector) {
     inspector.forAllClasses(
         clazz -> {
           clazz.forAllFields(
@@ -120,7 +120,7 @@
     Assert.assertTrue(inspector.clazz("shaking7.Liar").field("int", "theDoubleField").isPresent());
   }
 
-  private static void shaking7HasOnlyPublicFieldsNamedTheDoubleField(DexInspector inspector) {
+  private static void shaking7HasOnlyPublicFieldsNamedTheDoubleField(CodeInspector inspector) {
     inspector.forAllClasses(
         clazz -> {
           clazz.forAllFields(
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking8Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking8Test.java
index 02cda2a..b957c64 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking8Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking8Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -50,7 +50,7 @@
         null, null, null, ImmutableList.of("src/test/examples/shaking8/keep-rules-printusage.txt"));
   }
 
-  private static void shaking8ThingClassIsAbstractAndEmpty(DexInspector inspector) {
+  private static void shaking8ThingClassIsAbstractAndEmpty(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz("shaking8.Thing");
     Assert.assertTrue(clazz.isAbstract());
     clazz.forAllMethods((method) -> Assert.fail());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking9Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking9Test.java
index 18a1141..e64abe1 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking9Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking9Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -50,7 +50,7 @@
         null, null, null, ImmutableList.of("src/test/examples/shaking9/keep-rules-printusage.txt"));
   }
 
-  private static void shaking9OnlySuperMethodsKept(DexInspector inspector) {
+  private static void shaking9OnlySuperMethodsKept(CodeInspector inspector) {
     ClassSubject superclass = inspector.clazz("shaking9.Superclass");
     Assert.assertTrue(superclass.isAbstract());
     Assert.assertTrue(superclass.method("void", "aMethod", ImmutableList.of()).isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java
index dfe1806..d7d45f0 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -68,7 +68,7 @@
         });
   }
 
-  private static void annotationRemovalHasNoInnerClassAnnotations(DexInspector inspector) {
+  private static void annotationRemovalHasNoInnerClassAnnotations(CodeInspector inspector) {
     ClassSubject outer = inspector.clazz("annotationremoval.OuterClass");
     Assert.assertTrue(outer.isPresent());
     Assert.assertTrue(outer.getDexClass().getInnerClasses().isEmpty());
@@ -86,7 +86,7 @@
     Assert.assertTrue(local.getDexClass().getInnerClasses().isEmpty());
   }
 
-  private static void annotationRemovalHasAllInnerClassAnnotations(DexInspector inspector) {
+  private static void annotationRemovalHasAllInnerClassAnnotations(CodeInspector inspector) {
     ClassSubject outer = inspector.clazz("annotationremoval.OuterClass");
     Assert.assertTrue(outer.isPresent());
     Assert.assertFalse(outer.getDexClass().getInnerClasses().isEmpty());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingEnumprotoTest.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingEnumprotoTest.java
index e544edf..7f211db 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingEnumprotoTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingEnumprotoTest.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/enumproto/keep-rules.txt"));
   }
 
-  private static void enumprotoUnusedFieldsAreGone(DexInspector inspector) {
+  private static void enumprotoUnusedFieldsAreGone(CodeInspector inspector) {
     ClassSubject protoClass = inspector.clazz("enumproto.GeneratedEnumProto$Enum");
     Assert.assertTrue(protoClass.isPresent());
     Assert.assertFalse(protoClass.field("int", "id_").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto1Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto1Test.java
index 6650860..16b5f59 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto1Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto1Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/nestedproto1/keep-rules.txt"));
   }
 
-  private static void nestedproto1UnusedFieldsAreGone(DexInspector inspector) {
+  private static void nestedproto1UnusedFieldsAreGone(CodeInspector inspector) {
     ClassSubject protoClass = inspector.clazz("nestedproto1.GeneratedNestedProto$Outer");
     Assert.assertTrue(protoClass.isPresent());
     Assert.assertFalse(protoClass.field("int", "id_").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto2Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto2Test.java
index d7a8af5..a679810 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto2Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto2Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/nestedproto2/keep-rules.txt"));
   }
 
-  private static void nestedproto2UnusedFieldsAreGone(DexInspector inspector) {
+  private static void nestedproto2UnusedFieldsAreGone(CodeInspector inspector) {
     ClassSubject protoClass = inspector.clazz("nestedproto2.GeneratedNestedProto$Outer");
     Assert.assertTrue(protoClass.isPresent());
     Assert.assertTrue(protoClass.field("int", "id_").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingOneofprotoTest.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingOneofprotoTest.java
index 18f4648..e38258c 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingOneofprotoTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingOneofprotoTest.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/oneofproto/keep-rules.txt"));
   }
 
-  private static void oneofprotoUnusedFieldsAreGone(DexInspector inspector) {
+  private static void oneofprotoUnusedFieldsAreGone(CodeInspector inspector) {
     ClassSubject protoClass = inspector.clazz("oneofproto.GeneratedOneOfProto$Oneof");
     Assert.assertTrue(protoClass.isPresent());
     Assert.assertFalse(protoClass.field("int", "id_").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingRepeatedprotoTest.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingRepeatedprotoTest.java
index e55d822..923cf34 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingRepeatedprotoTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingRepeatedprotoTest.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/repeatedproto/keep-rules.txt"));
   }
 
-  private static void repeatedUnusedFieldsAreGone(DexInspector inspector) {
+  private static void repeatedUnusedFieldsAreGone(CodeInspector inspector) {
     ClassSubject protoClass = inspector.clazz("repeatedproto.GeneratedRepeatedProto$Repeated");
     Assert.assertTrue(protoClass.isPresent());
     Assert.assertFalse(protoClass.field("int", "id_").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto1Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto1Test.java
index 2b49803..64e3839 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto1Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto1Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/simpleproto1/keep-rules.txt"));
   }
 
-  private static void simpleproto1UnusedFieldIsGone(DexInspector inspector) {
+  private static void simpleproto1UnusedFieldIsGone(CodeInspector inspector) {
     ClassSubject protoClass = inspector.clazz("simpleproto1.GeneratedSimpleProto$Simple");
     Assert.assertTrue(protoClass.isPresent());
     Assert.assertFalse(protoClass.field("boolean", "other_").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto2Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto2Test.java
index ce9659b..5304dae 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto2Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto2Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -44,7 +44,7 @@
         ImmutableList.of("src/test/examples/simpleproto2/keep-rules.txt"));
   }
 
-  private static void simpleproto2UnusedFieldsAreGone(DexInspector inspector) {
+  private static void simpleproto2UnusedFieldsAreGone(CodeInspector inspector) {
     ClassSubject protoClass = inspector.clazz("simpleproto2.GeneratedSimpleProto$Simple");
     Assert.assertTrue(protoClass.isPresent());
     Assert.assertFalse(protoClass.field("int", "id_").isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
index 31c97ca..51baed2 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
@@ -38,10 +38,10 @@
 import com.android.tools.r8.utils.DefaultDiagnosticsHandler;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.Reporter;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import it.unimi.dsi.fastutil.objects.Object2BooleanArrayMap;
@@ -56,7 +56,7 @@
   private void test(Class mainClass, Class mentionedClass, boolean forceProguardCompatibility)
       throws Exception {
     String proguardConfig = keepMainProguardConfiguration(mainClass, true, false);
-    DexInspector inspector = new DexInspector(
+    CodeInspector inspector = new CodeInspector(
         compileWithR8(
             ImmutableList.of(mainClass, mentionedClass),
             proguardConfig,
@@ -103,7 +103,7 @@
     }
 
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
-    DexInspector inspector = new DexInspector(ToolHelper.runR8(builder.build()));
+    CodeInspector inspector = new CodeInspector(ToolHelper.runR8(builder.build()));
     assertTrue(inspector.clazz(mainClass.getCanonicalName()).isPresent());
     ClassSubject clazz = inspector.clazz(getJavacGeneratedClassName(mentionedClassWithAnnotations));
     assertTrue(clazz.isPresent());
@@ -138,7 +138,7 @@
     builder.setProguardCompatibilityRulesOutput(proguardCompatibilityRules);
 
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
-    DexInspector inspector = new DexInspector(ToolHelper.runR8(builder.build()));
+    CodeInspector inspector = new CodeInspector(ToolHelper.runR8(builder.build()));
     ClassSubject clazz = inspector.clazz(getJavacGeneratedClassName(testClass));
     assertTrue(clazz.isPresent());
     assertEquals(forceProguardCompatibility && hasDefaultConstructor,
@@ -195,7 +195,7 @@
     builder.addProguardConfiguration(proguardConfig, Origin.unknown());
 
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
-    DexInspector inspector = new DexInspector(ToolHelper.runR8(builder.build()));
+    CodeInspector inspector = new CodeInspector(ToolHelper.runR8(builder.build()));
     assertTrue(inspector.clazz(getJavacGeneratedClassName(mainClass)).isPresent());
     ClassSubject clazz = inspector.clazz(getJavacGeneratedClassName(instantiatedClass));
     assertEquals(containsCheckCast, clazz.isPresent());
@@ -210,7 +210,7 @@
       FileUtils.writeTextFile(proguardConfigFile, proguardConfig);
       ToolHelper.runProguard(jarTestClasses(ImmutableList.of(mainClass, instantiatedClass)),
           proguardedJar, proguardConfigFile, null);
-      DexInspector proguardInspector = new DexInspector(readJar(proguardedJar));
+      CodeInspector proguardInspector = new CodeInspector(readJar(proguardedJar));
       assertTrue(proguardInspector.clazz(mainClass).isPresent());
       assertEquals(
           containsCheckCast, proguardInspector.clazz(instantiatedClass).isPresent());
@@ -257,7 +257,7 @@
     }
 
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
-    DexInspector inspector = new DexInspector(ToolHelper.runR8(builder.build()));
+    CodeInspector inspector = new CodeInspector(ToolHelper.runR8(builder.build()));
     assertTrue(inspector.clazz(getJavacGeneratedClassName(mainClass)).isPresent());
     forNameClasses.forEach(clazz -> {
       ClassSubject subject = inspector.clazz(getJavacGeneratedClassName(clazz));
@@ -316,7 +316,7 @@
       ToolHelper.runProguard(jarTestClasses(
           ImmutableList.of(mainClass, forNameClass1, forNameClass2)),
           proguardedJar, proguardConfigFile, proguardMapFile);
-      DexInspector proguardedInspector = new DexInspector(readJar(proguardedJar), proguardMapFile);
+      CodeInspector proguardedInspector = new CodeInspector(readJar(proguardedJar), proguardMapFile);
       assertEquals(3, proguardedInspector.allClasses().size());
       assertTrue(proguardedInspector.clazz(mainClass).isPresent());
       for (Class clazz : ImmutableList.of(forNameClass1, forNameClass2)) {
@@ -360,7 +360,7 @@
     }
 
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
-    DexInspector inspector = new DexInspector(ToolHelper.runR8(builder.build()));
+    CodeInspector inspector = new CodeInspector(ToolHelper.runR8(builder.build()));
     assertTrue(inspector.clazz(getJavacGeneratedClassName(mainClass)).isPresent());
     ClassSubject classSubject = inspector.clazz(getJavacGeneratedClassName(withMemberClass));
     // Due to the direct usage of .class
@@ -424,7 +424,7 @@
       ToolHelper.runProguard(jarTestClasses(
           ImmutableList.of(mainClass, withMemberClass)),
           proguardedJar, proguardConfigFile, proguardMapFile);
-      DexInspector proguardedInspector = new DexInspector(readJar(proguardedJar), proguardMapFile);
+      CodeInspector proguardedInspector = new CodeInspector(readJar(proguardedJar), proguardMapFile);
       assertEquals(2, proguardedInspector.allClasses().size());
       assertTrue(proguardedInspector.clazz(mainClass).isPresent());
       classSubject = proguardedInspector.clazz(withMemberClass);
@@ -473,7 +473,7 @@
     }
 
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
-    DexInspector inspector = new DexInspector(ToolHelper.runR8(builder.build()));
+    CodeInspector inspector = new CodeInspector(ToolHelper.runR8(builder.build()));
     assertTrue(inspector.clazz(getJavacGeneratedClassName(mainClass)).isPresent());
     ClassSubject classSubject = inspector.clazz(getJavacGeneratedClassName(withVolatileFields));
     // Due to the direct usage of .class
@@ -541,7 +541,7 @@
       ToolHelper.runProguard(jarTestClasses(
           ImmutableList.of(mainClass, withVolatileFields)),
           proguardedJar, proguardConfigFile, proguardMapFile);
-      DexInspector proguardedInspector = new DexInspector(readJar(proguardedJar), proguardMapFile);
+      CodeInspector proguardedInspector = new CodeInspector(readJar(proguardedJar), proguardMapFile);
       assertEquals(2, proguardedInspector.allClasses().size());
       assertTrue(proguardedInspector.clazz(mainClass).isPresent());
       classSubject = proguardedInspector.clazz(withVolatileFields);
@@ -604,7 +604,7 @@
       assertTrue(!forceProguardCompatibility && (!innerClasses || !enclosingMethod));
       return;
     }
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     assertTrue(inspector.clazz(getJavacGeneratedClassName(mainClass)).isPresent());
     assertEquals(innerClasses || enclosingMethod ? "1" : "0", runOnArt(app, mainClass));
 
@@ -639,7 +639,7 @@
 
   private void runKeepDefaultMethodsTest(
       List<String> additionalKeepRules,
-      Consumer<DexInspector> inspection,
+      Consumer<CodeInspector> inspection,
       Consumer<ProguardConfiguration> compatInspection) throws Exception {
     Class mainClass = TestClass.class;
     CompatProguardCommandBuilder builder = new CompatProguardCommandBuilder();
@@ -657,7 +657,7 @@
     Path proguardCompatibilityRules = temp.newFile().toPath();
     builder.setProguardCompatibilityRulesOutput(proguardCompatibilityRules);
     AndroidApp app = ToolHelper.runR8(builder.build(), o -> o.enableClassInlining = false);
-    inspection.accept(new DexInspector(app));
+    inspection.accept(new CodeInspector(app));
     // Check the Proguard compatibility configuration generated.
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(new DexItemFactory(),
@@ -671,7 +671,7 @@
     assertEquals(0, configuration.getRules().size());
   }
 
-  private void defaultMethodKept(DexInspector inspector) {
+  private void defaultMethodKept(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(InterfaceWithDefaultMethods.class);
     assertTrue(clazz.isPresent());
     MethodSubject method = clazz.method("int", "method", ImmutableList.of());
@@ -695,7 +695,7 @@
     assertEquals(0, memberRule.getArguments().size());
   }
 
-  private void defaultMethod2Kept(DexInspector inspector) {
+  private void defaultMethod2Kept(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(InterfaceWithDefaultMethods.class);
     assertTrue(clazz.isPresent());
     MethodSubject method =
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatabilityTestBase.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatabilityTestBase.java
index f76d402..ef98898 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatabilityTestBase.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatabilityTestBase.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking.forceproguardcompatibility;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
@@ -19,8 +19,8 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.io.File;
 import java.nio.file.Path;
@@ -67,12 +67,12 @@
     throw new IllegalArgumentException("Unknown shrinker: " + mode);
   }
 
-  protected DexInspector runShrinker(
+  protected CodeInspector runShrinker(
       Shrinker mode, List<Class> programClasses, List<String> proguadConfigs) throws Exception {
     return runShrinker(mode, programClasses, String.join(System.lineSeparator(), proguadConfigs));
   }
 
-  protected DexInspector runShrinker(
+  protected CodeInspector runShrinker(
       Shrinker mode, List<Class> programClasses, String proguardConfig) throws Exception {
     switch (mode) {
       case PROGUARD5:
@@ -104,8 +104,8 @@
     return ToolHelper.runR8(builder.build(), configure);
   }
 
-  protected DexInspector runR8(List<Class> programClasses, String proguardConfig) throws Exception {
-    return new DexInspector(runR8Raw(programClasses, proguardConfig));
+  protected CodeInspector runR8(List<Class> programClasses, String proguardConfig) throws Exception {
+    return new CodeInspector(runR8Raw(programClasses, proguardConfig));
   }
 
   protected AndroidApp runR8CompatRaw(
@@ -120,12 +120,12 @@
     return ToolHelper.runR8(builder.build());
   }
 
-  protected DexInspector runR8Compat(
+  protected CodeInspector runR8Compat(
       List<Class> programClasses, String proguardConfig) throws Exception {
-    return new DexInspector(runR8CompatRaw(programClasses, proguardConfig));
+    return new CodeInspector(runR8CompatRaw(programClasses, proguardConfig));
   }
 
-  protected DexInspector runR8CompatKeepingMain(Class mainClass, List<Class> programClasses)
+  protected CodeInspector runR8CompatKeepingMain(Class mainClass, List<Class> programClasses)
       throws Exception {
     return runR8Compat(programClasses, keepMainProguardConfiguration(mainClass));
   }
@@ -148,10 +148,10 @@
     return readJar(proguardedJar);
   }
 
-  protected DexInspector runProguard5(
+  protected CodeInspector runProguard5(
       List<Class> programClasses, String proguardConfig) throws Exception {
     proguardMap = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
-    return new DexInspector(
+    return new CodeInspector(
         runProguard5Raw(programClasses, proguardConfig, proguardMap), proguardMap);
   }
 
@@ -173,10 +173,10 @@
     return readJar(proguardedJar);
   }
 
-  protected DexInspector runProguard6(
+  protected CodeInspector runProguard6(
       List<Class> programClasses, String proguardConfig) throws Exception {
     proguardMap = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
-    return new DexInspector(
+    return new CodeInspector(
         runProguard6Raw(programClasses, proguardConfig, proguardMap), proguardMap);
   }
 
@@ -198,30 +198,30 @@
     return ToolHelper.runD8(readJar(proguardedJar));
   }
 
-  protected DexInspector runProguard6AndD8(
+  protected CodeInspector runProguard6AndD8(
       List<Class> programClasses, String proguardConfig) throws Exception {
     proguardMap = File.createTempFile("proguard", ".map", temp.getRoot()).toPath();
-    return new DexInspector(
+    return new CodeInspector(
         runProguard6AndD8Raw(programClasses, proguardConfig, proguardMap), proguardMap);
   }
 
-  protected DexInspector runProguardKeepingMain(Class mainClass, List<Class> programClasses)
+  protected CodeInspector runProguardKeepingMain(Class mainClass, List<Class> programClasses)
       throws Exception {
     return runProguard6AndD8(programClasses, keepMainProguardConfiguration(mainClass));
   }
 
   protected void verifyClassesPresent(
-      DexInspector dexInspector, Class<?>... classesOfInterest) {
+      CodeInspector codeInspector, Class<?>... classesOfInterest) {
     for (Class klass : classesOfInterest) {
-      ClassSubject c = dexInspector.clazz(klass);
+      ClassSubject c = codeInspector.clazz(klass);
       assertThat(c, isPresent());
     }
   }
 
   protected void verifyClassesAbsent(
-      DexInspector dexInspector, Class<?>... classesOfInterest) {
+      CodeInspector codeInspector, Class<?>... classesOfInterest) {
     for (Class klass : classesOfInterest) {
-      ClassSubject c = dexInspector.clazz(klass);
+      ClassSubject c = codeInspector.clazz(klass);
       assertThat(c, not(isPresent()));
     }
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java
index d752e39..aed1423 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java
@@ -4,16 +4,16 @@
 
 package com.android.tools.r8.shaking.forceproguardcompatibility.defaultctor;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.hasDefaultConstructor;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.hasDefaultConstructor;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.core.IsNot.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
 import com.android.tools.r8.smali.ConstantFoldingTest.TriConsumer;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
@@ -103,14 +103,14 @@
   }
 
   private void checkAllClassesPresentWithDefaultConstructor(
-      Class mainClass, List<Class> programClasses, DexInspector inspector) {
+      Class mainClass, List<Class> programClasses, CodeInspector inspector) {
     assert programClasses.contains(mainClass);
     assertEquals(programClasses.size(), inspector.allClasses().size());
     inspector.forAllClasses(this::checkPresentWithDefaultConstructor);
   }
 
   private void checkAllClassesPresentOnlyMainWithDefaultConstructor(
-      Class mainClass, List<Class> programClasses, DexInspector inspector) {
+      Class mainClass, List<Class> programClasses, CodeInspector inspector) {
     assert programClasses.contains(mainClass);
     assertEquals(programClasses.size(), inspector.allClasses().size());
     checkPresentWithDefaultConstructor(inspector.clazz(mainClass));
@@ -121,7 +121,7 @@
   }
 
   private void checkOnlyMainPresent(
-      Class mainClass, List<Class> programClasses, DexInspector inspector) {
+      Class mainClass, List<Class> programClasses, CodeInspector inspector) {
     assert programClasses.contains(mainClass);
     assertEquals(1, inspector.allClasses().size());
     inspector.forAllClasses(this::checkPresentWithDefaultConstructor);
@@ -129,9 +129,9 @@
 
   private void runTest(
       Class mainClass, List<Class> programClasses, String proguardConfiguration,
-      TriConsumer<Class, List<Class>, DexInspector> r8Checker,
-      TriConsumer<Class, List<Class>, DexInspector> proguardChecker) throws Exception {
-    DexInspector inspector = runR8Compat(programClasses, proguardConfiguration);
+      TriConsumer<Class, List<Class>, CodeInspector> r8Checker,
+      TriConsumer<Class, List<Class>, CodeInspector> proguardChecker) throws Exception {
+    CodeInspector inspector = runR8Compat(programClasses, proguardConfiguration);
     r8Checker.accept(mainClass, programClasses, inspector);
 
     if (isRunProguard()) {
@@ -144,7 +144,7 @@
 
   private void runTest(
       Class mainClass, List<Class> programClasses, String proguardConfiguration,
-      TriConsumer<Class, List<Class>, DexInspector> checker) throws Exception {
+      TriConsumer<Class, List<Class>, CodeInspector> checker) throws Exception {
     runTest(mainClass, programClasses, proguardConfiguration, checker, checker);
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
index e64983d..513a01a 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking.ifrule;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
@@ -11,9 +11,9 @@
 
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.List;
@@ -59,8 +59,8 @@
         "  public <methods>;",
         "}"
     );
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    ClassSubject classSubject = dexInspector.clazz(ClassForIf.class);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    ClassSubject classSubject = codeInspector.clazz(ClassForIf.class);
     assertThat(classSubject, isPresent());
     MethodSubject methodSubject = classSubject.method(publicMethod);
     assertThat(methodSubject, not(isPresent()));
@@ -68,7 +68,7 @@
     assertThat(methodSubject, isPresent());
     assertTrue(methodSubject.getMethod().accessFlags.isPublic());
 
-    classSubject = dexInspector.clazz(ClassForSubsequent.class);
+    classSubject = codeInspector.clazz(ClassForSubsequent.class);
     if (isR8(shrinker)) {
       // TODO(b/72109068): ClassForIf#nonPublicMethod becomes public, and -if rule is not applied
       // at the 2nd tree shaking.
@@ -98,8 +98,8 @@
         "  !public <methods>;",
         "}"
     );
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    ClassSubject classSubject = dexInspector.clazz(ClassForIf.class);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    ClassSubject classSubject = codeInspector.clazz(ClassForIf.class);
     assertThat(classSubject, isPresent());
     MethodSubject methodSubject = classSubject.method(publicMethod);
     assertThat(methodSubject, not(isPresent()));
@@ -107,7 +107,7 @@
     assertThat(methodSubject, isPresent());
     assertTrue(methodSubject.getMethod().accessFlags.isPublic());
 
-    classSubject = dexInspector.clazz(ClassForSubsequent.class);
+    classSubject = codeInspector.clazz(ClassForSubsequent.class);
     if (isR8(shrinker)) {
       // TODO(b/72109068): ClassForIf#nonPublicMethod becomes public, and -if rule is not applied
       // at the 2nd tree shaking.
@@ -138,15 +138,15 @@
         "  public <methods>;",
         "}"
     );
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    ClassSubject classSubject = dexInspector.clazz(ClassForIf.class);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    ClassSubject classSubject = codeInspector.clazz(ClassForIf.class);
     assertThat(classSubject, isPresent());
     MethodSubject methodSubject = classSubject.method(publicMethod);
     assertThat(methodSubject, isPresent());
     methodSubject = classSubject.method(nonPublicMethod);
     assertThat(methodSubject, not(isPresent()));
 
-    classSubject = dexInspector.clazz(ClassForSubsequent.class);
+    classSubject = codeInspector.clazz(ClassForSubsequent.class);
     assertThat(classSubject, isPresent());
     methodSubject = classSubject.method(publicMethod);
     assertThat(methodSubject, isPresent());
@@ -170,15 +170,15 @@
         "  !public <methods>;",
         "}"
     );
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    ClassSubject classSubject = dexInspector.clazz(ClassForIf.class);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    ClassSubject classSubject = codeInspector.clazz(ClassForIf.class);
     assertThat(classSubject, isPresent());
     MethodSubject methodSubject = classSubject.method(publicMethod);
     assertThat(methodSubject, isPresent());
     methodSubject = classSubject.method(nonPublicMethod);
     assertThat(methodSubject, not(isPresent()));
 
-    classSubject = dexInspector.clazz(ClassForSubsequent.class);
+    classSubject = codeInspector.clazz(ClassForSubsequent.class);
     assertThat(classSubject, isPresent());
     methodSubject = classSubject.method(publicMethod);
     assertThat(methodSubject, not(isPresent()));
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java
index ac92146..146c3cd 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.shaking.ifrule;
 
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.List;
@@ -50,10 +50,10 @@
         "-keep class **.UnusedAnnotation*"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         UnusedAnnotation.class, UnusedAnnotationDependent.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         UsedAnnotation.class, UsedAnnotationDependent.class);
   }
 
@@ -76,10 +76,10 @@
         "-keep class <1>.Unused<2>*"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         UnusedAnnotation.class, UnusedAnnotationDependent.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         UsedAnnotation.class, UsedAnnotationDependent.class);
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
index 1f5ba35..167c2f4 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
@@ -3,18 +3,18 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking.ifrule;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isNotRenamed;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -60,19 +60,19 @@
   }
 
   @Override
-  protected DexInspector runR8(
+  protected CodeInspector runR8(
       List<Class> programClasses, String proguardConfig) throws Exception {
     return super.runR8(programClasses, adaptConfiguration(proguardConfig));
   }
 
   @Override
-  protected DexInspector runProguard5(
+  protected CodeInspector runProguard5(
       List<Class> programClasses, String proguardConfig) throws Exception {
     return super.runProguard5(programClasses, adaptConfiguration(proguardConfig));
   }
 
   @Override
-  protected DexInspector runProguard6(
+  protected CodeInspector runProguard6(
       List<Class> programClasses, String proguardConfig) throws Exception {
     return super.runProguard6(programClasses, adaptConfiguration(proguardConfig));
   }
@@ -86,17 +86,17 @@
         "-keep,allowobfuscation class **.Dependent"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
     if (!keepPrecondition) {
       // TODO(b/73708139): Proguard6 kept Dependent (w/o any members), which is not necessary.
       if (shrinker == Shrinker.PROGUARD6) {
         return;
       }
-      assertEquals(1, dexInspector.allClasses().size());
+      assertEquals(1, codeInspector.allClasses().size());
       return;
     }
 
-    ClassSubject clazz = dexInspector.clazz(DependentUser.class);
+    ClassSubject clazz = codeInspector.clazz(DependentUser.class);
     assertThat(clazz, isRenamed());
     // Members of DependentUser are not used anywhere.
     MethodSubject m = clazz.method("void", "callFoo", ImmutableList.of());
@@ -105,7 +105,7 @@
     assertThat(f, not(isPresent()));
 
     // Although DependentUser#callFoo is shrinked, Dependent is kept via -if.
-    clazz = dexInspector.clazz(Dependent.class);
+    clazz = codeInspector.clazz(Dependent.class);
     assertThat(clazz, isRenamed());
     // But, its members are gone.
     m = clazz.method("java.lang.String", "foo", ImmutableList.of());
@@ -123,17 +123,17 @@
         "-keep,allowobfuscation class <1>.<2>"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
     if (!keepPrecondition) {
       // TODO(b/73708139): Proguard6 kept Dependent (w/o any members), which is not necessary.
       if (shrinker == Shrinker.PROGUARD6) {
         return;
       }
-      assertEquals(1, dexInspector.allClasses().size());
+      assertEquals(1, codeInspector.allClasses().size());
       return;
     }
 
-    ClassSubject clazz = dexInspector.clazz(DependentUser.class);
+    ClassSubject clazz = codeInspector.clazz(DependentUser.class);
     assertThat(clazz, isRenamed());
     // Members of DependentUser are not used anywhere.
     MethodSubject m = clazz.method("void", "callFoo", ImmutableList.of());
@@ -142,7 +142,7 @@
     assertThat(f, not(isPresent()));
 
     // Although DependentUser#callFoo is shrinked, Dependent is kept via -if.
-    clazz = dexInspector.clazz(Dependent.class);
+    clazz = codeInspector.clazz(Dependent.class);
     assertThat(clazz, isRenamed());
     // But, its members are gone.
     m = clazz.method("java.lang.String", "foo", ImmutableList.of());
@@ -160,13 +160,13 @@
         "}"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
     if (!keepPrecondition) {
-      assertEquals(1, dexInspector.allClasses().size());
+      assertEquals(1, codeInspector.allClasses().size());
       return;
     }
 
-    ClassSubject clazz = dexInspector.clazz(DependentUser.class);
+    ClassSubject clazz = codeInspector.clazz(DependentUser.class);
     assertThat(clazz, isRenamed());
     MethodSubject m = clazz.method("void", "callFoo", ImmutableList.of());
     assertThat(m, isRenamed());
@@ -174,7 +174,7 @@
     assertThat(f, not(isPresent()));
 
     // Dependent is kept due to DependentUser#callFoo, but renamed.
-    clazz = dexInspector.clazz(Dependent.class);
+    clazz = codeInspector.clazz(Dependent.class);
     assertThat(clazz, isRenamed());
     m = clazz.method("java.lang.String", "foo", ImmutableList.of());
     assertThat(m, isRenamed());
@@ -196,17 +196,17 @@
         "-keep,allowobfuscation class **.*User"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
     if (!keepPrecondition) {
       // TODO(b/73708139): Proguard6 kept DependentUser (w/o any members), which is not necessary.
       if (shrinker == Shrinker.PROGUARD6) {
         return;
       }
-      assertEquals(1, dexInspector.allClasses().size());
+      assertEquals(1, codeInspector.allClasses().size());
       return;
     }
 
-    ClassSubject clazz = dexInspector.clazz(DependentUser.class);
+    ClassSubject clazz = codeInspector.clazz(DependentUser.class);
     assertThat(clazz, isRenamed());
     MethodSubject m = clazz.method("void", "callFoo", ImmutableList.of());
     assertThat(m, isRenamed());
@@ -214,7 +214,7 @@
     assertThat(f, not(isPresent()));
 
     // Dependent is kept due to DependentUser#callFoo, but renamed.
-    clazz = dexInspector.clazz(Dependent.class);
+    clazz = codeInspector.clazz(Dependent.class);
     assertThat(clazz, isRenamed());
     m = clazz.method("java.lang.String", "foo", ImmutableList.of());
     assertThat(m, isRenamed());
@@ -236,17 +236,17 @@
         "-keep,allowobfuscation class <1>.<2>User"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
     if (!keepPrecondition) {
       // TODO(b/73708139): Proguard6 kept DependentUser (w/o any members), which is not necessary.
       if (shrinker == Shrinker.PROGUARD6) {
         return;
       }
-      assertEquals(1, dexInspector.allClasses().size());
+      assertEquals(1, codeInspector.allClasses().size());
       return;
     }
 
-    ClassSubject clazz = dexInspector.clazz(DependentUser.class);
+    ClassSubject clazz = codeInspector.clazz(DependentUser.class);
     assertThat(clazz, isRenamed());
     MethodSubject m = clazz.method("void", "callFoo", ImmutableList.of());
     assertThat(m, isRenamed());
@@ -254,7 +254,7 @@
     assertThat(f, not(isPresent()));
 
     // Dependent is kept due to DependentUser#callFoo, but renamed.
-    clazz = dexInspector.clazz(Dependent.class);
+    clazz = codeInspector.clazz(Dependent.class);
     assertThat(clazz, isRenamed());
     m = clazz.method("java.lang.String", "foo", ImmutableList.of());
     assertThat(m, isRenamed());
@@ -274,9 +274,9 @@
         "-keepnames class **.Dependent"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
 
-    ClassSubject clazz = dexInspector.clazz(Dependent.class);
+    ClassSubject clazz = codeInspector.clazz(Dependent.class);
     // Only class name is not renamed, if triggered.
     assertThat(clazz, keepPrecondition ? isNotRenamed() : isRenamed());
     MethodSubject m = clazz.method("java.lang.String", "foo", ImmutableList.of());
@@ -299,9 +299,9 @@
         "}"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
 
-    ClassSubject clazz = dexInspector.clazz(Dependent.class);
+    ClassSubject clazz = codeInspector.clazz(Dependent.class);
     // Class name is not renamed, if triggered.
     assertThat(clazz, keepPrecondition ? isNotRenamed() : isRenamed());
     MethodSubject m = clazz.method("java.lang.String", "foo", ImmutableList.of());
@@ -325,9 +325,9 @@
         "}"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
 
-    ClassSubject clazz = dexInspector.clazz(Dependent.class);
+    ClassSubject clazz = codeInspector.clazz(Dependent.class);
     assertThat(clazz, isRenamed());
     MethodSubject m = clazz.method("java.lang.String", "foo", ImmutableList.of());
     // Only method name is not renamed, if triggered.
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java
index 0292344..d199cd4 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.shaking.ifrule;
 
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -42,13 +42,13 @@
   }
 
   @Override
-  protected DexInspector runR8(
+  protected CodeInspector runR8(
       List<Class> programClasses, String proguardConfig) throws Exception {
     return super.runR8(programClasses, adaptConfiguration(proguardConfig));
   }
 
   @Override
-  protected DexInspector runProguard6(
+  protected CodeInspector runProguard6(
       List<Class> programClasses, String proguardConfig) throws Exception {
     return super.runProguard6(programClasses, adaptConfiguration(proguardConfig));
   }
@@ -77,10 +77,10 @@
         "-keep class **.D"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         R1.class, R2.class, D.class, D2.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         R.class, D1.class);
   }
 
@@ -96,10 +96,10 @@
         "-keep class **.D<2>"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         R1.class, R2.class, D.class, D2.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         R.class, D1.class);
   }
 
@@ -119,10 +119,10 @@
         "-keep class **.D2"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         R.class, D.class, R1.class, D1.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         R2.class, D2.class);
   }
 
@@ -138,10 +138,10 @@
         "-keep class **.D<2>"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         R.class, D.class, R1.class, D1.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         R2.class, D2.class);
   }
 
@@ -158,10 +158,10 @@
         "-keep class **$*D"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         R.class, D.class, R1.class, D1.class, R2.class, D2.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         MainWithInner.InnerR.class, MainWithInner.InnerD.class);
   }
 
@@ -178,10 +178,10 @@
         "-keep class <1>$<2>D"
     );
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector,
         R.class, D.class, R1.class, D1.class, R2.class, D2.class);
-    verifyClassesPresent(dexInspector,
+    verifyClassesPresent(codeInspector,
         MainWithInner.InnerR.class, MainWithInner.InnerD.class);
   }
 
@@ -202,9 +202,9 @@
             "}",
             "-keep class **.D2");
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector, D2.class);
-    verifyClassesPresent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector, D2.class);
+    verifyClassesPresent(codeInspector,
         I.class, Impl.class, D1.class);
   }
 
@@ -225,9 +225,9 @@
             "}",
             "-keep class <2>.D2");
 
-    DexInspector dexInspector = runShrinker(shrinker, CLASSES, config);
-    verifyClassesAbsent(dexInspector, D2.class);
-    verifyClassesPresent(dexInspector,
+    CodeInspector codeInspector = runShrinker(shrinker, CLASSES, config);
+    verifyClassesAbsent(codeInspector, D2.class);
+    verifyClassesPresent(codeInspector,
         I.class, Impl.class, D1.class);
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/inlining/IfRuleWithInlining.java b/src/test/java/com/android/tools/r8/shaking/ifrule/inlining/IfRuleWithInlining.java
index cd2ce6a..7391986 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/inlining/IfRuleWithInlining.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/inlining/IfRuleWithInlining.java
@@ -4,15 +4,15 @@
 
 package com.android.tools.r8.shaking.ifrule.inlining;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.List;
@@ -65,7 +65,7 @@
   }
 
   private void check(AndroidApp app) throws Exception {
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazzA = inspector.clazz(A.class);
     assertThat(clazzA, isPresent());
     // A.a might be inlined.
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java
index aed9596..cc574f3 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.shaking.ifrule.verticalclassmerging;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -12,8 +12,8 @@
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.List;
@@ -90,7 +90,7 @@
   }
 
   private void check(AndroidApp app) throws Exception {
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     ClassSubject clazzA = inspector.clazz(A.class);
     assertEquals(!enableClassMerging, clazzA.isPresent());
     ClassSubject clazzB = inspector.clazz(B.class);
diff --git a/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java b/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java
index c841996..bc94fa6 100644
--- a/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java
@@ -9,7 +9,7 @@
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -18,10 +18,10 @@
 
 public class IncludeDescriptorClassesTest extends TestBase {
   private class Result {
-    final DexInspector inspector;
-    final DexInspector proguardedInspector;
+    final CodeInspector inspector;
+    final CodeInspector proguardedInspector;
 
-    Result(DexInspector inspector, DexInspector proguardedInspector) {
+    Result(CodeInspector inspector, CodeInspector proguardedInspector) {
       this.inspector = inspector;
       this.proguardedInspector = proguardedInspector;
     }
@@ -62,15 +62,15 @@
     List<Class> classes = new ArrayList<>(applicationClasses);
     classes.add(mainClass);
 
-    DexInspector inspector = new DexInspector(compileWithR8(classes, proguardConfig));
+    CodeInspector inspector = new CodeInspector(compileWithR8(classes, proguardConfig));
 
-    DexInspector proguardedInspector = null;
+    CodeInspector proguardedInspector = null;
     // Actually running Proguard should only be during development.
     if (isRunProguard()) {
       Path proguardedJar = temp.newFolder().toPath().resolve("proguarded.jar");
       Path proguardedMap = temp.newFolder().toPath().resolve("proguarded.map");
       ToolHelper.runProguard(jarTestClasses(classes), proguardedJar, proguardConfig, proguardedMap);
-      proguardedInspector = new DexInspector(readJar(proguardedJar), proguardedMap);
+      proguardedInspector = new CodeInspector(readJar(proguardedJar), proguardedMap);
     }
 
     return new Result(inspector, proguardedInspector);
diff --git a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java
index b1ae8bb..97cad3c 100644
--- a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java
@@ -4,24 +4,24 @@
 
 package com.android.tools.r8.shaking.keepclassmembers;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isAbstract;
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbstract;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.core.IsNot.not;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.FieldSubject;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
 public class KeepClassMembersTest extends ProguardCompatabilityTestBase {
 
-  private void check(DexInspector inspector, Class mainClass, Class<?> staticClass,
+  private void check(CodeInspector inspector, Class mainClass, Class<?> staticClass,
       boolean forceProguardCompatibility, boolean fromProguard) {
     assertTrue(inspector.clazz(mainClass).isPresent());
     ClassSubject staticClassSubject = inspector.clazz(staticClass);
@@ -70,8 +70,8 @@
         "}",
         "-dontoptimize", "-dontobfuscate"
     ));
-    DexInspector inspector;
-      inspector = new DexInspector(
+    CodeInspector inspector;
+      inspector = new CodeInspector(
           compileWithR8(ImmutableList.of(mainClass, staticClass), proguardConfig,
               options -> options.forceProguardCompatibility = forceProguardCompatibility));
     check(inspector, mainClass, staticClass, forceProguardCompatibility, false);
diff --git a/src/test/java/com/android/tools/r8/shaking/proxy/ProxiesTest.java b/src/test/java/com/android/tools/r8/shaking/proxy/ProxiesTest.java
index 8c71ff7..8d38aee 100644
--- a/src/test/java/com/android/tools/r8/shaking/proxy/ProxiesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/proxy/ProxiesTest.java
@@ -23,14 +23,14 @@
 import com.android.tools.r8.shaking.proxy.testclasses.SubInterface;
 import com.android.tools.r8.shaking.proxy.testclasses.TestClass;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
 
 public class ProxiesTest extends TestBase {
 
-  private void runTest(List<String> additionalKeepRules, Consumer<DexInspector> inspection,
+  private void runTest(List<String> additionalKeepRules, Consumer<CodeInspector> inspection,
       String expectedResult)
       throws Exception {
     Class mainClass = Main.class;
@@ -51,18 +51,18 @@
     builder.addProguardConfiguration(additionalKeepRules, Origin.unknown());
     builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
     AndroidApp app = ToolHelper.runR8(builder.build(), o -> o.enableDevirtualization = false);
-    inspection.accept(new DexInspector(app));
+    inspection.accept(new CodeInspector(app));
     assertEquals(expectedResult, runOnArt(app, mainClass));
   }
 
-  private int countInstructionInX(DexInspector inspector, Class<? extends Instruction> invoke) {
+  private int countInstructionInX(CodeInspector inspector, Class<? extends Instruction> invoke) {
     MethodSignature signatureForX =
         new MethodSignature("x", "void", ImmutableList.of(BaseInterface.class.getCanonicalName()));
     DexCode x = inspector.clazz(Main.class).method(signatureForX).getMethod().getCode().asDexCode();
     return (int) filterInstructionKind(x, invoke).count();
   }
 
-  private int countInstructionInY(DexInspector inspector, Class<? extends Instruction> invoke) {
+  private int countInstructionInY(CodeInspector inspector, Class<? extends Instruction> invoke) {
     MethodSignature signatureForY =
         new MethodSignature("y", "void", ImmutableList.of(SubInterface.class.getCanonicalName()));
     DexCode y = inspector.clazz(Main.class).method(signatureForY).getMethod().getCode().asDexCode();
@@ -71,7 +71,7 @@
         .count();
   }
 
-  private int countInstructionInZ(DexInspector inspector, Class<? extends Instruction> invoke) {
+  private int countInstructionInZ(CodeInspector inspector, Class<? extends Instruction> invoke) {
     MethodSignature signatureForZ =
         new MethodSignature("z", "void", ImmutableList.of(TestClass.class.getCanonicalName()));
     DexCode z = inspector.clazz(Main.class).method(signatureForZ).getMethod().getCode().asDexCode();
@@ -81,7 +81,7 @@
   }
 
   private int countInstructionInZSubClass(
-      DexInspector inspector, Class<? extends Instruction> invoke) {
+      CodeInspector inspector, Class<? extends Instruction> invoke) {
     MethodSignature signatureForZ =
         new MethodSignature("z", "void", ImmutableList.of(SubClass.class.getCanonicalName()));
     DexCode z = inspector.clazz(Main.class).method(signatureForZ).getMethod().getCode().asDexCode();
@@ -90,7 +90,7 @@
         .count();
   }
 
-  private void noInterfaceKept(DexInspector inspector) {
+  private void noInterfaceKept(CodeInspector inspector) {
     // Indirectly assert that method is inlined into x, y and z.
     assertEquals(1, countInstructionInX(inspector, InvokeInterface.class));
     assertEquals(1, countInstructionInY(inspector, InvokeInterface.class));
@@ -104,7 +104,7 @@
         "TestClass 1\nTestClass 1\nTestClass 1\nProxy\nEXCEPTION\n");
   }
 
-  private void baseInterfaceKept(DexInspector inspector) {
+  private void baseInterfaceKept(CodeInspector inspector) {
     // Indirectly assert that method is not inlined into x.
     assertEquals(3, countInstructionInX(inspector, InvokeInterface.class));
     // Indirectly assert that method is inlined into y and z.
@@ -124,7 +124,7 @@
         "TestClass 2\nTestClass 2\nTestClass 2\nProxy\nEXCEPTION\n");
   }
 
-  private void subInterfaceKept(DexInspector inspector) {
+  private void subInterfaceKept(CodeInspector inspector) {
     // Indirectly assert that method is not inlined into x or y.
     assertEquals(3, countInstructionInX(inspector, InvokeInterface.class));
     assertEquals(3, countInstructionInY(inspector, InvokeInterface.class));
@@ -146,7 +146,7 @@
         "TestClass 4\nTestClass 4\nTestClass 4\nSUCCESS\n");
   }
 
-  private void classKept(DexInspector inspector) {
+  private void classKept(CodeInspector inspector) {
     // Indirectly assert that method is not inlined into x, y or z.
     assertEquals(3, countInstructionInX(inspector, InvokeInterface.class));
     assertEquals(3, countInstructionInY(inspector, InvokeInterface.class));
diff --git a/src/test/java/com/android/tools/r8/shaking/testrules/ForceInlineTest.java b/src/test/java/com/android/tools/r8/shaking/testrules/ForceInlineTest.java
index 365d039..147b1b4 100644
--- a/src/test/java/com/android/tools/r8/shaking/testrules/ForceInlineTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/testrules/ForceInlineTest.java
@@ -8,7 +8,7 @@
 
 package com.android.tools.r8.shaking.testrules;
 
-import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
@@ -17,25 +17,25 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
 
 public class ForceInlineTest extends TestBase {
 
-  private DexInspector runTest(List<String> proguardConfiguration) throws Exception {
+  private CodeInspector runTest(List<String> proguardConfiguration) throws Exception {
     R8Command.Builder builder =
         ToolHelper.prepareR8CommandBuilder(readClasses(Main.class, A.class, B.class, C.class));
     ToolHelper.allowTestProguardOptions(builder);
     builder.addProguardConfiguration(proguardConfiguration, Origin.unknown());
-    return new DexInspector(ToolHelper.runR8(builder.build()));
+    return new CodeInspector(ToolHelper.runR8(builder.build()));
   }
 
   @Test
   public void testDefaultInlining() throws Exception {
-    DexInspector inspector = runTest(ImmutableList.of(
+    CodeInspector inspector = runTest(ImmutableList.of(
         "-keep class **.Main { *; }",
         "-dontobfuscate"
     ));
@@ -61,7 +61,7 @@
 
   @Test
   public void testNeverInline() throws Exception {
-    DexInspector inspector = runTest(ImmutableList.of(
+    CodeInspector inspector = runTest(ImmutableList.of(
         "-neverinline class **.A { method(); }",
         "-neverinline class **.B { method(); }",
         "-keep class **.Main { *; }",
@@ -86,7 +86,7 @@
 
   @Test
   public void testForceInline() throws Exception {
-    DexInspector inspector = runTest(ImmutableList.of(
+    CodeInspector inspector = runTest(ImmutableList.of(
         "-forceinline class **.A { int m(int, int); }",
         "-forceinline class **.B { int m(int, int); }",
         "-keep class **.Main { *; }",
@@ -108,7 +108,7 @@
   @Test
   public void testForceInlineFails() throws Exception {
     try {
-      DexInspector inspector = runTest(ImmutableList.of(
+      CodeInspector inspector = runTest(ImmutableList.of(
           "-forceinline class **.A { int x(); }",
           "-keep class **.Main { *; }",
           "-dontobfuscate"
diff --git a/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java b/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
index 5f9a6fd..ce1fd33 100644
--- a/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
+++ b/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
@@ -20,8 +20,8 @@
 import com.android.tools.r8.ir.code.SingleConstant;
 import com.android.tools.r8.ir.code.WideConstant;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -54,7 +54,7 @@
     public void run() throws Exception {
       AndroidApp processdApplication = processApplication(buildApplication(builder));
       assertEquals(1, getNumberOfProgramClasses(processdApplication));
-      DexInspector inspector = new DexInspector(processdApplication);
+      CodeInspector inspector = new CodeInspector(processdApplication);
       ClassSubject clazz = inspector.clazz(DEFAULT_CLASS_NAME);
       clazz.forAllMethods(method -> {
         int index = Integer.parseInt(method.getMethod().method.name.toString().substring(1));
diff --git a/src/test/java/com/android/tools/r8/smali/OutlineTest.java b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
index 41e894e..1479add 100644
--- a/src/test/java/com/android/tools/r8/smali/OutlineTest.java
+++ b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
@@ -34,9 +34,9 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.InternalOptions.OutlineOptions;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -59,7 +59,7 @@
   }
 
   DexEncodedMethod getInvokedMethod(DexApplication application, InvokeStatic invoke) {
-    DexInspector inspector = new DexInspector(application);
+    CodeInspector inspector = new CodeInspector(application);
     ClassSubject clazz = inspector.clazz(invoke.getMethod().holder.toSourceString());
     assertTrue(clazz.isPresent());
     DexMethod invokedMethod = invoke.getMethod();
@@ -843,7 +843,7 @@
     assertEquals(2, getNumberOfProgramClasses(processedApplication));
 
     // Check that three outlining methods was created.
-    DexInspector inspector = new DexInspector(processedApplication);
+    CodeInspector inspector = new CodeInspector(processedApplication);
     ClassSubject clazz = inspector.clazz(OutlineOptions.CLASS_NAME);
     assertTrue(clazz.isPresent());
     assertEquals(3, clazz.getDexClass().directMethods().length);
diff --git a/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java b/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java
index c8713e3..9c9991e 100644
--- a/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java
+++ b/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java
@@ -12,8 +12,8 @@
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import org.junit.Test;
@@ -80,7 +80,7 @@
             keepMainProguardConfiguration("Test"),
             options -> options.enableInlining = false);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     MethodSubject method = inspector.clazz("Test").method("void", "test", ImmutableList.of());
     DexCode code = method.getMethod().getCode().asDexCode();
     assertTrue(code.isEmptyVoidMethod());
@@ -153,7 +153,7 @@
             keepMainProguardConfiguration("Test"),
             options -> options.enableInlining = false);
 
-    DexInspector inspector = new DexInspector(app);
+    CodeInspector inspector = new CodeInspector(app);
     MethodSubject method = inspector.clazz("Test").method("void", "test", ImmutableList.of());
     DexCode code = method.getMethod().getCode().asDexCode();
     assertTrue(code.isEmptyVoidMethod());
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java b/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java
index 7287cc3..8d780b4 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java
@@ -9,8 +9,8 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.EmbeddedOrigin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.IOException;
 import java.util.concurrent.ExecutionException;
 import org.junit.Test;
@@ -19,7 +19,7 @@
 
   private void checkJavaLangString(AndroidApp application, boolean present) {
     try {
-      DexInspector inspector = new DexInspector(application);
+      CodeInspector inspector = new CodeInspector(application);
       ClassSubject clazz = inspector.clazz("java.lang.String");
       assertEquals(present, clazz.isPresent());
     } catch (IOException | ExecutionException e) {
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
index 7aabadb..b12c0b9 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
@@ -25,8 +25,8 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.Collection;
@@ -112,7 +112,7 @@
   }
 
   protected DexClass getClass(DexApplication application, String className) {
-    DexInspector inspector = new DexInspector(application);
+    CodeInspector inspector = new CodeInspector(application);
     ClassSubject clazz = inspector.clazz(className);
     assertTrue(clazz.isPresent());
     return clazz.getDexClass();
@@ -124,7 +124,7 @@
 
   protected DexClass getClass(Path appPath, String className) {
     try {
-      DexInspector inspector = new DexInspector(appPath);
+      CodeInspector inspector = new CodeInspector(appPath);
       ClassSubject clazz = inspector.clazz(className);
       assertTrue(clazz.isPresent());
       return clazz.getDexClass();
@@ -135,14 +135,14 @@
 
   protected DexEncodedMethod getMethod(Path appPath, MethodSignature signature) {
     try {
-      DexInspector inspector = new DexInspector(appPath);
+      CodeInspector inspector = new CodeInspector(appPath);
       return getMethod(inspector, signature);
     } catch (IOException | ExecutionException e) {
       throw new RuntimeException(e);
     }
   }
 
-  protected DexEncodedMethod getMethod(DexInspector inspector, MethodSignature signature) {
+  protected DexEncodedMethod getMethod(CodeInspector inspector, MethodSignature signature) {
     return getMethod(
         inspector, signature.clazz, signature.returnType, signature.name, signature.parameterTypes);
   }
diff --git a/src/test/java/com/android/tools/r8/utils/ArtErrorParser.java b/src/test/java/com/android/tools/r8/utils/ArtErrorParser.java
index 51c6ca5..5f00fc9 100644
--- a/src/test/java/com/android/tools/r8/utils/ArtErrorParser.java
+++ b/src/test/java/com/android/tools/r8/utils/ArtErrorParser.java
@@ -4,9 +4,9 @@
 package com.android.tools.r8.utils;
 
 import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.utils.dexinspector.ClassSubject;
-import com.android.tools.r8.utils.dexinspector.DexInspector;
-import com.android.tools.r8.utils.dexinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -72,7 +72,7 @@
   public static abstract class ArtErrorInfo {
     public abstract int consumedLines();
     public abstract String getMessage();
-    public abstract String dump(DexInspector inspector, boolean markLocation);
+    public abstract String dump(CodeInspector inspector, boolean markLocation);
   }
 
   private static class ArtMethodError extends ArtErrorInfo {
@@ -117,7 +117,7 @@
     }
 
     @Override
-    public String dump(DexInspector inspector, boolean markLocation) {
+    public String dump(CodeInspector inspector, boolean markLocation) {
       ClassSubject clazz = inspector.clazz(className);
       MethodSubject method = clazz.method(methodReturn, methodName, methodFormals);
       DexEncodedMethod dex = method.getMethod();
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentAnnotationSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentAnnotationSubject.java
similarity index 91%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/AbsentAnnotationSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/AbsentAnnotationSubject.java
index e6d9306..a82d9b0 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentAnnotationSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentAnnotationSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedAnnotation;
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
similarity index 97%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/AbsentClassSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
index e2fa906..167bc8d 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexClass;
 import java.util.List;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentFieldSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
similarity index 96%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/AbsentFieldSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
index f79fc00..d4409d1 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentFieldSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexValue;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
similarity index 96%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/AbsentMethodSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
index 5f10dd7..1396be9 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.naming.MemberNaming.Signature;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/AnnotationSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AnnotationSubject.java
similarity index 88%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/AnnotationSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/AnnotationSubject.java
index 24682be..4bffcca 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/AnnotationSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AnnotationSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedAnnotation;
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/CfInstructionIterator.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionIterator.java
similarity index 73%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/CfInstructionIterator.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionIterator.java
index d000250..0a3263a 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/CfInstructionIterator.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionIterator.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.graph.Code;
@@ -10,11 +10,11 @@
 
 class CfInstructionIterator implements InstructionIterator {
 
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
   private final Iterator<CfInstruction> iterator;
 
-  CfInstructionIterator(DexInspector dexInspector, MethodSubject method) {
-    this.dexInspector = dexInspector;
+  CfInstructionIterator(CodeInspector codeInspector, MethodSubject method) {
+    this.codeInspector = codeInspector;
     assert method.isPresent();
     Code code = method.getMethod().getCode();
     assert code != null && code.isCfCode();
@@ -28,6 +28,6 @@
 
   @Override
   public InstructionSubject next() {
-    return dexInspector.createInstructionSubject(iterator.next());
+    return codeInspector.createInstructionSubject(iterator.next());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/CfInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
similarity index 78%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/CfInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
index ae900f3..fa00432 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/CfInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
@@ -2,8 +2,9 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
+import com.android.tools.r8.cf.code.CfConstNull;
 import com.android.tools.r8.cf.code.CfConstString;
 import com.android.tools.r8.cf.code.CfFieldInstruction;
 import com.android.tools.r8.cf.code.CfGoto;
@@ -16,6 +17,7 @@
 import com.android.tools.r8.cf.code.CfNop;
 import com.android.tools.r8.cf.code.CfPosition;
 import com.android.tools.r8.cf.code.CfReturnVoid;
+import com.android.tools.r8.cf.code.CfStackInstruction;
 import com.android.tools.r8.cf.code.CfThrow;
 import org.objectweb.asm.Opcodes;
 
@@ -55,13 +57,14 @@
   }
 
   @Override
-  public boolean isConstString() {
+  public boolean isConstString(JumboStringMode jumboStringMode) {
     return instruction instanceof CfConstString;
   }
 
   @Override
-  public boolean isConstString(String value) {
-    return isConstString() && ((CfConstString) instruction).getString().toString().equals(value);
+  public boolean isConstString(String value, JumboStringMode jumboStringMode) {
+    return isConstString(jumboStringMode)
+        && ((CfConstString) instruction).getString().toSourceString().equals(value);
   }
 
   @Override
@@ -115,4 +118,17 @@
   public boolean isPosition() {
     return instruction instanceof CfPosition;
   }
+
+  public boolean isStackInstruction(CfStackInstruction.Opcode opcode) {
+    return instruction instanceof CfStackInstruction
+        && ((CfStackInstruction) instruction).getOpcode() == opcode;
+  }
+
+  public boolean isConstNull() {
+    return instruction instanceof CfConstNull;
+  }
+
+  public boolean isIfNull() {
+    return instruction instanceof CfIf && ((CfIf) instruction).getOpcode() == Opcodes.IFNULL;
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/ClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
similarity index 97%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/ClassSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
index afb4928..bbb6213 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/ClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/DexInspector.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
similarity index 90%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/DexInspector.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
index c67a560..ecc78c6 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/DexInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
@@ -1,7 +1,7 @@
 // Copyright (c) 2016, 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import static org.junit.Assert.assertTrue;
 
@@ -30,6 +30,7 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject.JumboStringMode;
 import com.google.common.collect.BiMap;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
@@ -44,7 +45,7 @@
 import java.util.function.Consumer;
 import java.util.function.Function;
 
-public class DexInspector {
+public class CodeInspector {
 
   private final DexApplication application;
   final DexItemFactory dexItemFactory;
@@ -54,19 +55,19 @@
   public static MethodSignature MAIN =
       new MethodSignature("main", "void", new String[] {"java.lang.String[]"});
 
-  public DexInspector(Path file, String mappingFile) throws IOException, ExecutionException {
+  public CodeInspector(Path file, String mappingFile) throws IOException, ExecutionException {
     this(Collections.singletonList(file), mappingFile);
   }
 
-  public DexInspector(Path file) throws IOException, ExecutionException {
+  public CodeInspector(Path file) throws IOException, ExecutionException {
     this(Collections.singletonList(file), null);
   }
 
-  public DexInspector(List<Path> files) throws IOException, ExecutionException {
+  public CodeInspector(List<Path> files) throws IOException, ExecutionException {
     this(files, null);
   }
 
-  public DexInspector(List<Path> files, String mappingFile) throws IOException, ExecutionException {
+  public CodeInspector(List<Path> files, String mappingFile) throws IOException, ExecutionException {
     if (mappingFile != null) {
       this.mapping = ClassNameMapper.mapperFromFile(Paths.get(mappingFile));
       originalToObfuscatedMapping = this.mapping.getObfuscatedToOriginalMapping().inverse();
@@ -74,23 +75,23 @@
       this.mapping = null;
       originalToObfuscatedMapping = null;
     }
-    Timing timing = new Timing("DexInspector");
+    Timing timing = new Timing("CodeInspector");
     InternalOptions options = new InternalOptions();
     dexItemFactory = options.itemFactory;
     AndroidApp input = AndroidApp.builder().addProgramFiles(files).build();
     application = new ApplicationReader(input, options, timing).read();
   }
 
-  public DexInspector(AndroidApp app) throws IOException, ExecutionException {
+  public CodeInspector(AndroidApp app) throws IOException, ExecutionException {
     this(
-        new ApplicationReader(app, new InternalOptions(), new Timing("DexInspector"))
+        new ApplicationReader(app, new InternalOptions(), new Timing("CodeInspector"))
             .read(app.getProguardMapOutputData()));
   }
 
-  public DexInspector(AndroidApp app, Consumer<InternalOptions> optionsConsumer)
+  public CodeInspector(AndroidApp app, Consumer<InternalOptions> optionsConsumer)
       throws IOException, ExecutionException {
     this(
-        new ApplicationReader(app, runOptionsConsumer(optionsConsumer), new Timing("DexInspector"))
+        new ApplicationReader(app, runOptionsConsumer(optionsConsumer), new Timing("CodeInspector"))
             .read(app.getProguardMapOutputData()));
   }
 
@@ -100,13 +101,13 @@
     return internalOptions;
   }
 
-  public DexInspector(AndroidApp app, Path proguardMap) throws IOException, ExecutionException {
+  public CodeInspector(AndroidApp app, Path proguardMap) throws IOException, ExecutionException {
     this(
-        new ApplicationReader(app, new InternalOptions(), new Timing("DexInspector"))
+        new ApplicationReader(app, new InternalOptions(), new Timing("CodeInspector"))
             .read(StringResource.fromFile(proguardMap)));
   }
 
-  public DexInspector(DexApplication application) {
+  public CodeInspector(DexApplication application) {
     dexItemFactory = application.dexItemFactory;
     this.application = application;
     this.mapping = application.getProguardMap();
@@ -254,6 +255,8 @@
       return new FieldAccessDexInstructionSubject(this, instruction);
     } else if (dexInst.isNewInstance()) {
       return new NewInstanceDexInstructionSubject(instruction);
+    } else if (dexInst.isConstString(JumboStringMode.ALLOW)) {
+      return new ConstStringDexInstructionSubject(instruction);
     } else {
       return dexInst;
     }
@@ -267,6 +270,8 @@
       return new FieldAccessCfInstructionSubject(this, instruction);
     } else if (cfInst.isNewInstance()) {
       return new NewInstanceCfInstructionSubject(instruction);
+    } else if (cfInst.isConstString(JumboStringMode.ALLOW)) {
+      return new ConstStringCfInstructionSubject(instruction);
     } else {
       return cfInst;
     }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringCfInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringCfInstructionSubject.java
new file mode 100644
index 0000000..da545e4
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringCfInstructionSubject.java
@@ -0,0 +1,22 @@
+// Copyright (c) 2018, 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.codeinspector;
+
+import com.android.tools.r8.cf.code.CfConstString;
+import com.android.tools.r8.cf.code.CfInstruction;
+import com.android.tools.r8.graph.DexString;
+
+public class ConstStringCfInstructionSubject extends CfInstructionSubject
+    implements ConstStringInstructionSubject {
+  public ConstStringCfInstructionSubject(CfInstruction instruction) {
+    super(instruction);
+    assert isConstString(JumboStringMode.ALLOW);
+  }
+
+  @Override
+  public DexString getString() {
+    return ((CfConstString) instruction).getString();
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java
new file mode 100644
index 0000000..cb69144
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java
@@ -0,0 +1,28 @@
+// Copyright (c) 2018, 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.codeinspector;
+
+import com.android.tools.r8.code.ConstString;
+import com.android.tools.r8.code.ConstStringJumbo;
+import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.graph.DexString;
+
+public class ConstStringDexInstructionSubject extends DexInstructionSubject
+    implements ConstStringInstructionSubject {
+  public ConstStringDexInstructionSubject(Instruction instruction) {
+    super(instruction);
+    assert isConstString(JumboStringMode.ALLOW);
+  }
+
+  @Override
+  public DexString getString() {
+    if (instruction instanceof ConstString) {
+      return ((ConstString) instruction).getString();
+    } else {
+      assert (instruction instanceof ConstStringJumbo);
+      return ((ConstStringJumbo) instruction).getString();
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringInstructionSubject.java
new file mode 100644
index 0000000..5914be7
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringInstructionSubject.java
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, 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.codeinspector;
+
+import com.android.tools.r8.graph.DexString;
+
+public interface ConstStringInstructionSubject extends InstructionSubject {
+  DexString getString();
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionIterator.java b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java
similarity index 74%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionIterator.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java
index 9ed4de1..8ae5609 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionIterator.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DexCode;
@@ -10,12 +10,12 @@
 
 class DexInstructionIterator implements InstructionIterator {
 
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
   private final DexCode code;
   private int index;
 
-  DexInstructionIterator(DexInspector dexInspector, MethodSubject method) {
-    this.dexInspector = dexInspector;
+  DexInstructionIterator(CodeInspector codeInspector, MethodSubject method) {
+    this.codeInspector = codeInspector;
     assert method.isPresent();
     Code code = method.getMethod().getCode();
     assert code != null && code.isDexCode();
@@ -33,6 +33,6 @@
     if (index == code.instructions.length) {
       throw new NoSuchElementException();
     }
-    return dexInspector.createInstructionSubject(code.instructions[index++]);
+    return codeInspector.createInstructionSubject(code.instructions[index++]);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
similarity index 89%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
index 82d725a..9c6d21c 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
@@ -2,10 +2,11 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.code.Const4;
 import com.android.tools.r8.code.ConstString;
+import com.android.tools.r8.code.ConstStringJumbo;
 import com.android.tools.r8.code.Goto;
 import com.android.tools.r8.code.IfEqz;
 import com.android.tools.r8.code.IfNez;
@@ -86,14 +87,18 @@
   }
 
   @Override
-  public boolean isConstString() {
-    return instruction instanceof ConstString;
+  public boolean isConstString(JumboStringMode jumboStringMode) {
+    return instruction instanceof ConstString
+        || (jumboStringMode == JumboStringMode.ALLOW && instruction instanceof ConstStringJumbo);
   }
 
   @Override
-  public boolean isConstString(String value) {
-    return instruction instanceof ConstString
-        && ((ConstString) instruction).BBBB.toSourceString().equals(value);
+  public boolean isConstString(String value, JumboStringMode jumboStringMode) {
+    return (instruction instanceof ConstString
+            && ((ConstString) instruction).BBBB.toSourceString().equals(value))
+        || (jumboStringMode == JumboStringMode.ALLOW
+            && instruction instanceof ConstStringJumbo
+            && ((ConstStringJumbo) instruction).BBBBBBBB.toSourceString().equals(value));
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessCfInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessCfInstructionSubject.java
similarity index 60%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessCfInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessCfInstructionSubject.java
index a2103e6..e9ccfd3 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessCfInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessCfInstructionSubject.java
@@ -2,22 +2,23 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.cf.code.CfFieldInstruction;
 import com.android.tools.r8.cf.code.CfInstruction;
 
 public class FieldAccessCfInstructionSubject extends CfInstructionSubject
     implements FieldAccessInstructionSubject {
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
 
-  public FieldAccessCfInstructionSubject(DexInspector dexInspector, CfInstruction instruction) {
+  public FieldAccessCfInstructionSubject(CodeInspector codeInspector, CfInstruction instruction) {
     super(instruction);
-    this.dexInspector = dexInspector;
+    this.codeInspector = codeInspector;
     assert isFieldAccess();
   }
 
+  @Override
   public TypeSubject holder() {
-    return new TypeSubject(dexInspector, ((CfFieldInstruction) instruction).getField().getHolder());
+    return new TypeSubject(codeInspector, ((CfFieldInstruction) instruction).getField().getHolder());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java
new file mode 100644
index 0000000..b9e7fd2
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java
@@ -0,0 +1,24 @@
+// Copyright (c) 2018, 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.codeinspector;
+
+import com.android.tools.r8.code.Instruction;
+
+public class FieldAccessDexInstructionSubject extends DexInstructionSubject
+    implements FieldAccessInstructionSubject {
+
+  private final CodeInspector codeInspector;
+
+  public FieldAccessDexInstructionSubject(CodeInspector codeInspector, Instruction instruction) {
+    super(instruction);
+    this.codeInspector = codeInspector;
+    assert isFieldAccess();
+  }
+
+  @Override
+  public TypeSubject holder() {
+    return new TypeSubject(codeInspector, instruction.getField().getHolder());
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessInstructionSubject.java
similarity index 86%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessInstructionSubject.java
index 54b27c7..355f3a4 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessInstructionSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 public interface FieldAccessInstructionSubject extends InstructionSubject {
   TypeSubject holder();
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldSubject.java
similarity index 92%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FieldSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FieldSubject.java
index 1e9471b..f9a669a 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexValue;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FilteredInstructionIterator.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FilteredInstructionIterator.java
similarity index 85%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FilteredInstructionIterator.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FilteredInstructionIterator.java
index 5f3c078..870953e 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FilteredInstructionIterator.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FilteredInstructionIterator.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import java.util.Iterator;
 import java.util.NoSuchElementException;
@@ -15,8 +15,8 @@
   private InstructionSubject pendingNext = null;
 
   FilteredInstructionIterator(
-      DexInspector dexInspector, MethodSubject method, Predicate<InstructionSubject> predicate) {
-    this.iterator = dexInspector.createInstructionIterator(method);
+      CodeInspector codeInspector, MethodSubject method, Predicate<InstructionSubject> predicate) {
+    this.iterator = codeInspector.createInstructionIterator(method);
     this.predicate = predicate;
     hasNext();
   }
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundAnnotationSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundAnnotationSubject.java
similarity index 93%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FoundAnnotationSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FoundAnnotationSubject.java
index ed85b24..546ef59 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundAnnotationSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundAnnotationSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexEncodedAnnotation;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
similarity index 79%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FoundClassSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
index 2202f89..9a0661f 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexClass;
@@ -25,12 +25,12 @@
 
 public class FoundClassSubject extends ClassSubject {
 
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
   private final DexClass dexClass;
   final ClassNamingForNameMapper naming;
 
-  FoundClassSubject(DexInspector dexInspector, DexClass dexClass, ClassNamingForNameMapper naming) {
-    this.dexInspector = dexInspector;
+  FoundClassSubject(CodeInspector codeInspector, DexClass dexClass, ClassNamingForNameMapper naming) {
+    this.codeInspector = codeInspector;
     this.dexClass = dexClass;
     this.naming = naming;
   }
@@ -42,14 +42,14 @@
 
   @Override
   public void forAllMethods(Consumer<FoundMethodSubject> inspection) {
-    DexInspector.forAll(
+    CodeInspector.forAll(
         dexClass.directMethods(),
-        (encoded, clazz) -> new FoundMethodSubject(dexInspector, encoded, clazz),
+        (encoded, clazz) -> new FoundMethodSubject(codeInspector, encoded, clazz),
         this,
         inspection);
-    DexInspector.forAll(
+    CodeInspector.forAll(
         dexClass.virtualMethods(),
-        (encoded, clazz) -> new FoundMethodSubject(dexInspector, encoded, clazz),
+        (encoded, clazz) -> new FoundMethodSubject(codeInspector, encoded, clazz),
         this,
         inspection);
   }
@@ -59,11 +59,11 @@
     DexType[] parameterTypes = new DexType[parameters.size()];
     for (int i = 0; i < parameters.size(); i++) {
       parameterTypes[i] =
-          dexInspector.toDexType(dexInspector.getObfuscatedTypeName(parameters.get(i)));
+          codeInspector.toDexType(codeInspector.getObfuscatedTypeName(parameters.get(i)));
     }
     DexProto proto =
-        dexInspector.dexItemFactory.createProto(
-            dexInspector.toDexType(dexInspector.getObfuscatedTypeName(returnType)), parameterTypes);
+        codeInspector.dexItemFactory.createProto(
+            codeInspector.toDexType(codeInspector.getObfuscatedTypeName(returnType)), parameterTypes);
     if (naming != null) {
       String[] parameterStrings = new String[parameterTypes.length];
       Signature signature =
@@ -74,15 +74,15 @@
       }
     }
     DexMethod dexMethod =
-        dexInspector.dexItemFactory.createMethod(
-            dexClass.type, proto, dexInspector.dexItemFactory.createString(name));
+        codeInspector.dexItemFactory.createMethod(
+            dexClass.type, proto, codeInspector.dexItemFactory.createString(name));
     DexEncodedMethod encoded = findMethod(dexClass.directMethods(), dexMethod);
     if (encoded == null) {
       encoded = findMethod(dexClass.virtualMethods(), dexMethod);
     }
     return encoded == null
         ? new AbsentMethodSubject()
-        : new FoundMethodSubject(dexInspector, encoded, this);
+        : new FoundMethodSubject(codeInspector, encoded, this);
   }
 
   private DexEncodedMethod findMethod(DexEncodedMethod[] methods, DexMethod dexMethod) {
@@ -96,21 +96,21 @@
 
   @Override
   public void forAllFields(Consumer<FoundFieldSubject> inspection) {
-    DexInspector.forAll(
+    CodeInspector.forAll(
         dexClass.staticFields(),
-        (dexField, clazz) -> new FoundFieldSubject(dexInspector, dexField, clazz),
+        (dexField, clazz) -> new FoundFieldSubject(codeInspector, dexField, clazz),
         this,
         inspection);
-    DexInspector.forAll(
+    CodeInspector.forAll(
         dexClass.instanceFields(),
-        (dexField, clazz) -> new FoundFieldSubject(dexInspector, dexField, clazz),
+        (dexField, clazz) -> new FoundFieldSubject(codeInspector, dexField, clazz),
         this,
         inspection);
   }
 
   @Override
   public FieldSubject field(String type, String name) {
-    String obfuscatedType = dexInspector.getObfuscatedTypeName(type);
+    String obfuscatedType = codeInspector.getObfuscatedTypeName(type);
     MemberNaming fieldNaming = null;
     if (naming != null) {
       fieldNaming = naming.lookupByOriginalSignature(new FieldSignature(name, type));
@@ -118,17 +118,17 @@
     String obfuscatedName = fieldNaming == null ? name : fieldNaming.getRenamedName();
 
     DexField field =
-        dexInspector.dexItemFactory.createField(
+        codeInspector.dexItemFactory.createField(
             dexClass.type,
-            dexInspector.toDexType(obfuscatedType),
-            dexInspector.dexItemFactory.createString(obfuscatedName));
+            codeInspector.toDexType(obfuscatedType),
+            codeInspector.dexItemFactory.createString(obfuscatedName));
     DexEncodedField encoded = findField(dexClass.staticFields(), field);
     if (encoded == null) {
       encoded = findField(dexClass.instanceFields(), field);
     }
     return encoded == null
         ? new AbsentFieldSubject()
-        : new FoundFieldSubject(dexInspector, encoded, this);
+        : new FoundFieldSubject(codeInspector, encoded, this);
   }
 
   @Override
@@ -161,7 +161,7 @@
     assert !name.endsWith("EnclosingClass")
         && !name.endsWith("EnclosingMethod")
         && !name.endsWith("InnerClass");
-    DexAnnotation annotation = dexInspector.findAnnotation(name, dexClass.annotations);
+    DexAnnotation annotation = codeInspector.findAnnotation(name, dexClass.annotations);
     return annotation == null
         ? new AbsentAnnotationSubject()
         : new FoundAnnotationSubject(annotation);
@@ -237,13 +237,13 @@
 
   @Override
   public String getOriginalSignatureAttribute() {
-    return dexInspector.getOriginalSignatureAttribute(
+    return codeInspector.getOriginalSignatureAttribute(
         dexClass.annotations, GenericSignatureParser::parseClassSignature);
   }
 
   @Override
   public String getFinalSignatureAttribute() {
-    return dexInspector.getFinalSignatureAttribute(dexClass.annotations);
+    return codeInspector.getFinalSignatureAttribute(dexClass.annotations);
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundFieldSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
similarity index 84%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FoundFieldSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
index 5dfa4f1..ae42b14 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundFieldSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexValue;
@@ -12,13 +12,13 @@
 
 public class FoundFieldSubject extends FieldSubject {
 
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
   private final FoundClassSubject clazz;
   private final DexEncodedField dexField;
 
   public FoundFieldSubject(
-      DexInspector dexInspector, DexEncodedField dexField, FoundClassSubject clazz) {
-    this.dexInspector = dexInspector;
+      CodeInspector codeInspector, DexEncodedField dexField, FoundClassSubject clazz) {
+    this.codeInspector = codeInspector;
     this.clazz = clazz;
     this.dexField = dexField;
   }
@@ -49,7 +49,7 @@
   }
 
   public TypeSubject type() {
-    return new TypeSubject(dexInspector, dexField.field.type);
+    return new TypeSubject(codeInspector, dexField.field.type);
   }
 
   @Override
@@ -67,7 +67,7 @@
     //
     // whereas the final signature is for X.a is "a a"
     String obfuscatedType = signature.type;
-    String originalType = dexInspector.originalToObfuscatedMapping.inverse().get(obfuscatedType);
+    String originalType = codeInspector.originalToObfuscatedMapping.inverse().get(obfuscatedType);
     String fieldType = originalType != null ? originalType : obfuscatedType;
 
     FieldSignature lookupSignature = new FieldSignature(signature.name, fieldType);
@@ -98,13 +98,13 @@
 
   @Override
   public String getOriginalSignatureAttribute() {
-    return dexInspector.getOriginalSignatureAttribute(
+    return codeInspector.getOriginalSignatureAttribute(
         dexField.annotations, GenericSignatureParser::parseFieldSignature);
   }
 
   @Override
   public String getFinalSignatureAttribute() {
-    return dexInspector.getFinalSignatureAttribute(dexField.annotations);
+    return codeInspector.getFinalSignatureAttribute(dexField.annotations);
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
similarity index 83%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/FoundMethodSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
index 6eb3858..3fe8186 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.naming.MemberNaming;
@@ -13,13 +13,13 @@
 
 public class FoundMethodSubject extends MethodSubject {
 
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
   private final FoundClassSubject clazz;
   private final DexEncodedMethod dexMethod;
 
   public FoundMethodSubject(
-      DexInspector dexInspector, DexEncodedMethod encoded, FoundClassSubject clazz) {
-    this.dexInspector = dexInspector;
+      CodeInspector codeInspector, DexEncodedMethod encoded, FoundClassSubject clazz) {
+    this.codeInspector = codeInspector;
     this.clazz = clazz;
     this.dexMethod = encoded;
   }
@@ -91,12 +91,12 @@
     String[] OriginalParameters = new String[signature.parameters.length];
     for (int i = 0; i < OriginalParameters.length; i++) {
       String obfuscated = signature.parameters[i];
-      String original = dexInspector.originalToObfuscatedMapping.inverse().get(obfuscated);
+      String original = codeInspector.originalToObfuscatedMapping.inverse().get(obfuscated);
       OriginalParameters[i] = original != null ? original : obfuscated;
     }
     String obfuscatedReturnType = signature.type;
     String originalReturnType =
-        dexInspector.originalToObfuscatedMapping.inverse().get(obfuscatedReturnType);
+        codeInspector.originalToObfuscatedMapping.inverse().get(obfuscatedReturnType);
     String returnType = originalReturnType != null ? originalReturnType : obfuscatedReturnType;
 
     MethodSignature lookupSignature =
@@ -113,24 +113,24 @@
 
   @Override
   public String getOriginalSignatureAttribute() {
-    return dexInspector.getOriginalSignatureAttribute(
+    return codeInspector.getOriginalSignatureAttribute(
         dexMethod.annotations, GenericSignatureParser::parseMethodSignature);
   }
 
   @Override
   public String getFinalSignatureAttribute() {
-    return dexInspector.getFinalSignatureAttribute(dexMethod.annotations);
+    return codeInspector.getFinalSignatureAttribute(dexMethod.annotations);
   }
 
   @Override
   public Iterator<InstructionSubject> iterateInstructions() {
-    return dexInspector.createInstructionIterator(this);
+    return codeInspector.createInstructionIterator(this);
   }
 
   @Override
   public <T extends InstructionSubject> Iterator<T> iterateInstructions(
       Predicate<InstructionSubject> filter) {
-    return new FilteredInstructionIterator<>(dexInspector, this, filter);
+    return new FilteredInstructionIterator<>(codeInspector, this, filter);
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/InstructionIterator.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionIterator.java
similarity index 86%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/InstructionIterator.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/InstructionIterator.java
index a777319..4685730 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/InstructionIterator.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionIterator.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import java.util.Iterator;
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/InstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
similarity index 70%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/InstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
index b6f1e52..6c1f4be 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/InstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
@@ -2,9 +2,15 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 public interface InstructionSubject {
+
+  enum JumboStringMode {
+    ALLOW,
+    DISALLOW
+  };
+
   boolean isFieldAccess();
 
   boolean isInvokeVirtual();
@@ -15,9 +21,9 @@
 
   boolean isNop();
 
-  boolean isConstString();
+  boolean isConstString(JumboStringMode jumboStringMode);
 
-  boolean isConstString(String value);
+  boolean isConstString(String value, JumboStringMode jumboStringMode);
 
   boolean isGoto();
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeCfInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeCfInstructionSubject.java
similarity index 72%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/InvokeCfInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/InvokeCfInstructionSubject.java
index 4d245b2..b307112 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeCfInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeCfInstructionSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfInvoke;
@@ -11,18 +11,20 @@
 
 public class InvokeCfInstructionSubject extends CfInstructionSubject
     implements InvokeInstructionSubject {
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
 
-  public InvokeCfInstructionSubject(DexInspector dexInspector, CfInstruction instruction) {
+  public InvokeCfInstructionSubject(CodeInspector codeInspector, CfInstruction instruction) {
     super(instruction);
     assert isInvoke();
-    this.dexInspector = dexInspector;
+    this.codeInspector = codeInspector;
   }
 
+  @Override
   public TypeSubject holder() {
-    return new TypeSubject(dexInspector, invokedMethod().getHolder());
+    return new TypeSubject(codeInspector, invokedMethod().getHolder());
   }
 
+  @Override
   public DexMethod invokedMethod() {
     if (isInvokeDynamic()) {
       throw new Unimplemented(
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java
similarity index 64%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/InvokeDexInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java
index 51d0767..7b5d41c 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeDexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.graph.DexMethod;
@@ -10,18 +10,20 @@
 public class InvokeDexInstructionSubject extends DexInstructionSubject
     implements InvokeInstructionSubject {
 
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
 
-  public InvokeDexInstructionSubject(DexInspector dexInspector, Instruction instruction) {
+  public InvokeDexInstructionSubject(CodeInspector codeInspector, Instruction instruction) {
     super(instruction);
-    this.dexInspector = dexInspector;
+    this.codeInspector = codeInspector;
     assert isInvoke();
   }
 
+  @Override
   public TypeSubject holder() {
-    return new TypeSubject(dexInspector, invokedMethod().getHolder());
+    return new TypeSubject(codeInspector, invokedMethod().getHolder());
   }
 
+  @Override
   public DexMethod invokedMethod() {
     return instruction.getMethod();
   }
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeInstructionSubject.java
similarity index 88%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/InvokeInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/InvokeInstructionSubject.java
index 9b59340..b2f99dc 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeInstructionSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexMethod;
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/Matchers.java b/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
similarity index 98%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/Matchers.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
index ab3ef13..3b718a4 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/Matchers.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.google.common.collect.ImmutableList;
 import org.hamcrest.Description;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/MemberSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/MemberSubject.java
similarity index 94%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/MemberSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/MemberSubject.java
index 1852659..9e90fde 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/MemberSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/MemberSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.naming.MemberNaming.Signature;
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/MethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
similarity index 94%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/MethodSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
index 3427924..6eaaf5f 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/MethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexEncodedMethod;
 import java.util.Iterator;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceCfInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceCfInstructionSubject.java
similarity index 92%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceCfInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceCfInstructionSubject.java
index 598ecf2..d3b0a93 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceCfInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceCfInstructionSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfNew;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java
similarity index 92%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceDexInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java
index 5a1b01c..a396468 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceDexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.code.NewInstance;
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceInstructionSubject.java
similarity index 87%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceInstructionSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceInstructionSubject.java
index 7450fbe..2a0f192 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/NewInstanceInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceInstructionSubject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexType;
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/Subject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/Subject.java
similarity index 86%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/Subject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/Subject.java
index f83eb14..d93e19a 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/Subject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/Subject.java
@@ -2,7 +2,7 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 public abstract class Subject {
 
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/TypeSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java
similarity index 70%
rename from src/test/java/com/android/tools/r8/utils/dexinspector/TypeSubject.java
rename to src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java
index 5b21c41..ba2230a 100644
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/TypeSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java
@@ -2,17 +2,17 @@
 // 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.dexinspector;
+package com.android.tools.r8.utils.codeinspector;
 
 import com.android.tools.r8.graph.DexType;
 
 public class TypeSubject extends Subject {
 
-  private final DexInspector dexInspector;
+  private final CodeInspector codeInspector;
   private final DexType dexType;
 
-  TypeSubject(DexInspector dexInspector, DexType dexType) {
-    this.dexInspector = dexInspector;
+  TypeSubject(CodeInspector codeInspector, DexType dexType) {
+    this.codeInspector = codeInspector;
     this.dexType = dexType;
   }
 
@@ -27,7 +27,7 @@
   }
 
   public boolean is(String type) {
-    return dexType.equals(dexInspector.toDexType(type));
+    return dexType.equals(codeInspector.toDexType(type));
   }
 
   public String toString() {
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessDexInstructionSubject.java
deleted file mode 100644
index ed54f90..0000000
--- a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessDexInstructionSubject.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2018, 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.dexinspector;
-
-import com.android.tools.r8.code.Instruction;
-
-public class FieldAccessDexInstructionSubject extends DexInstructionSubject
-    implements FieldAccessInstructionSubject {
-
-  private final DexInspector dexInspector;
-
-  public FieldAccessDexInstructionSubject(DexInspector dexInspector, Instruction instruction) {
-    super(instruction);
-    this.dexInspector = dexInspector;
-    assert isFieldAccess();
-  }
-
-  public TypeSubject holder() {
-    return new TypeSubject(dexInspector, instruction.getField().getHolder());
-  }
-}