Add reporter DesugaredMethodsList

- Fix compatibility with BackportedMethodRewriter

Change-Id: Iaf4818f90d7fabffbd05ca210143d3fe3e721f92
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/AbstractGenerateFiles.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/AbstractGenerateFiles.java
index f263c2e..5d6e15c 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/AbstractGenerateFiles.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/AbstractGenerateFiles.java
@@ -22,14 +22,7 @@
   // If we increment this api level, we need to verify everything works correctly.
   static final AndroidApiLevel MAX_TESTED_ANDROID_API_LEVEL = AndroidApiLevel.U;
 
-  private final DexItemFactory factory = new DexItemFactory();
-  private final Reporter reporter = new Reporter();
-  final InternalOptions options =
-      new InternalOptions(factory, reporter)
-          .getArtProfileOptions()
-          .setAllowReadingEmptyArtProfileProvidersMultipleTimesForTesting(true)
-          .getOptions();
-
+  final InternalOptions options;
   final DesugaredLibrarySpecification desugaredLibrarySpecification;
   final StringResource desugaredLibrarySpecificationResource;
   final Collection<ProgramResourceProvider> desugaredLibraryImplementation;
@@ -37,11 +30,13 @@
   final Collection<ClassFileResourceProvider> androidJar;
 
   AbstractGenerateFiles(
+      Reporter reporter,
       StringResource desugaredLibrarySpecificationResource,
       Collection<ProgramResourceProvider> desugarImplementation,
       Path output,
       Collection<ClassFileResourceProvider> androidJar) {
     assert androidJar != null;
+    this.options = createOptions(reporter);
     this.desugaredLibrarySpecificationResource = desugaredLibrarySpecificationResource;
     this.androidJar = androidJar;
     this.desugaredLibrarySpecification = readDesugaredLibrarySpecification();
@@ -49,14 +44,21 @@
     this.output = output;
   }
 
