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 {