Revert "Prune class-retention attributes from DEX inputs."

This reverts commit 4f82a1e7ca82239ad9a6396ad3ca6f4ce03484ec.

Reason for revert: Appears to break Art005_annotationsTest.

Change-Id: I646e65bda59ce73e2a94bda54d2f4be42306212b
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
index 315c217..3c239c8 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
@@ -228,7 +228,7 @@
           if (options.passthroughDexCode) {
             computedMinApiLevel = validateOrComputeMinApiLevel(computedMinApiLevel, dexReader);
           }
-          dexParsers.add(new DexParser(dexReader, classKind, options));
+          dexParsers.add(new DexParser(dexReader, classKind, itemFactory, options.reporter));
         }
         options.minApiLevel = computedMinApiLevel;
         for (DexParser dexParser : dexParsers) {
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index 3ef485f..1760ca4 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -8,6 +8,7 @@
 import static com.android.tools.r8.utils.EncodedValueUtils.parseSigned;
 import static com.android.tools.r8.utils.EncodedValueUtils.parseUnsigned;
 
+import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.ProgramResource.Kind;
 import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.code.InstructionFactory;
@@ -58,7 +59,6 @@
 import com.android.tools.r8.logging.Log;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.origin.PathOrigin;
-import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Pair;
 import com.google.common.io.ByteStreams;
 import it.unimi.dsi.fastutil.ints.Int2IntArrayMap;
@@ -85,7 +85,7 @@
   private final DexSection[] dexSections;
   private int[] stringIDs;
   private final ClassKind classKind;
-  private final InternalOptions options;
+  private final DiagnosticsHandler reporter;
 
   public static DexSection[] parseMapFrom(Path file) throws IOException {
     return parseMapFrom(Files.newInputStream(file), new PathOrigin(file));
@@ -96,7 +96,9 @@
   }
 
   private static DexSection[] parseMapFrom(DexReader dexReader) {
-    DexParser dexParser = new DexParser(dexReader, ClassKind.PROGRAM, new InternalOptions());
+    DexParser dexParser =
+        new DexParser(
+            dexReader, ClassKind.PROGRAM, new DexItemFactory(), new DiagnosticsHandler() {});
     return dexParser.dexSections;
   }
 
@@ -121,16 +123,17 @@
   // Factory to canonicalize certain dexitems.
   private final DexItemFactory dexItemFactory;
 
-  public DexParser(DexReader dexReader, ClassKind classKind, InternalOptions options) {
+  public DexParser(DexReader dexReader,
+      ClassKind classKind, DexItemFactory dexItemFactory, DiagnosticsHandler reporter) {
     assert dexReader.getOrigin() != null;
     this.origin = dexReader.getOrigin();
     this.dexReader = dexReader;
-    this.dexItemFactory = options.itemFactory;
+    this.dexItemFactory = dexItemFactory;
     dexReader.setByteOrder();
     dexSections = parseMap();
     parseStringIDs();
     this.classKind = classKind;
-    this.options = options;
+    this.reporter = reporter;
   }
 
   private void ensureCodesInited() {
@@ -423,17 +426,8 @@
       annotationOffsets[i] = dexReader.getUint();
     }
     DexAnnotation[] result = new DexAnnotation[size];
-    int actualSize = 0;
     for (int i = 0; i < size; i++) {
-      DexAnnotation dexAnnotation = annotationAt(annotationOffsets[i]);
-      if (retainAnnotation(dexAnnotation)) {
-        result[actualSize++] = dexAnnotation;
-      }
-    }
-    if (actualSize < size) {
-      DexAnnotation[] temp = new DexAnnotation[actualSize];
-      System.arraycopy(result, 0, temp, 0, actualSize);
-      result = temp;
+      result[i] = annotationAt(annotationOffsets[i]);
     }
     DexType dupType = DexAnnotationSet.findDuplicateEntryType(result);
     if (dupType != null) {
@@ -443,11 +437,6 @@
     return new DexAnnotationSet(result);
   }
 
-  private boolean retainAnnotation(DexAnnotation annotation) {
-    return annotation.visibility != DexAnnotation.VISIBILITY_BUILD
-        || DexAnnotation.retainCompileTimeAnnotation(annotation.annotation.type, options);
-  }
-
   private DexAnnotationSet annotationSetAt(int offset) {
     return (DexAnnotationSet) cacheAt(offset, this::parseAnnotationSet, DexAnnotationSet::empty);
   }
@@ -702,7 +691,7 @@
       }
 
       AttributesAndAnnotations attrs =
-          new AttributesAndAnnotations(type, annotationsDirectory.clazz, options.itemFactory);
+          new AttributesAndAnnotations(type, annotationsDirectory.clazz, dexItemFactory);
 
       DexClass clazz =
           classKind.create(
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
index c3d914f..6fc1e1d 100644
--- a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
+++ b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
@@ -13,8 +13,6 @@
 import com.android.tools.r8.graph.DexValue.DexValueNull;
 import com.android.tools.r8.graph.DexValue.DexValueString;
 import com.android.tools.r8.graph.DexValue.DexValueType;
-import com.android.tools.r8.ir.desugar.CovariantReturnTypeAnnotationTransformer;
-import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Pair;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -69,24 +67,6 @@
     mixedItems.add(this);
   }
 
-  public static boolean retainCompileTimeAnnotation(DexType annotation, InternalOptions options) {
-    if (options.readCompileTimeAnnotations) {
-      return true;
-    }
-    if (annotation == options.itemFactory.dalvikFastNativeAnnotation
-        || annotation == options.itemFactory.dalvikCriticalNativeAnnotation
-        || annotation == options.itemFactory.annotationSynthesizedClassMap) {
-      return true;
-    }
-    if (options.processCovariantReturnTypeAnnotations) {
-      // @CovariantReturnType annotations are processed by CovariantReturnTypeAnnotationTransformer,
-      // they thus need to be read here and will then be removed as part of the processing.
-      return CovariantReturnTypeAnnotationTransformer.isCovariantReturnTypeAnnotation(
-          annotation, options.itemFactory);
-    }
-    return false;
-  }
-
   public static DexAnnotation createEnclosingClassAnnotation(DexType enclosingClass,
       DexItemFactory factory) {
     return createSystemValueAnnotation(factory.annotationEnclosingClass, factory,
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index 87777e3..16e9d44 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -29,6 +29,7 @@
 import com.android.tools.r8.graph.DexValue.DexValueShort;
 import com.android.tools.r8.graph.DexValue.DexValueString;
 import com.android.tools.r8.graph.DexValue.DexValueType;
+import com.android.tools.r8.ir.desugar.CovariantReturnTypeAnnotationTransformer;
 import com.android.tools.r8.jar.CfApplicationWriter;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.shaking.ProguardKeepAttributes;
@@ -167,9 +168,21 @@
 
   private static boolean retainCompileTimeAnnotation(
       String desc, JarApplicationReader application) {
-    return application.options.readCompileTimeAnnotations
-        || DexAnnotation.retainCompileTimeAnnotation(
-            application.getTypeFromDescriptor(desc), application.options);
+    if (application.options.readCompileTimeAnnotations) {
+      return true;
+    }
+    DexType type = application.getTypeFromDescriptor(desc);
+    if (type == application.options.itemFactory.dalvikFastNativeAnnotation
+        || type == application.options.itemFactory.dalvikCriticalNativeAnnotation) {
+      return true;
+    }
+    if (application.options.processCovariantReturnTypeAnnotations) {
+      // @CovariantReturnType annotations are processed by CovariantReturnTypeAnnotationTransformer,
+      // they thus need to be read here and will then be removed as part of the processing.
+      return CovariantReturnTypeAnnotationTransformer.isCovariantReturnTypeAnnotation(
+          type, application.options.itemFactory);
+    }
+    return false;
   }
 
   private static DexEncodedAnnotation createEncodedAnnotation(String desc,
diff --git a/src/test/java/com/android/tools/r8/annotations/RetentionPolicyTest.java b/src/test/java/com/android/tools/r8/annotations/RetentionPolicyTest.java
index 1509320..be166ec 100644
--- a/src/test/java/com/android/tools/r8/annotations/RetentionPolicyTest.java
+++ b/src/test/java/com/android/tools/r8/annotations/RetentionPolicyTest.java
@@ -9,8 +9,8 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.D8TestCompileResult;
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestBuilder;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
@@ -43,7 +43,7 @@
         .flatMap(
             parameters -> {
               if (parameters.isCfRuntime()) {
-                return Stream.of((Object) new Object[] {parameters, true});
+                return Stream.of((Object) new Object[] {parameters, false});
               }
               return Stream.of(new Object[] {parameters, true}, new Object[] {parameters, false});
             })
@@ -81,48 +81,26 @@
 
   @Test
   public void test() throws Exception {
-    if (parameters.isCfRuntime()) {
-      assertTrue(intermediate);
-      checkAnnotations(
-          testForJvm()
-              .addProgramClasses(CLASSES)
-              .run(parameters.getRuntime(), A.class)
-              .assertSuccessWithOutput(EXPECTED)
-              .inspector(),
-          intermediate);
-    } else {
-      D8TestCompileResult compile =
-          testForD8()
-              .setMinApi(parameters.getRuntime())
-              .setIntermediate(intermediate)
-              .addProgramClasses(CLASSES)
-              .compile();
-      checkAnnotations(
-          compile
-              .run(parameters.getRuntime(), A.class)
-              .assertSuccessWithOutput(EXPECTED)
-              .inspector(),
-          intermediate);
-      // If the first build was an intermediate, re-compile and check the final output.
-      if (intermediate) {
-        checkAnnotations(
-            testForD8()
-                .setMinApi(parameters.getRuntime())
-                .addProgramFiles(compile.writeToZip())
-                .run(parameters.getRuntime(), A.class)
-                .inspector(),
-            false);
-      }
-    }
-  }
+    TestBuilder<?, ?> testBuilder =
+        parameters.isCfRuntime()
+            ? testForJvm()
+            : testForD8().setMinApi(parameters.getRuntime()).setIntermediate(intermediate);
 
-  private static void checkAnnotations(CodeInspector inspector, boolean isClassRetained) {
+    CodeInspector inspector =
+        testBuilder
+            .addProgramClasses(CLASSES)
+            .run(parameters.getRuntime(), A.class)
+            .assertSuccessWithOutput(EXPECTED)
+            .inspector();
+
     ClassSubject clazz = inspector.clazz(A.class);
     assertThat(clazz, isPresent());
     // Source retained annotations are always gone, even in the CF inputs.
     assertFalse(clazz.annotation(SourceRetained.class.getName()).isPresent());
     // Class retained annotations are present in CF and in intermediate builds.
-    assertEquals(isClassRetained, clazz.annotation(ClassRetained.class.getName()).isPresent());
+    assertEquals(
+        parameters.isCfRuntime() || intermediate,
+        clazz.annotation(ClassRetained.class.getName()).isPresent());
     // Runtime retained annotations are present in all.
     assertTrue(clazz.annotation(RuntimeRetained.class.getName()).isPresent());
   }