From 7031087a935b53bc785cf6bf5c02a5fe25432757 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Tue, 14 Nov 2017 16:52:17 +0300 Subject: [PATCH] Mark Gradle task properties with input/output annotations. --- .../kotlin/gradle/dsl/KotlinCompile.kt | 2 + .../gradle/internal/KaptGenerateStubsTask.kt | 11 +-- .../kotlin/gradle/internal/KaptTask.kt | 20 +++--- .../kotlin/gradle/tasks/KotlinJsDce.kt | 6 ++ .../kotlin/gradle/tasks/SyncOutputTask.kt | 12 ++-- .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 72 ++++++++++++++----- 6 files changed, 88 insertions(+), 35 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinCompile.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinCompile.kt index 71fa71db0aa..1b9386bb72a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinCompile.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinCompile.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.gradle.dsl import groovy.lang.Closure import org.gradle.api.Task +import org.gradle.api.tasks.Internal interface CompilerArgumentAware { val serializedCompilerArguments: List @@ -25,6 +26,7 @@ interface CompilerArgumentAware { } interface KotlinCompile : Task, CompilerArgumentAware { + @get:Internal val kotlinOptions: T fun kotlinOptions(fn: T.() -> Unit) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptGenerateStubsTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptGenerateStubsTask.kt index f6aa6371c30..eca0a29da40 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptGenerateStubsTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptGenerateStubsTask.kt @@ -16,11 +16,9 @@ package org.jetbrains.kotlin.gradle.internal -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.SourceTask -import org.gradle.api.tasks.incremental.IncrementalTaskInputs import com.intellij.openapi.util.io.FileUtil -import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.* +import org.gradle.api.tasks.incremental.IncrementalTaskInputs import org.jetbrains.kotlin.gradle.plugin.kotlinDebug import org.jetbrains.kotlin.gradle.tasks.FilteringSourceRootsContainer import org.jetbrains.kotlin.gradle.tasks.KotlinCompile @@ -33,14 +31,16 @@ import java.io.File open class KaptGenerateStubsTask : KotlinCompile() { override val sourceRootsContainer = FilteringSourceRootsContainer(emptyList(), { isSourceRootAllowed(it) }) + @get:Internal internal lateinit var kotlinCompileTask: KotlinCompile @get:OutputDirectory lateinit var stubsDir: File + @get:Internal lateinit var generatedSourcesDir: File - @get:InputFiles + @get:Classpath @get:InputFiles lateinit var kaptClasspath: List override fun source(vararg sources: Any?): SourceTask? { @@ -70,6 +70,7 @@ open class KaptGenerateStubsTask : KotlinCompile() { } sourceRoots.log(this.name, logger) + // todo handle the args like those of the compile tasks val args = createCompilerArgs() kotlinCompileTask.setupCompilerArgs(args) 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 0b348f32f5d..94f7415b532 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 @@ -1,13 +1,11 @@ package org.jetbrains.kotlin.gradle.internal +import com.intellij.openapi.util.io.FileUtil import org.gradle.api.GradleException import org.gradle.api.file.FileCollection import org.gradle.api.internal.ConventionTask -import org.gradle.api.tasks.InputFiles -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.TaskAction +import org.gradle.api.tasks.* import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments -import com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.compilerRunner.GradleCompilerEnvironment import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner import org.jetbrains.kotlin.compilerRunner.OutputItemsCollectorImpl @@ -16,9 +14,13 @@ import org.jetbrains.kotlin.gradle.tasks.* import java.io.File open class KaptTask : ConventionTask() { + @get:Internal internal val pluginOptions = CompilerPluginOptions() + @get:Internal internal lateinit var kotlinCompileTask: KotlinCompile + + @get:Internal internal lateinit var stubsDir: File private fun isInsideDestinationDirs(file: File): Boolean { @@ -26,17 +28,18 @@ open class KaptTask : ConventionTask() { || FileUtil.isAncestor(classesDir, file, /* strict = */ false) } - @get:InputFiles + @get:Classpath @get:InputFiles lateinit var kaptClasspath: List - @OutputDirectory + @get:OutputDirectory internal lateinit var classesDir: File - @OutputDirectory + @get:OutputDirectory lateinit var destinationDir: File + @get:Classpath @get:InputFiles val classpath: FileCollection - @InputFiles get() = kotlinCompileTask.classpath + get() = kotlinCompileTask.classpath val source: FileCollection @InputFiles get() { @@ -58,6 +61,7 @@ open class KaptTask : ConventionTask() { val rawSourceRoots = FilteringSourceRootsContainer(sourceRootsFromKotlin, { !isInsideDestinationDirs(it) }) val sourceRoots = SourceRoots.ForJvm.create(kotlinCompileTask.source, rawSourceRoots) + // todo handle the args like those of the compile tasks val args = K2JVMCompilerArguments() kotlinCompileTask.setupCompilerArgs(args) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJsDce.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJsDce.kt index f8d05e45a73..2367648098f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJsDce.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJsDce.kt @@ -17,6 +17,8 @@ package org.jetbrains.kotlin.gradle.tasks import org.gradle.api.Project +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Internal import org.gradle.api.tasks.TaskAction import org.jetbrains.kotlin.cli.common.arguments.K2JSDceArguments import org.jetbrains.kotlin.cli.js.dce.K2JSDce @@ -32,9 +34,11 @@ import java.io.File open class KotlinJsDce : AbstractKotlinCompileTool(), KotlinJsDce { private val dceOptionsImpl = KotlinJsDceOptionsImpl() + @get:Internal override val dceOptions: KotlinJsDceOptions get() = dceOptionsImpl + @get:Input override val keep: MutableList = mutableListOf() override fun findKotlinCompilerClasspath(project: Project): List = findKotlinJsDceClasspath(project) @@ -54,6 +58,8 @@ open class KotlinJsDce : AbstractKotlinCompileTool(), KotlinJs val args = K2JSDceArguments() dceOptionsImpl.updateArguments(args) args.declarationsToKeep = keep.toTypedArray() + + //todo handle the args like those of the compile tasks val argsArray = ArgumentUtils.convertArgumentsToStringList(args).toTypedArray() val log = GradleKotlinLogger(project.logger) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SyncOutputTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SyncOutputTask.kt index a8a8efea994..34ca318d08c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SyncOutputTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SyncOutputTask.kt @@ -17,10 +17,7 @@ package org.jetbrains.kotlin.gradle.tasks import org.gradle.api.DefaultTask -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.InputFiles -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.TaskAction +import org.gradle.api.tasks.* import org.gradle.api.tasks.incremental.IncrementalTaskInputs import org.gradle.api.tasks.incremental.InputFileDetails import com.intellij.openapi.util.io.FileUtil.isAncestor @@ -62,10 +59,13 @@ internal open class SyncOutputTask : DefaultTask() { // Marked as input to make Gradle fall back to non-incremental build when it changes. @get:Input - private val classesDirs: List + protected val classesDirs: List get() = listOf(kotlinOutputDir, kaptClassesDir).filter(File::exists) + @get:OutputDirectory var javaOutputDir: File by Delegates.notNull() + + @get:Internal var kotlinTask: KotlinCompile by Delegates.notNull() // OutputDirectory needed for task to be incremental @@ -73,9 +73,11 @@ internal open class SyncOutputTask : DefaultTask() { val workingDir: File by lazy { File(kotlinTask.taskBuildDirectory, "sync") } + private val timestampsFile: File by lazy { File(workingDir, TIMESTAMP_FILE_NAME) } + private val timestamps: MutableMap by lazy { readTimestamps(timestampsFile, javaOutputDir) } 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 0748dae74d4..ed249954fa6 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 @@ -20,10 +20,8 @@ import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.logging.Logger import org.gradle.api.plugins.BasePluginConvention -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.InputFiles -import org.gradle.api.tasks.SourceTask -import org.gradle.api.tasks.TaskAction +import org.gradle.api.tasks.* +import org.gradle.api.tasks.Optional import org.gradle.api.tasks.compile.AbstractCompile import org.gradle.api.tasks.incremental.IncrementalTaskInputs import org.jetbrains.kotlin.annotation.AnnotationFileUpdater @@ -56,10 +54,13 @@ const val USING_EXPERIMENTAL_JS_INCREMENTAL_COMPILATION_MESSAGE = "Using experim abstract class AbstractKotlinCompileTool() : AbstractCompile() { // TODO: deprecate and remove + @get:Internal var compilerJarFile: File? = null + + @get:Internal var compilerClasspath: List? = null - @get:InputFiles + @get:Classpath @get:InputFiles internal val computedCompilerClasspath: List get() = compilerClasspath?.takeIf { it.isNotEmpty() } ?: compilerJarFile?.let { @@ -73,11 +74,13 @@ abstract class AbstractKotlinCompileTool() : AbstractCo } abstract class AbstractKotlinCompile() : AbstractKotlinCompileTool(), CompilerArgumentAware { + @get:LocalState internal val taskBuildDirectory: File get() = File(File(project.buildDir, KOTLIN_BUILD_DIR_NAME), name).apply { mkdirs() } // indicates that task should compile kotlin incrementally if possible // it's not possible when IncrementalTaskInputs#isIncremental returns false (i.e first build) + @get:Input var incremental: Boolean = false get() = field set(value) { @@ -87,9 +90,13 @@ abstract class AbstractKotlinCompile() : AbstractKo abstract protected fun createCompilerArgs(): T + @get:Internal internal val pluginOptions = CompilerPluginOptions() + @get:Classpath @get:InputFiles protected val additionalClasspath = arrayListOf() + + @get:Internal // classpath already participates in the checks protected val compileClasspath: Iterable get() = (classpath + additionalClasspath) .filterTo(LinkedHashSet(), File::exists) @@ -102,6 +109,7 @@ abstract class AbstractKotlinCompile() : AbstractKo return ArgumentUtils.convertArgumentsToStringList(arguments) } + @get:Internal override val defaultSerializedCompilerArguments: List get() { val arguments = createCompilerArgs() @@ -126,6 +134,7 @@ abstract class AbstractKotlinCompile() : AbstractKo destinationDirProvider = lazyOf(destinationDir) } + @get:Internal internal var coroutinesFromGradleProperties: Coroutines? = null // Input is needed to force rebuild even if source files are not changed @get:Input @@ -137,11 +146,20 @@ abstract class AbstractKotlinCompile() : AbstractKo ?: coroutinesFromGradleProperties ?: Coroutines.DEFAULT + @get:Internal internal var compilerCalled: Boolean = false + // TODO: consider more reliable approach (see usage) + @get:Internal internal var anyClassesCompiled: Boolean = false + + @get:Internal internal var friendTaskName: String? = null + + @get:Internal internal var javaOutputDir: File? = null + + @get:Internal internal var sourceSetName: String by Delegates.notNull() @get:Input @@ -154,6 +172,7 @@ abstract class AbstractKotlinCompile() : AbstractKo } @Suppress("UNCHECKED_CAST") + @get:Internal protected val friendTask: AbstractKotlinCompile? get() = friendTaskName?.let { project.tasks.findByName(it) } as? AbstractKotlinCompile @@ -167,6 +186,7 @@ abstract class AbstractKotlinCompile() : AbstractKo attachedClassesDirs += lazy(provider) } + @get:Internal // takes part in the compiler arguments var friendPaths: Lazy?> = lazy { friendTask?.let { friendTask -> mutableListOf().apply { @@ -200,7 +220,9 @@ abstract class AbstractKotlinCompile() : AbstractKo callCompiler(args, sourceRoots, ChangedFiles(inputs)) } + @Internal internal abstract fun getSourceRoots(): SourceRoots + internal abstract fun callCompiler(args: T, sourceRoots: SourceRoots, changedFiles: ChangedFiles) open fun setupCompilerArgs(args: T, defaultsOnly: Boolean = false) { @@ -226,27 +248,37 @@ abstract class AbstractKotlinCompile() : AbstractKo } open class KotlinCompile : AbstractKotlinCompile(), KotlinJvmCompile { + @get:Internal internal var parentKotlinOptionsImpl: KotlinJvmOptionsImpl? = null + private val kotlinOptionsImpl = KotlinJvmOptionsImpl() + override val kotlinOptions: KotlinJvmOptions - get() = kotlinOptionsImpl + get() = kotlinOptionsImpl + + @get:Internal internal open val sourceRootsContainer = FilteringSourceRootsContainer() private var kaptAnnotationsFileUpdater: AnnotationFileUpdater? = null + + @get:Internal val buildHistoryFile: File = File(taskBuildDirectory, "build-history.bin") + @get:Internal 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"` */ + @get:Input + @get:Optional var javaPackagePrefix: String? = null - @get:Input - internal val javaPackagePrefixInputString get() = javaPackagePrefix ?: "" - + @get:Internal internal var artifactDifferenceRegistryProvider: ArtifactDifferenceRegistryProvider? = null + + @get:Internal internal var artifactFile: File? = null @get:Input @@ -300,6 +332,7 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl logger.kotlinDebug { "$name destinationDir = $destinationDir" } } + @Internal override fun getSourceRoots() = SourceRoots.ForJvm.create(getSource(), sourceRootsContainer) override fun callCompiler(args: K2JVMCompilerArguments, sourceRoots: SourceRoots, changedFiles: ChangedFiles) { @@ -403,13 +436,15 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl open class Kotlin2JsCompile() : AbstractKotlinCompile(), KotlinJsCompile { private val kotlinOptionsImpl = KotlinJsOptionsImpl() + override val kotlinOptions: KotlinJsOptions get() = kotlinOptionsImpl private val defaultOutputFile: File - get() = File(destinationDir, "$moduleName.js") + get() = File(destinationDir, "$moduleName.js") @Suppress("unused") + @get:OutputFile val outputFile: String get() = kotlinOptions.outputFile ?: defaultOutputFile.canonicalPath @@ -432,19 +467,22 @@ open class Kotlin2JsCompile() : AbstractKotlinCompile(), override fun getSourceRoots() = SourceRoots.KotlinOnly.create(getSource()) - override fun callCompiler(args: K2JSCompilerArguments, sourceRoots: SourceRoots, changedFiles: ChangedFiles) { - sourceRoots as SourceRoots.KotlinOnly - - logger.debug("Calling compiler") - destinationDir.mkdirs() - - val friendDependency = friendTaskName + @get:InputFiles + @get:Optional + internal val friendDependency + get() = friendTaskName ?.let { project.getTasksByName(it, false).singleOrNull() as? Kotlin2JsCompile } ?.outputFile ?.let { File(it).parentFile } ?.let { if (LibraryUtils.isKotlinJavascriptLibrary(it)) it else null } ?.absolutePath + override fun callCompiler(args: K2JSCompilerArguments, sourceRoots: SourceRoots, changedFiles: ChangedFiles) { + sourceRoots as SourceRoots.KotlinOnly + + logger.debug("Calling compiler") + destinationDir.mkdirs() + val dependencies = compileClasspath .filter { LibraryUtils.isKotlinJavascriptLibrary(it) } .map { it.canonicalPath }