Restore "Drop tasks inheritance from 'AbstractCompile' and 'SourceTask'"

This reverts commit 2c5d817633.
This commit is contained in:
Yahor Berdnikau
2022-03-23 19:19:35 +01:00
parent 64f0240d9f
commit 4aa6d984fc
41 changed files with 256 additions and 213 deletions
-2
View File
@@ -106,8 +106,6 @@ tasks.compileJava {
tasks.compileKotlin {
kotlinOptions.jvmTarget = "1.8"
sourceCompatibility = "1.8"
targetCompatibility = "1.8"
}
projectTest(parallel = true) {
@@ -57,7 +57,7 @@ val compileTestDevelopmentExecutableKotlinJs = tasks.named<KotlinJsIrLink>("comp
val populateNodeModules = tasks.register<Copy>("populateNodeModules") {
dependsOn("compileTestDevelopmentExecutableKotlinJs")
dependsOn(nodeModules)
from(compileTestDevelopmentExecutableKotlinJs.map { it.destinationDir })
from(compileTestDevelopmentExecutableKotlinJs.map { it.destinationDirectory })
from {
nodeModules.get().map {
+1 -1
View File
@@ -36,7 +36,7 @@ buildDir = "$projectDir/build"
tasks.register("populateNodeModules", Copy) {
dependsOn(compileKotlin2Js)
dependsOn(configurations.nodeModules)
from compileKotlin2Js.destinationDir
from compileKotlin2Js.destinationDirectory
from {
configurations.nodeModules.collect {
@@ -84,7 +84,7 @@ class BuildCacheRelocationIT : KGPBaseTest() {
testProject.subProject("libraryProject").buildGradle.modify {
it.replace("/exampleapp.js", "/web/exampleapp.js")
// Fix assembling the JAR from the whole buildDir
it.replace("from buildDir", "from compileKotlin2Js.destinationDir")
it.replace("from buildDir", "from compileKotlin2Js.destinationDirectory")
}
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.gradle
import org.gradle.api.logging.configuration.WarningMode
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.DisplayName
@@ -127,14 +128,23 @@ class ConfigurationAvoidanceIT : KGPBaseTest() {
@DisplayName("JS early configuration resolution")
@GradleTest
fun testEarlyConfigurationsResolutionKotlinJs(gradleVersion: GradleVersion) {
testEarlyConfigurationsResolution("kotlin-js-browser-project", gradleVersion, kts = true)
testEarlyConfigurationsResolution(
"kotlin-js-browser-project",
gradleVersion,
kts = true,
buildOptions = defaultBuildOptions.copy(
// bug in Gradle: https://github.com/gradle/gradle/issues/15796
warningMode = if (gradleVersion < GradleVersion.version("7.0")) WarningMode.Summary else defaultBuildOptions.warningMode
)
)
}
private fun testEarlyConfigurationsResolution(
projectName: String,
gradleVersion: GradleVersion,
kts: Boolean
) = project(projectName, gradleVersion) {
kts: Boolean,
buildOptions: BuildOptions = defaultBuildOptions
) = project(projectName, gradleVersion, buildOptions = buildOptions) {
(if (kts) buildGradleKts else buildGradle).appendText(
//language=Gradle
"""${'\n'}
@@ -9,10 +9,7 @@ import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.DisplayName
import java.nio.file.Path
import kotlin.io.path.createDirectories
import kotlin.io.path.deleteExisting
import kotlin.io.path.relativeTo
import kotlin.io.path.writeText
import kotlin.io.path.*
import kotlin.test.assertTrue
@DisplayName("Default incremental compilation with default precise java tracking")
@@ -66,9 +63,7 @@ open class IncrementalJavaChangeDefaultIT : IncrementalCompilationJavaChangesBas
}
build("compileKotlin", "--rerun-tasks") {
assertTasksExecuted(":compileKotlin")
val compiledKotlinClasses = kotlinClassesDir().allFilesWithExtension("class").toList()
assertTrue(compiledKotlinClasses.isEmpty())
assertTrue(kotlinClassesDir().notExists())
}
}
}
@@ -94,8 +94,7 @@ class KlibBasedMppIT : BaseGradleIT() {
"published-producer-commonMain.klib",
"published-dependency-$hostSpecificSourceSet.klib",
"published-dependency-commonMain.klib"
),
isNative = true
)
)
}
@@ -318,13 +317,12 @@ class KlibBasedMppIT : BaseGradleIT() {
private fun BaseGradleIT.Project.checkTaskCompileClasspath(
taskPath: String,
checkModulesInClasspath: List<String> = emptyList(),
checkModulesNotInClasspath: List<String> = emptyList(),
isNative: Boolean = false
checkModulesNotInClasspath: List<String> = emptyList()
) {
val subproject = taskPath.substringBeforeLast(":").takeIf { it.isNotEmpty() && it != taskPath }
val taskName = taskPath.removePrefix(subproject.orEmpty())
val taskClass = if (isNative) "org.jetbrains.kotlin.gradle.tasks.AbstractKotlinNativeCompile<*, *>" else "AbstractCompile"
val expression = """(tasks.getByName("$taskName") as $taskClass).${if (isNative) "libraries" else "classpath"}.toList()"""
val taskClass = "org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompileTool<*>"
val expression = """(tasks.getByName("$taskName") as $taskClass).libraries.toList()"""
checkPrintedItems(subproject, expression, checkModulesInClasspath, checkModulesNotInClasspath)
}
@@ -1176,7 +1176,14 @@ class GeneralKotlin2JsGradlePluginIT : KGPBaseTest() {
@DisplayName("nodejs up-to-date check works")
@GradleTest
fun testNodeJsAndYarnDownload(gradleVersion: GradleVersion) {
project("cleanTask", gradleVersion) {
project(
"cleanTask",
gradleVersion,
buildOptions = defaultBuildOptions.copy(
// bug in Gradle: https://github.com/gradle/gradle/issues/15796
warningMode = if (gradleVersion < GradleVersion.version("7.0")) WarningMode.None else defaultBuildOptions.warningMode
)
) {
build("checkDownloadedFolder")
build("checkIfLastModifiedNotNow", "--rerun-tasks")
@@ -551,12 +551,15 @@ class KotlinSpecificDependenciesIT : KGPBaseTest() {
taskPath: String,
checkModulesInClasspath: List<String> = emptyList(),
checkModulesNotInClasspath: List<String> = emptyList(),
isNative: Boolean = false,
isBuildGradleKts: Boolean = false
) {
val subproject = taskPath.substringBeforeLast(":").takeIf { it.isNotEmpty() && it != taskPath }
val taskName = taskPath.removePrefix(subproject.orEmpty())
val taskClass = if (isNative) "org.jetbrains.kotlin.gradle.tasks.AbstractKotlinNativeCompile<*, *>" else "AbstractCompile"
val taskClass = if (isBuildGradleKts) {
"org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompileTool<*>"
} else {
"org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompileTool<?>"
}
val expression = """(tasks.getByName("$taskName") as $taskClass).${if (isNative) "libraries" else "classpath"}.toList()"""
checkPrintedItems(subproject, expression, checkModulesInClasspath, checkModulesNotInClasspath, isBuildGradleKts)
}
@@ -5,11 +5,9 @@
package org.jetbrains.kotlin.gradle.tasks
import org.gradle.api.logging.configuration.WarningMode
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.BaseGradleIT
import org.jetbrains.kotlin.gradle.testbase.*
import org.jetbrains.kotlin.gradle.transformProjectWithPluginsDsl
import org.junit.Test
import org.junit.jupiter.api.DisplayName
@@ -19,7 +17,14 @@ class CleanDataTaskIT : KGPBaseTest() {
@DisplayName("nodejs is deleted from Gradle user home")
@GradleTest
fun testDownloadedFolderDeletion(gradleVersion: GradleVersion) {
project("cleanTask", gradleVersion) {
project(
"cleanTask",
gradleVersion,
buildOptions = defaultBuildOptions.copy(
// bug in Gradle: https://github.com/gradle/gradle/issues/15796
warningMode = if (gradleVersion < GradleVersion.version("7.0")) WarningMode.Summary else defaultBuildOptions.warningMode
)
) {
build("testCleanTask")
}
}
@@ -13,7 +13,7 @@ dependencies {
}
// important to test that destinationDir is configured before evaluation
test.testClassesDirs = files(project.tasks.compileTestKotlin.destinationDir)
test.testClassesDirs = files(project.tasks.compileTestKotlin.destinationDirectory)
test {
testLogging {
@@ -30,7 +30,7 @@ kotlin {
// Creating static library with a custom name.
staticLib('customNameForiosSimLib') {
outputDirectory = file("fooCustomNameForiosSimLib") // outputDir is a `val` property.
linkTask.destinationDir = file("fooCustomNameForiosSimLib")
linkTask.destinationDirectory = file("fooCustomNameForiosSimLib")
}
}
}
@@ -39,7 +39,7 @@ kotlin {
// Creating static library with a custom name.
staticLib('customNameForLinuxLib') {
outputDirectory = file("customNameForLinuxLib") // outputDir is a `val` property.
linkTask.destinationDir = file("customNameForLinuxLib")
linkTask.destinationDirectory = file("customNameForLinuxLib")
}
}
}
@@ -50,7 +50,7 @@ kotlin {
// Creating static library with a custom name.
staticLib('customNameForMacosLib') {
outputDirectory = file("customNameForMacosLib") // outputDir is a `val` property.
linkTask.destinationDir = file("customNameForMacosLib")
linkTask.destinationDirectory = file("customNameForMacosLib")
}
}
}
@@ -60,7 +60,7 @@ kotlin {
// KT-29395 fix
framework {
outputDirectory = file("fooDummyiOS") // outputDir is a `val` property.
linkTask.destinationDir = file("fooDummyiOS")
linkTask.destinationDirectory = file("fooDummyiOS")
}
}
}
@@ -8,12 +8,8 @@ package org.jetbrains.kotlin.gradle.mpp
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.internal.project.ProjectInternal
import org.gradle.api.plugins.ExtraPropertiesExtension
import org.gradle.api.provider.Provider
import org.gradle.testfixtures.ProjectBuilder
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.tasks.*
import kotlin.test.*
@@ -293,7 +289,7 @@ internal class CompilationSpecificPluginPath {
.getByName(taskName)
.let {
when (it) {
is AbstractKotlinNativeCompile<*, *> -> it.compilerPluginClasspath
is AbstractKotlinNativeCompile<*, *, *> -> it.compilerPluginClasspath
is AbstractKotlinCompile<*> -> it.pluginClasspath.from.single()
else -> error("Unexpected task type with name $taskName. Is it kotlin compile task?")
}
@@ -144,7 +144,7 @@ class KpmCompilerPluginTest {
.let {
when (it) {
is AbstractKotlinCompile<*> -> it.kotlinPluginData
is AbstractKotlinNativeCompile<*, *> -> it.kotlinPluginData
is AbstractKotlinNativeCompile<*, *, *> -> it.kotlinPluginData
else -> error("Unknown task type: $it")
}
}
@@ -300,7 +300,7 @@ internal open class GradleCompilerRunner(
task.buildHistoryFile.get().asFile,
task.abiSnapshotFile.get().asFile
)
dirToModule[task.destinationDir] = module
dirToModule[task.destinationDirectory.get().asFile] = module
task.javaOutputDir.orNull?.asFile?.let { dirToModule[it] = module }
nameToModules.getOrPut(module.name) { HashSet() }.add(module)
@@ -35,7 +35,6 @@ import org.jetbrains.kotlin.gradle.utils.isParentOf
import org.jetbrains.kotlin.incremental.classpathAsList
import org.jetbrains.kotlin.incremental.destinationAsFile
import java.io.File
import java.util.concurrent.Callable
import javax.inject.Inject
@CacheableTask
@@ -63,7 +62,7 @@ abstract class KaptGenerateStubsTask @Inject constructor(
val providerFactory = kotlinCompileTask.project.providers
task.useModuleDetection.value(kotlinCompileTask.useModuleDetection).disallowChanges()
task.moduleName.value(kotlinCompileTask.moduleName).disallowChanges()
task.classpath = task.project.files(Callable { kotlinCompileTask.classpath })
task.classpath.from(kotlinCompileTask.classpath)
task.kotlinTaskPluginClasspath.from(
providerFactory.provider { kotlinCompileTask.pluginClasspath }
)
@@ -119,16 +118,17 @@ abstract class KaptGenerateStubsTask @Inject constructor(
@get:Incremental
abstract val additionalSources: ConfigurableFileCollection
override fun source(vararg sources: Any): SourceTask {
return super.source(sourceRootsContainer.add(sources))
override fun setSource(vararg source: Any) {
super.setSource(sourceRootsContainer.add(sources))
}
override fun setSource(sources: Any) {
override fun setSource(source: Any) {
super.setSource(sourceRootsContainer.set(sources))
}
// TODO: prevent querying destinationDirectory on configuration time
private fun isSourceRootAllowed(source: File): Boolean =
!destinationDir.isParentOf(source) &&
!destinationDirectory.get().asFile.isParentOf(source) &&
!stubsDir.asFile.get().isParentOf(source) &&
generatedSourcesDirs.none { it.isParentOf(source) }
@@ -146,7 +146,7 @@ abstract class KaptGenerateStubsTask @Inject constructor(
args.verbose = verbose.get()
args.classpathAsList = this.classpath.filter { it.exists() }.toList()
args.destinationAsFile = this.destinationDir
args.destinationAsFile = this.destinationDirectory.get().asFile
}
@get:Internal
@@ -90,7 +90,7 @@ class KotlinModelBuilder(private val kotlinPluginVersion: String, private val an
friendSourceSets.get(),
kotlinSourceSet.kotlin.srcDirs,
javaSourceSet.resources.srcDirs,
destinationDir,
destinationDirectory.get().asFile,
javaSourceSet.output.resourcesDir!!,
createCompilerArguments()
)
@@ -116,7 +116,7 @@ class KotlinModelBuilder(private val kotlinPluginVersion: String, private val an
friendSourceSets.get(),
sources,
resources,
destinationDir,
destinationDirectory.get().asFile,
compilation.output.resourcesDir,
createCompilerArguments()
)
@@ -175,7 +175,7 @@ open class KotlinPlatformImplementationPluginBase(platformName: String) : Kotlin
val commonSources = getKotlinSourceDirectorySetSafe(commonSourceSet)!!
for (platformTask in platformTasks) {
platformTask.source(commonSources)
platformTask.setSource(commonSources)
platformTask.commonSourceSet.from(commonSources)
}
}
@@ -36,7 +36,6 @@ import org.jetbrains.kotlin.gradle.model.builder.KotlinModelBuilder
import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.isMainCompilationData
import org.jetbrains.kotlin.gradle.report.BuildMetricsReporterService
import org.jetbrains.kotlin.gradle.scripting.internal.ScriptingGradleSubplugin
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode
import org.jetbrains.kotlin.gradle.targets.js.ir.*
@@ -65,7 +64,7 @@ val KOTLIN_DSL_NAME = "kotlin"
val KOTLIN_JS_DSL_NAME = "kotlin2js"
val KOTLIN_OPTIONS_DSL_NAME = "kotlinOptions"
abstract class KotlinCompilationProcessor<out T : SourceTask>(
abstract class KotlinCompilationProcessor<out T : AbstractKotlinCompileTool<*>>(
open val kotlinCompilation: KotlinCompilationData<*>
) {
abstract val kotlinTask: TaskProvider<out T>
@@ -123,7 +122,7 @@ internal abstract class KotlinSourceSetProcessor<T : AbstractKotlinCompile<*>>(
return register(project, name) {
it.description = taskDescription
it.destinationDirectory.set(defaultKotlinDestinationDir)
it.classpath = project.files({ kotlinCompilation.compileDependencyFiles })
it.classpath.from({ kotlinCompilation.compileDependencyFiles })
}
}
@@ -1049,7 +1048,7 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTool
val kotlinTask = compilation.compileKotlinTaskProvider
compilation.androidVariant.forEachJavaSourceDir { sources ->
kotlinTask.configure {
it.source(sources.dir)
it.setSource(sources.dir)
it.dependsOn(sources)
}
}
@@ -2,7 +2,6 @@ package org.jetbrains.kotlin.gradle.plugin
import org.gradle.api.Project
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.compile.AbstractCompile
import org.gradle.api.tasks.compile.JavaCompile
import org.jetbrains.kotlin.gradle.dsl.KotlinCompile
import org.jetbrains.kotlin.gradle.logging.kotlinDebug
@@ -13,6 +12,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaCompilation
import org.jetbrains.kotlin.gradle.targets.js.ir.JsIrBinary
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompileTool
import org.jetbrains.kotlin.gradle.tasks.CompilerPluginOptions
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile
@@ -89,13 +89,20 @@ class SubpluginEnvironment(
}
}
internal fun addCompilationSourcesToExternalCompileTask(compilation: KotlinCompilation<*>, task: TaskProvider<out AbstractCompile>) {
internal fun addCompilationSourcesToExternalCompileTask(
compilation: KotlinCompilation<*>,
task: TaskProvider<out AbstractKotlinCompileTool<*>>
) {
if (compilation is KotlinJvmAndroidCompilation) {
compilation.androidVariant.forEachKotlinSourceSet { sourceSet -> task.configure { it.source(sourceSet.kotlin) } }
compilation.androidVariant.forEachJavaSourceDir { sources -> task.configure { it.source(sources.dir) } }
compilation.androidVariant.forEachKotlinSourceSet { sourceSet ->
task.configure { it.setSource(sourceSet.kotlin) }
}
compilation.androidVariant.forEachJavaSourceDir { sources ->
task.configure { it.setSource(sources.dir) }
}
} else {
task.configure { taskInstance ->
compilation.allKotlinSourceSets.forEach { sourceSet -> taskInstance.source(sourceSet.kotlin) }
compilation.allKotlinSourceSets.forEach { sourceSet -> taskInstance.setSource(sourceSet.kotlin) }
}
}
}
@@ -163,7 +163,7 @@ internal fun addSourcesToKotlinCompileTask(
fun AbstractKotlinCompile<*>.configureAction() {
// In this call, the super-implementation of `source` adds the directories files to the roots of the union file tree,
// so it's OK to pass just the source roots.
source(Callable(sources))
setSource(Callable(sources))
sourceFilesExtensions.addAll(sourceFileExtensions)
// The `commonSourceSet` is passed to the compiler as-is, converted with toList
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.Project
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.compile.AbstractCompile
import org.jetbrains.kotlin.gradle.plugin.Kotlin2JvmSourceSetProcessor
import org.jetbrains.kotlin.gradle.plugin.KotlinNativeTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.mpp.addCommonSourcesToKotlinCompileTask
@@ -57,7 +56,7 @@ open class KotlinCompilationTaskConfigurator(
val commonSources = getCommonSourcesForFragmentCompilation(fragment)
compileTask.configure {
it.source(allSources)
it.setSource(allSources)
it.commonSources.from(commonSources)
it.configure()
@@ -77,7 +77,7 @@ internal class DefaultLanguageSettingsBuilder : LanguageSettingsBuilder {
val pluginOptionsTask = compilerPluginOptionsTask.value ?: return null
return when (pluginOptionsTask) {
is AbstractKotlinCompile<*> -> pluginOptionsTask.pluginOptions
is AbstractKotlinNativeCompile<*, *> -> pluginOptionsTask.compilerPluginOptions
is AbstractKotlinNativeCompile<*, *, *> -> pluginOptionsTask.compilerPluginOptions
else -> error("Unexpected task: $pluginOptionsTask")
}.arguments
}
@@ -87,7 +87,7 @@ internal class DefaultLanguageSettingsBuilder : LanguageSettingsBuilder {
val pluginClasspathTask = compilerPluginOptionsTask.value ?: return null
return when (pluginClasspathTask) {
is AbstractKotlinCompile<*> -> pluginClasspathTask.pluginClasspath
is AbstractKotlinNativeCompile<*, *> -> pluginClasspathTask.compilerPluginClasspath ?: pluginClasspathTask.project.files()
is AbstractKotlinNativeCompile<*, *, *> -> pluginClasspathTask.compilerPluginClasspath ?: pluginClasspathTask.project.files()
else -> error("Unexpected task: $pluginClasspathTask")
}
}
@@ -17,7 +17,6 @@ import org.gradle.api.attributes.Attribute
import org.gradle.api.attributes.Category
import org.gradle.api.file.FileCollection
import org.gradle.api.specs.Spec
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.bundling.AbstractArchiveTask
import org.gradle.api.tasks.compile.AbstractCompile
@@ -49,7 +48,7 @@ class Android25ProjectHandler(
) {
val preJavaKotlinOutput = project.files(project.provider {
mutableListOf<File>().apply {
add(kotlinTask.get().destinationDir)
add(kotlinTask.get().destinationDirectory.get().asFile)
if (Kapt3GradleSubplugin.isEnabled(project)) {
// Add Kapt3 output as well, since there's no SyncOutputTask with the new API
val kaptClasssesDir = Kapt3GradleSubplugin.getKaptGeneratedClassesDir(project, getVariantName(variantData))
@@ -60,7 +59,7 @@ class Android25ProjectHandler(
val preJavaClasspathKey = variantData.registerPreJavacGeneratedBytecode(preJavaKotlinOutput)
kotlinTask.configure { kotlinTaskInstance ->
kotlinTaskInstance.classpath = project.files()
kotlinTaskInstance.classpath
.from(variantData.getCompileClasspath(preJavaClasspathKey))
.from(Callable { AndroidGradleWrapper.getRuntimeJars(androidPlugin, androidExt) })
@@ -130,7 +130,7 @@ class AndroidSubplugin : KotlinCompilerPluginSupportPlugin {
)
)
kotlinCompilation.compileKotlinTaskProvider.configure {
it.source(getLayoutDirectories(project, sourceSet.res.srcDirs))
it.setSource(getLayoutDirectories(project, sourceSet.res.srcDirs))
}
}
@@ -76,9 +76,9 @@ class KotlinJsDcePlugin : Plugin<Project> {
val configuration = project.configurations.getByName(kotlinCompilation.compileDependencyConfigurationName)
dceTask.configure {
it.classpath = configuration
it.destinationDir = it.dceOptions.outputDirectory?.let { File(it) } ?: outputDir
it.source((kotlinTask.get() as Kotlin2JsCompile).outputFileProperty.get())
it.classpath.from(configuration)
it.destinationDirectory.set(it.dceOptions.outputDirectory?.let { File(it) } ?: outputDir)
it.setSource((kotlinTask.get() as Kotlin2JsCompile).outputFileProperty)
}
}
}
@@ -7,10 +7,9 @@ package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileTree
import org.gradle.api.file.ProjectLayout
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.*
import org.gradle.internal.hash.FileHasher
import org.gradle.workers.WorkerExecutor
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments
@@ -26,6 +25,7 @@ import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode.DEVELOPMENT
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode.PRODUCTION
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
import org.jetbrains.kotlin.gradle.utils.getValue
import org.jetbrains.kotlin.gradle.utils.property
import org.jetbrains.kotlin.gradle.utils.toHexString
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
import org.jetbrains.kotlin.statistics.metrics.StringMetrics
@@ -36,8 +36,9 @@ import javax.inject.Inject
@CacheableTask
abstract class KotlinJsIrLink @Inject constructor(
objectFactory: ObjectFactory,
workerExecutor: WorkerExecutor
private val objectFactory: ObjectFactory,
workerExecutor: WorkerExecutor,
private val projectLayout: ProjectLayout
) : Kotlin2JsCompile(
KotlinJsOptionsImpl(),
objectFactory,
@@ -81,8 +82,8 @@ abstract class KotlinJsIrLink @Inject constructor(
lateinit var mode: KotlinJsBinaryMode
// Not check sources, only klib module
@Internal
override fun getSource(): FileTree = super.getSource()
@get:Internal
abstract override val sources: ConfigurableFileCollection
private val buildDir = project.buildDir
@@ -92,13 +93,18 @@ abstract class KotlinJsIrLink @Inject constructor(
@get:PathSensitive(PathSensitivity.RELATIVE)
internal abstract val entryModule: DirectoryProperty
override fun getDestinationDir(): File {
return if (kotlinOptions.outputFile == null) {
super.getDestinationDir()
} else {
outputFile.parentFile
override val destinationDirectory: DirectoryProperty
get() = objectFactory.directoryProperty().apply {
set(
destinationDirectory.flatMap { dir ->
if (kotlinOptions.outputFile == null) {
objectFactory.property(dir)
} else {
projectLayout.dir(outputFileProperty.map { it.parentFile })
}
}
)
}
}
override fun skipCondition(): Boolean {
return !entryModule.get().asFile.exists()
@@ -26,7 +26,6 @@ import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.utils.listProperty
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.gradle.utils.setProperty
import javax.inject.Inject
@@ -137,7 +136,7 @@ constructor(
binary.linkSyncTaskName
) { task ->
task.from(
project.layout.file(binary.linkTask.map { it.destinationDir })
project.layout.file(binary.linkTask.flatMap { it.destinationDirectory.map { it.asFile } })
)
task.from(project.tasks.named(compilation.processResourcesTaskName))
@@ -97,9 +97,9 @@ open class KotlinJsIrTargetConfigurator() :
compilation.compileKotlinTaskProvider.configure { task ->
val outputFilePath = outputFile ?: if (produceUnzippedKlib) {
task.destinationDir.absoluteFile.normalize().absolutePath
task.destinationDirectory.get().asFile.absoluteFile.normalize().absolutePath
} else {
File(task.destinationDir, "$baseName.$KLIB_TYPE").absoluteFile.normalize().absolutePath
File(task.destinationDirectory.get().asFile, "$baseName.$KLIB_TYPE").absoluteFile.normalize().absolutePath
}
outputFile = outputFilePath
@@ -112,7 +112,7 @@ open class KotlinJsIrTargetConfigurator() :
"To fix this, consider using the default outputFile location instead of providing it explicitly."
)
task.destinationDir = taskOutputDir
task.destinationDirectory.set(taskOutputDir)
}
val klibModuleName = target.project.klibModuleName(baseName)
@@ -26,7 +26,6 @@ import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig.Mode
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackDevtool
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackMajorVersion
import org.jetbrains.kotlin.gradle.targets.js.webpack.WebpackMajorVersion.Companion.choose
import org.jetbrains.kotlin.gradle.tasks.dependsOn
import org.jetbrains.kotlin.gradle.tasks.registerTask
@@ -266,9 +265,13 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
}
entryProperty.set(
project.layout.file(actualDceTaskProvider.map {
it.destinationDir.resolve(compilation.compileKotlinTask.outputFileProperty.get().name)
})
project.layout.file(
actualDceTaskProvider
.map {
it.destinationDirectory.file(compilation.compileKotlinTask.outputFileProperty.get().name)
}
.flatMap { it.map { it.asFile } }
)
)
resolveFromModulesFirst = true
@@ -305,12 +308,14 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) :
it.kotlinFilesOnly = true
it.classpath = project.configurations.getByName(compilation.runtimeDependencyConfigurationName)
it.destinationDir = it.dceOptions.outputDirectory?.let { File(it) }
?: compilation.npmProject.dir.resolve(if (dev) DCE_DEV_DIR else DCE_DIR)
it.classpath.from(project.configurations.getByName(compilation.runtimeDependencyConfigurationName))
it.destinationDirectory.set(
it.dceOptions.outputDirectory?.let { File(it) }
?: compilation.npmProject.dir.resolve(if (dev) DCE_DEV_DIR else DCE_DIR)
)
it.defaultCompilerClasspath.setFrom(project.configurations.named(COMPILER_CLASSPATH_CONFIGURATION_NAME))
it.source(kotlinTask.map { it.outputFileProperty.get() })
it.setSource(kotlinTask.map { it.outputFileProperty })
}
}
@@ -224,23 +224,29 @@ constructor(
compilation.platformType
}
/**
* [forNpmDependencies] is used to avoid querying [destinationDirectory] before task execution.
* Otherwise, Gradle will fail the build.
*/
private fun createWebpackConfig(forNpmDependencies: Boolean = false) = KotlinWebpackConfig(
mode = mode,
entry = if (forNpmDependencies) null else entry,
reportEvaluatedConfigFile = if (!forNpmDependencies && saveEvaluatedConfigFile) evaluatedConfigFile else null,
output = output,
outputPath = if (forNpmDependencies) null else destinationDirectory,
outputFileName = outputFileName,
configDirectory = configDirectory,
bundleAnalyzerReportDir = if (!forNpmDependencies && report) reportDir else null,
cssSupport = cssSupport,
devServer = devServer,
devtool = devtool,
sourceMaps = sourceMaps,
resolveFromModulesFirst = resolveFromModulesFirst,
webpackMajorVersion = webpackMajorVersion
)
private fun createRunner(): KotlinWebpackRunner {
val config = KotlinWebpackConfig(
mode = mode,
entry = entry,
reportEvaluatedConfigFile = if (saveEvaluatedConfigFile) evaluatedConfigFile else null,
output = output,
outputPath = destinationDirectory,
outputFileName = outputFileName,
configDirectory = configDirectory,
bundleAnalyzerReportDir = if (report) reportDir else null,
cssSupport = cssSupport,
devServer = devServer,
devtool = devtool,
sourceMaps = sourceMaps,
resolveFromModulesFirst = resolveFromModulesFirst,
webpackMajorVersion = webpackMajorVersion
)
val config = createWebpackConfig()
if (platformType == KotlinPlatformType.wasm) {
config.experiments += listOf(
@@ -268,7 +274,7 @@ constructor(
@Internal get() = true
override val requiredNpmDependencies: Set<RequiredKotlinJsDependency>
@Internal get() = createRunner().config.getRequiredDependencies(versions)
@Internal get() = createWebpackConfig(true).getRequiredDependencies(versions)
private val isContinuous = project.gradle.startParameter.isContinuous
@@ -6,13 +6,11 @@
@file:Suppress("PackageDirectoryMismatch") // Old package for compatibility
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.SourceSet
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.kotlin.dsl.named
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationOutput
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationWithResources
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
@@ -45,7 +43,9 @@ class KotlinWithJavaCompilation<KotlinOptionsType : KotlinCommonOptions>(
fun source(javaSourceSet: SourceSet) {
with(target.project) {
afterEvaluate {
(tasks.getByName(compileKotlinTaskName) as AbstractKotlinCompile<*>).source(javaSourceSet.java)
tasks.named<AbstractKotlinCompile<*>>(compileKotlinTaskName).configure {
it.setSource(javaSourceSet.java)
}
}
}
}
@@ -80,7 +80,7 @@ internal fun addSourcesToKotlinNativeCompileTask(
addAsCommonSources: Lazy<Boolean>
) {
project.tasks.withType(KotlinNativeCompile::class.java).matching { it.name == taskName }.configureEach { task ->
task.source(sourceFiles)
task.setSource(sourceFiles)
task.commonSources.from(project.files(Callable { if (addAsCommonSources.value) sourceFiles() else emptyList() }))
}
@@ -32,7 +32,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.apple.registerEmbedAndSignAppleFra
import org.jetbrains.kotlin.gradle.plugin.mpp.isMain
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmAwareTargetConfigurator
import org.jetbrains.kotlin.gradle.targets.metadata.KotlinMetadataTargetConfigurator
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
import org.jetbrains.kotlin.gradle.targets.native.*
import org.jetbrains.kotlin.gradle.targets.native.internal.commonizeCInteropTask
@@ -63,7 +62,6 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
it.group = BasePlugin.BUILD_GROUP
it.description = "Links ${binary.outputKind.description} '${binary.name}' for a target '${target.name}'."
it.enabled = binary.konanTarget.enabledOnCurrentHost
it.destinationDir = binary.outputDirectory
}
@@ -220,7 +220,7 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
check(targets.size == 1) { "The project has more than one target for the requested platform: `${requestedPlatform.visibleName}`" }
val frameworkLinkTask = targets.single().binaries.getFramework(POD_FRAMEWORK_PREFIX, requestedBuildType).linkTaskProvider
project.createSyncFrameworkTask(frameworkLinkTask.map { it.destinationDir }, frameworkLinkTask)
project.createSyncFrameworkTask(frameworkLinkTask.flatMap { it.destinationDirectory.map { it.asFile }}, frameworkLinkTask)
}
private fun createSyncTask(
@@ -15,11 +15,13 @@ import org.gradle.api.artifacts.component.ModuleComponentSelector
import org.gradle.api.artifacts.result.DependencyResult
import org.gradle.api.artifacts.result.ResolvedDependencyResult
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileCollection
import org.gradle.api.file.FileTree
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.api.tasks.compile.AbstractCompile
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.CommonToolArguments
import org.jetbrains.kotlin.compilerRunner.*
import org.jetbrains.kotlin.compilerRunner.KotlinNativeCInteropRunner.Companion.run
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
@@ -126,7 +128,11 @@ private fun Collection<File>.filterKlibsPassedToCompiler(): List<File> = filter
}
// endregion
abstract class AbstractKotlinNativeCompile<T : KotlinCommonToolOptions, K : KotlinNativeCompilationData<*>> : AbstractCompile() {
abstract class AbstractKotlinNativeCompile<
T : KotlinCommonToolOptions,
K : KotlinNativeCompilationData<*>,
M : CommonToolArguments
> : AbstractKotlinCompileTool<M>() {
@get:Internal
abstract val compilation: K
@@ -151,15 +157,6 @@ abstract class AbstractKotlinNativeCompile<T : KotlinCommonToolOptions, K : Kotl
compilation.konanTarget
}
// Inputs and outputs
@IgnoreEmptyDirectories
@InputFiles
@SkipWhenEmpty
@PathSensitive(PathSensitivity.RELATIVE)
override fun getSource(): FileTree {
return super.getSource()
}
@get:Classpath
val libraries: FileCollection by project.provider {
// Avoid resolving these dependencies during task graph construction when we can't build the target:
@@ -174,10 +171,8 @@ abstract class AbstractKotlinNativeCompile<T : KotlinCommonToolOptions, K : Kotl
}
@Deprecated("For native tasks use 'libraries' instead", ReplaceWith("libraries"))
override fun getClasspath(): FileCollection = libraries
override fun setClasspath(configuration: FileCollection?) {
throw UnsupportedOperationException("Setting classpath directly is unsupported.")
}
override val classpath: ConfigurableFileCollection
get() = objects.fileCollection().from(libraries)
@get:Input
val target: String by project.provider { compilation.konanTarget.name }
@@ -212,22 +207,23 @@ abstract class AbstractKotlinNativeCompile<T : KotlinCommonToolOptions, K : Kotl
internal val useEmbeddableCompilerJar: Boolean
get() = project.nativeUseEmbeddableCompilerJar
@Internal
open val outputFile: Provider<File> = project.provider {
val prefix = outputKind.prefix(konanTarget)
val suffix = outputKind.suffix(konanTarget)
val filename = "$prefix${baseName}$suffix".let {
when {
outputKind == FRAMEWORK ->
it.asValidFrameworkName()
outputKind in listOf(STATIC, DYNAMIC) || outputKind == PROGRAM && konanTarget == KonanTarget.WASM32 ->
it.replace('-', '_')
else -> it
@get:Internal
open val outputFile: Provider<File>
get() = destinationDirectory.map {
val prefix = outputKind.prefix(konanTarget)
val suffix = outputKind.suffix(konanTarget)
val filename = "$prefix${baseName}$suffix".let {
when {
outputKind == FRAMEWORK ->
it.asValidFrameworkName()
outputKind in listOf(STATIC, DYNAMIC) || outputKind == PROGRAM && konanTarget == KonanTarget.WASM32 ->
it.replace('-', '_')
else -> it
}
}
}
destinationDir.resolve(filename)
}
it.file(filename).asFile
}
// endregion
@Internal
@@ -250,12 +246,12 @@ abstract class AbstractKotlinNativeCompile<T : KotlinCommonToolOptions, K : Kotl
// Used by IDE via reflection.
@get:Internal
val serializedCompilerArguments: List<String>
override val serializedCompilerArguments: List<String>
get() = buildCommonArgs()
// Used by IDE via reflection.
@get:Internal
val defaultSerializedCompilerArguments: List<String>
override val defaultSerializedCompilerArguments: List<String>
get() = buildCommonArgs(true)
private val languageSettingsBuilder by project.provider {
@@ -301,17 +297,20 @@ abstract class AbstractKotlinNativeCompile<T : KotlinCommonToolOptions, K : Kotl
}
}
// Remove it once actual K2NativeCompilerArguments will be available without 'kotlin.native.enabled = true' flag
class StubK2NativeCompilerArguments : CommonCompilerArguments()
/**
* A task producing a klibrary from a compilation.
*/
@CacheableTask
open class KotlinNativeCompile
abstract class KotlinNativeCompile
@Inject
constructor(
@Internal
@Transient // can't be serialized for Gradle configuration cache
final override val compilation: KotlinNativeCompilationData<*>
) : AbstractKotlinNativeCompile<KotlinCommonOptions, KotlinNativeCompilationData<*>>(),
) : AbstractKotlinNativeCompile<KotlinCommonOptions, KotlinNativeCompilationData<*>, StubK2NativeCompilerArguments>(),
KotlinCompile<KotlinCommonOptions> {
@get:Input
@@ -395,6 +394,14 @@ constructor(
}
// endregion.
override fun createCompilerArgs(): StubK2NativeCompilerArguments = StubK2NativeCompilerArguments()
override fun setupCompilerArgs(
args: StubK2NativeCompilerArguments,
defaultsOnly: Boolean,
ignoreClasspathResolutionErrors: Boolean
) = Unit
@TaskAction
fun compile() {
val output = outputFile.get()
@@ -440,7 +447,7 @@ constructor(
shortModuleName,
friendModule,
sharedCompilationData,
source,
sources.asFileTree,
commonSourcesTree
)
@@ -452,12 +459,12 @@ constructor(
* A task producing a final binary from a compilation.
*/
@CacheableTask
open class KotlinNativeLink
abstract class KotlinNativeLink
@Inject
constructor(
@Internal
val binary: NativeBinary
) : AbstractKotlinNativeCompile<KotlinCommonToolOptions, KotlinNativeCompilation>() {
) : AbstractKotlinNativeCompile<KotlinCommonToolOptions, KotlinNativeCompilation, StubK2NativeCompilerArguments>() {
@get:Internal
final override val compilation: KotlinNativeCompilation
get() = binary.compilation
@@ -472,19 +479,13 @@ constructor(
@Internal // Taken into account by getSources().
val intermediateLibrary: Provider<File> = project.provider { compilation.compileKotlinTask.outputFile.get() }
@IgnoreEmptyDirectories
@InputFiles
@SkipWhenEmpty
override fun getSource(): FileTree =
objects.fileCollection().from(intermediateLibrary).asFileTree
override val sources: ConfigurableFileCollection = objects
.fileCollection()
.from(intermediateLibrary)
.apply { disallowChanges() }
@OutputDirectory
override fun getDestinationDir(): File {
return binary.outputDirectory
}
override fun setDestinationDir(destinationDir: File) {
binary.outputDirectory = destinationDir
override val destinationDirectory: DirectoryProperty = objects.directoryProperty().apply {
set(binary.outputDirectory)
}
override val outputKind: CompilerOutputKind
@@ -572,6 +573,14 @@ constructor(
project.configurations.getByName(compilation.apiConfigurationName).files.filterKlibsPassedToCompiler()
}
override fun createCompilerArgs(): StubK2NativeCompilerArguments = StubK2NativeCompilerArguments()
override fun setupCompilerArgs(
args: StubK2NativeCompilerArguments,
defaultsOnly: Boolean,
ignoreClasspathResolutionErrors: Boolean
) = Unit
private fun validatedExportedLibraries() {
val exportConfiguration = exportLibraries as? Configuration ?: return
val apiFiles = apiFilesProvider.get()
@@ -102,7 +102,7 @@ abstract class KotlinCompileCommon @Inject constructor(
K2MetadataCompilerArguments()
override fun getSourceRoots(): SourceRoots =
SourceRoots.KotlinOnly.create(getSource(), sourceFilesExtensions.get())
SourceRoots.KotlinOnly.create(sources, sourceFilesExtensions.get())
override fun setupCompilerArgs(args: K2MetadataCompilerArguments, defaultsOnly: Boolean, ignoreClasspathResolutionErrors: Boolean) {
args.apply { fillDefaultValues() }
@@ -120,7 +120,7 @@ abstract class KotlinCompileCommon @Inject constructor(
with(args) {
classpath = classpathList.joinToString(File.pathSeparator)
destination = destinationDir.canonicalPath
destination = destinationDirectory.get().asFile.canonicalPath
friendPaths = this@KotlinCompileCommon.friendPaths.files.map { it.absolutePath }.toTypedArray()
refinesPaths = refinesMetadataPaths.map { it.absolutePath }.toTypedArray()
@@ -16,14 +16,11 @@
package org.jetbrains.kotlin.gradle.tasks
import org.gradle.api.file.FileCollection
import org.gradle.api.file.FileTree
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.gradle.work.ChangeType
import org.gradle.work.Incremental
import org.gradle.work.InputChanges
import org.jetbrains.kotlin.cli.common.arguments.DevModeOverwritingStrategies
import org.jetbrains.kotlin.cli.common.arguments.K2JSDceArguments
@@ -73,11 +70,6 @@ abstract class KotlinJsDce : AbstractKotlinCompileTool<K2JSDceArguments>(), Kotl
@Input
var jvmArgs = mutableListOf<String>()
@Incremental
override fun getClasspath(): FileCollection {
return super.getClasspath()
}
private val buildDir by lazy {
project.buildDir
}
@@ -101,13 +93,12 @@ abstract class KotlinJsDce : AbstractKotlinCompileTool<K2JSDceArguments>(), Kotl
.filter { it.changeType == ChangeType.MODIFIED || it.changeType == ChangeType.ADDED }
.map { it.file }
} else {
classpath
classpath.asFileTree.files
}
val inputFiles = (listOf(source) + classpathFiles
// TODO: use PatternFilterable here!
val inputFiles = sources.asFileTree.files.plus(classpathFiles)
.filter { !kotlinFilesOnly || isDceCandidate(it) }
.map { objects.fileCollection().from(it).asFileTree })
.reduce(FileTree::plus)
.files.map { it.path }
.map { it.path }
val outputDirArgs = arrayOf("-output-dir", destinationDirectory.get().asFile.path)
@@ -30,7 +30,7 @@ internal sealed class SourceRoots(val kotlinSourceFiles: FileCollection) {
companion object {
fun create(
taskSource: FileTree,
taskSource: FileCollection,
sourceRoots: FilteringSourceRootsContainer,
sourceFilesExtensions: List<String>
): ForJvm {
@@ -58,7 +58,7 @@ internal sealed class SourceRoots(val kotlinSourceFiles: FileCollection) {
class KotlinOnly(kotlinSourceFiles: FileCollection) : SourceRoots(kotlinSourceFiles) {
companion object {
fun create(
taskSource: FileTree,
taskSource: FileCollection,
sourceFilesExtensions: List<String>
) = KotlinOnly(
taskSource.filter { it.isKotlinFile(sourceFilesExtensions) }
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.gradle.tasks
import org.gradle.api.DefaultTask
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.Task
@@ -13,7 +14,6 @@ import org.gradle.api.file.*
import org.gradle.api.invocation.Gradle
import org.gradle.api.logging.Logger
import org.gradle.api.model.ObjectFactory
import org.gradle.api.model.ReplacedBy
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
@@ -22,6 +22,7 @@ import org.gradle.api.services.BuildServiceParameters
import org.gradle.api.tasks.*
import org.gradle.api.tasks.compile.AbstractCompile
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.api.tasks.util.PatternFilterable
import org.gradle.work.ChangeType
import org.gradle.work.Incremental
import org.gradle.work.InputChanges
@@ -77,26 +78,40 @@ const val USING_JS_INCREMENTAL_COMPILATION_MESSAGE = "Using Kotlin/JS incrementa
const val USING_JS_IR_BACKEND_MESSAGE = "Using Kotlin/JS IR backend"
abstract class AbstractKotlinCompileTool<T : CommonToolArguments>
: AbstractCompile(),
: DefaultTask(),
//PatternFilterable,
CompilerArgumentAwareWithInput<T>,
TaskWithLocalState {
@ReplacedBy("stableSources")
override fun getSource() = super.getSource()
@get:InputFiles
@get:SkipWhenEmpty
@get:IgnoreEmptyDirectories
@get:PathSensitive(PathSensitivity.RELATIVE)
internal val stableSources: FileCollection = project.files(
{ source }
)
abstract val sources: ConfigurableFileCollection
@Incremental
override fun getClasspath(): FileCollection {
return super.getClasspath()
/**
* Sets the source for this task.
* The given source object is evaluated as per [org.gradle.api.Project.files].
*/
open fun setSource(source: Any) {
sources.from(source)
}
/**
* Sets the source for this task.
* The given source object is evaluated as per [org.gradle.api.Project.files].
*/
open fun setSource(vararg source: Any) {
sources.from(source)
}
@get:Classpath
@get:Incremental
abstract val classpath: ConfigurableFileCollection
@get:OutputDirectory
abstract val destinationDirectory: DirectoryProperty
@get:Internal
override val metrics: Property<BuildMetricsReporter> = project.objects
.property(BuildMetricsReporterImpl())
@@ -403,7 +418,7 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments> : AbstractKotl
@get:Internal
protected open val incrementalProps: List<FileCollection>
get() = listOfNotNull(
stableSources,
sources,
classpath,
commonSourceSet
)
@@ -508,7 +523,7 @@ class KotlinJvmCompilerArgumentsProvider
val moduleName: String = taskProvider.moduleName.get()
val friendPaths: FileCollection = taskProvider.friendPaths
val compileClasspath: Iterable<File> = taskProvider.classpath
val destinationDir: File = taskProvider.destinationDir
val destinationDir: File = taskProvider.destinationDirectory.get().asFile
internal val kotlinOptions: List<KotlinJvmOptionsImpl> = listOfNotNull(
taskProvider.parentKotlinOptionsImpl.orNull as? KotlinJvmOptionsImpl,
taskProvider.kotlinOptions as KotlinJvmOptionsImpl
@@ -628,7 +643,7 @@ abstract class KotlinCompile @Inject constructor(
private val jvmSourceRoots by project.provider {
// serialize in the task state for configuration caching; avoid building anew in task execution, as it may access the project model
SourceRoots.ForJvm.create(source, sourceRootsContainer, sourceFilesExtensions.get())
SourceRoots.ForJvm.create(sources, sourceRootsContainer, sourceFilesExtensions.get())
}
/** A package prefix that is used for locating Java sources in a directory structure with non-full-depth packages.
@@ -646,10 +661,8 @@ abstract class KotlinCompile @Inject constructor(
logger.kotlinDebug { "Set $this.usePreciseJavaTracking=$value" }
}
@Internal // To support compile avoidance (ClasspathSnapshotProperties.classpathSnapshot will be used as input instead)
override fun getClasspath(): FileCollection {
return super.getClasspath()
}
@get:Internal // To support compile avoidance (ClasspathSnapshotProperties.classpathSnapshot will be used as input instead)
override abstract val classpath: ConfigurableFileCollection
@get:Input
abstract val useKotlinAbiSnapshot: Property<Boolean>
@@ -678,7 +691,7 @@ abstract class KotlinCompile @Inject constructor(
}
override val incrementalProps: List<FileCollection>
get() = listOf(stableSources, commonSourceSet, classpathSnapshotProperties.classpath, classpathSnapshotProperties.classpathSnapshot)
get() = listOf(sources, commonSourceSet, classpathSnapshotProperties.classpath, classpathSnapshotProperties.classpathSnapshot)
// Exclude classpathSnapshotDir from TaskOutputsBackup (see TaskOutputsBackup's kdoc for more info). */
override val taskOutputsBackupExcludes: List<File>
@@ -859,15 +872,15 @@ abstract class KotlinCompile @Inject constructor(
}
// override setSource to track source directory sets and files (for generated android folders)
override fun setSource(sources: Any) {
sourceRootsContainer.set(sources)
super.setSource(sources)
override fun setSource(source: Any) {
sourceRootsContainer.set(source)
super.setSource(source)
}
// override source to track source directory sets and files (for generated android folders)
override fun source(vararg sources: Any): SourceTask {
sourceRootsContainer.add(*sources)
return super.source(*sources)
override fun setSource(vararg source: Any) {
sourceRootsContainer.add(*source)
super.setSource(*source)
}
private fun getClasspathChanges(inputChanges: InputChanges): ClasspathChanges = when {
@@ -1018,7 +1031,7 @@ abstract class Kotlin2JsCompile @Inject constructor(
(kotlinOptions as KotlinJsOptionsImpl).updateArguments(args)
}
override fun getSourceRoots() = SourceRoots.KotlinOnly.create(getSource(), sourceFilesExtensions.get())
override fun getSourceRoots() = SourceRoots.KotlinOnly.create(sources, sourceFilesExtensions.get())
@get:InputFiles
@get:IgnoreEmptyDirectories
@@ -1115,7 +1128,7 @@ abstract class Kotlin2JsCompile @Inject constructor(
sourceRoots as SourceRoots.KotlinOnly
logger.debug("Calling compiler")
destinationDir.mkdirs()
//destinationDir.mkdirs()
if (kotlinOptions.isIrBackendEnabled()) {
logger.info(USING_JS_IR_BACKEND_MESSAGE)