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);
         });
   }