Rewrite all R8 uses of libraryTypesAssumedToBePresent

Change-Id: I39d198ba2b66a2b82b11f5a1fbdd64f79091fc59
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
index e750ab3..7ac70e7 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
@@ -140,12 +140,7 @@
 
     // Check if the type is guaranteed to be present.
     DexClass clazz = appView.definitionFor(baseType);
-    if (clazz == null) {
-      return true;
-    }
-
-    if (clazz.isLibraryClass()
-        && !appView.dexItemFactory().libraryTypesAssumedToBePresent.contains(baseType)) {
+    if (clazz == null || !clazz.isResolvable(appView)) {
       return true;
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
index 9bc1728..5a3a1118 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
@@ -183,16 +183,10 @@
 
     // Check if the type is guaranteed to be present.
     DexClass clazz = appView.definitionFor(baseType);
-    if (clazz == null) {
+    if (clazz == null || !clazz.isResolvable(appView)) {
       return true;
     }
 
-    if (clazz.isLibraryClass()) {
-      if (!appView.dexItemFactory().libraryTypesAssumedToBePresent.contains(baseType)) {
-        return true;
-      }
-    }
-
     // Check if the type is guaranteed to be accessible.
     if (AccessControl.isClassAccessible(clazz, context, appViewWithClassHierarchy)
         .isPossiblyFalse()) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
index d6c938d..236bd0a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
@@ -170,12 +170,7 @@
     }
 
     DexClass definition = appView.definitionFor(clazz);
-    if (definition == null || definition.accessFlags.isAbstract()) {
-      return true;
-    }
-
-    if (definition.isLibraryClass()
-        && !dexItemFactory.libraryTypesAssumedToBePresent.contains(clazz)) {
+    if (definition == null || definition.isAbstract() || !definition.isResolvable(appView)) {
       return true;
     }
 
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java b/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java
index da8353b..2c3b88b 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java
@@ -114,7 +114,9 @@
       LibraryDefinition definition,
       AndroidApiLevelCompute androidApiLevelCompute,
       InternalOptions options) {
-    assert options.apiModelingOptions().enableApiCallerIdentification;
+    if (!options.apiModelingOptions().enableApiCallerIdentification) {
+      return false;
+    }
     ComputedApiLevel apiLevel =
         androidApiLevelCompute.computeApiLevelForLibraryReference(
             definition.getReference(), ComputedApiLevel.unknown());
diff --git a/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java b/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
index 6df7b0a..5a16cf6 100644
--- a/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
@@ -10,6 +10,7 @@
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 
 import com.android.tools.r8.R8;
 import com.android.tools.r8.R8FullTestBuilder;
@@ -232,7 +233,7 @@
             .apply(this::suppressZipFileAssignmentsToJavaLangAutoCloseable)
             .compile()
             .graphInspector();
-    assertRetainedClassesEqual(referenceInspector, ifThenKeepClassMembersInspector);
+    assertRetainedClassesEqual(referenceInspector, ifThenKeepClassMembersInspector, true);
 
     GraphInspector ifThenKeepClassesWithMembersInspector =
         testForR8(Backend.CF)
@@ -251,7 +252,7 @@
             .apply(this::suppressZipFileAssignmentsToJavaLangAutoCloseable)
             .compile()
             .graphInspector();
-    assertRetainedClassesEqual(referenceInspector, ifThenKeepClassesWithMembersInspector);
+    assertRetainedClassesEqual(referenceInspector, ifThenKeepClassesWithMembersInspector, true);
 
     GraphInspector ifHasMemberThenKeepClassInspector =
         testForR8(Backend.CF)
@@ -272,7 +273,7 @@
             .apply(this::suppressZipFileAssignmentsToJavaLangAutoCloseable)
             .compile()
             .graphInspector();
-    assertRetainedClassesEqual(referenceInspector, ifHasMemberThenKeepClassInspector);
+    assertRetainedClassesEqual(referenceInspector, ifHasMemberThenKeepClassInspector, true);
   }
 
   private void configureHorizontalClassMerging(R8FullTestBuilder testBuilder) {
@@ -292,6 +293,13 @@
 
   private void assertRetainedClassesEqual(
       GraphInspector referenceResult, GraphInspector conditionalResult) {
+    assertRetainedClassesEqual(referenceResult, conditionalResult, false);
+  }
+
+  private void assertRetainedClassesEqual(
+      GraphInspector referenceResult,
+      GraphInspector conditionalResult,
+      boolean expectConditionalIsLarger) {
     Set<String> referenceClasses =
         new TreeSet<>(
             referenceResult.codeInspector().allClasses().stream()
@@ -303,10 +311,14 @@
             .collect(Collectors.toSet());
     Set<String> notInReference =
         new TreeSet<>(Sets.difference(conditionalClasses, referenceClasses));
-    assertEquals(
-        "Classes in -if rule that are not in -keepclassmembers rule",
-        Collections.emptySet(),
-        notInReference);
+    if (expectConditionalIsLarger) {
+      assertFalse("Expected classes in -if rule to retain more.", notInReference.isEmpty());
+    } else {
+      assertEquals(
+          "Classes in -if rule that are not in -keepclassmembers rule",
+          Collections.emptySet(),
+          notInReference);
+    }
     Set<String> notInConditional =
         new TreeSet<>(Sets.difference(referenceClasses, conditionalClasses));
     assertEquals(
diff --git a/src/test/java/com/android/tools/r8/smali/OutlineTest.java b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
index 56435ed..da3ef50 100644
--- a/src/test/java/com/android/tools/r8/smali/OutlineTest.java
+++ b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
@@ -46,7 +46,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.function.Consumer;
 import org.junit.Assert;
@@ -1384,14 +1383,8 @@
               opts.outline.minSize = 3;
               opts.outline.maxSize = 3;
 
-              // Do not allow dead code elimination of the new-instance instructions. This can be
-              // achieved
-              // by not assuming that StringBuilder is present.
-              DexItemFactory dexItemFactory = opts.itemFactory;
-              opts.itemFactory.libraryTypesAssumedToBePresent =
-                  new HashSet<>(dexItemFactory.libraryTypesAssumedToBePresent);
-              dexItemFactory.libraryTypesAssumedToBePresent.remove(
-                  dexItemFactory.stringBuilderType);
+              // Do not allow dead code elimination of the new-instance instructions.
+              opts.apiModelingOptions().enableApiCallerIdentification = false;
             });
 
     AndroidApp originalApplication = buildApplicationWithAndroidJar(builder);