blob: 824a7427b6a7dbda397eed40a8db4180d8e4c661 [file] [log] [blame]
/*
* Copyright 2018 The Bazel Authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.bazel.kotlin.builder;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import io.bazel.kotlin.builder.toolchain.KotlinToolchain;
import io.bazel.kotlin.model.CompilationTaskInfo;
import io.bazel.kotlin.model.JvmCompilationTask;
import java.util.HashSet;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static io.bazel.kotlin.builder.Deps.*;
public final class KotlinBuilderJvmTestTask extends KotlinBuilderResource<JvmCompilationTask> {
@SuppressWarnings({"unused", "WeakerAccess"})
public static Dep
KOTLIN_ANNOTATIONS =
Dep.importJar(
"kotlin-annotations",
"external/com_github_jetbrains_kotlin/lib/annotations-13.0.jar"),
KOTLIN_STDLIB =
Dep.importJar(
"kotlin-stdlib", "external/com_github_jetbrains_kotlin/lib/kotlin-stdlib.jar"),
KOTLIN_STDLIB_JDK7 =
Dep.importJar(
"kotlin-stdlib-jdk7",
"external/com_github_jetbrains_kotlin/lib/kotlin-stdlib-jdk7.jar"),
KOTLIN_STDLIB_JDK8 =
Dep.importJar(
"kotlin-stdlib-jdk8",
"external/com_github_jetbrains_kotlin/lib/kotlin-stdlib-jdk8.jar");
private static final JvmCompilationTask.Builder taskBuilder = JvmCompilationTask.newBuilder();
private static final KotlinBuilderComponent component =
DaggerKotlinBuilderComponent.builder().toolchain(KotlinToolchain.createToolchain()).build();
@Override
CompilationTaskInfo.Builder infoBuilder() {
return taskBuilder.getInfoBuilder();
}
@Override
JvmCompilationTask buildTask() {
return taskBuilder.build();
}
@Override
protected final void before() throws Throwable {
taskBuilder.clear();
super.before();
taskBuilder
.getDirectoriesBuilder()
.setClasses(directory(DirectoryType.CLASSES).toAbsolutePath().toString())
.setGeneratedSources(directory(DirectoryType.SOURCE_GEN).toAbsolutePath().toString())
.setTemp(directory(DirectoryType.TEMP).toAbsolutePath().toString())
.setGeneratedClasses(
directory(DirectoryType.GENERATED_CLASSES).toAbsolutePath().toString());
taskBuilder
.getOutputsBuilder()
.setJar(instanceRoot().resolve("jar_file.jar").toAbsolutePath().toString())
.setJdeps(instanceRoot().resolve("jdeps_file.jdeps").toAbsolutePath().toString())
.setSrcjar(instanceRoot().resolve("jar_file-sources.jar").toAbsolutePath().toString());
}
private void resetForNext() {
try {
before();
} catch (Throwable throwable) {
throw new RuntimeException(throwable);
}
}
public void addSource(String filename, String... lines) {
String pathAsString = super.writeSourceFile(filename, lines).toString();
if (pathAsString.endsWith(".kt")) {
taskBuilder.getInputsBuilder().addKotlinSources(pathAsString);
} else if (pathAsString.endsWith(".java")) {
taskBuilder.getInputsBuilder().addJavaSources(pathAsString);
} else {
throw new RuntimeException("unhandled file type: " + pathAsString);
}
}
public void addAnnotationProcessors(AnnotationProcessor... annotationProcessors) {
Preconditions.checkState(
taskBuilder.getInputs().getProcessorsList().isEmpty(), "processors already set");
HashSet<String> processorClasses = new HashSet<>();
taskBuilder
.getInputsBuilder()
.addAllProcessorpaths(
Stream.of(annotationProcessors)
.peek(it -> processorClasses.add(it.processClass()))
.flatMap(it -> it.processorPath().stream())
.distinct()
.collect(Collectors.toList()))
.addAllProcessors(processorClasses);
}
public void addDirectDependencies(Dep... dependencies) {
Dep.classpathOf(dependencies)
.forEach((dependency) -> taskBuilder.getInputsBuilder().addClasspath(dependency));
}
private Dep currentDep() {
return Dep.builder()
.label(label())
.compileJars(ImmutableSet.of(taskBuilder.getOutputs().getJar()))
.runtimeDeps(ImmutableSet.copyOf(taskBuilder.getInputs().getClasspathList()))
.build();
}
@SafeVarargs
public final Dep runCompileTask(Consumer<KotlinBuilderJvmTestTask>... setup) {
Stream.of(setup).forEach(it -> it.accept(this));
return runCompileTask(
(taskContext, task) -> {
component.jvmTaskExecutor().execute(taskContext, task);
assertFilesExist(task.getOutputs().getJar(), task.getOutputs().getJdeps());
return currentDep();
});
}
/** Run a single compile task returning a dep and resetting the context. */
@SafeVarargs
public final Dep supplyDepTask(Consumer<KotlinBuilderJvmTestTask>... setup) {
Dep dep = runCompileTask(setup);
resetForNext();
return dep;
}
}