Merge "Add two stages of error handling for applymapping"
diff --git a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
index e3eec3d..a60be5d 100644
--- a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
@@ -145,8 +145,6 @@
}
protected void checkFieldIsAbsent(ClassSubject classSubject, String fieldType, String fieldName) {
- // Field must NOT exist in the input.
- checkFieldPresenceInInput(classSubject.getOriginalName(), fieldType, fieldName, false);
FieldSubject fieldSubject = classSubject.field(fieldType, fieldName);
assertNotNull(fieldSubject);
assertFalse(fieldSubject.isPresent());
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinClassStaticizerTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinClassStaticizerTest.java
index 3f02c70..15015cd 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinClassStaticizerTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinClassStaticizerTest.java
@@ -4,15 +4,16 @@
package com.android.tools.r8.kotlin;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.core.IsNot.not;
+import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import java.util.concurrent.atomic.AtomicInteger;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
import org.junit.Test;
public class KotlinClassStaticizerTest extends AbstractR8KotlinTestBase {
@@ -28,32 +29,34 @@
final String mainClassName = "class_staticizer.MainKt";
// Without class staticizer.
- runTest("class_staticizer", mainClassName, false, (app) -> {
- CodeInspector inspector = new CodeInspector(app);
- assertTrue(inspector.clazz("class_staticizer.Regular$Companion").isPresent());
- assertTrue(inspector.clazz("class_staticizer.Derived$Companion").isPresent());
+ runTest(
+ "class_staticizer",
+ mainClassName,
+ false,
+ (app) -> {
+ CodeInspector inspector = new CodeInspector(app);
+ assertThat(inspector.clazz("class_staticizer.Regular$Companion"), not(isPresent()));
+ assertThat(inspector.clazz("class_staticizer.Derived$Companion"), not(isPresent()));
- ClassSubject utilClass = inspector.clazz("class_staticizer.Util");
- assertTrue(utilClass.isPresent());
- AtomicInteger nonStaticMethodCount = new AtomicInteger();
- utilClass.forAllMethods(method -> {
- if (!method.isStatic()) {
- nonStaticMethodCount.incrementAndGet();
- }
- });
- assertEquals(4, nonStaticMethodCount.get());
- });
+ ClassSubject utilClass = inspector.clazz("class_staticizer.Util");
+ assertThat(utilClass, isPresent());
+ assertTrue(utilClass.allMethods().stream().allMatch(FoundMethodSubject::isStatic));
+ });
// With class staticizer.
- runTest("class_staticizer", mainClassName, true, (app) -> {
- CodeInspector inspector = new CodeInspector(app);
- assertFalse(inspector.clazz("class_staticizer.Regular$Companion").isPresent());
- assertFalse(inspector.clazz("class_staticizer.Derived$Companion").isPresent());
+ runTest(
+ "class_staticizer",
+ mainClassName,
+ true,
+ (app) -> {
+ CodeInspector inspector = new CodeInspector(app);
+ assertThat(inspector.clazz("class_staticizer.Regular$Companion"), not(isPresent()));
+ assertThat(inspector.clazz("class_staticizer.Derived$Companion"), not(isPresent()));
- ClassSubject utilClass = inspector.clazz("class_staticizer.Util");
- assertTrue(utilClass.isPresent());
- utilClass.forAllMethods(method -> assertTrue(method.isStatic()));
- });
+ ClassSubject utilClass = inspector.clazz("class_staticizer.Util");
+ assertThat(utilClass, isPresent());
+ assertTrue(utilClass.allMethods().stream().allMatch(FoundMethodSubject::isStatic));
+ });
}
protected void runTest(String folder, String mainClass,
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
index 0048b1b..5630c1f 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
@@ -75,28 +75,31 @@
final TestKotlinCompanionClass testedClass = COMPANION_PROPERTY_CLASS;
String mainClass = addMainToClasspath("properties.CompanionPropertiesKt",
"companionProperties_usePrimitiveProp");
- runTest(PROPERTIES_PACKAGE_NAME, mainClass, disableClassStaticizer, (app) -> {
- CodeInspector codeInspector = new CodeInspector(app);
- ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
- String propertyName = "primitiveProp";
- FieldSubject fieldSubject = checkFieldIsKept(outerClass, "int", propertyName);
- assertTrue(fieldSubject.getField().accessFlags.isStatic());
+ runTest(
+ PROPERTIES_PACKAGE_NAME,
+ mainClass,
+ disableClassStaticizer,
+ (app) -> {
+ CodeInspector codeInspector = new CodeInspector(app);
+ ClassSubject outerClass =
+ checkClassIsKept(codeInspector, testedClass.getOuterClassName());
+ String propertyName = "primitiveProp";
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, "int", propertyName);
+ assertTrue(fieldSubject.getField().accessFlags.isStatic());
- MemberNaming.MethodSignature getterAccessor = testedClass
- .getGetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
- MemberNaming.MethodSignature setterAccessor = testedClass
- .getSetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
+ MemberNaming.MethodSignature getterAccessor =
+ testedClass.getGetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
+ MemberNaming.MethodSignature setterAccessor =
+ testedClass.getSetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
+ checkMethodIsRemoved(outerClass, getterAccessor);
+ checkMethodIsRemoved(outerClass, setterAccessor);
- if (allowAccessModification) {
- assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsRemoved(outerClass, getterAccessor);
- checkMethodIsRemoved(outerClass, setterAccessor);
- } else {
- assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsKept(outerClass, getterAccessor);
- checkMethodIsKept(outerClass, setterAccessor);
- }
- });
+ if (allowAccessModification) {
+ assertTrue(fieldSubject.getField().accessFlags.isPublic());
+ } else {
+ assertTrue(fieldSubject.getField().accessFlags.isPrivate());
+ }
+ });
}
@Test
@@ -104,29 +107,31 @@
final TestKotlinCompanionClass testedClass = COMPANION_PROPERTY_CLASS;
String mainClass = addMainToClasspath("properties.CompanionPropertiesKt",
"companionProperties_usePrivateProp");
- runTest(PROPERTIES_PACKAGE_NAME, mainClass, disableClassStaticizer, (app) -> {
- CodeInspector codeInspector = new CodeInspector(app);
- ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
- String propertyName = "privateProp";
- FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
- assertTrue(fieldSubject.getField().accessFlags.isStatic());
+ runTest(
+ PROPERTIES_PACKAGE_NAME,
+ mainClass,
+ disableClassStaticizer,
+ (app) -> {
+ CodeInspector codeInspector = new CodeInspector(app);
+ ClassSubject outerClass =
+ checkClassIsKept(codeInspector, testedClass.getOuterClassName());
+ String propertyName = "privateProp";
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
+ assertTrue(fieldSubject.getField().accessFlags.isStatic());
- MemberNaming.MethodSignature getterAccessor = testedClass
- .getGetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
- MemberNaming.MethodSignature setterAccessor = testedClass
- .getSetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
- if (allowAccessModification) {
- assertTrue(fieldSubject.getField().accessFlags.isPublic());
+ MemberNaming.MethodSignature getterAccessor =
+ testedClass.getGetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
+ MemberNaming.MethodSignature setterAccessor =
+ testedClass.getSetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
+ checkMethodIsRemoved(outerClass, getterAccessor);
+ checkMethodIsRemoved(outerClass, setterAccessor);
- checkMethodIsRemoved(outerClass, getterAccessor);
- checkMethodIsRemoved(outerClass, setterAccessor);
- } else {
- assertTrue(fieldSubject.getField().accessFlags.isPrivate());
-
- checkMethodIsKept(outerClass, getterAccessor);
- checkMethodIsKept(outerClass, setterAccessor);
- }
- });
+ if (allowAccessModification) {
+ assertTrue(fieldSubject.getField().accessFlags.isPublic());
+ } else {
+ assertTrue(fieldSubject.getField().accessFlags.isPrivate());
+ }
+ });
}
@Test
@@ -134,28 +139,31 @@
final TestKotlinCompanionClass testedClass = COMPANION_PROPERTY_CLASS;
String mainClass = addMainToClasspath("properties.CompanionPropertiesKt",
"companionProperties_useInternalProp");
- runTest(PROPERTIES_PACKAGE_NAME, mainClass, disableClassStaticizer, (app) -> {
- CodeInspector codeInspector = new CodeInspector(app);
- ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
- String propertyName = "internalProp";
- FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
- assertTrue(fieldSubject.getField().accessFlags.isStatic());
+ runTest(
+ PROPERTIES_PACKAGE_NAME,
+ mainClass,
+ disableClassStaticizer,
+ (app) -> {
+ CodeInspector codeInspector = new CodeInspector(app);
+ ClassSubject outerClass =
+ checkClassIsKept(codeInspector, testedClass.getOuterClassName());
+ String propertyName = "internalProp";
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
+ assertTrue(fieldSubject.getField().accessFlags.isStatic());
- MemberNaming.MethodSignature getterAccessor = testedClass
- .getGetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
- MemberNaming.MethodSignature setterAccessor = testedClass
- .getSetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
+ MemberNaming.MethodSignature getterAccessor =
+ testedClass.getGetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
+ MemberNaming.MethodSignature setterAccessor =
+ testedClass.getSetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
+ checkMethodIsRemoved(outerClass, getterAccessor);
+ checkMethodIsRemoved(outerClass, setterAccessor);
- if (allowAccessModification) {
- assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsRemoved(outerClass, getterAccessor);
- checkMethodIsRemoved(outerClass, setterAccessor);
- } else {
- assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsKept(outerClass, getterAccessor);
- checkMethodIsKept(outerClass, setterAccessor);
- }
- });
+ if (allowAccessModification) {
+ assertTrue(fieldSubject.getField().accessFlags.isPublic());
+ } else {
+ assertTrue(fieldSubject.getField().accessFlags.isPrivate());
+ }
+ });
}
@Test
@@ -163,28 +171,31 @@
final TestKotlinCompanionClass testedClass = COMPANION_PROPERTY_CLASS;
String mainClass = addMainToClasspath("properties.CompanionPropertiesKt",
"companionProperties_usePublicProp");
- runTest(PROPERTIES_PACKAGE_NAME, mainClass, disableClassStaticizer, (app) -> {
- CodeInspector codeInspector = new CodeInspector(app);
- ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
- String propertyName = "publicProp";
- FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
- assertTrue(fieldSubject.getField().accessFlags.isStatic());
+ runTest(
+ PROPERTIES_PACKAGE_NAME,
+ mainClass,
+ disableClassStaticizer,
+ (app) -> {
+ CodeInspector codeInspector = new CodeInspector(app);
+ ClassSubject outerClass =
+ checkClassIsKept(codeInspector, testedClass.getOuterClassName());
+ String propertyName = "publicProp";
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
+ assertTrue(fieldSubject.getField().accessFlags.isStatic());
- MemberNaming.MethodSignature getterAccessor = testedClass
- .getGetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
- MemberNaming.MethodSignature setterAccessor = testedClass
- .getSetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
+ MemberNaming.MethodSignature getterAccessor =
+ testedClass.getGetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
+ MemberNaming.MethodSignature setterAccessor =
+ testedClass.getSetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
+ checkMethodIsRemoved(outerClass, getterAccessor);
+ checkMethodIsRemoved(outerClass, setterAccessor);
- if (allowAccessModification) {
- assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsRemoved(outerClass, getterAccessor);
- checkMethodIsRemoved(outerClass, setterAccessor);
- } else {
- assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsKept(outerClass, getterAccessor);
- checkMethodIsKept(outerClass, setterAccessor);
- }
- });
+ if (allowAccessModification) {
+ assertTrue(fieldSubject.getField().accessFlags.isPublic());
+ } else {
+ assertTrue(fieldSubject.getField().accessFlags.isPrivate());
+ }
+ });
}
@Test
@@ -192,27 +203,32 @@
final TestKotlinCompanionClass testedClass = COMPANION_LATE_INIT_PROPERTY_CLASS;
String mainClass = addMainToClasspath("properties.CompanionLateInitPropertiesKt",
"companionLateInitProperties_usePrivateLateInitProp");
- runTest(PROPERTIES_PACKAGE_NAME, mainClass, disableClassStaticizer, (app) -> {
- CodeInspector codeInspector = new CodeInspector(app);
- ClassSubject outerClass = checkClassIsKept(codeInspector, testedClass.getOuterClassName());
- String propertyName = "privateLateInitProp";
- FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
- assertTrue(fieldSubject.getField().accessFlags.isStatic());
+ runTest(
+ PROPERTIES_PACKAGE_NAME,
+ mainClass,
+ disableClassStaticizer,
+ (app) -> {
+ CodeInspector codeInspector = new CodeInspector(app);
+ ClassSubject outerClass =
+ checkClassIsKept(codeInspector, testedClass.getOuterClassName());
+ String propertyName = "privateLateInitProp";
+ FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
+ assertTrue(fieldSubject.getField().accessFlags.isStatic());
- MemberNaming.MethodSignature getterAccessor = testedClass
- .getGetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
- MemberNaming.MethodSignature setterAccessor = testedClass
- .getSetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
- if (allowAccessModification) {
- assertTrue(fieldSubject.getField().accessFlags.isPublic());
- checkMethodIsRemoved(outerClass, getterAccessor);
- checkMethodIsRemoved(outerClass, setterAccessor);
- } else {
- assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- checkMethodIsKept(outerClass, getterAccessor);
- checkMethodIsKept(outerClass, setterAccessor);
- }
- });
+ MemberNaming.MethodSignature getterAccessor =
+ testedClass.getGetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
+ MemberNaming.MethodSignature setterAccessor =
+ testedClass.getSetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
+ checkMethodIsRemoved(outerClass, setterAccessor);
+
+ if (allowAccessModification) {
+ assertTrue(fieldSubject.getField().accessFlags.isPublic());
+ checkMethodIsRemoved(outerClass, getterAccessor);
+ } else {
+ assertTrue(fieldSubject.getField().accessFlags.isPrivate());
+ checkMethodIsKept(outerClass, getterAccessor);
+ }
+ });
}
@Test
@@ -276,23 +292,18 @@
CodeInspector codeInspector = new CodeInspector(app);
ClassSubject outerClass =
checkClassIsKept(codeInspector, testedClass.getOuterClassName());
- ClassSubject companionClass = checkClassIsKept(codeInspector, testedClass.getClassName());
+
+ // Companion class has been removed because of class staticizing.
+ String companionClassName = testedClass.getClassName();
+ checkClassIsRemoved(codeInspector, companionClassName);
+
String propertyName = "property";
- FieldSubject fieldSubject = checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName);
- assertTrue(fieldSubject.getField().accessFlags.isStatic());
+ checkFieldIsAbsent(outerClass, JAVA_LANG_STRING, propertyName);
// The getter is always inlined since it just calls into the accessor.
- MemberNaming.MethodSignature getter = testedClass.getGetterForProperty(propertyName);
- checkMethodIsAbsent(companionClass, getter);
-
MemberNaming.MethodSignature getterAccessor =
testedClass.getGetterAccessorForProperty(propertyName, AccessorKind.FROM_COMPANION);
- if (allowAccessModification) {
- assertTrue(fieldSubject.getField().accessFlags.isPublic());
- } else {
- assertTrue(fieldSubject.getField().accessFlags.isPrivate());
- }
- checkMethodIsKept(outerClass, getterAccessor);
+ checkMethodIsRemoved(outerClass, getterAccessor);
});
}