Debug mode implies keeping line numbers and locals.

Updated existing tests to run in release and assert that release never keeps
locals.

Bug: 112515155
Change-Id: Ie5cc9730abcc6000199dd8bd6231e203173c440d
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 96e1e99..7b24770 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -650,6 +650,9 @@
 
     assert internal.enableVerticalClassMerging || !proguardConfiguration.isOptimizing();
     if (internal.debug) {
+      internal.proguardConfiguration.getKeepAttributes().lineNumberTable = true;
+      internal.proguardConfiguration.getKeepAttributes().localVariableTable = true;
+      internal.proguardConfiguration.getKeepAttributes().localVariableTypeTable = true;
       // TODO(zerny): Should we support inlining in debug mode? b/62937285
       internal.enableInlining = false;
       internal.enableClassInlining = false;
diff --git a/src/test/java/com/android/tools/r8/shaking/KeepAttributesTest.java b/src/test/java/com/android/tools/r8/shaking/KeepAttributesTest.java
index 275d2e9..b518683 100644
--- a/src/test/java/com/android/tools/r8/shaking/KeepAttributesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/KeepAttributesTest.java
@@ -9,7 +9,6 @@
 
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.R8;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
@@ -18,10 +17,11 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.shaking.forceproguardcompatibility.keepattributes.TestKeepAttributes;
+import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.AndroidAppConsumers;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
-import java.nio.file.Path;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
@@ -32,12 +32,24 @@
   public static final Class CLASS = TestKeepAttributes.class;
 
   @Test
+  public void keepAllAttributesInDebugMode()
+      throws ExecutionException, CompilationFailedException, IOException {
+    List<String> keepRules = ImmutableList.of(
+        "-keep class ** { *; }"
+    );
+    CodeInspector inspector = compile(keepRules, CompilationMode.DEBUG);
+    DebugInfoInspector debugInfo = debugInfoForMain(inspector);
+    checkLineNumbers(true, debugInfo);
+    checkLocals(true, debugInfo);
+  }
+
+  @Test
   public void discardAllAttributes()
       throws CompilationFailedException, IOException, ExecutionException {
     List<String> keepRules = ImmutableList.of(
         "-keep class ** { *; }"
     );
-    CodeInspector inspector = compile(keepRules);
+    CodeInspector inspector = compile(keepRules, CompilationMode.RELEASE);
     DebugInfoInspector debugInfo = debugInfoForMain(inspector);
     checkLineNumbers(false, debugInfo);
     checkLocals(false, debugInfo);
@@ -50,7 +62,7 @@
         "-keep class ** { *; }",
         "-keepattributes " + ProguardKeepAttributes.LINE_NUMBER_TABLE
     );
-    CodeInspector inspector = compile(keepRules);
+    CodeInspector inspector = compile(keepRules, CompilationMode.RELEASE);
     DebugInfoInspector debugInfo = debugInfoForMain(inspector);
     checkLineNumbers(true, debugInfo);
     checkLocals(false, debugInfo);
@@ -66,10 +78,11 @@
             + ", "
             + ProguardKeepAttributes.LOCAL_VARIABLE_TABLE
     );
-    CodeInspector inspector = compile(keepRules);
+    CodeInspector inspector = compile(keepRules, CompilationMode.RELEASE);
     DebugInfoInspector debugInfo = debugInfoForMain(inspector);
     checkLineNumbers(true, debugInfo);
-    checkLocals(true, debugInfo);
+    // Locals are never included in release builds.
+    checkLocals(false, debugInfo);
   }
 
   @Test
@@ -80,7 +93,7 @@
     );
     // Compiling with a keep rule for locals but no line results in an error in R8.
     try {
-      compile(keepRules);
+      compile(keepRules, CompilationMode.RELEASE);
     } catch (CompilationFailedException e) {
       assertTrue(e.getCause().getMessage().contains(ProguardKeepAttributes.LOCAL_VARIABLE_TABLE));
       assertTrue(e.getCause().getMessage().contains(ProguardKeepAttributes.LINE_NUMBER_TABLE));
@@ -89,24 +102,29 @@
     fail("Expected error");
   }
 
-  private CodeInspector compile(List<String> keepRules)
+  private CodeInspector compile(List<String> keepRules, CompilationMode mode)
       throws CompilationFailedException, IOException, ExecutionException {
-    Path dexOut = temp.getRoot().toPath().resolve("dex.zip");
-    R8.run(R8Command.builder()
-        .setMode(CompilationMode.DEBUG)
-        .addProgramFiles(ToolHelper.getClassFileForTestClass(CLASS))
-        .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
-        .addProguardConfiguration(keepRules, Origin.unknown())
-        .setProgramConsumer(new DexIndexedConsumer.ArchiveConsumer(dexOut))
-        .build());
-    ToolHelper.runArtRaw(dexOut.toString(), CLASS.getCanonicalName());
-    return new CodeInspector(dexOut);
+    AndroidAppConsumers sink = new AndroidAppConsumers();
+    R8.run(
+        R8Command.builder()
+            .setMode(mode)
+            .addProgramFiles(
+                ToolHelper.getClassFilesForTestDirectory(
+                    ToolHelper.getClassFileForTestClass(CLASS).getParent()))
+            .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
+            .addProguardConfiguration(keepRules, Origin.unknown())
+            .setProgramConsumer(sink.wrapProgramConsumer(emptyConsumer(Backend.DEX)))
+            .build());
+    AndroidApp app = sink.build();
+    CodeInspector codeInspector = new CodeInspector(app);
+    runOnArt(app, CLASS.getTypeName());
+    return codeInspector;
   }
 
   private DebugInfoInspector debugInfoForMain(CodeInspector inspector) {
     return new DebugInfoInspector(
         inspector,
-        CLASS.getCanonicalName(),
+        CLASS.getTypeName(),
         new MethodSignature("main", "void", Collections.singleton("java.lang.String[]")));
   }