Merge "Revert "Define distinct access-flag types for classes, methods and fields.""
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index d24eb43..fef695e 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -35,6 +35,7 @@
     private Optional<Boolean> treeShaking = Optional.empty();
     private Optional<Boolean> discardedChecker = Optional.empty();
     private Optional<Boolean> minification = Optional.empty();
+    private boolean ignoreMissingClassesWhenNotShrinking = false;
     private boolean ignoreMissingClasses = false;
     private boolean forceProguardCompatibility = false;
     private Path proguardMapOutput = null;
@@ -43,9 +44,12 @@
       super(CompilationMode.RELEASE);
     }
 
-    protected Builder(boolean ignoreDexInArchive, boolean forceProguardCompatibility) {
+    protected Builder(boolean ignoreDexInArchive, boolean forceProguardCompatibility,
+        boolean ignoreMissingClassesWhenNotShrinking, boolean ignoreMissingClasses) {
       super(CompilationMode.RELEASE, ignoreDexInArchive);
       this.forceProguardCompatibility = forceProguardCompatibility;
+      this.ignoreMissingClassesWhenNotShrinking = ignoreMissingClassesWhenNotShrinking;
+      this.ignoreMissingClasses = ignoreMissingClasses;
     }
 
     private Builder(AndroidApp app) {
@@ -256,6 +260,7 @@
           useMinification,
           ignoreMissingClasses,
           forceProguardCompatibility,
+          ignoreMissingClassesWhenNotShrinking,
           proguardMapOutput);
     }
   }
@@ -297,6 +302,7 @@
   private final boolean useMinification;
   private final boolean ignoreMissingClasses;
   private final boolean forceProguardCompatibility;
+  private final boolean ignoreMissingClassesWhenNotShrinking;
   private final Path proguardMapOutput;
 
   public static Builder builder() {
@@ -415,6 +421,7 @@
       boolean useMinification,
       boolean ignoreMissingClasses,
       boolean forceProguardCompatibility,
+      boolean ignoreMissingClassesWhenNotShrinking,
       Path proguardMapOutput) {
     super(inputApp, outputPath, outputMode, mode, minApiLevel, diagnosticsHandler,
         enableDesugaring);
@@ -429,6 +436,7 @@
     this.useMinification = useMinification;
     this.ignoreMissingClasses = ignoreMissingClasses;
     this.forceProguardCompatibility = forceProguardCompatibility;
+    this.ignoreMissingClassesWhenNotShrinking = ignoreMissingClassesWhenNotShrinking;
     this.proguardMapOutput = proguardMapOutput;
   }
 
@@ -442,6 +450,7 @@
     useMinification = false;
     ignoreMissingClasses = false;
     forceProguardCompatibility = false;
+    ignoreMissingClassesWhenNotShrinking = false;
     proguardMapOutput = null;
   }
   public boolean useTreeShaking() {
@@ -479,6 +488,9 @@
     assert !internal.ignoreMissingClasses;
     internal.ignoreMissingClasses = ignoreMissingClasses;
     internal.ignoreMissingClasses |= proguardConfiguration.isIgnoreWarnings();
+    internal.ignoreMissingClasses |=
+        ignoreMissingClassesWhenNotShrinking && !proguardConfiguration.isShrinking();
+
     assert !internal.verbose;
     internal.mainDexKeepRules = mainDexKeepRules;
     internal.minimalMainDex = internal.debug;
diff --git a/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java b/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java
index 2120714..e904e53 100644
--- a/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java
+++ b/src/main/java/com/android/tools/r8/benchmarks/FrameworkIncrementalDexingBenchmark.java
@@ -22,6 +22,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.ByteStreams;
 import java.io.IOException;
+import java.io.InputStream;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
@@ -174,7 +175,9 @@
       throws IOException, CompilationException {
     List<byte[]> bytes = new ArrayList<>(outputs.size());
     for (Resource input : outputs.values()) {
-      bytes.add(ByteStreams.toByteArray(input.getStream()));
+      try (InputStream inputStream = input.getStream()) {
+        bytes.add(ByteStreams.toByteArray(inputStream));
+      }
     }
     long start = System.nanoTime();
     D8Output out =
diff --git a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
index 4c49a6a..a6b45ae 100644
--- a/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
+++ b/src/main/java/com/android/tools/r8/compatproguard/CompatProguard.java
@@ -33,14 +33,16 @@
     public final String output;
     public final int minApi;
     public final boolean forceProguardCompatibility;
+    public final boolean ignoreMissingClasses;
     public final boolean multiDex;
     public final List<String> proguardConfig;
 
     CompatProguardOptions(List<String> proguardConfig, String output, int minApi,
-        boolean multiDex, boolean forceProguardCompatibility) {
+        boolean multiDex, boolean forceProguardCompatibility, boolean ignoreMissingClasses) {
       this.output = output;
       this.minApi = minApi;
       this.forceProguardCompatibility = forceProguardCompatibility;
+      this.ignoreMissingClasses = ignoreMissingClasses;
       this.multiDex = multiDex;
       this.proguardConfig = proguardConfig;
     }
@@ -49,6 +51,7 @@
       String output = null;
       int minApi = 1;
       boolean forceProguardCompatibility = false;
+      boolean ignoreMissingClasses = false;
       boolean multiDex = false;
       boolean coreLibrary = false;
 
@@ -62,6 +65,8 @@
               minApi = Integer.valueOf(args[++i]);
             } else if (arg.equals("--force-proguard-compatibility")) {
               forceProguardCompatibility = true;
+            } else if (arg.equals("--ignore-missing-classes")) {
+              ignoreMissingClasses = true;
             } else if (arg.equals("--output")) {
               output = args[++i];
             } else if (arg.equals("--multi-dex")) {
@@ -82,7 +87,7 @@
         builder.add(currentLine.toString());
       }
       return new CompatProguardOptions(builder.build(), output, minApi, multiDex,
-          forceProguardCompatibility);
+          forceProguardCompatibility, ignoreMissingClasses);
     }
   }
 
