Merge "Don't mark identifier name strings if not minifying"
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemBasedString.java b/src/main/java/com/android/tools/r8/graph/DexItemBasedString.java
index 7777147..14fc568 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemBasedString.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemBasedString.java
@@ -42,7 +42,8 @@
   @Override
   public void collectIndexedItems(IndexedItemCollection indexedItems) {
     // This instance should not exist when collecting indexed items.
-    // {@link IdentifierMinifier} will replace this with an appropriate {@link DexString}.
+    // {@link com.android.tools.r8.naming.IdentifierMinifier} will replace this with an appropriate
+    // {@link DexString}.
     throw new Unreachable("Remaining DexItemBasedString: " + this.toString());
   }
 }
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 b466315..8547206 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
@@ -113,7 +113,7 @@
       this.lensCodeRewriter = new LensCodeRewriter(graphLense, appInfo.withSubtyping());
       if (appInfo.hasLiveness()) {
         this.protoLiteRewriter = new ProtoLitePruner(appInfo.withLiveness());
-        if (!appInfo.withLiveness().identifierNameStrings.isEmpty()) {
+        if (!appInfo.withLiveness().identifierNameStrings.isEmpty() && !options.skipMinification) {
           this.identifierNameStringMarker = new IdentifierNameStringMarker(appInfo.withLiveness());
         } else {
           this.identifierNameStringMarker = null;
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 168b794..f6e1ef0 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
@@ -5,36 +5,33 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.CompilationException;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.code.ConstString;
 import com.android.tools.r8.code.InvokeStatic;
 import com.android.tools.r8.code.ReturnVoid;
 import com.android.tools.r8.graph.DexCode;
-import com.android.tools.r8.graph.DexEncodedMethod;
 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;
+import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
-import java.io.IOException;
 import java.nio.file.Path;
 import java.util.List;
-import java.util.concurrent.ExecutionException;
-import org.antlr.runtime.RecognitionException;
 import org.junit.Test;
 
 public class ForNameTest extends SmaliTestBase {
 
+  private final String CLASS_NAME = "Example";
   private final static String BOO = "Boo";
 
   @Test
   public void forName_renamed() throws Exception {
-    SmaliBuilder builder = new SmaliBuilder("Example");
-    MethodSignature main = builder.addMainMethod(
+    SmaliBuilder builder = new SmaliBuilder(CLASS_NAME);
+    builder.addMainMethod(
         1,
         "const-string v0, \"" + BOO + "\"",
         "invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;",
@@ -44,16 +41,19 @@
     builder.addClass(BOO);
 
     List<String> pgConfigs = ImmutableList.of(
-        "-keep class Example { *; }",
+        "-keep class " + CLASS_NAME + " { *; }",
         "-keep,allowobfuscation class " + BOO,
         "-dontshrink",
         "-dontoptimize");
-    Path processedApp = runCompatProguard(builder, pgConfigs);
 
-    DexEncodedMethod method = getMethod(processedApp, main);
-    assertNotNull(method);
+    DexInspector inspector = runCompatProguard(builder, pgConfigs);
 
-    DexCode code = method.getCode().asDexCode();
+    ClassSubject clazz = inspector.clazz(CLASS_NAME);
+    assertTrue(clazz.isPresent());
+    MethodSubject method = clazz.method(DexInspector.MAIN);
+    assertTrue(method.isPresent());
+
+    DexCode code = method.getMethod().getCode().asDexCode();
     // TODO(b/36799092): DeadCodeRemover should be able to remove this instruction.
     assertTrue(code.instructions[0] instanceof ConstString);
     ConstString constString = (ConstString) code.instructions[0];
@@ -65,20 +65,49 @@
     assertTrue(code.instructions[3] instanceof ReturnVoid);
   }
 
-  private Path runCompatProguard(SmaliBuilder builder, List<String> proguardConfigurations) {
-    try {
-      Path dexOutputDir = temp.newFolder().toPath();
-      R8Command command =
-          new CompatProguardCommandBuilder(true, true)
-              .addDexProgramData(builder.compile())
-              .setOutputPath(dexOutputDir)
-              .addProguardConfiguration(proguardConfigurations)
-              .build();
-      ToolHelper.runR8(command);
-      return dexOutputDir.resolve("classes.dex");
-    } catch (CompilationException | IOException | RecognitionException | ExecutionException e) {
-      throw new RuntimeException(e);
-    }
+  @Test
+  public void forName_noMinification() throws Exception {
+    SmaliBuilder builder = new SmaliBuilder(CLASS_NAME);
+    builder.addMainMethod(
+        1,
+        "const-string v0, \"" + BOO + "\"",
+        "invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;",
+        "move-result-object v0",
+        "return-void");
+
+    builder.addClass(BOO);
+
+    List<String> pgConfigs = ImmutableList.of(
+        "-keep class " + CLASS_NAME +" { *; }",
+        "-keep class " + BOO,
+        "-dontshrink",
+        "-dontoptimize",
+        "-dontobfuscate");
+
+    DexInspector inspector = runCompatProguard(builder, pgConfigs);
+
+    ClassSubject clazz = inspector.clazz(CLASS_NAME);
+    assertTrue(clazz.isPresent());
+    MethodSubject method = clazz.method(DexInspector.MAIN);
+    assertTrue(method.isPresent());
+
+    DexCode code = method.getMethod().getCode().asDexCode();
+    assertTrue(code.instructions[0] instanceof ConstString);
+    ConstString constString = (ConstString) code.instructions[0];
+    assertEquals(BOO, constString.getString().toString());
+    assertTrue(code.instructions[1] instanceof InvokeStatic);
+    assertTrue(code.instructions[2] instanceof ReturnVoid);
   }
 
+  private DexInspector runCompatProguard(SmaliBuilder builder, List<String> proguardConfigurations)
+      throws Exception{
+    Path dexOutputDir = temp.newFolder().toPath();
+    R8Command command =
+        new CompatProguardCommandBuilder(true, true)
+            .addDexProgramData(builder.compile())
+            .setOutputPath(dexOutputDir)
+            .addProguardConfiguration(proguardConfigurations)
+            .build();
+    return new DexInspector(ToolHelper.runR8(command));
+  }
 }