Enable CF on ValidNameConflictTest, also:
Ignore '-overloadAggressively' if '-useUniqueClassMemberNames' is also specified
because '-useUniqueClassMemberNames' already determines which members will have
identical or different names, there's no freedom left for
'-overloadAggressively'.
Bug: 115438234
Change-Id: Ide6264bb3be5de6e49e8c9cface4f77fb64f883c
diff --git a/src/main/java/com/android/tools/r8/naming/MemberNameMinifier.java b/src/main/java/com/android/tools/r8/naming/MemberNameMinifier.java
index 4c2479d..e03890c 100644
--- a/src/main/java/com/android/tools/r8/naming/MemberNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/MemberNameMinifier.java
@@ -31,7 +31,8 @@
this.rootSet = rootSet;
this.dictionary = options.proguardConfiguration.getObfuscationDictionary();
this.useUniqueMemberNames = options.proguardConfiguration.isUseUniqueClassMemberNames();
- this.overloadAggressively = options.proguardConfiguration.isOverloadAggressively();
+ this.overloadAggressively =
+ options.proguardConfiguration.isOverloadAggressivelyWithoutUseUniqueClassMemberNames();
this.globalState = NamingState.createRoot(
appInfo.dexItemFactory, dictionary, getKeyTransform(), useUniqueMemberNames);
}
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
index 599d444..bbb255c 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
@@ -208,6 +208,10 @@
return useUniqueClassMemberNames;
}
+ boolean isOverloadAggressively() {
+ return overloadAggressively;
+ }
+
public void setKeepParameterNames(boolean keepParameterNames, Origin optionOrigin,
Position optionPosition) {
assert optionOrigin != null || !keepParameterNames;
@@ -552,8 +556,8 @@
return rules;
}
- public boolean isOverloadAggressively() {
- return overloadAggressively;
+ public boolean isOverloadAggressivelyWithoutUseUniqueClassMemberNames() {
+ return overloadAggressively && !useUniqueClassMemberNames;
}
public ImmutableList<String> getObfuscationDictionary() {
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index 75e91b1..a410a65 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -127,6 +127,13 @@
configurationBuilder.getKeepParameterNamesOptionOrigin(),
configurationBuilder.getKeepParameterNamesOptionPosition()));
}
+ if (configurationBuilder.isOverloadAggressively()
+ && configurationBuilder.isUseUniqueClassMemberNames()) {
+ reporter.warning(
+ new StringDiagnostic(
+ "The -overloadaggressively flag has no effect if -useuniqueclassmembernames"
+ + " is also specified."));
+ }
}
/**
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index b28ddd7..48e7d1a 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -641,6 +641,13 @@
return ToolHelper.runJava(out, mainAndArgs.toArray(new String[0]));
}
+ protected ProcessResult runOnJavaRawNoVerify(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.runJavaNoVerify(out, mainClass, args.toArray(new String[0]));
+ }
+
private String extractClassName(byte[] ccc) {
class ClassNameExtractor extends ClassVisitor {
private String className;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/CheckCastRemovalTest.java b/src/test/java/com/android/tools/r8/ir/optimize/CheckCastRemovalTest.java
index f894322..e505499 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/CheckCastRemovalTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/CheckCastRemovalTest.java
@@ -50,7 +50,8 @@
List<String> pgConfigs = ImmutableList.of(
"-keep class " + CLASS_NAME + " { *; }",
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, o -> o.enableClassInlining = false);
+ AndroidApp app =
+ compileWithR8(builder, pgConfigs, o -> o.enableClassInlining = false, Backend.DEX);
DexEncodedMethod method = getMethod(app, CLASS_NAME, main);
assertNotNull(method);
@@ -89,7 +90,8 @@
"-keep class B { *; }",
"-keep class C { *; }",
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, opts -> opts.enableClassInlining = false);
+ AndroidApp app =
+ compileWithR8(builder, pgConfigs, opts -> opts.enableClassInlining = false, Backend.DEX);
DexEncodedMethod method = getMethod(app, CLASS_NAME, main);
assertNotNull(method);
@@ -129,7 +131,7 @@
"-keep class C { *; }",
"-dontoptimize",
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, Backend.DEX);
DexEncodedMethod method = getMethod(app, CLASS_NAME, main);
assertNotNull(method);
@@ -168,7 +170,7 @@
List<String> pgConfigs = ImmutableList.of(
"-keep class " + CLASS_NAME + " { *; }",
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, Backend.DEX);
DexEncodedMethod method = getMethod(app, CLASS_NAME, main);
assertNotNull(method);
@@ -205,7 +207,7 @@
List<String> pgConfigs = ImmutableList.of(
"-keep class " + CLASS_NAME + " { *; }",
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, Backend.DEX);
DexEncodedMethod method = getMethod(app, CLASS_NAME, main);
assertNotNull(method);
diff --git a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java b/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
index c75ea7d..6500ca7 100644
--- a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
+++ b/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
@@ -106,11 +106,12 @@
protected AndroidApp compileWithR8(
JasminBuilder builder,
List<String> proguardConfigs,
- Consumer<InternalOptions> optionsConsumer)
+ Consumer<InternalOptions> optionsConsumer,
+ Backend backend)
throws Exception {
R8Command command =
- ToolHelper.prepareR8CommandBuilder(builder.build())
- .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
+ ToolHelper.prepareR8CommandBuilder(builder.build(), emptyConsumer(backend))
+ .addLibraryFiles(runtimeJar(backend))
.addProguardConfiguration(proguardConfigs, Origin.unknown())
.build();
return ToolHelper.runR8(command, optionsConsumer);
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 efead2d..61274ee 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
@@ -9,23 +9,42 @@
import static org.junit.Assert.assertTrue;
import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.VmTestRunner;
import com.android.tools.r8.jasmin.JasminBuilder;
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.StringUtils;
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.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
-@RunWith(VmTestRunner.class)
+@RunWith(Parameterized.class)
public class ValidNameConflictTest extends JasminTestBase {
+ private static final String REPEATED_NAME = "hopeTheresNoSuchNameInRuntimeLibraries";
+
+ private final Backend backend;
+
+ @Parameterized.Parameters(name = "Backend: {0}")
+ public static Collection<Backend> data() {
+ return Arrays.asList(Backend.values());
+ }
+
+ public ValidNameConflictTest(Backend backend) {
+ this.backend = backend;
+ }
+
private final String CLASS_NAME = "Example";
private final String SUPER_CLASS = "Super";
private final String ANOTHER_CLASS = "Test";
@@ -64,8 +83,8 @@
private JasminBuilder buildFieldNameConflictClassFile() {
JasminBuilder builder = new JasminBuilder();
ClassBuilder classBuilder = builder.addClass(CLASS_NAME);
- classBuilder.addStaticField("same", "Ljava/lang/Object;", null);
- classBuilder.addStaticField("same", "Ljava/lang/String;", "\"" + MSG + "\"");
+ classBuilder.addStaticField(REPEATED_NAME, "Ljava/lang/Object;", null);
+ classBuilder.addStaticField(REPEATED_NAME, "Ljava/lang/String;", "\"" + MSG + "\"");
classBuilder.addMainMethod(
buildCodeForVisitingDeclaredMembers(
ImmutableList.of(
@@ -79,6 +98,15 @@
return builder;
}
+ private ProcessResult runRaw(AndroidApp app, String main) throws IOException {
+ if (backend == Backend.DEX) {
+ return runOnArtRaw(app, main);
+ } else {
+ assert backend == Backend.CF;
+ return runOnJavaRawNoVerify(app, main, Collections.emptyList());
+ }
+ }
+
@Test
public void remainFieldNameConflict_keepRules() throws Exception {
JasminBuilder builder = buildFieldNameConflictClassFile();
@@ -92,22 +120,22 @@
+ "}\n"
+ "-printmapping\n",
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, backend);
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject clazz = codeInspector.clazz(CLASS_NAME);
assertTrue(clazz.isPresent());
- FieldSubject f1 = clazz.field("java.lang.String", "same");
+ FieldSubject f1 = clazz.field("java.lang.String", REPEATED_NAME);
assertTrue(f1.isPresent());
assertFalse(f1.isRenamed());
- FieldSubject f2 = clazz.field("java.lang.Object", "same");
+ FieldSubject f2 = clazz.field("java.lang.Object", REPEATED_NAME);
assertTrue(f2.isPresent());
assertFalse(f2.isRenamed());
assertEquals(f1.getFinalName(), f2.getFinalName());
- ProcessResult artOutput = runOnArtRaw(app, CLASS_NAME);
- assertEquals(0, artOutput.exitCode);
- assertEquals(javaOutput.stdout, artOutput.stdout);
+ ProcessResult output = runRaw(app, CLASS_NAME);
+ assertEquals(0, output.exitCode);
+ assertEquals(javaOutput.stdout, output.stdout);
}
@Test
@@ -120,22 +148,22 @@
keepMainProguardConfiguration(CLASS_NAME),
"-useuniqueclassmembernames",
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, backend);
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject clazz = codeInspector.clazz(CLASS_NAME);
assertTrue(clazz.isPresent());
- FieldSubject f1 = clazz.field("java.lang.String", "same");
+ FieldSubject f1 = clazz.field("java.lang.String", REPEATED_NAME);
assertTrue(f1.isPresent());
assertTrue(f1.isRenamed());
- FieldSubject f2 = clazz.field("java.lang.Object", "same");
+ FieldSubject f2 = clazz.field("java.lang.Object", REPEATED_NAME);
assertTrue(f2.isPresent());
assertTrue(f2.isRenamed());
assertEquals(f1.getFinalName(), f2.getFinalName());
- ProcessResult artOutput = runOnArtRaw(app, CLASS_NAME);
- assertEquals(0, artOutput.exitCode);
- assertEquals(javaOutput.stdout, artOutput.stdout);
+ ProcessResult output = runRaw(app, CLASS_NAME);
+ assertEquals(0, output.exitCode);
+ assertEquals(javaOutput.stdout, output.stdout);
}
@Test
@@ -150,22 +178,22 @@
"-useuniqueclassmembernames",
"-overloadaggressively", // no-op
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, backend);
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject clazz = codeInspector.clazz(CLASS_NAME);
assertTrue(clazz.isPresent());
- FieldSubject f1 = clazz.field("java.lang.String", "same");
+ FieldSubject f1 = clazz.field("java.lang.String", REPEATED_NAME);
assertTrue(f1.isPresent());
assertTrue(f1.isRenamed());
- FieldSubject f2 = clazz.field("java.lang.Object", "same");
+ FieldSubject f2 = clazz.field("java.lang.Object", REPEATED_NAME);
assertTrue(f2.isPresent());
assertTrue(f2.isRenamed());
assertEquals(f1.getFinalName(), f2.getFinalName());
- ProcessResult artOutput = runOnArtRaw(app, CLASS_NAME);
- assertEquals(0, artOutput.exitCode);
- assertEquals(javaOutput.stdout, artOutput.stdout);
+ ProcessResult output = runRaw(app, CLASS_NAME);
+ assertEquals(0, output.exitCode);
+ assertEquals(javaOutput.stdout, output.stdout);
}
@Test
@@ -177,22 +205,22 @@
List<String> pgConfigs = ImmutableList.of(
keepMainProguardConfiguration(CLASS_NAME),
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, backend);
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject clazz = codeInspector.clazz(CLASS_NAME);
assertTrue(clazz.isPresent());
- FieldSubject f1 = clazz.field("java.lang.String", "same");
+ FieldSubject f1 = clazz.field("java.lang.String", REPEATED_NAME);
assertTrue(f1.isPresent());
assertTrue(f1.isRenamed());
- FieldSubject f2 = clazz.field("java.lang.Object", "same");
+ FieldSubject f2 = clazz.field("java.lang.Object", REPEATED_NAME);
assertTrue(f2.isPresent());
assertTrue(f2.isRenamed());
assertNotEquals(f1.getFinalName(), f2.getFinalName());
- ProcessResult artOutput = runOnArtRaw(app, CLASS_NAME);
- assertEquals(0, artOutput.exitCode);
- assertEquals(javaOutput.stdout, artOutput.stdout);
+ ProcessResult output = runRaw(app, CLASS_NAME);
+ assertEquals(0, output.exitCode);
+ assertEquals(javaOutput.stdout, output.stdout);
}
@Test
@@ -205,33 +233,31 @@
keepMainProguardConfiguration(CLASS_NAME),
"-overloadaggressively",
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, backend);
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject clazz = codeInspector.clazz(CLASS_NAME);
assertTrue(clazz.isPresent());
- FieldSubject f1 = clazz.field("java.lang.String", "same");
+ FieldSubject f1 = clazz.field("java.lang.String", REPEATED_NAME);
assertTrue(f1.isPresent());
assertTrue(f1.isRenamed());
- FieldSubject f2 = clazz.field("java.lang.Object", "same");
+ FieldSubject f2 = clazz.field("java.lang.Object", REPEATED_NAME);
assertTrue(f2.isPresent());
assertTrue(f2.isRenamed());
assertEquals(f1.getFinalName(), f2.getFinalName());
- ProcessResult artOutput = runOnArtRaw(app, CLASS_NAME);
- assertEquals(0, artOutput.exitCode);
- assertEquals(javaOutput.stdout, artOutput.stdout);
+ ProcessResult output = runRaw(app, CLASS_NAME);
+ assertEquals(0, output.exitCode);
+ assertEquals(javaOutput.stdout, output.stdout);
}
private JasminBuilder buildMethodNameConflictClassFile() {
JasminBuilder builder = new JasminBuilder();
ClassBuilder classBuilder = builder.addClass(ANOTHER_CLASS);
- classBuilder.addStaticMethod("same", ImmutableList.of(), "Ljava/lang/Object;",
- "aconst_null",
- "areturn");
- classBuilder.addStaticMethod("same", ImmutableList.of(), "Ljava/lang/String;",
- "ldc \"" + MSG + "\"",
- "areturn");
+ classBuilder.addStaticMethod(
+ REPEATED_NAME, ImmutableList.of(), "Ljava/lang/Object;", "aconst_null", "areturn");
+ classBuilder.addStaticMethod(
+ REPEATED_NAME, ImmutableList.of(), "Ljava/lang/String;", "ldc \"" + MSG + "\"", "areturn");
classBuilder = builder.addClass(CLASS_NAME);
classBuilder.addMainMethod(
buildCodeForVisitingDeclaredMembers(
@@ -261,22 +287,22 @@
+ "}\n",
keepMainProguardConfiguration(CLASS_NAME),
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, backend);
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject clazz = codeInspector.clazz(ANOTHER_CLASS);
assertTrue(clazz.isPresent());
- MethodSubject m1 = clazz.method("java.lang.String", "same", ImmutableList.of());
+ MethodSubject m1 = clazz.method("java.lang.String", REPEATED_NAME, ImmutableList.of());
assertTrue(m1.isPresent());
assertFalse(m1.isRenamed());
- MethodSubject m2 = clazz.method("java.lang.Object", "same", ImmutableList.of());
+ MethodSubject m2 = clazz.method("java.lang.Object", REPEATED_NAME, ImmutableList.of());
assertTrue(m2.isPresent());
assertFalse(m2.isRenamed());
assertEquals(m1.getFinalName(), m2.getFinalName());
- ProcessResult artOutput = runOnArtRaw(app, CLASS_NAME);
- assertEquals(0, artOutput.exitCode);
- assertEquals(javaOutput.stdout, artOutput.stdout);
+ ProcessResult output = runRaw(app, CLASS_NAME);
+ assertEquals(0, output.exitCode);
+ assertEquals(javaOutput.stdout, output.stdout);
}
@Test
@@ -289,22 +315,22 @@
keepMainProguardConfiguration(CLASS_NAME),
"-useuniqueclassmembernames",
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, backend);
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject clazz = codeInspector.clazz(ANOTHER_CLASS);
assertTrue(clazz.isPresent());
- MethodSubject m1 = clazz.method("java.lang.String", "same", ImmutableList.of());
+ MethodSubject m1 = clazz.method("java.lang.String", REPEATED_NAME, ImmutableList.of());
assertTrue(m1.isPresent());
assertTrue(m1.isRenamed());
- MethodSubject m2 = clazz.method("java.lang.Object", "same", ImmutableList.of());
+ MethodSubject m2 = clazz.method("java.lang.Object", REPEATED_NAME, ImmutableList.of());
assertTrue(m2.isPresent());
assertTrue(m2.isRenamed());
assertEquals(m1.getFinalName(), m2.getFinalName());
- ProcessResult artOutput = runOnArtRaw(app, CLASS_NAME);
- assertEquals(0, artOutput.exitCode);
- assertEquals(javaOutput.stdout, artOutput.stdout);
+ ProcessResult output = runRaw(app, CLASS_NAME);
+ assertEquals(0, output.exitCode);
+ assertEquals(javaOutput.stdout, output.stdout);
}
@Test
@@ -319,22 +345,22 @@
"-useuniqueclassmembernames",
"-overloadaggressively", // no-op
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, backend);
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject clazz = codeInspector.clazz(ANOTHER_CLASS);
assertTrue(clazz.isPresent());
- MethodSubject m1 = clazz.method("java.lang.String", "same", ImmutableList.of());
+ MethodSubject m1 = clazz.method("java.lang.String", REPEATED_NAME, ImmutableList.of());
assertTrue(m1.isPresent());
assertTrue(m1.isRenamed());
- MethodSubject m2 = clazz.method("java.lang.Object", "same", ImmutableList.of());
+ MethodSubject m2 = clazz.method("java.lang.Object", REPEATED_NAME, ImmutableList.of());
assertTrue(m2.isPresent());
assertTrue(m2.isRenamed());
assertEquals(m1.getFinalName(), m2.getFinalName());
- ProcessResult artOutput = runOnArtRaw(app, CLASS_NAME);
- assertEquals(0, artOutput.exitCode);
- assertEquals(javaOutput.stdout, artOutput.stdout);
+ ProcessResult output = runRaw(app, CLASS_NAME);
+ assertEquals(0, output.exitCode);
+ assertEquals(javaOutput.stdout, output.stdout);
}
@Test
@@ -346,22 +372,24 @@
List<String> pgConfigs = ImmutableList.of(
keepMainProguardConfiguration(CLASS_NAME),
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, backend);
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject clazz = codeInspector.clazz(ANOTHER_CLASS);
assertTrue(clazz.isPresent());
- MethodSubject m1 = clazz.method("java.lang.String", "same", ImmutableList.of());
+ MethodSubject m1 = clazz.method("java.lang.String", REPEATED_NAME, ImmutableList.of());
assertTrue(m1.isPresent());
assertTrue(m1.isRenamed());
- MethodSubject m2 = clazz.method("java.lang.Object", "same", ImmutableList.of());
+ MethodSubject m2 = clazz.method("java.lang.Object", REPEATED_NAME, ImmutableList.of());
assertTrue(m2.isPresent());
assertTrue(m2.isRenamed());
assertNotEquals(m1.getFinalName(), m2.getFinalName());
- ProcessResult artOutput = runOnArtRaw(app, CLASS_NAME);
- assertEquals(0, artOutput.exitCode);
- assertEquals(javaOutput.stdout, artOutput.stdout);
+ ProcessResult output = runRaw(app, CLASS_NAME);
+ assertEquals(0, output.exitCode);
+ assertEquals(
+ new HashSet<String>(StringUtils.splitLines(javaOutput.stdout)),
+ new HashSet<String>(StringUtils.splitLines(output.stdout)));
}
@Test
@@ -374,41 +402,45 @@
keepMainProguardConfiguration(CLASS_NAME),
"-overloadaggressively",
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, backend);
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject clazz = codeInspector.clazz(ANOTHER_CLASS);
assertTrue(clazz.isPresent());
- MethodSubject m1 = clazz.method("java.lang.String", "same", ImmutableList.of());
+ MethodSubject m1 = clazz.method("java.lang.String", REPEATED_NAME, ImmutableList.of());
assertTrue(m1.isPresent());
assertTrue(m1.isRenamed());
- MethodSubject m2 = clazz.method("java.lang.Object", "same", ImmutableList.of());
+ MethodSubject m2 = clazz.method("java.lang.Object", REPEATED_NAME, ImmutableList.of());
assertTrue(m2.isPresent());
assertTrue(m2.isRenamed());
assertEquals(m1.getFinalName(), m2.getFinalName());
- ProcessResult artOutput = runOnArtRaw(app, CLASS_NAME);
- assertEquals(0, artOutput.exitCode);
- assertEquals(javaOutput.stdout, artOutput.stdout);
+ ProcessResult output = runRaw(app, CLASS_NAME);
+ assertEquals(0, output.exitCode);
+ assertEquals(javaOutput.stdout, output.stdout);
}
private JasminBuilder buildMethodNameConflictInHierarchy() {
JasminBuilder builder = new JasminBuilder();
ClassBuilder classBuilder = builder.addClass(SUPER_CLASS);
- classBuilder.addVirtualMethod("same", ImmutableList.of(), "Ljava/lang/Object;",
- "aconst_null",
- "areturn");
- classBuilder.addVirtualMethod("same", ImmutableList.of(), "Ljava/lang/String;",
- "ldc \"" + MSG + "\"",
- "areturn");
+ classBuilder.addVirtualMethod(
+ REPEATED_NAME, ImmutableList.of(), "Ljava/lang/Object;", "aconst_null", "areturn");
+ classBuilder.addVirtualMethod(
+ REPEATED_NAME, ImmutableList.of(), "Ljava/lang/String;", "ldc \"" + MSG + "\"", "areturn");
classBuilder = builder.addClass(ANOTHER_CLASS, SUPER_CLASS);
- classBuilder.addVirtualMethod("same", ImmutableList.of(), "Ljava/lang/Object;",
+ classBuilder.addVirtualMethod(
+ REPEATED_NAME,
+ ImmutableList.of(),
+ "Ljava/lang/Object;",
"aload_0",
- "invokespecial " + SUPER_CLASS + "/same()Ljava/lang/Object;",
+ "invokespecial " + SUPER_CLASS + "/" + REPEATED_NAME + "()Ljava/lang/Object;",
"areturn");
- classBuilder.addVirtualMethod("same", ImmutableList.of(), "Ljava/lang/String;",
+ classBuilder.addVirtualMethod(
+ REPEATED_NAME,
+ ImmutableList.of(),
+ "Ljava/lang/String;",
"aload_0",
- "invokespecial " + SUPER_CLASS + "/same()Ljava/lang/String;",
+ "invokespecial " + SUPER_CLASS + "/" + REPEATED_NAME + "()Ljava/lang/String;",
"areturn");
classBuilder = builder.addClass(CLASS_NAME);
classBuilder.addMainMethod(
@@ -443,25 +475,25 @@
+ "}\n",
keepMainProguardConfiguration(CLASS_NAME),
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, backend);
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject sup = codeInspector.clazz(SUPER_CLASS);
assertTrue(sup.isPresent());
- MethodSubject m1 = sup.method("java.lang.String", "same", ImmutableList.of());
+ MethodSubject m1 = sup.method("java.lang.String", REPEATED_NAME, ImmutableList.of());
assertTrue(m1.isPresent());
assertFalse(m1.isRenamed());
- MethodSubject m2 = sup.method("java.lang.Object", "same", ImmutableList.of());
+ MethodSubject m2 = sup.method("java.lang.Object", REPEATED_NAME, ImmutableList.of());
assertTrue(m2.isPresent());
assertFalse(m2.isRenamed());
assertEquals(m1.getFinalName(), m2.getFinalName());
ClassSubject sub = codeInspector.clazz(ANOTHER_CLASS);
assertTrue(sub.isPresent());
- MethodSubject subM1 = sub.method("java.lang.String", "same", ImmutableList.of());
+ MethodSubject subM1 = sub.method("java.lang.String", REPEATED_NAME, ImmutableList.of());
assertTrue(subM1.isPresent());
assertFalse(subM1.isRenamed());
- MethodSubject subM2 = sub.method("java.lang.Object", "same", ImmutableList.of());
+ MethodSubject subM2 = sub.method("java.lang.Object", REPEATED_NAME, ImmutableList.of());
assertTrue(subM2.isPresent());
assertFalse(subM2.isRenamed());
assertEquals(subM1.getFinalName(), subM2.getFinalName());
@@ -470,9 +502,9 @@
assertEquals(m1.getFinalName(), subM1.getFinalName());
assertEquals(m2.getFinalName(), subM2.getFinalName());
- ProcessResult artOutput = runOnArtRaw(app, CLASS_NAME);
- assertEquals(0, artOutput.exitCode);
- assertEquals(javaOutput.stdout, artOutput.stdout);
+ ProcessResult output = runRaw(app, CLASS_NAME);
+ assertEquals(0, output.exitCode);
+ assertEquals(javaOutput.stdout, output.stdout);
}
@Test
@@ -485,25 +517,25 @@
keepMainProguardConfiguration(CLASS_NAME),
"-useuniqueclassmembernames",
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, backend);
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject sup = codeInspector.clazz(SUPER_CLASS);
assertTrue(sup.isPresent());
- MethodSubject m1 = sup.method("java.lang.String", "same", ImmutableList.of());
+ MethodSubject m1 = sup.method("java.lang.String", REPEATED_NAME, ImmutableList.of());
assertTrue(m1.isPresent());
assertTrue(m1.isRenamed());
- MethodSubject m2 = sup.method("java.lang.Object", "same", ImmutableList.of());
+ MethodSubject m2 = sup.method("java.lang.Object", REPEATED_NAME, ImmutableList.of());
assertTrue(m2.isPresent());
assertTrue(m2.isRenamed());
assertEquals(m1.getFinalName(), m2.getFinalName());
ClassSubject sub = codeInspector.clazz(ANOTHER_CLASS);
assertTrue(sub.isPresent());
- MethodSubject subM1 = sub.method("java.lang.String", "same", ImmutableList.of());
+ MethodSubject subM1 = sub.method("java.lang.String", REPEATED_NAME, ImmutableList.of());
assertTrue(subM1.isPresent());
assertTrue(subM1.isRenamed());
- MethodSubject subM2 = sub.method("java.lang.Object", "same", ImmutableList.of());
+ MethodSubject subM2 = sub.method("java.lang.Object", REPEATED_NAME, ImmutableList.of());
assertTrue(subM2.isPresent());
assertTrue(subM2.isRenamed());
assertEquals(subM1.getFinalName(), subM2.getFinalName());
@@ -512,9 +544,9 @@
assertEquals(m1.getFinalName(), subM1.getFinalName());
assertEquals(m2.getFinalName(), subM2.getFinalName());
- ProcessResult artOutput = runOnArtRaw(app, CLASS_NAME);
- assertEquals(0, artOutput.exitCode);
- assertEquals(javaOutput.stdout, artOutput.stdout);
+ ProcessResult output = runRaw(app, CLASS_NAME);
+ assertEquals(0, output.exitCode);
+ assertEquals(javaOutput.stdout, output.stdout);
}
@Test
@@ -529,25 +561,25 @@
"-useuniqueclassmembernames",
"-overloadaggressively", // no-op
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, backend);
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject sup = codeInspector.clazz(SUPER_CLASS);
assertTrue(sup.isPresent());
- MethodSubject m1 = sup.method("java.lang.String", "same", ImmutableList.of());
+ MethodSubject m1 = sup.method("java.lang.String", REPEATED_NAME, ImmutableList.of());
assertTrue(m1.isPresent());
assertTrue(m1.isRenamed());
- MethodSubject m2 = sup.method("java.lang.Object", "same", ImmutableList.of());
+ MethodSubject m2 = sup.method("java.lang.Object", REPEATED_NAME, ImmutableList.of());
assertTrue(m2.isPresent());
assertTrue(m2.isRenamed());
assertEquals(m1.getFinalName(), m2.getFinalName());
ClassSubject sub = codeInspector.clazz(ANOTHER_CLASS);
assertTrue(sub.isPresent());
- MethodSubject subM1 = sub.method("java.lang.String", "same", ImmutableList.of());
+ MethodSubject subM1 = sub.method("java.lang.String", REPEATED_NAME, ImmutableList.of());
assertTrue(subM1.isPresent());
assertTrue(subM1.isRenamed());
- MethodSubject subM2 = sub.method("java.lang.Object", "same", ImmutableList.of());
+ MethodSubject subM2 = sub.method("java.lang.Object", REPEATED_NAME, ImmutableList.of());
assertTrue(subM2.isPresent());
assertTrue(subM2.isRenamed());
assertEquals(subM1.getFinalName(), subM2.getFinalName());
@@ -556,9 +588,9 @@
assertEquals(m1.getFinalName(), subM1.getFinalName());
assertEquals(m2.getFinalName(), subM2.getFinalName());
- ProcessResult artOutput = runOnArtRaw(app, CLASS_NAME);
- assertEquals(0, artOutput.exitCode);
- assertEquals(javaOutput.stdout, artOutput.stdout);
+ ProcessResult output = runRaw(app, CLASS_NAME);
+ assertEquals(0, output.exitCode);
+ assertEquals(javaOutput.stdout, output.stdout);
}
@Test
@@ -570,25 +602,25 @@
List<String> pgConfigs = ImmutableList.of(
keepMainProguardConfiguration(CLASS_NAME),
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, backend);
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject sup = codeInspector.clazz(SUPER_CLASS);
assertTrue(sup.isPresent());
- MethodSubject m1 = sup.method("java.lang.String", "same", ImmutableList.of());
+ MethodSubject m1 = sup.method("java.lang.String", REPEATED_NAME, ImmutableList.of());
assertTrue(m1.isPresent());
assertTrue(m1.isRenamed());
- MethodSubject m2 = sup.method("java.lang.Object", "same", ImmutableList.of());
+ MethodSubject m2 = sup.method("java.lang.Object", REPEATED_NAME, ImmutableList.of());
assertTrue(m2.isPresent());
assertTrue(m2.isRenamed());
assertNotEquals(m1.getFinalName(), m2.getFinalName());
ClassSubject sub = codeInspector.clazz(ANOTHER_CLASS);
assertTrue(sub.isPresent());
- MethodSubject subM1 = sub.method("java.lang.String", "same", ImmutableList.of());
+ MethodSubject subM1 = sub.method("java.lang.String", REPEATED_NAME, ImmutableList.of());
assertTrue(subM1.isPresent());
assertTrue(subM1.isRenamed());
- MethodSubject subM2 = sub.method("java.lang.Object", "same", ImmutableList.of());
+ MethodSubject subM2 = sub.method("java.lang.Object", REPEATED_NAME, ImmutableList.of());
assertTrue(subM2.isPresent());
assertTrue(subM2.isRenamed());
assertNotEquals(subM1.getFinalName(), subM2.getFinalName());
@@ -597,9 +629,11 @@
assertEquals(m1.getFinalName(), subM1.getFinalName());
assertEquals(m2.getFinalName(), subM2.getFinalName());
- ProcessResult artOutput = runOnArtRaw(app, CLASS_NAME);
- assertEquals(0, artOutput.exitCode);
- assertEquals(javaOutput.stdout, artOutput.stdout);
+ ProcessResult output = runRaw(app, CLASS_NAME);
+ assertEquals(0, output.exitCode);
+ assertEquals(
+ new HashSet<String>(StringUtils.splitLines(javaOutput.stdout)),
+ new HashSet<String>(StringUtils.splitLines(output.stdout)));
}
@Test
@@ -612,26 +646,26 @@
keepMainProguardConfiguration(CLASS_NAME),
"-overloadaggressively",
"-dontshrink");
- AndroidApp app = compileWithR8(builder, pgConfigs, null);
+ AndroidApp app = compileWithR8(builder, pgConfigs, null, backend);
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject sup = codeInspector.clazz(SUPER_CLASS);
assertTrue(sup.isPresent());
- MethodSubject m1 = sup.method("java.lang.String", "same", ImmutableList.of());
+ MethodSubject m1 = sup.method("java.lang.String", REPEATED_NAME, ImmutableList.of());
assertTrue(m1.isPresent());
assertTrue(m1.isRenamed());
- MethodSubject m2 = sup.method("java.lang.Object", "same", ImmutableList.of());
+ MethodSubject m2 = sup.method("java.lang.Object", REPEATED_NAME, ImmutableList.of());
assertTrue(m2.isPresent());
assertTrue(m2.isRenamed());
assertEquals(m1.getFinalName(), m2.getFinalName());
ClassSubject sub = codeInspector.clazz(ANOTHER_CLASS);
assertTrue(sub.isPresent());
- MethodSubject subM1 = sub.method("java.lang.String", "same", ImmutableList.of());
+ MethodSubject subM1 = sub.method("java.lang.String", REPEATED_NAME, ImmutableList.of());
assertTrue(subM1.isPresent());
assertTrue(subM1.isRenamed());
- MethodSubject subM2 = sub.method("java.lang.Object", "same", ImmutableList.of());
+ MethodSubject subM2 = sub.method("java.lang.Object", REPEATED_NAME, ImmutableList.of());
assertTrue(subM2.isPresent());
assertTrue(subM2.isRenamed());
assertEquals(subM1.getFinalName(), subM2.getFinalName());
@@ -640,8 +674,8 @@
assertEquals(m1.getFinalName(), subM1.getFinalName());
assertEquals(m2.getFinalName(), subM2.getFinalName());
- ProcessResult artOutput = runOnArtRaw(app, CLASS_NAME);
- assertEquals(0, artOutput.exitCode);
- assertEquals(javaOutput.stdout, artOutput.stdout);
+ ProcessResult output = runRaw(app, CLASS_NAME);
+ assertEquals(0, output.exitCode);
+ assertEquals(javaOutput.stdout, output.stdout);
}
}