@@ -95,7 +100,8 @@
     // Run R8 passing all the options from the command line as a Proguard configuration.
     CompatProguardOptions options = CompatProguardOptions.parse(args);
     R8Command.Builder builder =
-        new CompatProguardCommandBuilder(options.forceProguardCompatibility);
+        new CompatProguardCommandBuilder(
+            options.forceProguardCompatibility, options.ignoreMissingClasses);
     builder.setOutputPath(Paths.get(options.output))
         .addProguardConfiguration(options.proguardConfig)
         .setMinApiLevel(options.minApi);
diff --git a/src/main/java/com/android/tools/r8/compatproguard/CompatProguardCommandBuilder.java b/src/main/java/com/android/tools/r8/compatproguard/CompatProguardCommandBuilder.java
index 71bc6eb..18ec474 100644
--- a/src/main/java/com/android/tools/r8/compatproguard/CompatProguardCommandBuilder.java
+++ b/src/main/java/com/android/tools/r8/compatproguard/CompatProguardCommandBuilder.java
@@ -7,8 +7,9 @@
 import com.android.tools.r8.R8Command;
 
 public class CompatProguardCommandBuilder extends R8Command.Builder {
-  public CompatProguardCommandBuilder(boolean forceProguardCompatibility) {
-    super(true, forceProguardCompatibility);
+  public CompatProguardCommandBuilder(boolean forceProguardCompatibility,
+      boolean ignoreMissingClasses) {
+    super(true, forceProguardCompatibility, true, ignoreMissingClasses);
     setEnableDesugaring(false);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/dex/BaseFile.java b/src/main/java/com/android/tools/r8/dex/BaseFile.java
index dd9b325..86143c8 100644
--- a/src/main/java/com/android/tools/r8/dex/BaseFile.java
+++ b/src/main/java/com/android/tools/r8/dex/BaseFile.java
@@ -18,7 +18,9 @@
   protected final ByteBuffer buffer;
 
   protected BaseFile(Resource resource) throws IOException {
-    buffer = ByteBuffer.wrap(ByteStreams.toByteArray(resource.getStream()));
+    try (InputStream input = resource.getStream()) {
+      buffer = ByteBuffer.wrap(ByteStreams.toByteArray(input));
+    }
   }
 
   protected BaseFile(String name) throws IOException {
diff --git a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
index 4662cd0..83788c7 100644
--- a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
@@ -16,9 +16,9 @@
 import java.io.IOException;
 import java.util.Collections;
 import java.util.concurrent.ExecutorService;
-import jdk.internal.org.objectweb.asm.Type;
 import org.objectweb.asm.ClassWriter;
 import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Type;
 
 public class CfApplicationWriter {
   private final DexApplication application;
diff --git a/src/main/java/com/android/tools/r8/utils/ZipUtils.java b/src/main/java/com/android/tools/r8/utils/ZipUtils.java
index ca9a404..76d84c2 100644
--- a/src/main/java/com/android/tools/r8/utils/ZipUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ZipUtils.java
@@ -9,6 +9,7 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Enumeration;
@@ -53,8 +54,9 @@
           Path outPath = outDirectoryPath.resolve(name);
           File outFile = outPath.toFile();
           outFile.getParentFile().mkdirs();
-          FileOutputStream output = new FileOutputStream(outFile);
-          ByteStreams.copy(input, output);
+          try (OutputStream output = new FileOutputStream(outFile)) {
+            ByteStreams.copy(input, output);
+          }
           outFiles.add(outFile);
         }
       });
diff --git a/src/test/examplesAndroidO/invokecustom/TestGenerator.java b/src/test/examplesAndroidO/invokecustom/TestGenerator.java
index 574fe14..e42b9c9 100644
--- a/src/test/examplesAndroidO/invokecustom/TestGenerator.java
+++ b/src/test/examplesAndroidO/invokecustom/TestGenerator.java
@@ -3,13 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 package invokecustom;
 
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.lang.invoke.CallSite;
 import java.lang.invoke.MethodHandle;
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.MethodType;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import org.objectweb.asm.ClassReader;
@@ -36,30 +37,34 @@
   }
 
   private void generateTests() throws IOException {
-    ClassReader cr = new ClassReader(new FileInputStream(classNamePath.toFile()));
-    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
-    cr.accept(
-        new ClassVisitor(Opcodes.ASM6, cw) {
-          @Override
-          public void visitEnd() {
-            generateMethodTest1(cw);
-            generateMethodTest2(cw);
-            generateMethodTest3(cw);
-            generateMethodTest4(cw);
-            generateMethodTest5(cw);
-            generateMethodTest6(cw);
-            generateMethodTest7(cw);
-            generateMethodTest8(cw);
-            generateMethodTest9(cw);
-            generateMethodTest10(cw);
-            generateMethodTest11(cw);
-            generateMethodTest12(cw);
-            generateMethodTest13(cw);
-            generateMethodMain(cw);
-            super.visitEnd();
-          }
-        }, 0);
-    new FileOutputStream(classNamePath.toFile()).write(cw.toByteArray());
+    try (InputStream input = Files.newInputStream(classNamePath)) {
+      ClassReader cr = new ClassReader(input);
+      ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+      cr.accept(
+          new ClassVisitor(Opcodes.ASM6, cw) {
+            @Override
+            public void visitEnd() {
+              generateMethodTest1(cw);
+              generateMethodTest2(cw);
+              generateMethodTest3(cw);
+              generateMethodTest4(cw);
+              generateMethodTest5(cw);
+              generateMethodTest6(cw);
+              generateMethodTest7(cw);
+              generateMethodTest8(cw);
+              generateMethodTest9(cw);
+              generateMethodTest10(cw);
+              generateMethodTest11(cw);
+              generateMethodTest12(cw);
+              generateMethodTest13(cw);
+              generateMethodMain(cw);
+              super.visitEnd();
+            }
+          }, 0);
+      try (OutputStream output = Files.newOutputStream(classNamePath)) {
+        output.write(cw.toByteArray());
+      }
+    }
   }
 
   /* generate main method that only call all test methods. */
diff --git a/src/test/examplesAndroidO/invokecustom2/TestGenerator.java b/src/test/examplesAndroidO/invokecustom2/TestGenerator.java
index ab77d32..9bbc03a 100644
--- a/src/test/examplesAndroidO/invokecustom2/TestGenerator.java
+++ b/src/test/examplesAndroidO/invokecustom2/TestGenerator.java
@@ -4,13 +4,14 @@
 
 package invokecustom2;
 
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.lang.invoke.CallSite;
 import java.lang.invoke.MethodHandle;
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.MethodType;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import org.objectweb.asm.ClassReader;
@@ -37,26 +38,30 @@
   }
 
   private void generateTests() throws IOException {
-    ClassReader cr = new ClassReader(new FileInputStream(classNamePath.toFile()));
-    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
-    cr.accept(
-        new ClassVisitor(Opcodes.ASM6, cw) {
-          @Override
-          public void visitEnd() {
-            generateMethodTest1(cw);
-            generateMethodTest2(cw);
-            generateMethodTest3(cw);
-            generateMethodTest4(cw);
-            generateMethodTest5(cw);
-            generateMethodTest6(cw);
-            generateMethodTest7(cw);
-            generateMethodTest8(cw);
-            generateMethodTest9(cw);
-            generateMethodMain(cw);
-            super.visitEnd();
-          }
-        }, 0);
-    new FileOutputStream(classNamePath.toFile()).write(cw.toByteArray());
+    try (InputStream input = Files.newInputStream(classNamePath)) {
+      ClassReader cr = new ClassReader(input);
+      ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+      cr.accept(
+          new ClassVisitor(Opcodes.ASM6, cw) {
+            @Override
+            public void visitEnd() {
+              generateMethodTest1(cw);
+              generateMethodTest2(cw);
+              generateMethodTest3(cw);
+              generateMethodTest4(cw);
+              generateMethodTest5(cw);
+              generateMethodTest6(cw);
+              generateMethodTest7(cw);
+              generateMethodTest8(cw);
+              generateMethodTest9(cw);
+              generateMethodMain(cw);
+              super.visitEnd();
+            }
+          }, 0);
+      try (OutputStream output = Files.newOutputStream(classNamePath)) {
+        output.write(cw.toByteArray());
+      }
+    }
   }
 
   /* generate main method that only call all test methods. */