+  private InternalOptions createOptions(Reporter reporter) {
+    return new InternalOptions(new DexItemFactory(), reporter)
+        .getArtProfileOptions()
+        .setAllowReadingEmptyArtProfileProvidersMultipleTimesForTesting(true)
+        .getOptions();
+  }
+
   private DesugaredLibrarySpecification readDesugaredLibrarySpecification() {
     if (desugaredLibrarySpecificationResource == null) {
       return MachineDesugaredLibrarySpecification.empty();
     }
     return DesugaredLibrarySpecificationParser.parseDesugaredLibrarySpecification(
         desugaredLibrarySpecificationResource,
-        factory,
-        reporter,
+        options.dexItemFactory(),
+        options.reporter,
         false,
         AndroidApiLevel.B.getLevel());
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsList.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsList.java
index c2261d4..169dcfe 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsList.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsList.java
@@ -9,38 +9,43 @@
 import com.android.tools.r8.ArchiveClassFileProvider;
 import com.android.tools.r8.ArchiveProgramResourceProvider;
 import com.android.tools.r8.ClassFileResourceProvider;
+import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.Keep;
 import com.android.tools.r8.ProgramResourceProvider;
 import com.android.tools.r8.StringConsumer;
 import com.android.tools.r8.StringResource;
 import com.android.tools.r8.Version;
 import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.ExceptionUtils;
+import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.ThreadUtils;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Paths;
 import java.util.Collection;
 import java.util.List;
+import java.util.concurrent.ExecutorService;
 
 @Keep
 public class DesugaredMethodsList extends GenerateDesugaredLibraryLintFiles {
 
   private final AndroidApiLevel minApi;
-
   private final StringConsumer outputConsumer;
 
   DesugaredMethodsList(
       int minApi,
+      Reporter reporter,
       StringResource desugarConfiguration,
       Collection<ProgramResourceProvider> desugarImplementation,
       StringConsumer outputConsumer,
       Collection<ClassFileResourceProvider> androidJar) {
-    super(desugarConfiguration, desugarImplementation, null, androidJar);
+    super(reporter, desugarConfiguration, desugarImplementation, null, androidJar);
     this.minApi = AndroidApiLevel.getAndroidApiLevel(minApi);
     this.outputConsumer = outputConsumer;
   }
 
-  public static void run(DesugaredMethodsListCommand command) throws IOException {
+  public static void run(DesugaredMethodsListCommand command) throws CompilationFailedException {
     if (command.isHelp()) {
       System.out.println(DesugaredMethodsListCommand.getUsageMessage());
       return;
@@ -49,13 +54,23 @@
       System.out.println("DesugaredMethodsList " + Version.getVersionString());
       return;
     }
-    new DesugaredMethodsList(
-            command.getMinApi(),
-            command.getDesugarLibrarySpecification(),
-            command.getDesugarLibraryImplementation(),
-            command.getOutputConsumer(),
-            command.getLibrary())
-        .run();
+    ExecutorService executorService = ThreadUtils.getExecutorService(ThreadUtils.NOT_SPECIFIED);
+    try {
+      ExceptionUtils.withD8CompilationHandler(
+          command.getReporter(),
+          () -> {
+            new DesugaredMethodsList(
+                    command.getMinApi(),
+                    command.getReporter(),
+                    command.getDesugarLibrarySpecification(),
+                    command.getDesugarLibraryImplementation(),
+                    command.getOutputConsumer(),
+                    command.getLibrary())
+                .run();
+          });
+    } finally {
+      executorService.shutdown();
+    }
   }
 
   @Override
@@ -100,7 +115,7 @@
   public static void main(String[] args) throws Exception {
     if (args.length == 4 || args.length == 5) {
       DesugaredMethodsListCommand.Builder builder =
-          DesugaredMethodsListCommand.builder()
+          DesugaredMethodsListCommand.builder(new Reporter())
               .setMinApi(parseInt(args[0]))
               .setDesugarLibrarySpecification(getSpecificationArg(args[1]))
               .setOutputPath(Paths.get(args[3]));
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsListCommand.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsListCommand.java
index 924a0e6..726d445 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsListCommand.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/DesugaredMethodsListCommand.java
@@ -15,9 +15,8 @@
 import com.android.tools.r8.ProgramResourceProvider;
 import com.android.tools.r8.StringConsumer;
 import com.android.tools.r8.StringResource;
-import com.android.tools.r8.errors.CompilationError;
-import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
@@ -33,6 +32,8 @@
   private final boolean help;
   private final boolean version;
   private final int minApi;
+
+  private final Reporter reporter;
   private final StringResource desugarLibrarySpecification;
   private final Collection<ProgramResourceProvider> desugarLibraryImplementation;
   private final StringConsumer outputConsumer;
@@ -40,6 +41,7 @@
 
   DesugaredMethodsListCommand(
       int minApi,
+      Reporter reporter,
       StringResource desugarLibrarySpecification,
       Collection<ProgramResourceProvider> desugarLibraryImplementation,
       StringConsumer outputConsumer,
@@ -47,6 +49,7 @@
     this.help = false;
     this.version = false;
     this.minApi = minApi;
+    this.reporter = reporter;
     this.desugarLibrarySpecification = desugarLibrarySpecification;
     this.desugarLibraryImplementation = desugarLibraryImplementation;
     this.outputConsumer = outputConsumer;
@@ -57,6 +60,7 @@
     this.help = help;
     this.version = version;
     this.minApi = -1;
+    this.reporter = null;
     this.desugarLibrarySpecification = null;
     this.desugarLibraryImplementation = null;
     this.outputConsumer = null;
@@ -100,14 +104,19 @@
     return builder.toString();
   }
 
-  public static Builder builder() {
-    return new Builder();
+  public Reporter getReporter() {
+    return reporter;
+  }
+
+  public static Builder builder(DiagnosticsHandler diagnosticsHandler) {
+    return new Builder(diagnosticsHandler);
   }
 
   @Keep
   public static class Builder {
 
     private int minApi = AndroidApiLevel.B.getLevel();
+    private final Reporter reporter;
     private StringResource desugarLibrarySpecification = null;
     private Collection<ProgramResourceProvider> desugarLibraryImplementation = new ArrayList<>();
     private StringConsumer outputConsumer;
@@ -116,6 +125,10 @@
     private boolean help = false;
     private boolean version = false;
 
+    public Builder(DiagnosticsHandler diagnosticsHandler) {
+      this.reporter = new Reporter(diagnosticsHandler);
+    }
+
     public Builder setMinApi(int minApi) {
       this.minApi = minApi;
       return this;
@@ -173,11 +186,11 @@
       }
 
       if (desugarLibrarySpecification != null && library.isEmpty()) {
-        throw new CompilationError("With desugared library configuration a library is required");
+        reporter.error("With desugared library configuration a library is required");
       }
 
       if (!desugarLibraryImplementation.isEmpty() && desugarLibrarySpecification == null) {
-        throw new CompilationError(
+        reporter.error(
             "desugarLibrarySpecification is required when desugared library implementation is"
                 + " present.");
       }
@@ -196,6 +209,7 @@
       }
       return new DesugaredMethodsListCommand(
           minApi,
+          reporter,
           desugarLibrarySpecification,
           desugarLibraryImplementation,
           outputConsumer,
@@ -219,8 +233,9 @@
           .build();
     }
 
-    public DesugaredMethodsListCommand parse(String[] args, Origin origin) throws IOException {
-      DesugaredMethodsListCommand.Builder builder = DesugaredMethodsListCommand.builder();
+    public DesugaredMethodsListCommand parse(String[] args, DiagnosticsHandler handler)
+        throws IOException {
+      DesugaredMethodsListCommand.Builder builder = DesugaredMethodsListCommand.builder(handler);
       for (int i = 0; i < args.length; i += 2) {
         String arg = args[i].trim();
         if (arg.length() == 0) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateDesugaredLibraryLintFiles.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateDesugaredLibraryLintFiles.java
index 49d979b..47d7b9f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateDesugaredLibraryLintFiles.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateDesugaredLibraryLintFiles.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.io.File;
@@ -32,11 +33,12 @@
   private static final boolean FORMAT_WITH_FIELD = true;
 
   public GenerateDesugaredLibraryLintFiles(
+      Reporter reporter,
       StringResource desugarConfiguration,
       Collection<ProgramResourceProvider> desugarImplementation,
       Path output,
       Collection<ClassFileResourceProvider> androidJar) {
-    super(desugarConfiguration, desugarImplementation, output, androidJar);
+    super(reporter, desugarConfiguration, desugarImplementation, output, androidJar);
   }
 
   private String lintBaseFileName(
@@ -175,6 +177,7 @@
   public static void main(String[] args) throws Exception {
     if (args.length == 4) {
       new GenerateDesugaredLibraryLintFiles(
+              new Reporter(),
               StringResource.fromFile(Paths.get(args[0])),
               ImmutableList.of(ArchiveProgramResourceProvider.fromArchive(Paths.get(args[1]))),
               Paths.get(args[2]),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateHtmlDoc.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateHtmlDoc.java
index 4bc0821..d1394058 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateHtmlDoc.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateHtmlDoc.java
@@ -23,6 +23,7 @@
 import com.android.tools.r8.ir.desugar.desugaredlibrary.lint.SupportedClasses.SupportedClass;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.ListUtils;
+import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.io.PrintStream;
@@ -50,7 +51,7 @@
       Collection<ProgramResourceProvider> desugarImplementation,
       Path outputDirectory,
       Collection<ClassFileResourceProvider> androidJar) {
-    super(desugarSpecification, desugarImplementation, outputDirectory, androidJar);
+    super(new Reporter(), desugarSpecification, desugarImplementation, outputDirectory, androidJar);
   }
 
   private static class StringBuilderWithIndent {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
index e07b779..106486b 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
@@ -259,6 +259,7 @@
       Path lint = top.resolve("lint_" + spec);
       Files.createDirectories(lint);
       new GenerateDesugaredLibraryLintFiles(
+              new Reporter(),
               StringResource.fromFile(spec.getSpecification()),
               ImmutableList.of(ArchiveProgramResourceProvider.fromArchive(jdkLibJar)),
               lint,