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