diff --git a/src/test/examplesAndroidO/stringconcat/TestGenerator.java b/src/test/examplesAndroidO/stringconcat/TestGenerator.java
index 6a837a4..e72f438 100644
--- a/src/test/examplesAndroidO/stringconcat/TestGenerator.java
+++ b/src/test/examplesAndroidO/stringconcat/TestGenerator.java
@@ -3,12 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 package stringconcat;
 
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.lang.invoke.CallSite;
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.MethodType;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
@@ -46,177 +47,181 @@
   }
 
   private static void generateTests(Path classNamePath) throws IOException {
-    ClassReader cr = new ClassReader(new FileInputStream(classNamePath.toFile()));
-    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
-    cr.accept(
-        new ClassVisitor(Opcodes.ASM6, cw) {
-          @Override
-          public MethodVisitor visitMethod(int access,
-              final String methodName, String desc, String signature, String[] exceptions) {
-            MethodVisitor mv = super.visitMethod(access, methodName, desc, signature, exceptions);
-            return new MethodVisitor(Opcodes.ASM6, mv) {
-              private List<Object> recentConstants = new ArrayList<>();
+    try (InputStream input = Files.newInputStream(classNamePath)) {
+      ClassReader cr = new ClassReader(input);
+      ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+      cr.accept(
+          new ClassVisitor(Opcodes.ASM6, cw) {
+            @Override
+            public MethodVisitor visitMethod(int access,
+                final String methodName, String desc, String signature, String[] exceptions) {
+              MethodVisitor mv = super.visitMethod(access, methodName, desc, signature, exceptions);
+              return new MethodVisitor(Opcodes.ASM6, mv) {
+                private List<Object> recentConstants = new ArrayList<>();
 
-              @Override
-              public void visitLdcInsn(Object cst) {
-                if (!recentConstants.isEmpty() ||
-                    (cst instanceof String && ((String) cst).startsWith(RECIPE_PREFIX))) {
-                  // Add the constant, don't push anything on stack.
-                  recentConstants.add(cst);
-                  return;
-                }
-                super.visitLdcInsn(cst);
-              }
-
-              @Override
-              public void visitMethodInsn(
-                  int opcode, String owner, String name, String desc, boolean itf) {
-                // Replace calls to 'makeConcat(...)' with appropriate `invokedynamic`.
-                if (opcode == Opcodes.INVOKESTATIC && name.equals("makeConcat")) {
-                  mv.visitInvokeDynamicInsn(MAKE_CONCAT.getName(), desc, MAKE_CONCAT);
-                  recentConstants.clear();
-                  return;
-                }
-
-                // Replace calls to 'makeConcat(...)' with appropriate `invokedynamic`.
-                if (opcode == Opcodes.INVOKESTATIC && name.equals("makeConcatWithConstants")) {
-                  if (recentConstants.isEmpty()) {
-                    throw new AssertionError("No constants detected in `" +
-                        methodName + "`: call to " + name + desc);
+                @Override
+                public void visitLdcInsn(Object cst) {
+                  if (!recentConstants.isEmpty() ||
+                      (cst instanceof String && ((String) cst).startsWith(RECIPE_PREFIX))) {
+                    // Add the constant, don't push anything on stack.
+                    recentConstants.add(cst);
+                    return;
                   }
-                  recentConstants.set(0,
-                      ((String) recentConstants.get(0)).substring(RECIPE_PREFIX.length()));
-
-                  mv.visitInvokeDynamicInsn(MAKE_CONCAT_WITH_CONSTANTS.getName(),
-                      removeLastParams(desc, recentConstants.size()), MAKE_CONCAT_WITH_CONSTANTS,
-                      recentConstants.toArray(new Object[recentConstants.size()]));
-                  recentConstants.clear();
-                  return;
+                  super.visitLdcInsn(cst);
                 }
 
-                // Otherwise fall back to default implementation.
-                super.visitMethodInsn(opcode, owner, name, desc, itf);
-              }
-
-              private String removeLastParams(String descr, int paramsToRemove) {
-                MethodType methodType =
-                    MethodType.fromMethodDescriptorString(
-                        descr, this.getClass().getClassLoader());
-                return methodType
-                    .dropParameterTypes(
-                        methodType.parameterCount() - paramsToRemove,
-                        methodType.parameterCount())
-                    .toMethodDescriptorString();
-              }
-
-              @Override
-              public void visitInsn(int opcode) {
-                switch (opcode) {
-                  case Opcodes.ICONST_0:
-                    if (!recentConstants.isEmpty()) {
-                      recentConstants.add(0);
-                      return;
-                    }
-                    break;
-                  case Opcodes.ICONST_1:
-                    if (!recentConstants.isEmpty()) {
-                      recentConstants.add(1);
-                      return;
-                    }
-                    break;
-                  case Opcodes.ICONST_2:
-                    if (!recentConstants.isEmpty()) {
-                      recentConstants.add(2);
-                      return;
-                    }
-                    break;
-                  case Opcodes.ICONST_3:
-                    if (!recentConstants.isEmpty()) {
-                      recentConstants.add(3);
-                      return;
-                    }
-                    break;
-                  case Opcodes.ICONST_4:
-                    if (!recentConstants.isEmpty()) {
-                      recentConstants.add(4);
-                      return;
-                    }
-                    break;
-                  case Opcodes.ICONST_5:
-                    if (!recentConstants.isEmpty()) {
-                      recentConstants.add(5);
-                      return;
-                    }
-                    break;
-                  case Opcodes.ICONST_M1:
-                    if (!recentConstants.isEmpty()) {
-                      recentConstants.add(-1);
-                      return;
-                    }
-                    break;
-                  default:
+                @Override
+                public void visitMethodInsn(
+                    int opcode, String owner, String name, String desc, boolean itf) {
+                  // Replace calls to 'makeConcat(...)' with appropriate `invokedynamic`.
+                  if (opcode == Opcodes.INVOKESTATIC && name.equals("makeConcat")) {
+                    mv.visitInvokeDynamicInsn(MAKE_CONCAT.getName(), desc, MAKE_CONCAT);
                     recentConstants.clear();
-                    break;
+                    return;
+                  }
+
+                  // Replace calls to 'makeConcat(...)' with appropriate `invokedynamic`.
+                  if (opcode == Opcodes.INVOKESTATIC && name.equals("makeConcatWithConstants")) {
+                    if (recentConstants.isEmpty()) {
+                      throw new AssertionError("No constants detected in `" +
+                          methodName + "`: call to " + name + desc);
+                    }
+                    recentConstants.set(0,
+                        ((String) recentConstants.get(0)).substring(RECIPE_PREFIX.length()));
+
+                    mv.visitInvokeDynamicInsn(MAKE_CONCAT_WITH_CONSTANTS.getName(),
+                        removeLastParams(desc, recentConstants.size()), MAKE_CONCAT_WITH_CONSTANTS,
+                        recentConstants.toArray(new Object[recentConstants.size()]));
+                    recentConstants.clear();
+                    return;
+                  }
+
+                  // Otherwise fall back to default implementation.
+                  super.visitMethodInsn(opcode, owner, name, desc, itf);
                 }
-                super.visitInsn(opcode);
-              }
 
-              @Override
-              public void visitIntInsn(int opcode, int operand) {
-                recentConstants.clear();
-                super.visitIntInsn(opcode, operand);
-              }
+                private String removeLastParams(String descr, int paramsToRemove) {
+                  MethodType methodType =
+                      MethodType.fromMethodDescriptorString(
+                          descr, this.getClass().getClassLoader());
+                  return methodType
+                      .dropParameterTypes(
+                          methodType.parameterCount() - paramsToRemove,
+                          methodType.parameterCount())
+                      .toMethodDescriptorString();
+                }
 
-              @Override
-              public void visitVarInsn(int opcode, int var) {
-                recentConstants.clear();
-                super.visitVarInsn(opcode, var);
-              }
+                @Override
+                public void visitInsn(int opcode) {
+                  switch (opcode) {
+                    case Opcodes.ICONST_0:
+                      if (!recentConstants.isEmpty()) {
+                        recentConstants.add(0);
+                        return;
+                      }
+                      break;
+                    case Opcodes.ICONST_1:
+                      if (!recentConstants.isEmpty()) {
+                        recentConstants.add(1);
+                        return;
+                      }
+                      break;
+                    case Opcodes.ICONST_2:
+                      if (!recentConstants.isEmpty()) {
+                        recentConstants.add(2);
+                        return;
+                      }
+                      break;
+                    case Opcodes.ICONST_3:
+                      if (!recentConstants.isEmpty()) {
+                        recentConstants.add(3);
+                        return;
+                      }
+                      break;
+                    case Opcodes.ICONST_4:
+                      if (!recentConstants.isEmpty()) {
+                        recentConstants.add(4);
+                        return;
+                      }
+                      break;
+                    case Opcodes.ICONST_5:
+                      if (!recentConstants.isEmpty()) {
+                        recentConstants.add(5);
+                        return;
+                      }
+                      break;
+                    case Opcodes.ICONST_M1:
+                      if (!recentConstants.isEmpty()) {
+                        recentConstants.add(-1);
+                        return;
+                      }
+                      break;
+                    default:
+                      recentConstants.clear();
+                      break;
+                  }
+                  super.visitInsn(opcode);
+                }
 
-              @Override
-              public void visitTypeInsn(int opcode, String type) {
-                recentConstants.clear();
-                super.visitTypeInsn(opcode, type);
-              }
+                @Override
+                public void visitIntInsn(int opcode, int operand) {
+                  recentConstants.clear();
+                  super.visitIntInsn(opcode, operand);
+                }
 
-              @Override
-              public void visitFieldInsn(int opcode, String owner, String name, String desc) {
-                recentConstants.clear();
-                super.visitFieldInsn(opcode, owner, name, desc);
-              }
+                @Override
+                public void visitVarInsn(int opcode, int var) {
+                  recentConstants.clear();
+                  super.visitVarInsn(opcode, var);
+                }
 
-              @Override
-              public void visitJumpInsn(int opcode, Label label) {
-                recentConstants.clear();
-                super.visitJumpInsn(opcode, label);
-              }
+                @Override
+                public void visitTypeInsn(int opcode, String type) {
+                  recentConstants.clear();
+                  super.visitTypeInsn(opcode, type);
+                }
 
-              @Override
-              public void visitIincInsn(int var, int increment) {
-                recentConstants.clear();
-                super.visitIincInsn(var, increment);
-              }
+                @Override
+                public void visitFieldInsn(int opcode, String owner, String name, String desc) {
+                  recentConstants.clear();
+                  super.visitFieldInsn(opcode, owner, name, desc);
+                }
 
-              @Override
-              public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
-                recentConstants.clear();
-                super.visitTableSwitchInsn(min, max, dflt, labels);
-              }
+                @Override
+                public void visitJumpInsn(int opcode, Label label) {
+                  recentConstants.clear();
+                  super.visitJumpInsn(opcode, label);
+                }
 
-              @Override
-              public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
-                recentConstants.clear();
-                super.visitLookupSwitchInsn(dflt, keys, labels);
-              }
+                @Override
+                public void visitIincInsn(int var, int increment) {
+                  recentConstants.clear();
+                  super.visitIincInsn(var, increment);
+                }
 
-              @Override
-              public void visitMultiANewArrayInsn(String desc, int dims) {
-                recentConstants.clear();
-                super.visitMultiANewArrayInsn(desc, dims);
-              }
-            };
-          }
-        }, 0);
-    new FileOutputStream(classNamePath.toFile()).write(cw.toByteArray());
+                @Override
+                public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
+                  recentConstants.clear();
+                  super.visitTableSwitchInsn(min, max, dflt, labels);
+                }
+
+                @Override
+                public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
+                  recentConstants.clear();
+                  super.visitLookupSwitchInsn(dflt, keys, labels);
+                }
+
+                @Override
+                public void visitMultiANewArrayInsn(String desc, int dims) {
+                  recentConstants.clear();
+                  super.visitMultiANewArrayInsn(desc, dims);
+                }
+              };
+            }
+          }, 0);
+      try (OutputStream output = Files.newOutputStream(classNamePath)) {
+        output.write(cw.toByteArray());
+      }
+    }
   }
 }
