Relocator should keep all attributes

Bug: 155303677
Change-Id: I676b1ebe4bb5aac0fd1580083da11ce9d7010e29
diff --git a/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java b/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java
index 4a19677..6b561d8 100644
--- a/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java
+++ b/src/main/java/com/android/tools/r8/relocator/RelocatorCommand.java
@@ -26,6 +26,7 @@
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringDiagnostic;
 import com.android.tools.r8.utils.ThreadUtils;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
@@ -140,7 +141,10 @@
     // We are using the proguard configuration for adapting resources.
     InternalOptions options =
         new InternalOptions(
-            ProguardConfiguration.builder(factory, getReporter()).build(), getReporter());
+            ProguardConfiguration.builder(factory, getReporter())
+                .addKeepAttributePatterns(ImmutableList.of("*"))
+                .build(),
+            getReporter());
     assert options.threadCount == ThreadUtils.NOT_SPECIFIED;
     options.relocatorCompilation = true;
     options.threadCount = getThreadCount();
diff --git a/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java b/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java
index 5e66581..7d9dadb 100644
--- a/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java
+++ b/src/test/java/com/android/tools/r8/relocator/RelocatorTest.java
@@ -27,6 +27,9 @@
 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.android.tools.r8.utils.codeinspector.LocalVariableTable;
+import com.android.tools.r8.utils.codeinspector.LocalVariableTable.LocalVariableTableEntry;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -65,8 +68,7 @@
   }
 
   @Test
-  public void testRelocatorEmptyToSomething()
-      throws IOException, CompilationFailedException, ExecutionException {
+  public void testRelocatorEmptyToSomething() throws IOException, CompilationFailedException {
     String originalPrefix = "";
     String newPrefix = "foo.bar.baz";
     Path output = temp.newFile("output.jar").toPath();
@@ -82,8 +84,7 @@
   }
 
   @Test
-  public void testRelocatorSomethingToEmpty()
-      throws IOException, CompilationFailedException, ExecutionException {
+  public void testRelocatorSomethingToEmpty() throws IOException {
     String originalPrefix = "com.android.tools.r8";
     String newPrefix = "";
     Path output = temp.newFile("output.jar").toPath();
@@ -99,6 +100,50 @@
   }
 
   @Test
+  public void testRelocateKeepsDebugInfo()
+      throws IOException, CompilationFailedException, ExecutionException {
+    String originalPrefix = "com.android.tools.r8";
+    String newPrefix = "com.android.tools.r8";
+    Path output = temp.newFile("output.jar").toPath();
+    Map<String, String> mapping = new HashMap<>();
+    mapping.put(originalPrefix, newPrefix);
+    runRelocator(ToolHelper.R8_JAR, mapping, output);
+    // Assert that all classes are the same, have the same methods and debug info:
+    CodeInspector originalInspector = new CodeInspector(ToolHelper.R8_JAR);
+    CodeInspector relocatedInspector = new CodeInspector(output);
+    for (FoundClassSubject clazz : originalInspector.allClasses()) {
+      ClassSubject relocatedClass = relocatedInspector.clazz(clazz.getFinalName());
+      assertThat(relocatedClass, isPresent());
+      assertEquals(clazz.getDexClass().sourceFile, relocatedClass.getDexClass().sourceFile);
+      for (FoundMethodSubject originalMethod : clazz.allMethods()) {
+        MethodSubject relocatedMethod = relocatedClass.method(originalMethod.asMethodReference());
+        assertThat(relocatedMethod, isPresent());
+        assertEquals(originalMethod.hasLineNumberTable(), relocatedMethod.hasLineNumberTable());
+        if (originalMethod.hasLineNumberTable()) {
+          // TODO(b/155303677): Figure out why we cannot assert the same lines.
+          // assertEquals(
+          //     originalMethod.getLineNumberTable().getLines().size(),
+          //     relocatedMethod.getLineNumberTable().getLines().size());
+        }
+        assertEquals(
+            originalMethod.hasLocalVariableTable(), relocatedMethod.hasLocalVariableTable());
+        if (originalMethod.hasLocalVariableTable()) {
+          LocalVariableTable originalVariableTable = originalMethod.getLocalVariableTable();
+          LocalVariableTable relocatedVariableTable = relocatedMethod.getLocalVariableTable();
+          assertEquals(originalVariableTable.size(), relocatedVariableTable.size());
+          for (int i = 0; i < originalVariableTable.getEntries().size(); i++) {
+            LocalVariableTableEntry originalEntry = originalVariableTable.get(i);
+            LocalVariableTableEntry relocatedEntry = relocatedVariableTable.get(i);
+            assertEquals(originalEntry.name, relocatedEntry.name);
+            assertEquals(originalEntry.signature, relocatedEntry.signature);
+            assertEquals(originalEntry.type.toString(), relocatedEntry.type.toString());
+          }
+        }
+      }
+    }
+  }
+
+  @Test
   public void testRelocateAll() throws IOException, CompilationFailedException, ExecutionException {
     String originalPrefix = "com.android.tools.r8";
     String newPrefix = "foo.bar.baz";
@@ -181,7 +226,7 @@
 
   @Test
   public void testPartialPrefix()
-      throws IOException, CompilationFailedException, ExecutionException {
+      throws CompilationFailedException, IOException, ExecutionException {
     String originalPrefix = "com.android.tools.r";
     String newPrefix = "i_cannot_w";
     Map<String, String> mapping = new LinkedHashMap<>();
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
index fe574e4..782bbf0 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
@@ -229,6 +229,9 @@
   @Override
   public boolean hasLocalVariableTable() {
     Code code = getMethod().getCode();
+    if (code == null) {
+      return false;
+    }
     if (code.isDexCode()) {
       DexCode dexCode = code.asDexCode();
       if (dexCode.getDebugInfo() != null) {
@@ -254,6 +257,9 @@
   @Override
   public LineNumberTable getLineNumberTable() {
     Code code = getMethod().getCode();
+    if (code == null) {
+      return null;
+    }
     if (code.isDexCode()) {
       return getDexLineNumberTable(code.asDexCode());
     }