blob: f648da4fca58ce2ce2de691530a505832fa9be3e [file] [log] [blame]
// Copyright (c) 2020, 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.tracereferences;
import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.Keep;
import com.android.tools.r8.StringConsumer;
import com.android.tools.r8.StringConsumer.FileConsumer;
import com.android.tools.r8.tracereferences.internal.TraceReferencesResult;
import java.nio.file.Path;
/**
* Consumer to format the result of running {@link TraceReferences} as keep rules.
*
* <p>To build an instance of this consumer, use the {@link TraceReferencesKeepRules.Builder} class.
* For example:
*
* <pre>
* TraceReferencesKeepRules consumer = TraceReferencesKeepRules.builder()
* .setAllowObfuscation(true)
* .setOutputPath(Paths.get("references-to-keep.rules"))
* .build();
* </pre>
*/
@Keep
public class TraceReferencesKeepRules extends TraceReferencesConsumer.ForwardingConsumer {
private final TraceReferencesResult.Builder traceReferencesResultBuilder;
private final StringConsumer consumer;
private final boolean allowObfuscation;
private TraceReferencesKeepRules(
TraceReferencesResult.Builder traceReferencesResultBuilder,
StringConsumer consumer,
boolean allowObfuscation) {
super(traceReferencesResultBuilder);
this.traceReferencesResultBuilder = traceReferencesResultBuilder;
this.consumer = consumer;
this.allowObfuscation = allowObfuscation;
}
/**
* Builder for constructing a {@link TraceReferencesKeepRules].
*
* <p>A builder is obtained by calling {@link TraceReferencesKeepRules#builder}.
*/
@Keep
public static class Builder {
private StringConsumer consumer;
private boolean allowObfuscation;
/**
* Indicate if the generated keep rules should have the <code>allowobfuscation</code> modifier.
*/
public Builder setAllowObfuscation(boolean value) {
allowObfuscation = value;
return this;
}
/**
* Set the output of the keep rules to a file.
*
* @param output Path to write the output to.
*/
public Builder setOutputPath(Path output) {
this.consumer = new FileConsumer(output);
return this;
}
/**
* Set the output of the keep rules to a {@link com.android.tools.r8.StringConsumer}.
*
* @param consumer Consumer to send the output to.
*/
public Builder setOutputConsumer(StringConsumer consumer) {
this.consumer = consumer;
return this;
}
/** Build the {@link TraceReferencesKeepRules} instance. */
public TraceReferencesKeepRules build() {
return new TraceReferencesKeepRules(
TraceReferencesResult.builder(), consumer, allowObfuscation);
}
}
/** Create a builder for constructing an instance of {@link TraceReferencesKeepRules.Builder}. */
public static Builder builder() {
return new Builder();
}
@Override
public void finished(DiagnosticsHandler handler) {
super.finished(handler);
Formatter formatter = new KeepRuleFormatter(allowObfuscation);
formatter.format(traceReferencesResultBuilder.build());
consumer.accept(formatter.get(), handler);
consumer.finished(handler);
}
}