Merge "Tests for -if rules after member renaming"
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index fa8ca13..4fa8738 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -761,7 +761,7 @@
while (enclosing.getEnclosingClass() != null) {
parts.set(parts.size() - 2, parts.get(parts.size() - 2) + "$" + parts.get(parts.size() - 1));
parts.remove(parts.size() - 1);
- enclosing = clazz.getEnclosingClass();
+ enclosing = enclosing.getEnclosingClass();
}
parts.set(parts.size() - 1, parts.get(parts.size() - 1) + ".class");
return parts;
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java
index b026c31..57ad556 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java
@@ -58,9 +58,6 @@
}
}
-// TODO(b/110141157):
-// - Add tests where fields and methods get renamed due to naming conflicts.
-// - Add tests where the then-clause of an -if rule keeps a class that has been merged into another.
@RunWith(Parameterized.class)
public class IfRuleWithVerticalClassMerging extends TestBase {
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java
index a877fec..7c85a7b 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java
@@ -4,6 +4,16 @@
package com.android.tools.r8.shaking.ifrule.verticalclassmerging;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.core.IsNot.not;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertThat;
+
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.google.common.collect.ImmutableList;
+
public class MergedFieldTypeTest extends MergedTypeBaseTest {
static class TestClass {
@@ -33,4 +43,69 @@
public String getExpectedStdout() {
return B.class.getName();
}
+
+ public static class MergedFieldTypeWithCollisionTest extends MergedTypeBaseTest {
+
+ static class SuperTestClass {
+
+ private A field = new B();
+
+ public A get() {
+ return field;
+ }
+ }
+
+ static class TestClass extends SuperTestClass {
+
+ private A field = null;
+
+ public static void main(String[] args) {
+ TestClass obj = new TestClass();
+ if (false) {
+ obj.field = new B();
+ System.out.println(obj.field);
+ }
+ System.out.print(obj.get().getClass().getName());
+ }
+ }
+
+ public MergedFieldTypeWithCollisionTest(Backend backend, boolean enableVerticalClassMerging) {
+ super(backend, enableVerticalClassMerging, ImmutableList.of(SuperTestClass.class));
+ }
+
+ @Override
+ public Class<?> getTestClass() {
+ return TestClass.class;
+ }
+
+ @Override
+ public String getConditionForProguardIfRule() {
+ return "-if class **$SuperTestClass { **$A field; }";
+ }
+
+ @Override
+ public String getExpectedStdout() {
+ return B.class.getName();
+ }
+
+ @Override
+ public void inspect(CodeInspector inspector) {
+ super.inspect(inspector);
+
+ ClassSubject testClassSubject = inspector.clazz(TestClass.class);
+ assertThat(testClassSubject, isPresent());
+
+ if (enableVerticalClassMerging) {
+ // Verify that SuperTestClass has been merged into TestClass.
+ assertThat(inspector.clazz(SuperTestClass.class), not(isPresent()));
+ assertEquals("java.lang.Object", testClassSubject.getDexClass().superType.toSourceString());
+
+ // Verify that TestClass.field has been removed.
+ assertEquals(1, testClassSubject.allFields().size());
+
+ // Verify that there was a naming conflict such that SuperTestClass.field was renamed.
+ assertNotEquals("field", testClassSubject.allFields().get(0).getFinalName());
+ }
+ }
+ }
}
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java
index 7447efd1..d8c1f29 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java
@@ -4,6 +4,19 @@
package com.android.tools.r8.shaking.ifrule.verticalclassmerging;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.core.IsNot.not;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertThat;
+
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import java.util.stream.Collectors;
+
public class MergedParameterTypeTest extends MergedTypeBaseTest {
static class TestClass {
@@ -35,4 +48,73 @@
public String getExpectedStdout() {
return B.class.getName();
}
+
+ public static class MergedParameterTypeWithCollisionTest extends MergedTypeBaseTest {
+
+ static class SuperTestClass {
+
+ public static void method(A obj) {
+ System.out.print(obj.getClass().getName());
+ }
+ }
+
+ static class TestClass extends SuperTestClass {
+
+ public static void main(String[] args) {
+ B obj = new B();
+ if (obj == null) {
+ TestClass.method(obj);
+ }
+ SuperTestClass.method(obj);
+ }
+
+ public static void method(A obj) {
+ System.out.print(obj.getClass().getName());
+ }
+ }
+
+ public MergedParameterTypeWithCollisionTest(
+ Backend backend, boolean enableVerticalClassMerging) {
+ super(backend, enableVerticalClassMerging, ImmutableList.of(SuperTestClass.class));
+ }
+
+ @Override
+ public Class<?> getTestClass() {
+ return TestClass.class;
+ }
+
+ @Override
+ public String getConditionForProguardIfRule() {
+ return "-if class **$SuperTestClass { void method(**$A); }";
+ }
+
+ @Override
+ public String getExpectedStdout() {
+ return B.class.getName();
+ }
+
+ @Override
+ public void inspect(CodeInspector inspector) {
+ super.inspect(inspector);
+
+ ClassSubject testClassSubject = inspector.clazz(TestClass.class);
+ assertThat(testClassSubject, isPresent());
+
+ if (enableVerticalClassMerging) {
+ // Verify that SuperTestClass has been merged into TestClass.
+ assertThat(inspector.clazz(SuperTestClass.class), not(isPresent()));
+ assertEquals("java.lang.Object", testClassSubject.getDexClass().superType.toSourceString());
+
+ // Verify that TestClass.method has been removed.
+ List<FoundMethodSubject> methods =
+ testClassSubject.allMethods().stream()
+ .filter(subject -> subject.getFinalName().contains("method"))
+ .collect(Collectors.toList());
+ assertEquals(1, methods.size());
+
+ // Verify that there was a naming conflict such that SuperTestClass.method was renamed.
+ assertNotEquals("method", methods.get(0).getFinalName());
+ }
+ }
+ }
}
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java
index da4a9f1..e1b071f 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java
@@ -4,6 +4,19 @@
package com.android.tools.r8.shaking.ifrule.verticalclassmerging;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.core.IsNot.not;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertThat;
+
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import java.util.stream.Collectors;
+
public class MergedReturnTypeTest extends MergedTypeBaseTest {
static class TestClass {
@@ -35,4 +48,72 @@
public String getExpectedStdout() {
return B.class.getName();
}
+
+ public static class MergedReturnTypeWithCollisionTest extends MergedTypeBaseTest {
+
+ static class SuperTestClass {
+
+ public static A method() {
+ return new B();
+ }
+ }
+
+ static class TestClass extends SuperTestClass {
+
+ public static void main(String[] args) {
+ B obj = new B();
+ if (obj == null) {
+ System.out.print(TestClass.method().getClass().getName());
+ }
+ System.out.print(SuperTestClass.method().getClass().getName());
+ }
+
+ public static A method() {
+ return new B();
+ }
+ }
+
+ public MergedReturnTypeWithCollisionTest(Backend backend, boolean enableVerticalClassMerging) {
+ super(backend, enableVerticalClassMerging, ImmutableList.of(SuperTestClass.class));
+ }
+
+ @Override
+ public Class<?> getTestClass() {
+ return TestClass.class;
+ }
+
+ @Override
+ public String getConditionForProguardIfRule() {
+ return "-if class **$SuperTestClass { **$A method(); }";
+ }
+
+ @Override
+ public String getExpectedStdout() {
+ return B.class.getName();
+ }
+
+ @Override
+ public void inspect(CodeInspector inspector) {
+ super.inspect(inspector);
+
+ ClassSubject testClassSubject = inspector.clazz(TestClass.class);
+ assertThat(testClassSubject, isPresent());
+
+ if (enableVerticalClassMerging) {
+ // Verify that SuperTestClass has been merged into TestClass.
+ assertThat(inspector.clazz(SuperTestClass.class), not(isPresent()));
+ assertEquals("java.lang.Object", testClassSubject.getDexClass().superType.toSourceString());
+
+ // Verify that TestClass.method has been removed.
+ List<FoundMethodSubject> methods =
+ testClassSubject.allMethods().stream()
+ .filter(subject -> subject.getFinalName().contains("method"))
+ .collect(Collectors.toList());
+ assertEquals(1, methods.size());
+
+ // Verify that there was a naming conflict such that SuperTestClass.method was renamed.
+ assertNotEquals("method", methods.get(0).getFinalName());
+ }
+ }
+ }
}
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedTypeBaseTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedTypeBaseTest.java
index ac341eb..2b9fec7 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedTypeBaseTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedTypeBaseTest.java
@@ -27,10 +27,6 @@
@RunWith(Parameterized.class)
public abstract class MergedTypeBaseTest extends TestBase {
- private final List<Class> CLASSES =
- ImmutableList.of(
- A.class, B.class, C.class, I.class, J.class, K.class, Unused.class, getTestClass());
-
static class A {}
static class B extends A {}
@@ -46,11 +42,22 @@
static class Unused {}
final Backend backend;
+ final List<Class> classes;
final boolean enableVerticalClassMerging;
public MergedTypeBaseTest(Backend backend, boolean enableVerticalClassMerging) {
+ this(backend, enableVerticalClassMerging, ImmutableList.of());
+ }
+
+ public MergedTypeBaseTest(
+ Backend backend, boolean enableVerticalClassMerging, List<Class<?>> additionalClasses) {
this.backend = backend;
this.enableVerticalClassMerging = enableVerticalClassMerging;
+ this.classes =
+ ImmutableList.<Class>builder()
+ .add(A.class, B.class, C.class, Unused.class, getTestClass())
+ .addAll(additionalClasses)
+ .build();
}
@Parameters(name = "Backend: {0}, vertical class merging: {1}")
@@ -96,7 +103,7 @@
getConditionForProguardIfRule(),
"-keep class " + Unused.class.getTypeName(),
getAdditionalKeepRules());
- AndroidApp output = compileWithR8(readClasses(CLASSES), config, this::configure, backend);
+ AndroidApp output = compileWithR8(readClasses(classes), config, this::configure, backend);
assertEquals(expected, runOnVM(output, getTestClass(), backend));
inspect(new CodeInspector(output));
}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
index 90013b0..e76991b 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
@@ -56,6 +56,12 @@
public abstract void forAllFields(Consumer<FoundFieldSubject> inspection);
+ public final List<FoundFieldSubject> allFields() {
+ ImmutableList.Builder<FoundFieldSubject> builder = ImmutableList.builder();
+ forAllFields(builder::add);
+ return builder.build();
+ }
+
public abstract FieldSubject field(String type, String name);
public FoundClassSubject asFoundClassSubject() {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
index 1d308fc..ed71b96 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
@@ -20,7 +20,6 @@
import com.android.tools.r8.naming.MemberNaming.Signature;
import com.android.tools.r8.naming.signature.GenericSignatureParser;
import com.android.tools.r8.utils.DescriptorUtils;
-import com.google.common.collect.ImmutableList;
import java.util.List;
import java.util.function.Consumer;
@@ -109,12 +108,6 @@
inspection);
}
- public List<FoundFieldSubject> allFields() {
- ImmutableList.Builder<FoundFieldSubject> builder = ImmutableList.builder();
- forAllFields(builder::add);
- return builder.build();
- }
-
@Override
public FieldSubject field(String type, String name) {
String obfuscatedType = codeInspector.getObfuscatedTypeName(type);