Remove duplicates in DesugaredMethodsList

Bug: b/302055774
Change-Id: Ia3dc4b50bf57141127c248f21b27ef7290e08ca9
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 ee0f728..f9abbbf 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
@@ -82,7 +82,6 @@
       List<String> desugaredApisSignatures) {
     for (String desugaredApisSignature : desugaredApisSignatures) {
       outputConsumer.accept(desugaredApisSignature, options.reporter);
-      outputConsumer.accept("\n", options.reporter);
     }
     outputConsumer.finished(options.reporter);
   }
@@ -100,13 +99,16 @@
 
   public static void main(String[] args) throws Exception {
     if (args.length == 4 || args.length == 5) {
-      new DesugaredMethodsList(
-              parseInt(args[0]),
-              getSpecificationArg(args[1]),
-              getImplementationArg(args[2]),
-              new StringConsumer.FileConsumer(Paths.get(args[3])),
-              ImmutableList.of(new ArchiveClassFileProvider(Paths.get(getAndroidJarPath(args, 5)))))
-          .run();
+      DesugaredMethodsListCommand.Builder builder =
+          DesugaredMethodsListCommand.builder()
+              .setMinApi(parseInt(args[0]))
+              .setDesugarLibrarySpecification(getSpecificationArg(args[1]))
+              .setOutputPath(Paths.get(args[3]));
+      for (ProgramResourceProvider programResourceProvider : getImplementationArg(args[2])) {
+        builder.addDesugarLibraryImplementation(programResourceProvider);
+      }
+      builder.addLibrary(new ArchiveClassFileProvider(Paths.get(getAndroidJarPath(args, 5))));
+      DesugaredMethodsList.run(builder.build());
       return;
     }
     throw new RuntimeException(
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 948ea0c..924a0e6 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
@@ -21,6 +21,7 @@
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
+import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -130,6 +131,18 @@
       return this;
     }
 
+    public Builder setOutputPath(Path outputPath) {
+      this.outputConsumer =
+          new StringConsumer.FileConsumer(outputPath) {
+            @Override
+            public void accept(String string, DiagnosticsHandler handler) {
+              super.accept(string, handler);
+              super.accept(System.lineSeparator(), handler);
+            }
+          };
+      return this;
+    }
+
     public Builder addDesugarLibraryImplementation(
         ProgramResourceProvider programResourceProvider) {
       desugarLibraryImplementation.add(programResourceProvider);
@@ -228,7 +241,7 @@
           builder.addDesugarLibraryImplementation(
               ArchiveProgramResourceProvider.fromArchive(Paths.get(argValue)));
         } else if (arg.equals("--output")) {
-          builder.setOutputConsumer(new StringConsumer.FileConsumer(Paths.get(argValue)));
+          builder.setOutputPath(Paths.get(argValue));
         } else if (arg.equals("--lib")) {
           builder.addLibrary(new ArchiveClassFileProvider(Paths.get(argValue)));
         }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
index 4435768..595092b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
@@ -331,7 +331,7 @@
 
     // All retargeted methods are supported.
     machineSpecification.forEachRetargetMethod(
-        method -> registerMethod(method, implementationApplication));
+        method -> registerMethod(method, implementationApplication, backports));
 
     machineSpecification
         .getStaticFieldRetarget()
@@ -366,7 +366,8 @@
     }
   }
 
-  private void registerMethod(DexMethod method, DexApplication implementationApplication) {
+  private void registerMethod(
+      DexMethod method, DexApplication implementationApplication, List<DexMethod> backports) {
     DexClass dexClass = implementationApplication.definitionFor(method.getHolderType());
     if (dexClass != null) {
       DexEncodedMethod dexEncodedMethod = dexClass.lookupMethod(method);
@@ -381,6 +382,7 @@
     if (dexEncodedMethod != null) {
       builder.addSupportedMethod(dexClass, dexEncodedMethod);
       builder.annotateClass(dexClass.getType(), ClassAnnotation.getAdditionnalMembersOnClass());
+      backports.remove(method);
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredMethodsListTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredMethodsListTest.java
index 71a91d1..25494ca 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredMethodsListTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredMethodsListTest.java
@@ -26,7 +26,9 @@
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -86,6 +88,10 @@
     List<String> sorted = new ArrayList<>(lintContents);
     sorted.sort(Comparator.naturalOrder());
     assertEquals(lintContents, sorted);
+
+    // No duplicates.
+    Set<String> set = new HashSet<>(lintContents);
+    assertEquals(set.size(), lintContents.size());
   }
 
   @Test