diff --git a/src/test/examplesAndroidP/invokecustom/TestGenerator.java b/src/test/examplesAndroidP/invokecustom/TestGenerator.java
index 375dc34..7ee4bdc 100644
--- a/src/test/examplesAndroidP/invokecustom/TestGenerator.java
+++ b/src/test/examplesAndroidP/invokecustom/TestGenerator.java
@@ -3,13 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 package invokecustom;
 
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
+
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.lang.invoke.CallSite;
-import java.lang.invoke.MethodHandle;
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.MethodType;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import org.objectweb.asm.ClassReader;
@@ -36,19 +37,23 @@
   }
 
   private void generateTests() throws IOException {
-    ClassReader cr = new ClassReader(new FileInputStream(classNamePath.toFile()));
-    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
-    cr.accept(
-        new ClassVisitor(Opcodes.ASM6, cw) {
-          @Override
-          public void visitEnd() {
-            generateMethodTest1(cw);
-            generateMethodTest2(cw);
-            generateMethodMain(cw);
-            super.visitEnd();
-          }
-        }, 0);
-    new FileOutputStream(classNamePath.toFile()).write(cw.toByteArray());
+    try (InputStream inputStream = Files.newInputStream(classNamePath)) {
+      ClassReader cr = new ClassReader(inputStream);
+      ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+      cr.accept(
+          new ClassVisitor(Opcodes.ASM6, cw) {
+            @Override
+            public void visitEnd() {
+              generateMethodTest1(cw);
+              generateMethodTest2(cw);
+              generateMethodMain(cw);
+              super.visitEnd();
+            }
+          }, 0);
+      try (OutputStream output = Files.newOutputStream(classNamePath)) {
+        output.write(cw.toByteArray());
+      }
+    }
   }
 
   /* Generate main method that only call all test methods. */
