Reland "Change non-kept SourceFile from empty string to SourceFile"
This reverts commit 4f9974341180882dcaa28019f407be6c4d2ef0c9.
Bug: 129362602
Bug: 147571342
Change-Id: I351bb3f5217b758c5f356565f33c5df6d7421c64
diff --git a/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java b/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
index 8f4330c..cb2b287 100644
--- a/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
+++ b/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
@@ -29,16 +29,25 @@
public void run() {
ProguardConfiguration proguardConfiguration = appView.options().getProguardConfiguration();
String renameSourceFile = proguardConfiguration.getRenameSourceFileAttribute();
+ boolean hasRenameSourceFileAttribute = renameSourceFile != null;
// Return early if a user wants to keep the current source file attribute as-is.
- if (renameSourceFile == null && proguardConfiguration.getKeepAttributes().sourceFile) {
+ if (!hasRenameSourceFileAttribute
+ && proguardConfiguration.getKeepAttributes().sourceFile
+ && appView.options().forceProguardCompatibility) {
return;
}
- // Now, the user wants either to remove source file attribute or to rename it.
- DexString dexRenameSourceFile =
- renameSourceFile == null
- ? appView.dexItemFactory().createString("")
- : appView.dexItemFactory().createString(renameSourceFile);
+ // Now, the user wants either to remove source file attribute or to rename it for non-kept
+ // classes.
+ DexString dexRenameSourceFile = getSourceFileRenaming(proguardConfiguration);
for (DexClass clazz : appView.appInfo().classes()) {
+ // We only parse sourceFile if -keepattributes SourceFile, but for compat we should add
+ // a source file name, otherwise line positions will not be printed on the JVM or old version
+ // of ART.
+ if (!hasRenameSourceFileAttribute
+ && proguardConfiguration.getKeepAttributes().sourceFile
+ && appView.rootSet().mayNotBeMinified(clazz.type, appView)) {
+ continue;
+ }
clazz.sourceFile = dexRenameSourceFile;
clazz.forEachMethod(encodedMethod -> {
// Abstract methods do not have code_item.
@@ -66,4 +75,24 @@
});
}
}
+
+ private DexString getSourceFileRenaming(ProguardConfiguration proguardConfiguration) {
+ // If we should not be keeping the source file, null it out.
+ if (!appView.options().forceProguardCompatibility
+ && !proguardConfiguration.getKeepAttributes().sourceFile) {
+ return null;
+ }
+
+ String renamedSourceFileAttribute = proguardConfiguration.getRenameSourceFileAttribute();
+ if (renamedSourceFileAttribute != null) {
+ return appView.dexItemFactory().createString(renamedSourceFileAttribute);
+ }
+
+ // Otherwise, take the smallest size depending on platform. We cannot use NULL since the jvm
+ // and art will write at foo.bar.baz(Unknown Source) without a line-number. Newer version of ART
+ // will report the DEX PC.
+ return appView
+ .dexItemFactory()
+ .createString(appView.options().isGeneratingClassFiles() ? "SourceFile" : "");
+ }
}
diff --git a/src/test/java/com/android/tools/r8/R8TestRunResult.java b/src/test/java/com/android/tools/r8/R8TestRunResult.java
index 2ec28b8..9fe91d1 100644
--- a/src/test/java/com/android/tools/r8/R8TestRunResult.java
+++ b/src/test/java/com/android/tools/r8/R8TestRunResult.java
@@ -59,6 +59,16 @@
return new CodeInspector(app, proguardMap);
}
+ @Override
+ public <E extends Throwable> R8TestRunResult inspectFailure(
+ ThrowingConsumer<CodeInspector, E> consumer) throws IOException, ExecutionException, E {
+ assertFailure();
+ assertNotNull(app);
+ CodeInspector codeInspector = new CodeInspector(app, proguardMap);
+ consumer.accept(codeInspector);
+ return self();
+ }
+
public <E extends Throwable> R8TestRunResult inspectOriginalStackTrace(
ThrowingConsumer<StackTrace, E> consumer) throws E {
consumer.accept(getOriginalStackTrace());
diff --git a/src/test/java/com/android/tools/r8/TestRunResult.java b/src/test/java/com/android/tools/r8/TestRunResult.java
index 46bf0a1..bf3bb9d 100644
--- a/src/test/java/com/android/tools/r8/TestRunResult.java
+++ b/src/test/java/com/android/tools/r8/TestRunResult.java
@@ -142,6 +142,15 @@
return self();
}
+ public <E extends Throwable> RR inspectFailure(ThrowingConsumer<CodeInspector, E> consumer)
+ throws IOException, ExecutionException, E {
+ assertFailure();
+ assertNotNull(app);
+ CodeInspector inspector = new CodeInspector(app);
+ consumer.accept(inspector);
+ return self();
+ }
+
public <E extends Throwable> RR inspectStackTrace(ThrowingConsumer<StackTrace, E> consumer)
throws E {
consumer.accept(getStackTrace());
diff --git a/src/test/java/com/android/tools/r8/debuginfo/DexPcWithDebugInfoForOverloadedMethodsTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/DexPcWithDebugInfoForOverloadedMethodsTestRunner.java
index 9d9d386..11dff7b 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/DexPcWithDebugInfoForOverloadedMethodsTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/DexPcWithDebugInfoForOverloadedMethodsTestRunner.java
@@ -23,6 +23,7 @@
import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.retrace.RetraceMethodResult;
+import com.android.tools.r8.shaking.ProguardKeepAttributes;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -67,6 +68,7 @@
.addKeepMainRule(MAIN)
.addKeepMethodRules(MAIN, "void overloaded(...)")
.addKeepAttributeLineNumberTable()
+ .addKeepAttributes(ProguardKeepAttributes.SOURCE_FILE)
.setMinApi(parameters.getApiLevel())
.addOptionsModification(
internalOptions -> {
diff --git a/src/test/java/com/android/tools/r8/naming/RenameSourceFileRetraceTest.java b/src/test/java/com/android/tools/r8/naming/RenameSourceFileRetraceTest.java
new file mode 100644
index 0000000..4de8e4b
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/RenameSourceFileRetraceTest.java
@@ -0,0 +1,149 @@
+// Copyright (c) 2020, 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.naming;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.containsLinePositions;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static junit.framework.TestCase.assertEquals;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.R8TestBuilder;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.naming.retrace.StackTrace;
+import com.android.tools.r8.naming.testclasses.ClassToBeMinified;
+import com.android.tools.r8.naming.testclasses.Main;
+import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.shaking.ProguardKeepAttributes;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.Matchers.LinePosition;
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+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 RenameSourceFileRetraceTest extends TestBase {
+
+ private static final String FILENAME_RENAME = "FOO";
+ private static final String FILENAME_MAIN = "Main.java";
+ private static final String FILENAME_CLASS_TO_BE_MINIFIED = "ClassToBeMinified.java";
+
+ private final TestParameters parameters;
+ private final boolean isCompat;
+ private final boolean keepSourceFile;
+
+ @Parameters(name = "{0}, is compat: {1}, keep source file attribute: {2}")
+ public static List<Object[]> data() {
+ return buildParameters(
+ getTestParameters().withAllRuntimesAndApiLevels().build(),
+ BooleanUtils.values(),
+ BooleanUtils.values());
+ }
+
+ public RenameSourceFileRetraceTest(
+ TestParameters parameters, Boolean isCompat, Boolean keepSourceFile) {
+ this.parameters = parameters;
+ this.isCompat = isCompat;
+ this.keepSourceFile = keepSourceFile;
+ }
+
+ @Test
+ public void testR8()
+ throws ExecutionException, CompilationFailedException, IOException, NoSuchMethodException {
+ R8TestBuilder<? extends R8TestBuilder<?>> r8TestBuilder =
+ isCompat ? testForR8Compat(parameters.getBackend()) : testForR8(parameters.getBackend());
+ if (keepSourceFile) {
+ r8TestBuilder.addKeepAttributes(ProguardKeepAttributes.SOURCE_FILE);
+ }
+ String minifiedFileName =
+ (keepSourceFile && isCompat) ? FILENAME_CLASS_TO_BE_MINIFIED : getDefaultExpectedName();
+ String mainFileName = keepSourceFile ? FILENAME_MAIN : getDefaultExpectedName();
+ r8TestBuilder
+ .addProgramClasses(ClassToBeMinified.class, Main.class)
+ .addKeepAttributes(ProguardKeepAttributes.LINE_NUMBER_TABLE)
+ .addKeepMainRule(Main.class)
+ .setMinApi(parameters.getApiLevel())
+ .enableInliningAnnotations()
+ .run(parameters.getRuntime(), Main.class)
+ .assertFailureWithErrorThatMatches(containsString("ClassToBeMinified.foo()"))
+ .inspectFailure(inspector -> inspectOutput(inspector, minifiedFileName, mainFileName))
+ .inspectStackTrace(stackTrace -> inspectStackTrace(stackTrace, FILENAME_MAIN));
+ }
+
+ @Test
+ public void testRenameSourceFileR8()
+ throws ExecutionException, CompilationFailedException, IOException, NoSuchMethodException {
+ R8TestBuilder<? extends R8TestBuilder<?>> r8TestBuilder =
+ isCompat ? testForR8Compat(parameters.getBackend()) : testForR8(parameters.getBackend());
+ if (keepSourceFile) {
+ r8TestBuilder.addKeepAttributes(ProguardKeepAttributes.SOURCE_FILE);
+ }
+ String expectedName = getDefaultExpectedName(FILENAME_RENAME);
+ r8TestBuilder
+ .addProgramClasses(ClassToBeMinified.class, Main.class)
+ .addKeepAttributes(ProguardKeepAttributes.LINE_NUMBER_TABLE)
+ .addKeepRules("-renamesourcefileattribute " + FILENAME_RENAME)
+ .addKeepMainRule(Main.class)
+ .setMinApi(parameters.getApiLevel())
+ .enableInliningAnnotations()
+ .run(parameters.getRuntime(), Main.class)
+ .assertFailureWithErrorThatMatches(containsString("ClassToBeMinified.foo()"))
+ .inspectFailure(inspector -> inspectOutput(inspector, expectedName, expectedName))
+ .inspectStackTrace(stackTrace -> inspectStackTrace(stackTrace, expectedName));
+ }
+
+ private String getDefaultExpectedName() {
+ return getDefaultExpectedName(parameters.getBackend() == Backend.CF ? "SourceFile" : "");
+ }
+
+ private String getDefaultExpectedName(String name) {
+ if (!isCompat && !keepSourceFile) {
+ return null;
+ } else {
+ return name;
+ }
+ }
+
+ private void inspectOutput(
+ CodeInspector inspector, String classToBeMinifiedFilename, String mainClassFilename) {
+ inspectSourceFileForClass(inspector, Main.class, mainClassFilename);
+ inspectSourceFileForClass(inspector, ClassToBeMinified.class, classToBeMinifiedFilename);
+ }
+
+ private void inspectSourceFileForClass(CodeInspector inspector, Class<?> clazz, String expected) {
+ ClassSubject classToBeMinifiedSubject = inspector.clazz(clazz);
+ assertThat(classToBeMinifiedSubject, isPresent());
+ DexClass dexClass = classToBeMinifiedSubject.getDexClass();
+ String actualString = dexClass.sourceFile == null ? null : dexClass.sourceFile.toString();
+ assertEquals(expected, actualString);
+ }
+
+ private void inspectStackTrace(StackTrace stackTrace, String mainFileName)
+ throws NoSuchMethodException {
+ if (!keepSourceFile) {
+ return;
+ }
+ assertEquals(2, stackTrace.getStackTraceLines().size());
+ MethodReference classToBeMinifiedFoo =
+ Reference.methodFromMethod(ClassToBeMinified.class.getDeclaredMethod("foo"));
+ MethodReference mainMain =
+ Reference.methodFromMethod(Main.class.getDeclaredMethod("main", String[].class));
+ LinePosition expectedStack =
+ LinePosition.stack(
+ LinePosition.create(classToBeMinifiedFoo, 1, 13, FILENAME_CLASS_TO_BE_MINIFIED),
+ LinePosition.create(mainMain, 1, 10, mainFileName));
+ assertThat(stackTrace, containsLinePositions(expectedStack));
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/DesugarLambdaRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retrace/DesugarLambdaRetraceTest.java
index 9b2c7c4..a55e1d5 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/DesugarLambdaRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/DesugarLambdaRetraceTest.java
@@ -9,10 +9,12 @@
import static com.android.tools.r8.naming.retrace.StackTrace.isSameExceptForFileNameAndLineNumber;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.naming.retrace.StackTrace.StackTraceLine;
+import com.android.tools.r8.utils.BooleanUtils;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
import org.junit.Test;
@@ -23,14 +25,16 @@
@RunWith(Parameterized.class)
public class DesugarLambdaRetraceTest extends RetraceTestBase {
- @Parameters(name = "{0}, mode: {1}")
+ @Parameters(name = "{0}, mode: {1}, compat: {2}")
public static Collection<Object[]> data() {
return buildParameters(
- getTestParameters().withAllRuntimesAndApiLevels().build(), CompilationMode.values());
+ getTestParameters().withAllRuntimesAndApiLevels().build(),
+ CompilationMode.values(),
+ BooleanUtils.values());
}
- public DesugarLambdaRetraceTest(TestParameters parameters, CompilationMode mode) {
- super(parameters, mode);
+ public DesugarLambdaRetraceTest(TestParameters parameters, CompilationMode mode, boolean compat) {
+ super(parameters, mode, compat);
}
@Override
@@ -122,12 +126,14 @@
@Test
public void testLineNumberTableOnly() throws Exception {
+ assumeTrue(compat);
runTest(
ImmutableList.of("-keepattributes LineNumberTable"), this::checkIsSameExceptForFileName);
}
@Test
public void testNoLineNumberTable() throws Exception {
+ assumeTrue(compat);
runTest(ImmutableList.of(), this::checkIsSameExceptForFileNameAndLineNumber);
}
}
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/DesugarStaticInterfaceMethodsRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retrace/DesugarStaticInterfaceMethodsRetraceTest.java
index 1427865..f049056 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/DesugarStaticInterfaceMethodsRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/DesugarStaticInterfaceMethodsRetraceTest.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.BooleanUtils;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
import org.junit.Test;
@@ -20,14 +21,17 @@
@RunWith(Parameterized.class)
public class DesugarStaticInterfaceMethodsRetraceTest extends RetraceTestBase {
- @Parameters(name = "{0}, mode: {1}")
+ @Parameters(name = "{0}, mode: {1}, compat: {2}")
public static Collection<Object[]> data() {
return buildParameters(
- getTestParameters().withAllRuntimesAndApiLevels().build(), CompilationMode.values());
+ getTestParameters().withAllRuntimesAndApiLevels().build(),
+ CompilationMode.values(),
+ BooleanUtils.values());
}
- public DesugarStaticInterfaceMethodsRetraceTest(TestParameters parameters, CompilationMode mode) {
- super(parameters, mode);
+ public DesugarStaticInterfaceMethodsRetraceTest(
+ TestParameters parameters, CompilationMode mode, boolean compat) {
+ super(parameters, mode, compat);
}
@Override
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java
index 4ffc7de..48fc320 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java
@@ -9,10 +9,12 @@
import static com.android.tools.r8.naming.retrace.StackTrace.isSameExceptForFileNameAndLineNumber;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.ForceInline;
import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.BooleanUtils;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
import org.junit.Test;
@@ -23,14 +25,16 @@
@RunWith(Parameterized.class)
public class InliningRetraceTest extends RetraceTestBase {
- @Parameters(name = "{0}, mode: {1}")
+ @Parameters(name = "{0}, mode: {1}, compat: {2}")
public static Collection<Object[]> data() {
return buildParameters(
- getTestParameters().withAllRuntimesAndApiLevels().build(), CompilationMode.values());
+ getTestParameters().withAllRuntimesAndApiLevels().build(),
+ CompilationMode.values(),
+ BooleanUtils.values());
}
- public InliningRetraceTest(TestParameters parameters, CompilationMode mode) {
- super(parameters, mode);
+ public InliningRetraceTest(TestParameters parameters, CompilationMode mode, boolean compat) {
+ super(parameters, mode, compat);
}
@Override
@@ -54,6 +58,7 @@
@Test
public void testLineNumberTableOnly() throws Exception {
+ assumeTrue(compat);
runTest(
ImmutableList.of("-keepattributes LineNumberTable"),
(StackTrace actualStackTrace, StackTrace retracedStackTrace) -> {
@@ -64,6 +69,7 @@
@Test
public void testNoLineNumberTable() throws Exception {
+ assumeTrue(compat);
runTest(
ImmutableList.of(),
(StackTrace actualStackTrace, StackTrace retracedStackTrace) -> {
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/RetraceTestBase.java b/src/test/java/com/android/tools/r8/naming/retrace/RetraceTestBase.java
index 3da28ae..adc5cb8 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/RetraceTestBase.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/RetraceTestBase.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.naming.retrace;
import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.R8TestBuilder;
import com.android.tools.r8.R8TestRunResult;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
@@ -18,15 +18,17 @@
public abstract class RetraceTestBase extends TestBase {
protected TestParameters parameters;
protected CompilationMode mode;
+ protected boolean compat;
- public RetraceTestBase(TestParameters parameters, CompilationMode mode) {
+ public RetraceTestBase(TestParameters parameters, CompilationMode mode, boolean compat) {
this.parameters = parameters;
this.mode = mode;
+ this.compat = compat;
}
public StackTrace expectedStackTrace;
- public void configure(R8FullTestBuilder builder) {}
+ public void configure(R8TestBuilder builder) {}
public Collection<Class<?>> getClasses() {
return ImmutableList.of(getMainClass());
@@ -49,7 +51,7 @@
throws Exception {
R8TestRunResult result =
- testForR8(parameters.getBackend())
+ (compat ? testForR8Compat(parameters.getBackend()) : testForR8(parameters.getBackend()))
.setMode(mode)
.enableProguardTestOptions()
.addProgramClasses(getClasses())
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/VerticalClassMergingRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retrace/VerticalClassMergingRetraceTest.java
index 6cd268f..46da60b 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/VerticalClassMergingRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/VerticalClassMergingRetraceTest.java
@@ -7,12 +7,14 @@
import static com.android.tools.r8.naming.retrace.StackTrace.isSameExceptForFileNameAndLineNumber;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.NeverInline;
-import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.R8TestBuilder;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.naming.retrace.StackTrace.StackTraceLine;
+import com.android.tools.r8.utils.BooleanUtils;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
import java.util.HashSet;
@@ -26,18 +28,21 @@
public class VerticalClassMergingRetraceTest extends RetraceTestBase {
private Set<StackTraceLine> haveSeenLines = new HashSet<>();
- @Parameters(name = "{0}, mode: {1}")
+ @Parameters(name = "{0}, mode: {1}, compat: {2}")
public static Collection<Object[]> data() {
return buildParameters(
- getTestParameters().withAllRuntimesAndApiLevels().build(), CompilationMode.values());
+ getTestParameters().withAllRuntimesAndApiLevels().build(),
+ CompilationMode.values(),
+ BooleanUtils.values());
}
- public VerticalClassMergingRetraceTest(TestParameters parameters, CompilationMode mode) {
- super(parameters, mode);
+ public VerticalClassMergingRetraceTest(
+ TestParameters parameters, CompilationMode mode, boolean compat) {
+ super(parameters, mode, compat);
}
@Override
- public void configure(R8FullTestBuilder builder) {
+ public void configure(R8TestBuilder builder) {
builder.enableInliningAnnotations();
}
@@ -87,6 +92,7 @@
@Test
public void testLineNumberTableOnly() throws Exception {
+ assumeTrue(compat);
runTest(
ImmutableList.of("-keepattributes LineNumberTable"),
(StackTrace actualStackTrace, StackTrace retracedStackTrace) -> {
@@ -125,6 +131,7 @@
// at com.android.tools.r8.naming.retraceproguard.ResourceWrapper.foo(ResourceWrapper.java:0)
// at com.android.tools.r8.naming.retraceproguard.MainApp.main(MainApp.java:7)
// since the synthetic bridge belongs to ResourceWrapper.foo.
+ assumeTrue(compat);
haveSeenLines.clear();
runTest(
ImmutableList.of(),
diff --git a/src/test/java/com/android/tools/r8/naming/retraceproguard/DesugarLambdaRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retraceproguard/DesugarLambdaRetraceTest.java
index 42f2857..a527d93 100644
--- a/src/test/java/com/android/tools/r8/naming/retraceproguard/DesugarLambdaRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retraceproguard/DesugarLambdaRetraceTest.java
@@ -12,6 +12,7 @@
import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.naming.retraceproguard.StackTrace.StackTraceLine;
+import com.android.tools.r8.utils.BooleanUtils;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
import org.junit.Ignore;
@@ -23,13 +24,14 @@
@RunWith(Parameterized.class)
public class DesugarLambdaRetraceTest extends RetraceTestBase {
- @Parameters(name = "Backend: {0}, mode: {1}")
+ @Parameters(name = "Backend: {0}, mode: {1}, compat: {2}")
public static Collection<Object[]> data() {
- return buildParameters(ToolHelper.getBackends(), CompilationMode.values());
+ return buildParameters(
+ ToolHelper.getBackends(), CompilationMode.values(), BooleanUtils.values());
}
- public DesugarLambdaRetraceTest(Backend backend, CompilationMode mode) {
- super(backend, mode);
+ public DesugarLambdaRetraceTest(Backend backend, CompilationMode mode, boolean compat) {
+ super(backend, mode, compat);
}
@Override
diff --git a/src/test/java/com/android/tools/r8/naming/retraceproguard/DesugarStaticInterfaceMethodsRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retraceproguard/DesugarStaticInterfaceMethodsRetraceTest.java
index acd5baa..2034f5d 100644
--- a/src/test/java/com/android/tools/r8/naming/retraceproguard/DesugarStaticInterfaceMethodsRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retraceproguard/DesugarStaticInterfaceMethodsRetraceTest.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.utils.BooleanUtils;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
import org.junit.Test;
@@ -20,13 +21,15 @@
@RunWith(Parameterized.class)
public class DesugarStaticInterfaceMethodsRetraceTest extends RetraceTestBase {
- @Parameters(name = "Backend: {0}, mode: {1}")
+ @Parameters(name = "Backend: {0}, mode: {1}, compat: {2}")
public static Collection<Object[]> data() {
- return buildParameters(ToolHelper.getBackends(), CompilationMode.values());
+ return buildParameters(
+ ToolHelper.getBackends(), CompilationMode.values(), BooleanUtils.values());
}
- public DesugarStaticInterfaceMethodsRetraceTest(Backend backend, CompilationMode mode) {
- super(backend, mode);
+ public DesugarStaticInterfaceMethodsRetraceTest(
+ Backend backend, CompilationMode mode, boolean compat) {
+ super(backend, mode, compat);
}
@Override
diff --git a/src/test/java/com/android/tools/r8/naming/retraceproguard/InliningRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retraceproguard/InliningRetraceTest.java
index 4f84c8f..aafa229 100644
--- a/src/test/java/com/android/tools/r8/naming/retraceproguard/InliningRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retraceproguard/InliningRetraceTest.java
@@ -8,11 +8,13 @@
import static com.android.tools.r8.naming.retraceproguard.StackTrace.isSameExceptForFileNameAndLineNumber;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.ForceInline;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.utils.BooleanUtils;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
import java.util.Collections;
@@ -28,11 +30,12 @@
public static Collection<Object[]> data() {
return ToolHelper.getDexVm().getVersion() == Version.V5_1_1
? Collections.emptyList()
- : buildParameters(ToolHelper.getBackends(), CompilationMode.values());
+ : buildParameters(
+ ToolHelper.getBackends(), CompilationMode.values(), BooleanUtils.values());
}
- public InliningRetraceTest(Backend backend, CompilationMode mode) {
- super(backend, mode);
+ public InliningRetraceTest(Backend backend, CompilationMode mode, boolean value) {
+ super(backend, mode, value);
}
@Override
@@ -57,6 +60,7 @@
@Test
public void testLineNumberTableOnly() throws Exception {
+ assumeTrue(compat);
runTest(
ImmutableList.of("-keepattributes LineNumberTable"),
(StackTrace actualStackTrace, StackTrace retracedStackTrace) -> {
@@ -67,6 +71,7 @@
@Test
public void testNoLineNumberTable() throws Exception {
+ assumeTrue(compat);
runTest(
ImmutableList.of(),
(StackTrace actualStackTrace, StackTrace retracedStackTrace) -> {
diff --git a/src/test/java/com/android/tools/r8/naming/retraceproguard/RetraceTestBase.java b/src/test/java/com/android/tools/r8/naming/retraceproguard/RetraceTestBase.java
index 4a877e2..e94483f 100644
--- a/src/test/java/com/android/tools/r8/naming/retraceproguard/RetraceTestBase.java
+++ b/src/test/java/com/android/tools/r8/naming/retraceproguard/RetraceTestBase.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.naming.retraceproguard;
import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.R8TestBuilder;
import com.android.tools.r8.R8TestRunResult;
import com.android.tools.r8.TestBase;
import com.google.common.collect.ImmutableList;
@@ -17,15 +17,17 @@
public abstract class RetraceTestBase extends TestBase {
protected Backend backend;
protected CompilationMode mode;
+ protected boolean compat;
- public RetraceTestBase(Backend backend, CompilationMode mode) {
+ public RetraceTestBase(Backend backend, CompilationMode mode, boolean compat) {
this.backend = backend;
this.mode = mode;
+ this.compat = compat;
}
public StackTrace expectedStackTrace;
- public void configure(R8FullTestBuilder builder) {}
+ public void configure(R8TestBuilder builder) {}
public Collection<Class<?>> getClasses() {
return ImmutableList.of(getMainClass());
@@ -48,7 +50,7 @@
throws Exception {
R8TestRunResult result =
- testForR8(backend)
+ (compat ? testForR8Compat(backend) : testForR8(backend))
.setMode(mode)
.enableProguardTestOptions()
.addProgramClasses(getClasses())
diff --git a/src/test/java/com/android/tools/r8/naming/retraceproguard/VerticalClassMergingRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retraceproguard/VerticalClassMergingRetraceTest.java
index 42264a2..2874bf9 100644
--- a/src/test/java/com/android/tools/r8/naming/retraceproguard/VerticalClassMergingRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retraceproguard/VerticalClassMergingRetraceTest.java
@@ -7,12 +7,14 @@
import static com.android.tools.r8.naming.retraceproguard.StackTrace.isSameExceptForFileNameAndLineNumber;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.NeverInline;
-import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.R8TestBuilder;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.naming.retraceproguard.StackTrace.StackTraceLine;
+import com.android.tools.r8.utils.BooleanUtils;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
import java.util.HashSet;
@@ -26,17 +28,18 @@
public class VerticalClassMergingRetraceTest extends RetraceTestBase {
private Set<StackTraceLine> haveSeenLines = new HashSet<>();
- @Parameters(name = "Backend: {0}, mode: {1}")
+ @Parameters(name = "Backend: {0}, mode: {1}, compat: {2}")
public static Collection<Object[]> data() {
- return buildParameters(ToolHelper.getBackends(), CompilationMode.values());
+ return buildParameters(
+ ToolHelper.getBackends(), CompilationMode.values(), BooleanUtils.values());
}
- public VerticalClassMergingRetraceTest(Backend backend, CompilationMode mode) {
- super(backend, mode);
+ public VerticalClassMergingRetraceTest(Backend backend, CompilationMode mode, boolean compat) {
+ super(backend, mode, compat);
}
@Override
- public void configure(R8FullTestBuilder builder) {
+ public void configure(R8TestBuilder builder) {
builder.enableInliningAnnotations();
}
@@ -83,6 +86,7 @@
@Test
public void testLineNumberTableOnly() throws Exception {
+ assumeTrue(compat);
runTest(
ImmutableList.of("-keepattributes LineNumberTable"),
(StackTrace actualStackTrace, StackTrace retracedStackTrace) -> {
@@ -97,6 +101,7 @@
@Test
public void testNoLineNumberTable() throws Exception {
+ assumeTrue(compat);
haveSeenLines.clear();
runTest(
ImmutableList.of(),
diff --git a/src/test/java/com/android/tools/r8/naming/testclasses/ClassToBeMinified.java b/src/test/java/com/android/tools/r8/naming/testclasses/ClassToBeMinified.java
new file mode 100644
index 0000000..da6f9c0
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/testclasses/ClassToBeMinified.java
@@ -0,0 +1,15 @@
+// Copyright (c) 2020, 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.naming.testclasses;
+
+import com.android.tools.r8.NeverInline;
+
+public class ClassToBeMinified {
+
+ @NeverInline
+ public static void foo() {
+ throw new RuntimeException("ClassToBeMinified.foo()");
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/naming/testclasses/Main.java b/src/test/java/com/android/tools/r8/naming/testclasses/Main.java
new file mode 100644
index 0000000..1e37d4c
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/testclasses/Main.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2020, 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.naming.testclasses;
+
+public class Main {
+
+ public static void main(String[] args) {
+ ClassToBeMinified.foo();
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/retrace/InlineWithoutNullCheckTest.java b/src/test/java/com/android/tools/r8/retrace/InlineWithoutNullCheckTest.java
index 3c80a6a..1796dbf 100644
--- a/src/test/java/com/android/tools/r8/retrace/InlineWithoutNullCheckTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/InlineWithoutNullCheckTest.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.TestRuntime.CfVm;
import com.android.tools.r8.naming.retrace.StackTrace;
+import com.android.tools.r8.shaking.ProguardKeepAttributes;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -110,6 +111,7 @@
.addInnerClasses(InlineWithoutNullCheckTest.class)
.addKeepMainRule(TestClassForInlineMethod.class)
.enableInliningAnnotations()
+ .addKeepAttributes(ProguardKeepAttributes.SOURCE_FILE)
.setMinApi(parameters.getApiLevel())
.compile()
.inspect(this::checkSomething)
@@ -136,6 +138,7 @@
.addInnerClasses(InlineWithoutNullCheckTest.class)
.addKeepMainRule(TestClassForInlineField.class)
.enableInliningAnnotations()
+ .addKeepAttributes(ProguardKeepAttributes.SOURCE_FILE)
.setMinApi(parameters.getApiLevel())
.compile()
.inspect(this::checkSomething)
@@ -163,6 +166,7 @@
.addInnerClasses(InlineWithoutNullCheckTest.class)
.addKeepMainRule(TestClassForInlineStaticField.class)
.enableInliningAnnotations()
+ .addKeepAttributes(ProguardKeepAttributes.SOURCE_FILE)
.setMinApi(parameters.getApiLevel())
.compile()
.inspect(this::checkSomething)