blob: e8e75f55373b1f198149dacb2af482fa1ad17d77 [file] [log] [blame]
// Copyright (c) 2021, 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.graph.AppView;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.shaking.ProguardConfigurationRule;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.ListUtils;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
public class TestAppViewBuilder {
private AndroidApp.Builder builder = AndroidApp.builder();
private List<Function<DexItemFactory, List<ProguardConfigurationRule>>> rules = new ArrayList<>();
private List<Consumer<InternalOptions>> optionModifications = new ArrayList<>();
public static TestAppViewBuilder builder() {
return new TestAppViewBuilder();
}
private TestAppViewBuilder() {}
public TestAppViewBuilder addProgramClasses(Class<?>... classes) {
return addProgramClasses(Arrays.asList(classes));
}
public TestAppViewBuilder addProgramClasses(Collection<Class<?>> classes) {
classes.forEach(clazz -> builder.addProgramFile(ToolHelper.getClassFileForTestClass(clazz)));
return this;
}
public TestAppViewBuilder addProgramClassFileData(byte[]... classes) {
return addProgramClassFileData(Arrays.asList(classes));
}
public TestAppViewBuilder addProgramClassFileData(Collection<byte[]> classes) {
builder.addClassProgramData(classes);
return this;
}
public TestAppViewBuilder addAndroidApp(AndroidApp app) {
app.getProgramResourceProviders().forEach(builder::addProgramResourceProvider);
app.getClasspathResourceProviders().forEach(builder::addClasspathResourceProvider);
app.getLibraryResourceProviders().forEach(builder::addLibraryResourceProvider);
assert !app.hasMainDexList() : "todo";
return this;
}
public TestAppViewBuilder addKeepAllRule() {
rules = null;
return this;
}
public TestAppViewBuilder addKeepMainRule(Class<?> mainClass) {
return addKeepRuleBuilder(
factory -> TestBase.buildKeepRuleForClassAndMethods(mainClass, factory));
}
public TestAppViewBuilder addKeepRuleBuilder(
Function<DexItemFactory, List<ProguardConfigurationRule>> ruleBuilder) {
if (rules != null) {
rules.add(ruleBuilder);
}
return this;
}
public TestAppViewBuilder addOptionsModification(Consumer<InternalOptions> optionsConsumer) {
optionModifications.add(optionsConsumer);
return this;
}
public AppView<AppInfoWithLiveness> buildWithLiveness() throws Exception {
return TestBase.computeAppViewWithLiveness(
builder.build(),
(rules == null
? null
: factory ->
TestBase.buildConfigForRules(
factory, ListUtils.flatMap(rules, r -> r.apply(factory)))),
options -> optionModifications.forEach(consumer -> consumer.accept(options)));
}
public TestAppViewBuilder setMinApi(AndroidApiLevel minApi) {
optionModifications.add(options -> options.setMinApiLevel(minApi));
return this;
}
public TestAppViewBuilder addClasspathClasses(Class<?>... classes) {
return addClasspathClasses(Arrays.asList(classes));
}
public TestAppViewBuilder addClasspathClasses(Collection<Class<?>> classes) {
classes.forEach(clazz -> addClasspathFiles(ToolHelper.getClassFileForTestClass(clazz)));
return this;
}
public TestAppViewBuilder addClasspathFiles(Path... files) {
return addClasspathFiles(Arrays.asList(files));
}
public TestAppViewBuilder addClasspathFiles(List<Path> files) {
builder.addClasspathFiles(files);
return this;
}
public TestAppViewBuilder addLibraryFiles(Path... files) {
return addLibraryFiles(Arrays.asList(files));
}
public TestAppViewBuilder addLibraryFiles(List<Path> files) {
builder.addLibraryFiles(files);
return this;
}
public TestAppViewBuilder addTestingAnnotations() {
return addProgramClasses(TestBuilder.getTestingAnnotations());
}
}