[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();
}