diff --git a/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java b/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java
index 2b0084d..ddcbf8c 100644
--- a/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java
+++ b/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java
@@ -9,7 +9,7 @@
 import com.google.common.collect.ImmutableList;
 import jasmin.ClassFile;
 import java.io.File;
-import java.io.FileOutputStream;
+import java.io.OutputStream;
 import java.io.StringReader;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -88,7 +88,9 @@
       file.readJasmin(new StringReader(clazz.toString()), clazz.name, false);
       Path path = out.toPath().resolve(clazz.name + ".class");
       Files.createDirectories(path.getParent());
-      file.write(new FileOutputStream(path.toFile()));
+      try (OutputStream outputStream = Files.newOutputStream(path)) {
+        file.write(outputStream);
+      }
       if (isRunningJava()) {
         extraPaths.add(path);
       } else {
diff --git a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java b/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
index 67decf2..15cf848 100644
--- a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
+++ b/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
@@ -132,7 +132,10 @@
     for (ClassBuilder clazz : builder.getClasses()) {
       ClassFile file = new ClassFile();
       file.readJasmin(new StringReader(clazz.toString()), clazz.name, false);
-      file.write(new FileOutputStream(classes.toPath().resolve(clazz.name + ".class").toFile()));
+      try (OutputStream outputStream =
+          Files.newOutputStream(classes.toPath().resolve(clazz.name + ".class"))) {
+        file.write(outputStream);
+      }
     }
     List<String> args = new ArrayList<>();
     args.add("--output=" + dex.toString());
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
index 1519f6c..298876f 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
@@ -55,7 +55,7 @@
 
   private void runAnnotationsTest(boolean forceProguardCompatibility, boolean keepAnnotations) throws Exception {
     R8Command.Builder builder =
-        new CompatProguardCommandBuilder(forceProguardCompatibility);
+        new CompatProguardCommandBuilder(forceProguardCompatibility, false);
     // Add application classes including the annotation class.
     Class mainClass = TestMain.class;
     Class mentionedClassWithAnnotations = TestMain.MentionedClassWithAnnotation.class;