From 6ce92651656d13d34fcb7eedaab3fbd8ccf84542 Mon Sep 17 00:00:00 2001 From: Chris Woodward and Nelson Osacky Date: Tue, 23 May 2017 14:19:40 -0700 Subject: [PATCH] Add support for kotlin and java mixed sources. This adds a javac step to the KotlincToJarStepFactory. If any java files are found it will invoke javac, otherwise it won't do anything. --- .../DefaultAndroidLibraryCompilerFactory.java | 2 +- .../android/KotlinAndroidLibraryCompiler.java | 14 +++++- .../kotlin/DefaultKotlinLibraryBuilder.java | 2 +- .../jvm/kotlin/KotlincToJarStepFactory.java | 49 ++++++++++++++++++- 4 files changed, 62 insertions(+), 5 deletions(-) diff --git a/src/com/facebook/buck/android/DefaultAndroidLibraryCompilerFactory.java b/src/com/facebook/buck/android/DefaultAndroidLibraryCompilerFactory.java index f8d1a3b7d59..d9c7a2755ab 100644 --- a/src/com/facebook/buck/android/DefaultAndroidLibraryCompilerFactory.java +++ b/src/com/facebook/buck/android/DefaultAndroidLibraryCompilerFactory.java @@ -41,7 +41,7 @@ public AndroidLibraryCompiler getCompiler(AndroidLibraryDescription.JvmLanguage case SCALA: return new ScalaAndroidLibraryCompiler(scalaConfig); case KOTLIN: - return new KotlinAndroidLibraryCompiler(kotlinBuckConfig); + return new KotlinAndroidLibraryCompiler(kotlinBuckConfig, javaConfig); } throw new HumanReadableException("Unsupported `language` parameter value: %s", language); } diff --git a/src/com/facebook/buck/android/KotlinAndroidLibraryCompiler.java b/src/com/facebook/buck/android/KotlinAndroidLibraryCompiler.java index eaf565294ef..6ed0ec95549 100644 --- a/src/com/facebook/buck/android/KotlinAndroidLibraryCompiler.java +++ b/src/com/facebook/buck/android/KotlinAndroidLibraryCompiler.java @@ -17,19 +17,25 @@ package com.facebook.buck.android; import com.facebook.buck.jvm.java.CompileToJarStepFactory; +import com.facebook.buck.jvm.java.JavaBuckConfig; +import com.facebook.buck.jvm.java.Javac; +import com.facebook.buck.jvm.java.JavacFactory; import com.facebook.buck.jvm.java.JavacOptions; import com.facebook.buck.jvm.kotlin.KotlinBuckConfig; import com.facebook.buck.jvm.kotlin.KotlincToJarStepFactory; import com.facebook.buck.rules.BuildRuleResolver; +import com.facebook.buck.rules.SourcePathRuleFinder; import com.google.common.collect.ImmutableList; public class KotlinAndroidLibraryCompiler extends AndroidLibraryCompiler { private final KotlinBuckConfig kotlinBuckConfig; + private final JavaBuckConfig javaBuckConfig; - public KotlinAndroidLibraryCompiler(KotlinBuckConfig kotlinBuckConfig) { + public KotlinAndroidLibraryCompiler(KotlinBuckConfig kotlinBuckConfig, JavaBuckConfig javaBuckConfig) { super(); this.kotlinBuckConfig = kotlinBuckConfig; + this.javaBuckConfig = javaBuckConfig; } @Override @@ -45,6 +51,12 @@ public CompileToJarStepFactory compileToJar( return new KotlincToJarStepFactory( kotlinBuckConfig.getKotlinCompiler().get(), ImmutableList.of(), + getJavac(resolver, args), + javacOptions, ANDROID_CLASSPATH_FROM_CONTEXT); } + + private Javac getJavac(BuildRuleResolver resolver, AndroidLibraryDescription.CoreArg arg) { + return JavacFactory.create(new SourcePathRuleFinder(resolver), javaBuckConfig, arg); + } } diff --git a/src/com/facebook/buck/jvm/kotlin/DefaultKotlinLibraryBuilder.java b/src/com/facebook/buck/jvm/kotlin/DefaultKotlinLibraryBuilder.java index d7a65d5e66a..14bb268d14f 100644 --- a/src/com/facebook/buck/jvm/kotlin/DefaultKotlinLibraryBuilder.java +++ b/src/com/facebook/buck/jvm/kotlin/DefaultKotlinLibraryBuilder.java @@ -59,7 +59,7 @@ protected class BuilderHelper extends DefaultJavaLibraryBuilder.BuilderHelper { protected CompileToJarStepFactory buildCompileStepFactory() { return new KotlincToJarStepFactory( Preconditions.checkNotNull(kotlinBuckConfig).getKotlinCompiler().get(), - extraKotlincArguments); + extraKotlincArguments, getJavac(), javacOptions); } } } diff --git a/src/com/facebook/buck/jvm/kotlin/KotlincToJarStepFactory.java b/src/com/facebook/buck/jvm/kotlin/KotlincToJarStepFactory.java index cd42d70e79f..fb9a544cf61 100644 --- a/src/com/facebook/buck/jvm/kotlin/KotlincToJarStepFactory.java +++ b/src/com/facebook/buck/jvm/kotlin/KotlincToJarStepFactory.java @@ -19,6 +19,10 @@ import com.facebook.buck.io.ProjectFilesystem; import com.facebook.buck.jvm.java.BaseCompileToJarStepFactory; import com.facebook.buck.jvm.java.ClassUsageFileWriter; +import com.facebook.buck.jvm.java.ClasspathChecker; +import com.facebook.buck.jvm.java.Javac; +import com.facebook.buck.jvm.java.JavacOptions; +import com.facebook.buck.jvm.java.JavacStep; import com.facebook.buck.model.BuildTarget; import com.facebook.buck.rules.BuildContext; import com.facebook.buck.rules.BuildableContext; @@ -30,25 +34,38 @@ import com.google.common.base.Function; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSortedSet; + +import java.nio.file.FileSystems; import java.nio.file.Path; +import java.nio.file.PathMatcher; import java.util.Optional; +import java.util.stream.Collectors; public class KotlincToJarStepFactory extends BaseCompileToJarStepFactory { + private static final PathMatcher JAVA_PATH_MATCHER = FileSystems.getDefault() + .getPathMatcher("glob:**.java"); + private final Tool kotlinc; private final ImmutableList extraArguments; + private final JavacOptions javacOptions; private final Function> extraClassPath; + private final Javac javac; - public KotlincToJarStepFactory(Tool kotlinc, ImmutableList extraArguments) { - this(kotlinc, extraArguments, EMPTY_EXTRA_CLASSPATH); + public KotlincToJarStepFactory(Tool kotlinc, ImmutableList extraArguments, Javac javac, JavacOptions javacOptions) { + this(kotlinc, extraArguments, javac, javacOptions, EMPTY_EXTRA_CLASSPATH); } public KotlincToJarStepFactory( Tool kotlinc, ImmutableList extraArguments, + Javac javac, + JavacOptions javacOptions, Function> extraClassPath) { this.kotlinc = kotlinc; this.extraArguments = extraArguments; + this.javac = javac; + this.javacOptions = javacOptions; this.extraClassPath = extraClassPath; } @@ -81,6 +98,34 @@ public void createCompileStep( .addAll(declaredClasspathEntries) .build(), filesystem)); + + ImmutableSortedSet javaSourceFiles = ImmutableSortedSet.copyOf( + sourceFilePaths + .stream() + .filter(JAVA_PATH_MATCHER::matches) + .collect(Collectors.toSet())); + + // Don't invoke javac if we don't have any java files. + if (!javaSourceFiles.isEmpty()) { + steps.add(new JavacStep( + outputDirectory, + usedClassesFileWriter, + workingDirectory, + javaSourceFiles, + pathToSrcsList, + ImmutableSortedSet.naturalOrder() + .add(outputDirectory) + .addAll(declaredClasspathEntries) + .build(), + javac, + javacOptions, + invokingRule, + resolver, + filesystem, + new ClasspathChecker(), + Optional.empty() + )); + } } @Override