diff --git a/jps/jps-plugin/build.gradle.kts b/jps/jps-plugin/build.gradle.kts index f23e1d74e06..f0fab6b303e 100644 --- a/jps/jps-plugin/build.gradle.kts +++ b/jps/jps-plugin/build.gradle.kts @@ -106,8 +106,6 @@ tasks.compileJava { tasks.compileKotlin { kotlinOptions.jvmTarget = "1.8" - sourceCompatibility = "1.8" - targetCompatibility = "1.8" } projectTest(parallel = true) { diff --git a/libraries/kotlin.test/js-ir/it/build.gradle.kts b/libraries/kotlin.test/js-ir/it/build.gradle.kts index 985b589e5ac..adac2f826ab 100644 --- a/libraries/kotlin.test/js-ir/it/build.gradle.kts +++ b/libraries/kotlin.test/js-ir/it/build.gradle.kts @@ -57,7 +57,7 @@ val compileTestDevelopmentExecutableKotlinJs = tasks.named("comp val populateNodeModules = tasks.register("populateNodeModules") { dependsOn("compileTestDevelopmentExecutableKotlinJs") dependsOn(nodeModules) - from(compileTestDevelopmentExecutableKotlinJs.map { it.destinationDir }) + from(compileTestDevelopmentExecutableKotlinJs.map { it.destinationDirectory }) from { nodeModules.get().map { diff --git a/libraries/kotlin.test/js/it/build.gradle b/libraries/kotlin.test/js/it/build.gradle index f453e473da3..5f74d0b3982 100644 --- a/libraries/kotlin.test/js/it/build.gradle +++ b/libraries/kotlin.test/js/it/build.gradle @@ -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 { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildCacheRelocationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildCacheRelocationIT.kt index bf4bc7db647..cf352c6f033 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildCacheRelocationIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildCacheRelocationIT.kt @@ -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") } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationAvoidanceIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationAvoidanceIT.kt index 0c578e497e7..73e08457b83 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationAvoidanceIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationAvoidanceIT.kt @@ -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'} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalJavaChangeIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalJavaChangeIT.kt index 482114746c6..da7a243dc2d 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalJavaChangeIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalJavaChangeIT.kt @@ -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()) } } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt index 375b36bf5a8..70c325e6667 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt @@ -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 = emptyList(), - checkModulesNotInClasspath: List = emptyList(), - isNative: Boolean = false + checkModulesNotInClasspath: List = 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) } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt index bdaf6cad180..b46615335b8 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt @@ -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") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinSpecificDependenciesIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinSpecificDependenciesIT.kt index cdb63c59874..90821fb308c 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinSpecificDependenciesIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinSpecificDependenciesIT.kt @@ -551,12 +551,15 @@ class KotlinSpecificDependenciesIT : KGPBaseTest() { taskPath: String, checkModulesInClasspath: List = emptyList(), checkModulesNotInClasspath: List = 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) } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/CleanDataTaskIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/CleanDataTaskIT.kt index b101cde76c6..7228549d209 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/CleanDataTaskIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/CleanDataTaskIT.kt @@ -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") } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/build.gradle index e936c4ac897..77074b9bc7f 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/destinationDirReferencedDuringEvaluation/build.gradle @@ -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 { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hierarchical-mpp-multi-modules/bottom-mpp/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hierarchical-mpp-multi-modules/bottom-mpp/build.gradle index b1381845a3f..57e009ce32f 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hierarchical-mpp-multi-modules/bottom-mpp/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hierarchical-mpp-multi-modules/bottom-mpp/build.gradle @@ -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") } } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hierarchical-mpp-multi-modules/top-mpp/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hierarchical-mpp-multi-modules/top-mpp/build.gradle index 1b97b6d8d80..3e98b33c556 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hierarchical-mpp-multi-modules/top-mpp/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/hierarchical-mpp-multi-modules/top-mpp/build.gradle @@ -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") } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/CompilationSpecificPluginPath.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/CompilationSpecificPluginPath.kt index ca3c86a0936..c057e222135 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/CompilationSpecificPluginPath.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/CompilationSpecificPluginPath.kt @@ -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?") } diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/KpmCompilerPluginTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/KpmCompilerPluginTest.kt index d92ccd1b85f..d9da6ac9f03 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/KpmCompilerPluginTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/KpmCompilerPluginTest.kt @@ -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") } } 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 3c42fcfad8d..67ebf5d085a 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 @@ -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) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt index 26d289c684f..abbe5bbda39 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptGenerateStubsTask.kt @@ -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 diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/model/builder/KotlinModelBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/model/builder/KotlinModelBuilder.kt index 8ffac56f408..d14226e2dae 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/model/builder/KotlinModelBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/model/builder/KotlinModelBuilder.kt @@ -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() ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt index aebebb4fd44..5a42cd404ca 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinMultiplatformPlugin.kt @@ -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) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index ea0d4ffaa2e..b9964ac5314 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -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( +abstract class KotlinCompilationProcessor>( open val kotlinCompilation: KotlinCompilationData<*> ) { abstract val kotlinTask: TaskProvider @@ -123,7 +122,7 @@ internal abstract class KotlinSourceSetProcessor>( 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) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/SubpluginEnvironment.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/SubpluginEnvironment.kt index 23e93c629ad..db8a6e98ece 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/SubpluginEnvironment.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/SubpluginEnvironment.kt @@ -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) { +internal fun addCompilationSourcesToExternalCompileTask( + compilation: KotlinCompilation<*>, + task: TaskProvider> +) { 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) } } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt index 6f492880f70..1c4e0745359 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt @@ -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 diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationTaskConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationTaskConfigurator.kt index 817401e9b4b..63e5036c039 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationTaskConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationTaskConfigurator.kt @@ -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() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultLanguageSettingsBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultLanguageSettingsBuilder.kt index 07734f958cd..c56eac798e9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultLanguageSettingsBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultLanguageSettingsBuilder.kt @@ -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") } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/Android25ProjectHandler.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/Android25ProjectHandler.kt index 696263c17d9..9211349f80e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/Android25ProjectHandler.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/Android25ProjectHandler.kt @@ -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().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) }) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt index 29dbafe7f3f..993191dcefe 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt @@ -130,7 +130,7 @@ class AndroidSubplugin : KotlinCompilerPluginSupportPlugin { ) ) kotlinCompilation.compileKotlinTaskProvider.configure { - it.source(getLayoutDirectories(project, sourceSet.res.srcDirs)) + it.setSource(getLayoutDirectories(project, sourceSet.res.srcDirs)) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsDcePlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsDcePlugin.kt index 37cca755d3c..01a3dce42a5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsDcePlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsDcePlugin.kt @@ -76,9 +76,9 @@ class KotlinJsDcePlugin : Plugin { 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) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt index 5f955e49634..d078b824f23 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt @@ -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() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt index 78a166ecaa2..183095f792f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt @@ -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)) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt index bbe22471a55..f1cd3eec953 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt @@ -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) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt index 8fef0c44934..de3e29fedfc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt @@ -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 }) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt index e0c80c9c3ff..985f9f5a601 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt @@ -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 - @Internal get() = createRunner().config.getRequiredDependencies(versions) + @Internal get() = createWebpackConfig(true).getRequiredDependencies(versions) private val isContinuous = project.gradle.startParameter.isContinuous diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilation.kt index 3deadf18029..4d053d35645 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinWithJavaCompilation.kt @@ -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( fun source(javaSourceSet: SourceSet) { with(target.project) { afterEvaluate { - (tasks.getByName(compileKotlinTaskName) as AbstractKotlinCompile<*>).source(javaSourceSet.java) + tasks.named>(compileKotlinTaskName).configure { + it.setSource(javaSourceSet.java) + } } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt index 9adacce56d8..1a5135c37a8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt @@ -80,7 +80,7 @@ internal fun addSourcesToKotlinNativeCompileTask( addAsCommonSources: Lazy ) { 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() })) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt index ee8b73a0179..003f72fc346 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt @@ -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 : 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 } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt index f5220719897..5d84aaa967d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt @@ -220,7 +220,7 @@ open class KotlinCocoapodsPlugin : Plugin { 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( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt index 1c0380f9ba7..329e66dd37a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt @@ -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.filterKlibsPassedToCompiler(): List = filter } // endregion -abstract class AbstractKotlinNativeCompile> : AbstractCompile() { +abstract class AbstractKotlinNativeCompile< + T : KotlinCommonToolOptions, + K : KotlinNativeCompilationData<*>, + M : CommonToolArguments + > : AbstractKotlinCompileTool() { @get:Internal abstract val compilation: K @@ -151,15 +157,6 @@ abstract class AbstractKotlinNativeCompile = 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 + 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 + override val serializedCompilerArguments: List get() = buildCommonArgs() // Used by IDE via reflection. @get:Internal - val defaultSerializedCompilerArguments: List + override val defaultSerializedCompilerArguments: List get() = buildCommonArgs(true) private val languageSettingsBuilder by project.provider { @@ -301,17 +297,20 @@ abstract class AbstractKotlinNativeCompile -) : AbstractKotlinNativeCompile>(), +) : AbstractKotlinNativeCompile, StubK2NativeCompilerArguments>(), KotlinCompile { @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() { +) : AbstractKotlinNativeCompile() { @get:Internal final override val compilation: KotlinNativeCompilation get() = binary.compilation @@ -472,19 +479,13 @@ constructor( @Internal // Taken into account by getSources(). val intermediateLibrary: Provider = 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() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt index 854f6a8790d..07afea53b22 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt @@ -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() 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 ed41eb91e53..60fe655b2a4 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 @@ -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(), Kotl @Input var jvmArgs = mutableListOf() - @Incremental - override fun getClasspath(): FileCollection { - return super.getClasspath() - } - private val buildDir by lazy { project.buildDir } @@ -101,13 +93,12 @@ abstract class KotlinJsDce : AbstractKotlinCompileTool(), 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) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SourceRoots.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SourceRoots.kt index 59cf73033bb..1c7d7076c02 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SourceRoots.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/SourceRoots.kt @@ -30,7 +30,7 @@ internal sealed class SourceRoots(val kotlinSourceFiles: FileCollection) { companion object { fun create( - taskSource: FileTree, + taskSource: FileCollection, sourceRoots: FilteringSourceRootsContainer, sourceFilesExtensions: List ): 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 ) = KotlinOnly( taskSource.filter { it.isKotlinFile(sourceFilesExtensions) } 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 43c5bfbfdb4..f9d73cbc00b 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 @@ -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 - : AbstractCompile(), + : DefaultTask(), + //PatternFilterable, CompilerArgumentAwareWithInput, 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 = project.objects .property(BuildMetricsReporterImpl()) @@ -403,7 +418,7 @@ abstract class AbstractKotlinCompile : AbstractKotl @get:Internal protected open val incrementalProps: List 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 = taskProvider.classpath - val destinationDir: File = taskProvider.destinationDir + val destinationDir: File = taskProvider.destinationDirectory.get().asFile internal val kotlinOptions: List = 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 @@ -678,7 +691,7 @@ abstract class KotlinCompile @Inject constructor( } override val incrementalProps: List - 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 @@ -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)