Include unused package wide keep rules in library analysis result
Change-Id: I84da3329e8a4730565f119ead05eddfcf2b1b18a
diff --git a/src/libanalyzer/java/com/android/tools/r8/libanalyzer/LibraryAnalyzer.java b/src/libanalyzer/java/com/android/tools/r8/libanalyzer/LibraryAnalyzer.java
index 798267b..d65717f 100644
--- a/src/libanalyzer/java/com/android/tools/r8/libanalyzer/LibraryAnalyzer.java
+++ b/src/libanalyzer/java/com/android/tools/r8/libanalyzer/LibraryAnalyzer.java
@@ -45,6 +45,7 @@
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.util.ArrayList;
+import java.util.Comparator;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.function.Predicate;
@@ -148,14 +149,15 @@
options.blastRadiusOutputPath.toString();
}
r8Options.blastRadiusConsumer =
- (appView, appInfo, blastRadius) -> {
- resultBuilder.setNumItems(getNumberOfItems(appView));
- resultBuilder.setNumItemsKept(getNumberOfKeptItems(appInfo));
- resultBuilder.setNumKeepRules(getNumberOfKeepRules(appView));
- resultBuilder.setNumKeepRulesPackageWide(
- getNumberOfPackageWideKeepRules(appView));
- resultBuilder.addAllKeepRuleBlastRadius(getTopBlastRadiusKeepRules(blastRadius));
- };
+ (appView, appInfo, blastRadius) ->
+ resultBuilder
+ .setNumItems(getNumberOfItems(appView))
+ .setNumItemsKept(getNumberOfKeptItems(appInfo))
+ .setNumKeepRules(getNumberOfKeepRules(appView))
+ .setNumKeepRulesPackageWide(getNumberOfPackageWideKeepRules(appView))
+ .addAllKeepRuleBlastRadius(getTopBlastRadiusKeepRules(blastRadius))
+ .addAllUnusedPackageWideKeepRules(
+ getUnusedPackageWideKeepRules(blastRadius));
});
} catch (CompilationFailedException e) {
options.reporter.warning(new ExceptionDiagnostic(e));
@@ -258,6 +260,26 @@
.build());
}
+ private static List<KeepRuleBlastRadius> getUnusedPackageWideKeepRules(
+ RootSetBlastRadius blastRadius) {
+ List<RootSetBlastRadiusForRule> unusedPackageWideKeepRules =
+ ListUtils.filter(
+ blastRadius.getBlastRadius(),
+ rule ->
+ rule.getNumberOfItems() == 0
+ && BlastRadiusKeepRuleClassifier.isPackageWideKeepRule(rule.getRule()));
+ List<RootSetBlastRadiusForRule> unusedPackageWideKeepRulesSorted =
+ ListUtils.sort(
+ unusedPackageWideKeepRules, Comparator.comparing(RootSetBlastRadiusForRule::getSource));
+ return ListUtils.map(
+ unusedPackageWideKeepRulesSorted,
+ rule ->
+ KeepRuleBlastRadius.newBuilder()
+ .setSource(rule.getSource())
+ .setNumItemsKept(0)
+ .build());
+ }
+
private void writeAnalysisResult(
InternalD8CompileResult d8CompileResult, R8CompileResult r8CompileResult) {
LibraryAnalysisResult.Builder resultBuilder = LibraryAnalysisResult.newBuilder();
diff --git a/src/libanalyzer/proto/libraryanalysisresult.proto b/src/libanalyzer/proto/libraryanalysisresult.proto
index b74104b..394027e 100644
--- a/src/libanalyzer/proto/libraryanalysisresult.proto
+++ b/src/libanalyzer/proto/libraryanalysisresult.proto
@@ -31,6 +31,7 @@
uint32 num_keep_rules = 4;
uint32 num_keep_rules_package_wide = 5;
repeated KeepRuleBlastRadius keep_rule_blast_radius = 6;
+ repeated KeepRuleBlastRadius unused_package_wide_keep_rules = 7;
}
message KeepRuleBlastRadius {