Inspect keep anno generated keep rules
Bug: b/392865072
Change-Id: Ib933f7f9a553ce643eb41ed19ad8efdbd7038af4
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
index a412aff..b9baff4 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
@@ -153,15 +153,29 @@
return this;
}
+ /**
+ * Prints the all rules passed to the compilation. Compared to {@link #printExtractedRules()} this
+ * is all rules, not just the ones extracted from keep annotations.
+ */
public final KeepAnnoTestBuilder printRules() {
- return inspectOutputConfig(System.out::println);
+ return inspectOutputRules(System.out::println);
}
- public KeepAnnoTestBuilder inspectOutputConfig(Consumer<String> configConsumer) {
- // Default to ignore the consumer.
- return this;
+ /**
+ * Inspect the all rules passed to the compilation. Compared to {@link
+ * #inspectExtractedRules(Consumer)} this is all rules, not just the ones extracted from keep
+ * annotations.
+ */
+ public abstract KeepAnnoTestBuilder inspectOutputRules(Consumer<String> configConsumer);
+
+ /** Prints the rules extracted from annotations as part of the compilation. */
+ public final KeepAnnoTestBuilder printExtractedRules() {
+ return inspectExtractedRules(rules -> System.out.println(String.join("\n", rules)));
}
+ /** Inspect the rules extracted from annotations as part of the compilation. */
+ public abstract KeepAnnoTestBuilder inspectExtractedRules(Consumer<List<String>> configConsumer);
+
private static class ReferenceBuilder extends KeepAnnoTestBuilder {
private final TestBuilder<? extends SingleTestRunResult<?>, ?> builder;
@@ -199,6 +213,18 @@
}
@Override
+ public KeepAnnoTestBuilder inspectOutputRules(Consumer<String> configConsumer) {
+ // Ignore the consumer.
+ return this;
+ }
+
+ @Override
+ public KeepAnnoTestBuilder inspectExtractedRules(Consumer<List<String>> configConsumer) {
+ // Ignore the consumer.
+ return this;
+ }
+
+ @Override
public SingleTestRunResult<?> run(Class<?> mainClass) throws Exception {
return builder.run(parameters().getRuntime(), mainClass);
}
@@ -212,6 +238,7 @@
final KeepAnnoConfig config;
final List<Consumer<R>> compileResultConsumers = new ArrayList<>();
+ final List<String> extractedRules = new ArrayList();
private R8NativeBuilderBase(KeepAnnoParameters params, B builder) {
super(params);
@@ -276,7 +303,12 @@
if (isExtractRules()) {
List<KeepDeclaration> declarations = KeepEdgeReader.readKeepEdges(classFileData);
if (!declarations.isEmpty()) {
- KeepRuleExtractor extractor = new KeepRuleExtractor(builder::addKeepRules);
+ KeepRuleExtractor extractor =
+ new KeepRuleExtractor(
+ rule -> {
+ builder.addKeepRules(rule);
+ extractedRules.add(rule);
+ });
declarations.forEach(extractor::extract);
}
return;
@@ -299,13 +331,19 @@
}
@Override
- public KeepAnnoTestBuilder inspectOutputConfig(Consumer<String> configConsumer) {
+ public KeepAnnoTestBuilder inspectOutputRules(Consumer<String> configConsumer) {
compileResultConsumers.add(
result -> configConsumer.accept(result.getProguardConfiguration()));
return this;
}
@Override
+ public KeepAnnoTestBuilder inspectExtractedRules(Consumer<List<String>> configConsumer) {
+ compileResultConsumers.add(result -> configConsumer.accept(extractedRules));
+ return this;
+ }
+
+ @Override
public SingleTestRunResult<?> run(Class<?> mainClass) throws Exception {
R compileResult = builder.compile();
compileResultConsumers.forEach(fn -> fn.accept(compileResult));
@@ -393,6 +431,8 @@
KeepRuleExtractorOptions.getR8Options();
private final ExternalR8TestBuilder builder;
private final List<Consumer<List<String>>> configConsumers = new ArrayList<>();
+ private final List<Consumer<List<String>>> extractedRulesConsumers = new ArrayList<>();
+ private final List<String> extractedRules = new ArrayList();
public R8LegacyBuilder(
KeepAnnoParameters params,
@@ -419,6 +459,7 @@
List<String> rules = KeepAnnoTestUtils.extractRulesFromFiles(programFiles, extractorOptions);
builder.addProgramFiles(programFiles);
builder.addKeepRules(rules);
+ extractedRules.addAll(rules);
return this;
}
@@ -427,6 +468,7 @@
List<String> rules = KeepAnnoTestUtils.extractRules(programClasses, extractorOptions);
builder.addProgramClasses(programClasses);
builder.addKeepRules(rules);
+ extractedRules.addAll(rules);
return this;
}
@@ -437,18 +479,25 @@
KeepAnnoTestUtils.extractRulesFromBytes(programClasses, extractorOptions);
builder.addProgramClassFileData(programClasses);
builder.addKeepRules(rules);
+ extractedRules.addAll(rules);
return this;
}
@Override
- public KeepAnnoTestBuilder inspectOutputConfig(Consumer<String> configConsumer) {
+ public KeepAnnoTestBuilder inspectOutputRules(Consumer<String> configConsumer) {
configConsumers.add(lines -> configConsumer.accept(String.join("\n", lines)));
return this;
}
+ public KeepAnnoTestBuilder inspectExtractedRules(Consumer<List<String>> configConsumer) {
+ extractedRulesConsumers.add(configConsumer);
+ return this;
+ }
+
@Override
public SingleTestRunResult<?> run(Class<?> mainClass) throws Exception {
configConsumers.forEach(fn -> fn.accept(builder.getConfig()));
+ extractedRulesConsumers.forEach(fn -> fn.accept(extractedRules));
return builder.run(parameters().getRuntime(), mainClass);
}
}
@@ -459,6 +508,8 @@
KeepRuleExtractorOptions.getPgOptions();
private final ProguardTestBuilder builder;
private final List<Consumer<List<String>>> configConsumers = new ArrayList<>();
+ private final List<Consumer<List<String>>> extractedRulesConsumers = new ArrayList<>();
+ private final List<String> extractedRules = new ArrayList();
public PGBuilder(
KeepAnnoParameters params,
@@ -490,6 +541,7 @@
List<String> rules = KeepAnnoTestUtils.extractRulesFromFiles(programFiles, extractorOptions);
builder.addProgramFiles(programFiles);
builder.addKeepRules(rules);
+ extractedRules.addAll(rules);
return this;
}
@@ -498,6 +550,7 @@
List<String> rules = KeepAnnoTestUtils.extractRules(programClasses, extractorOptions);
builder.addProgramClasses(programClasses);
builder.addKeepRules(rules);
+ extractedRules.addAll(rules);
return this;
}
@@ -508,18 +561,25 @@
KeepAnnoTestUtils.extractRulesFromBytes(programClasses, extractorOptions);
builder.addProgramClassFileData(programClasses);
builder.addKeepRules(rules);
+ extractedRules.addAll(rules);
return this;
}
@Override
- public KeepAnnoTestBuilder inspectOutputConfig(Consumer<String> configConsumer) {
+ public KeepAnnoTestBuilder inspectOutputRules(Consumer<String> configConsumer) {
configConsumers.add(lines -> configConsumer.accept(String.join("\n", lines)));
return this;
}
+ public KeepAnnoTestBuilder inspectExtractedRules(Consumer<List<String>> configConsumer) {
+ extractedRulesConsumers.add(configConsumer);
+ return this;
+ }
+
@Override
public SingleTestRunResult<?> run(Class<?> mainClass) throws Exception {
configConsumers.forEach(fn -> fn.accept(builder.getConfig()));
+ extractedRulesConsumers.forEach(fn -> fn.accept(extractedRules));
return builder.run(parameters().getRuntime(), mainClass);
}
}