blob: 3dacb927c0a52a06524ad6926f1785f6f2ceb25c [file] [log] [blame]
// Copyright (c) 2024, 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;
import com.android.tools.r8.R8Command.Builder;
import com.android.tools.r8.TestBase.Backend;
import com.android.tools.r8.benchmarks.BenchmarkResults;
import com.android.tools.r8.shaking.ProguardConfigurationRule;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.Box;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.R8PartialCompilationConfiguration;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;
public class R8PartialTestBuilder
extends R8TestBuilder<R8PartialTestCompileResult, R8TestRunResult, R8PartialTestBuilder> {
private R8PartialCompilationConfiguration r8PartialConfiguration =
R8PartialCompilationConfiguration.disabledConfiguration();
private R8PartialTestBuilder(TestState state, Builder builder, Backend backend) {
super(state, builder, backend);
}
public static R8PartialTestBuilder create(TestState state, Backend backend) {
Builder builder = R8Command.builder(state.getDiagnosticsHandler());
return new R8PartialTestBuilder(state, builder, backend);
}
public static R8PartialTestBuilder create(
TestState state, AndroidApp.Builder appBuilder, Backend backend) {
return new R8PartialTestBuilder(state, R8Command.builder(appBuilder.build()), backend);
}
@Override
public boolean isR8TestBuilder() {
return true;
}
@Override
R8PartialTestBuilder self() {
return this;
}
public R8PartialTestBuilder setR8PartialConfigurationJavaTypePredicate(
Predicate<String> include) {
assert r8PartialConfiguration.equals(R8PartialCompilationConfiguration.disabledConfiguration())
: "Overwriting configuration...?";
r8PartialConfiguration =
R8PartialCompilationConfiguration.builder().includeJavaType(include).build();
return self();
}
public R8PartialTestBuilder setR8PartialConfiguration(
R8PartialCompilationConfiguration configuration) {
assert r8PartialConfiguration.equals(R8PartialCompilationConfiguration.disabledConfiguration())
: "Overwriting configuration...?";
r8PartialConfiguration = configuration;
return self();
}
public R8PartialTestBuilder setR8PartialConfiguration(
Consumer<R8PartialCompilationConfiguration.Builder> consumer) {
assert r8PartialConfiguration.equals(R8PartialCompilationConfiguration.disabledConfiguration())
: "Overwriting configuration...?";
R8PartialCompilationConfiguration.Builder builder = R8PartialCompilationConfiguration.builder();
consumer.accept(builder);
r8PartialConfiguration = builder.build();
return self();
}
@Override
R8PartialTestCompileResult internalCompileR8(
Builder builder,
Consumer<InternalOptions> optionsConsumer,
Supplier<AndroidApp> app,
BenchmarkResults benchmarkResults,
StringBuilder pgConfOutput,
Box<List<ProguardConfigurationRule>> syntheticProguardRulesConsumer,
StringBuilder proguardMapBuilder)
throws CompilationFailedException {
Box<AndroidApp> r8InputAppBox = new Box<>();
Box<AndroidApp> d8InputAppBox = new Box<>();
Box<AndroidApp> r8OutputAppBox = new Box<>();
Box<AndroidApp> d8OutputAppBox = new Box<>();
Consumer<InternalOptions> configureR8PartialCompilation =
options -> {
options.partialCompilationConfiguration = r8PartialConfiguration;
options.partialCompilationConfiguration.r8InputAppConsumer = r8InputAppBox::set;
options.partialCompilationConfiguration.d8InputAppConsumer = d8InputAppBox::set;
options.partialCompilationConfiguration.r8OutputAppConsumer = r8OutputAppBox::set;
options.partialCompilationConfiguration.d8OutputAppConsumer = d8OutputAppBox::set;
};
ToolHelper.runAndBenchmarkR8PartialWithoutResult(
builder, configureR8PartialCompilation.andThen(optionsConsumer), benchmarkResults);
return new R8PartialTestCompileResult(
getState(),
getOutputMode(),
libraryDesugaringTestConfiguration,
app.get(),
pgConfOutput.toString(),
syntheticProguardRulesConsumer.get(),
proguardMapBuilder.toString(),
graphConsumer,
getMinApiLevel(),
features,
residualArtProfiles,
resourceShrinkerOutput,
resourceShrinkerOutputForFeatures,
buildMetadata != null ? buildMetadata.get() : null,
r8InputAppBox.get(),
d8InputAppBox.get(),
r8OutputAppBox.get(),
d8OutputAppBox.get());
}
}