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