From 192d569e54ca7aef52b079eab64c7b87fec96879 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Wed, 9 Aug 2017 19:42:31 +0300 Subject: [PATCH] Support Java package prefix in Gradle plugin Issue #KT-17150 Fixed --- .../org/jetbrains/kotlin/incremental/buildUtil.kt | 12 ++++++++++-- .../jetbrains/kotlin/daemon/CompileServiceImpl.kt | 7 ++++++- .../incremental/IncrementalJvmCompilerRunner.kt | 7 +++++-- .../compilerRunner/GradleKotlinCompilerRunner.kt | 7 +++---- .../jetbrains/kotlin/gradle/internal/KaptTask.kt | 11 +++++++++-- .../org/jetbrains/kotlin/gradle/tasks/Tasks.kt | 15 ++++++++++++++- 6 files changed, 47 insertions(+), 12 deletions(-) diff --git a/build-common/src/org/jetbrains/kotlin/incremental/buildUtil.kt b/build-common/src/org/jetbrains/kotlin/incremental/buildUtil.kt index fd83e104fa5..b96c9010e36 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/buildUtil.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/buildUtil.kt @@ -43,13 +43,21 @@ import java.util.* fun Iterable.javaSourceRoots(roots: Iterable): Iterable = filter(File::isJavaFile).mapNotNull { findSrcDirRoot(it, roots) } -fun makeModuleFile(name: String, isTest: Boolean, outputDir: File, sourcesToCompile: Iterable, javaSourceRoots: Iterable, classpath: Iterable, friendDirs: Iterable): File { +fun makeModuleFile( + name: String, + isTest: Boolean, + outputDir: File, + sourcesToCompile: Iterable, + javaSourceRoots: Iterable, + classpath: Iterable, + friendDirs: Iterable +): File { val builder = KotlinModuleXmlBuilder() builder.addModule( name, outputDir.absolutePath, sourcesToCompile, - javaSourceRoots.map { JvmSourceRoot(it) }, + javaSourceRoots, classpath, null, "java-production", diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt index 643148e970d..4636246b6b0 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt @@ -20,6 +20,7 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.util.Disposer import com.intellij.openapi.vfs.impl.ZipHandler import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem +import org.jetbrains.kotlin.build.JvmSourceRoot import org.jetbrains.kotlin.cli.common.CLICompiler import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.KOTLIN_COMPILER_ENVIRONMENT_KEEPALIVE_PROPERTY @@ -434,7 +435,11 @@ class CompileServiceImpl( } parsedModule } - val javaSourceRoots = parsedModule.modules.flatMapTo(HashSet()) { it.getJavaSourceRoots().map { File(it.path) } } + + val javaSourceRoots = parsedModule.modules.flatMapTo(HashSet()) { + it.getJavaSourceRoots().map { JvmSourceRoot(File(it.path), it.packagePrefix) } + } + val allKotlinFiles = parsedModule.modules.flatMap { it.getSourceFiles().map(::File) } k2jvmArgs.friendPaths = parsedModule.modules.flatMap(Module::getFriendPaths).toTypedArray() diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt index ec18536ed26..bcae7e68796 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt @@ -20,6 +20,7 @@ import com.intellij.util.io.PersistentEnumeratorBase import org.jetbrains.kotlin.annotation.AnnotationFileUpdater import org.jetbrains.kotlin.build.GeneratedFile import org.jetbrains.kotlin.build.GeneratedJvmClass +import org.jetbrains.kotlin.build.JvmSourceRoot import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation @@ -59,7 +60,9 @@ fun makeIncrementally( val kotlinFiles = sourceFiles.filter { it.extension.toLowerCase() in kotlinExtensions } withIC { - val compiler = IncrementalJvmCompilerRunner(cachesDir, /* javaSourceRoots = */sourceRoots.toSet(), versions, reporter) + val compiler = IncrementalJvmCompilerRunner(cachesDir, + sourceRoots.map { JvmSourceRoot(it, null) }.toSet(), + versions, reporter) compiler.compile(kotlinFiles, args, messageCollector) { it.incrementalCache.sourceSnapshotMap.compareAndUpdate(sourceFiles) } @@ -85,7 +88,7 @@ inline fun withIC(enabled: Boolean = true, fn: ()->R): R { class IncrementalJvmCompilerRunner( workingDir: File, - private val javaSourceRoots: Set, + private val javaSourceRoots: Set, private val cacheVersions: List, private val reporter: ICReporter, private var kaptAnnotationsFileUpdater: AnnotationFileUpdater? = null, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt index 549be228654..67e7949eb94 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.compilerRunner import org.gradle.api.Project +import org.jetbrains.kotlin.build.JvmSourceRoot import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments @@ -29,8 +30,6 @@ import org.jetbrains.kotlin.cli.common.messages.MessageRenderer import org.jetbrains.kotlin.com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.daemon.client.CompileServiceSession -import org.jetbrains.kotlin.daemon.client.DaemonReportingTargets -import org.jetbrains.kotlin.daemon.client.launchProcessWithFallback import org.jetbrains.kotlin.daemon.common.* import org.jetbrains.kotlin.gradle.plugin.ParentLastURLClassLoader import org.jetbrains.kotlin.gradle.plugin.kotlinDebug @@ -38,7 +37,6 @@ import org.jetbrains.kotlin.incremental.* import java.io.ByteArrayOutputStream import java.io.File import java.io.PrintStream -import kotlin.concurrent.thread internal const val KOTLIN_COMPILER_EXECUTION_STRATEGY_PROPERTY = "kotlin.compiler.execution.strategy" internal const val DAEMON_EXECUTION_STRATEGY = "daemon" @@ -85,6 +83,7 @@ internal class GradleCompilerRunner(private val project: Project) : KotlinCompil fun runJvmCompiler( sourcesToCompile: List, javaSourceRoots: Iterable, + javaPackagePrefix: String?, args: K2JVMCompilerArguments, environment: GradleCompilerEnvironment ): ExitCode { @@ -93,7 +92,7 @@ internal class GradleCompilerRunner(private val project: Project) : KotlinCompil isTest = false, outputDir = args.destinationAsFile, sourcesToCompile = sourcesToCompile, - javaSourceRoots = javaSourceRoots, + javaSourceRoots = javaSourceRoots.map { JvmSourceRoot(it, javaPackagePrefix) }, classpath = args.classpathAsList, friendDirs = args.friendPaths?.map(::File) ?: emptyList()) args.buildFile = buildFile.absolutePath diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt index 722a55400dc..a2a114774b4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt @@ -3,7 +3,9 @@ package org.jetbrains.kotlin.gradle.internal import org.gradle.api.GradleException import org.gradle.api.file.FileCollection import org.gradle.api.internal.ConventionTask -import org.gradle.api.tasks.* +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.TaskAction import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.compilerRunner.GradleCompilerEnvironment @@ -67,7 +69,12 @@ open class KaptTask : ConventionTask() { } val compilerRunner = GradleCompilerRunner(project) - val exitCode = compilerRunner.runJvmCompiler(sourceRoots.kotlinSourceFiles, sourceRoots.javaSourceRoots, args, environment) + val exitCode = compilerRunner.runJvmCompiler( + sourceRoots.kotlinSourceFiles, + sourceRoots.javaSourceRoots, + kotlinCompileTask.javaPackagePrefix, + args, + environment) throwGradleExceptionIfError(exitCode) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index 6c4dd6b5268..be9c4c0e93c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -232,6 +232,13 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl val kaptOptions = KaptOptions() + /** A package prefix that is used for locating Java sources in a directory structure with non-full-depth packages. + * + * Example: a Java source file with `package com.example.my.package` is located in directory `src/main/java/my/package`. + * Then, for the Kotlin compilation to locate the source file, use package prefix `"com.example"` */ + @Input + var javaPackagePrefix: String? = null + internal val pluginOptions = CompilerPluginOptions() internal var artifactDifferenceRegistryProvider: ArtifactDifferenceRegistryProvider? = null internal var artifactFile: File? = null @@ -302,7 +309,13 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl } try { - val exitCode = compilerRunner.runJvmCompiler(sourceRoots.kotlinSourceFiles, sourceRoots.javaSourceRoots, args, environment) + val exitCode = compilerRunner.runJvmCompiler( + sourceRoots.kotlinSourceFiles, + sourceRoots.javaSourceRoots, + javaPackagePrefix, + args, + environment) + processCompilerExitCode(exitCode) artifactDifferenceRegistryProvider?.withRegistry(reporter) { it.flush(true)