[KeepAnno] Clean up printing utilities.

This is largely a simple refactoring. The "extract" routine is moved to
the splitter and the remaining methods to a printing utility class.

Change-Id: I7770e73973e1f0cbc6ce49682ab0647a54ec94d9
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepEdgeSplitter.java b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepEdgeSplitter.java
index 449ee4e..fe57269 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepEdgeSplitter.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepEdgeSplitter.java
@@ -29,11 +29,28 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Consumer;
 
 /** Split a keep edge into multiple PG rules that over-approximate it. */
 public class KeepEdgeSplitter {
 
-  public static Collection<PgRule> split(KeepEdge edge) {
+  private final Consumer<String> ruleConsumer;
+
+  public KeepEdgeSplitter(Consumer<String> ruleConsumer) {
+    this.ruleConsumer = ruleConsumer;
+  }
+
+  public void extract(KeepEdge edge) {
+    Collection<PgRule> rules = split(edge);
+    StringBuilder builder = new StringBuilder();
+    for (PgRule rule : rules) {
+      rule.printRule(builder);
+      builder.append("\n");
+    }
+    ruleConsumer.accept(builder.toString());
+  }
+
+  private static Collection<PgRule> split(KeepEdge edge) {
     return doSplit(KeepEdgeNormalizer.normalize(edge));
   }
 
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/PgRule.java b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/PgRule.java
index ce35e9c..29c2335 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/PgRule.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/PgRule.java
@@ -36,16 +36,16 @@
     return (StringBuilder builder, KeepClassReference classReference) -> {
       assert classReference.isBindingReference()
           || classReference.asClassNamePattern().equals(classNamePattern);
-      KeepRuleExtractor.printClassName(builder, classNamePattern);
+      RulePrintingUtils.printClassName(builder, classNamePattern);
     };
   }
 
   void printKeepOptions(StringBuilder builder) {
-    KeepRuleExtractor.printKeepOptions(builder, options);
+    RulePrintingUtils.printKeepOptions(builder, options);
   }
 
   public void printRule(StringBuilder builder) {
-    KeepRuleExtractor.printHeader(builder, metaInfo);
+    RulePrintingUtils.printHeader(builder, metaInfo);
     printCondition(builder);
     printConsequence(builder);
   }
@@ -129,7 +129,7 @@
 
     @Override
     String getConsequenceKeepType() {
-      return "-keep";
+      return RulePrintingUtils.KEEP;
     }
 
     @Override
@@ -139,7 +139,7 @@
 
     @Override
     void printTargetHolder(StringBuilder builder) {
-      KeepRuleExtractor.printClassHeader(
+      RulePrintingUtils.printClassHeader(
           builder, holderPattern, classReferencePrinter(holderNamePattern));
     }
 
@@ -181,22 +181,22 @@
 
     @Override
     void printConditionHolder(StringBuilder builder) {
-      KeepRuleExtractor.printClassHeader(builder, classCondition, this::printClassName);
+      RulePrintingUtils.printClassHeader(builder, classCondition, this::printClassName);
     }
 
     @Override
     void printConditionMember(StringBuilder builder, String member) {
       KeepMemberPattern memberPattern = memberPatterns.get(member);
-      KeepRuleExtractor.printMemberClause(builder, memberPattern);
+      RulePrintingUtils.printMemberClause(builder, memberPattern);
     }
 
     @Override
     void printTargetHolder(StringBuilder builder) {
-      KeepRuleExtractor.printClassHeader(builder, classTarget, this::printClassName);
+      RulePrintingUtils.printClassHeader(builder, classTarget, this::printClassName);
     }
 
     void printClassName(StringBuilder builder, KeepClassReference clazz) {
-      KeepRuleExtractor.printClassName(builder, clazz.asClassNamePattern());
+      RulePrintingUtils.printClassName(builder, clazz.asClassNamePattern());
     }
   }
 
@@ -224,7 +224,7 @@
 
     @Override
     String getConsequenceKeepType() {
-      return "-keep";
+      return RulePrintingUtils.KEEP;
     }
 
     @Override
@@ -269,7 +269,9 @@
 
     @Override
     String getConsequenceKeepType() {
-      return classAndMembers ? "-keepclasseswithmembers" : "-keepclassmembers";
+      return classAndMembers
+          ? RulePrintingUtils.KEEP_CLASSES_WITH_MEMBERS
+          : RulePrintingUtils.KEEP_CLASS_MEMBERS;
     }
 
     @Override
@@ -280,7 +282,7 @@
     @Override
     void printTargetMember(StringBuilder builder, String member) {
       KeepMemberPattern memberPattern = memberPatterns.get(member);
-      KeepRuleExtractor.printMemberClause(builder, memberPattern);
+      RulePrintingUtils.printMemberClause(builder, memberPattern);
     }
   }
 
@@ -319,7 +321,7 @@
 
     @Override
     void printConditionHolder(StringBuilder b) {
-      KeepRuleExtractor.printClassHeader(
+      RulePrintingUtils.printClassHeader(
           b,
           holderPattern,
           (builder, classReference) -> {
@@ -339,12 +341,12 @@
     void printConditionMember(StringBuilder builder, String member) {
       // TODO(b/248408342): Support back-ref to member instances too.
       KeepMemberPattern memberPattern = memberPatterns.get(member);
-      KeepRuleExtractor.printMemberClause(builder, memberPattern);
+      RulePrintingUtils.printMemberClause(builder, memberPattern);
     }
 
     @Override
     void printTargetHolder(StringBuilder builder) {
-      KeepRuleExtractor.printClassHeader(
+      RulePrintingUtils.printClassHeader(
           builder,
           holderPattern,
           (b, reference) -> {
@@ -407,7 +409,7 @@
 
     @Override
     String getConsequenceKeepType() {
-      return "-keep";
+      return RulePrintingUtils.KEEP;
     }
 
     @Override
@@ -466,7 +468,9 @@
 
     @Override
     String getConsequenceKeepType() {
-      return classAndMembers ? "-keepclasseswithmembers" : "-keepclassmembers";
+      return classAndMembers
+          ? RulePrintingUtils.KEEP_CLASSES_WITH_MEMBERS
+          : RulePrintingUtils.KEEP_CLASS_MEMBERS;
     }
 
     @Override
@@ -479,7 +483,7 @@
       if (hasCondition()) {
         super.printTargetHolder(builder);
       } else {
-        KeepRuleExtractor.printClassHeader(
+        RulePrintingUtils.printClassHeader(
             builder, holderPattern, classReferencePrinter(holderNamePattern));
       }
     }
@@ -488,7 +492,7 @@
     void printTargetMember(StringBuilder builder, String member) {
       // TODO(b/248408342): Support back-ref to member instances too.
       KeepMemberPattern memberPattern = memberPatterns.get(member);
-      KeepRuleExtractor.printMemberClause(builder, memberPattern);
+      RulePrintingUtils.printMemberClause(builder, memberPattern);
     }
   }
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepRuleExtractor.java b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/RulePrintingUtils.java
similarity index 92%
rename from src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepRuleExtractor.java
rename to src/keepanno/java/com/android/tools/r8/keepanno/keeprules/RulePrintingUtils.java
index 39ae46d..f7af345 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepRuleExtractor.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/RulePrintingUtils.java
@@ -1,10 +1,9 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.keeprules;
 
 import com.android.tools.r8.keepanno.ast.KeepClassReference;
-import com.android.tools.r8.keepanno.ast.KeepEdge;
 import com.android.tools.r8.keepanno.ast.KeepEdgeException;
 import com.android.tools.r8.keepanno.ast.KeepEdgeMetaInfo;
 import com.android.tools.r8.keepanno.ast.KeepExtendsPattern;
@@ -25,29 +24,15 @@
 import com.android.tools.r8.keepanno.ast.KeepTypePattern;
 import com.android.tools.r8.keepanno.ast.KeepUnqualfiedClassNamePattern;
 import com.android.tools.r8.keepanno.utils.Unimplemented;
-import java.util.Collection;
 import java.util.function.BiConsumer;
-import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
-/** Extract out a sequence of Proguard keep rules that give a conservative over-approximation. */
-public class KeepRuleExtractor {
+public abstract class RulePrintingUtils {
 
-  private final Consumer<String> ruleConsumer;
-
-  public KeepRuleExtractor(Consumer<String> ruleConsumer) {
-    this.ruleConsumer = ruleConsumer;
-  }
-
-  public void extract(KeepEdge edge) {
-    Collection<PgRule> rules = KeepEdgeSplitter.split(edge);
-    StringBuilder builder = new StringBuilder();
-    for (PgRule rule : rules) {
-      rule.printRule(builder);
-      builder.append("\n");
-    }
-    ruleConsumer.accept(builder.toString());
-  }
+  public static final String IF = "-if";
+  public static final String KEEP = "-keep";
+  public static final String KEEP_CLASS_MEMBERS = "-keepclassmembers";
+  public static final String KEEP_CLASSES_WITH_MEMBERS = "-keepclasseswithmembers";
 
   public static void printHeader(StringBuilder builder, KeepEdgeMetaInfo metaInfo) {
     if (metaInfo.hasContext()) {
@@ -157,7 +142,7 @@
         .append('(')
         .append(
             parametersPattern.asList().stream()
-                .map(KeepRuleExtractor::getTypePatternString)
+                .map(RulePrintingUtils::getTypePatternString)
                 .collect(Collectors.joining(", ")))
         .append(')');
   }
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepEdgeAnnotationsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepEdgeAnnotationsTest.java
index f99f3bf..cced4a2 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepEdgeAnnotationsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepEdgeAnnotationsTest.java
@@ -19,7 +19,7 @@
 import com.android.tools.r8.keepanno.asm.KeepEdgeReader;
 import com.android.tools.r8.keepanno.asm.KeepEdgeWriter;
 import com.android.tools.r8.keepanno.ast.KeepEdge;
-import com.android.tools.r8.keepanno.keeprules.KeepRuleExtractor;
+import com.android.tools.r8.keepanno.keeprules.KeepEdgeSplitter;
 import com.android.tools.r8.keepanno.processor.KeepEdgeProcessor;
 import com.android.tools.r8.keepanno.testsource.KeepClassAndDefaultConstructorSource;
 import com.android.tools.r8.keepanno.testsource.KeepDependentFieldSource;
@@ -204,7 +204,7 @@
   public static List<String> getKeepRulesForClass(Class<?> clazz) throws IOException {
     Set<KeepEdge> keepEdges = KeepEdgeReader.readKeepEdges(ToolHelper.getClassAsBytes(clazz));
     List<String> rules = new ArrayList<>();
-    KeepRuleExtractor extractor = new KeepRuleExtractor(rules::add);
+    KeepEdgeSplitter extractor = new KeepEdgeSplitter(rules::add);
     keepEdges.forEach(extractor::extract);
     return rules;
   }
diff --git a/src/test/java/com/android/tools/r8/keepanno/ast/KeepEdgeAstTest.java b/src/test/java/com/android/tools/r8/keepanno/ast/KeepEdgeAstTest.java
index b85a41b..7dad207 100644
--- a/src/test/java/com/android/tools/r8/keepanno/ast/KeepEdgeAstTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/ast/KeepEdgeAstTest.java
@@ -9,7 +9,7 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.keepanno.ast.KeepOptions.KeepOption;
-import com.android.tools.r8.keepanno.keeprules.KeepRuleExtractor;
+import com.android.tools.r8.keepanno.keeprules.KeepEdgeSplitter;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
@@ -33,7 +33,7 @@
 
   public static String extract(KeepEdge edge) {
     StringBuilder builder = new StringBuilder();
-    KeepRuleExtractor extractor = new KeepRuleExtractor(builder::append);
+    KeepEdgeSplitter extractor = new KeepEdgeSplitter(builder::append);
     extractor.extract(edge);
     return builder.toString();
   }