From 571c9c10d4ef3c0918c7d244f4cb6d109ac1b6f6 Mon Sep 17 00:00:00 2001 From: Ivan Gavrilovic Date: Mon, 26 Apr 2021 17:20:00 +0100 Subject: [PATCH] [Gradle] Update compile tasks to use properties and clean up code Update AbstractKotlinCompile, KotlinCompile, and Kotlin2JsCompile to use Gradle properties, and introduce Configurator classes that are using configuration-time data to configure task. Also, introduce TaskConfigurator interface that should be implemented by classes that are used to configure tasks. --- .../gradle/internal/tasks/TaskConfigurator.kt | 13 + .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 331 +++++++----------- 2 files changed, 149 insertions(+), 195 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/tasks/TaskConfigurator.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/tasks/TaskConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/tasks/TaskConfigurator.kt new file mode 100644 index 00000000000..21b291b4280 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/tasks/TaskConfigurator.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.internal.tasks + +import org.gradle.api.Task + +/** Classes that participate in task configuration should implement this interface. */ +interface TaskConfigurator { + fun configure(task: T) +} \ No newline at end of file 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 7aabf68ac60..9f6fd3444c2 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 @@ -8,9 +8,13 @@ package org.jetbrains.kotlin.gradle.tasks import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.FileCollection +import org.gradle.api.file.RegularFileProperty import org.gradle.api.logging.Logger import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.ListProperty +import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.tasks.* import org.gradle.api.tasks.compile.AbstractCompile @@ -35,19 +39,20 @@ import org.jetbrains.kotlin.gradle.incremental.ChangedFiles import org.jetbrains.kotlin.gradle.incremental.IncrementalModuleInfoBuildService import org.jetbrains.kotlin.gradle.incremental.IncrementalModuleInfoProvider import org.jetbrains.kotlin.gradle.internal.* +import org.jetbrains.kotlin.gradle.internal.tasks.TaskConfigurator import org.jetbrains.kotlin.gradle.internal.tasks.TaskWithLocalState import org.jetbrains.kotlin.gradle.internal.tasks.allOutputFiles import org.jetbrains.kotlin.gradle.logging.GradleKotlinLogger import org.jetbrains.kotlin.gradle.logging.GradlePrintingMessageCollector import org.jetbrains.kotlin.gradle.logging.kotlinDebug -import org.jetbrains.kotlin.gradle.logging.kotlinWarn import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.plugin.mpp.associateWithTransitiveClosure +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinCompilationData import org.jetbrains.kotlin.gradle.report.ReportingSettings import org.jetbrains.kotlin.gradle.targets.js.ir.isProduceUnzippedKlib import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.isParentOf import org.jetbrains.kotlin.gradle.utils.pathsAsStringRelativeTo -import org.jetbrains.kotlin.gradle.utils.toSortedPathsArray import org.jetbrains.kotlin.incremental.ChangedFiles import org.jetbrains.kotlin.library.impl.isKotlinLibrary import org.jetbrains.kotlin.utils.JsLibraryUtils @@ -93,11 +98,6 @@ abstract class AbstractKotlinCompileTool } }) - // a hack to remove compiler jar from the cp, will be dropped when compilerJarFile will be removed - private val classpathWithCompilerJar - get() = project.objects.fileCollection() - .from(compilerJarFile, defaultCompilerClasspath.filter { !it.nameWithoutExtension.startsWith("kotlin-compiler") }) - protected abstract fun findKotlinCompilerClasspath(project: Project): List init { @@ -109,53 +109,74 @@ abstract class AbstractKotlinCompileTool } } -public class GradleCompileTaskProvider { +class GradleCompileTaskProvider(task: Task) { - constructor(task: Task) { - buildDir = task.project.buildDir - projectDir = task.project.rootProject.projectDir - rootDir = task.project.rootProject.rootDir - sessionsDir = GradleCompilerRunner.sessionsDir(task.project) - projectName = task.project.rootProject.name.normalizeForFlagFile() + val path: String = task.path + val logger: Logger = task.logger + val buildDir: File = task.project.buildDir + val projectDir: File = task.project.rootProject.projectDir + val rootDir: File = task.project.rootProject.rootDir + val sessionsDir: File = GradleCompilerRunner.sessionsDir(task.project) + val projectName: String = task.project.rootProject.name.normalizeForFlagFile() + val buildModulesInfo: Provider = run { val modulesInfo = GradleCompilerRunner.buildModulesInfo(task.project.gradle) - buildModulesInfo = task.project.gradle.sharedServices.registerIfAbsent( + task.project.gradle.sharedServices.registerIfAbsent( IncrementalModuleInfoBuildService.getServiceName(), IncrementalModuleInfoBuildService::class.java ) { it.parameters.info.set(modulesInfo) } - path = task.path - logger = task.logger } - - val path: String - val logger: Logger - val buildDir: File /*= project.buildDir*/ - val projectDir: File /*= project.rootProject.projectDir*/ - val rootDir: File /*= project.rootProject.rootDir*/ - val sessionsDir: File/* = GradleCompilerRunner.sessionsDir(project)*/ - val projectName: String /*= project.rootProject.name.normalizeForFlagFile()*/ - val buildModulesInfo: Provider /*= GradleCompilerRunner.buildModulesInfo(project.gradle)*/ } abstract class AbstractKotlinCompile : AbstractKotlinCompileTool(), UsesKotlinJavaToolchain { + open class Configurator>(protected val compilation: KotlinCompilationData<*>) : TaskConfigurator { + override fun configure(task: T) { + val project = task.project + task.friendPaths.from(project.provider { compilation.friendPaths }) + + if (compilation is KotlinCompilation<*>) { + task.friendSourceSets.set(project.provider { compilation.associateWithTransitiveClosure.map { it.name } }) + // FIXME support compiler plugins with PM20 + task.pluginClasspath.from(project.configurations.getByName(compilation.pluginConfigurationName)) + } + task.moduleName.set(project.provider { compilation.moduleName }) + task.sourceSetName.set(project.provider { compilation.compilationPurpose }) + task.coroutines.value( + project.provider { + project.extensions.findByType(KotlinTopLevelExtension::class.java)!!.experimental.coroutines + ?: PropertiesProvider(project).coroutines + ?: Coroutines.DEFAULT + } + ).disallowChanges() + task.multiPlatformEnabled.value( + project.provider { + project.plugins.any { it is KotlinPlatformPluginBase || it is KotlinMultiplatformPluginWrapper || it is KotlinPm20PluginWrapper } + } + ).disallowChanges() + task.taskBuildDirectory.value( + project.layout.buildDirectory.dir("$KOTLIN_BUILD_DIR_NAME/${task.name}") + ).disallowChanges() + task.localStateDirectories.from(task.taskBuildDirectory).disallowChanges() + } + } + init { cacheOnlyIfEnabledForKotlin() } private val layout = project.layout + @get:Internal + protected val objects: ObjectFactory = project.objects + // avoid creating directory in getter: this can lead to failure in parallel build @get:LocalState - internal val taskBuildDirectory: File by layout.buildDirectory.dir(KOTLIN_BUILD_DIR_NAME).map { it.file(name).asFile } - + internal val taskBuildDirectory: DirectoryProperty = objects.directoryProperty() @get:Internal - internal val projectObjects = project.objects - - private val localStateDirectoriesProvider: FileCollection = projectObjects.fileCollection().from({ taskBuildDirectory }) - - override fun localStateDirectories(): FileCollection = localStateDirectoriesProvider + internal val buildHistoryFile + get() = taskBuildDirectory.file("build-history.bin") // indicates that task should compile kotlin incrementally if possible // it's not possible when IncrementalTaskInputs#isIncremental returns false (i.e first build) @@ -163,7 +184,6 @@ abstract class AbstractKotlinCompile : AbstractKotl // don't rely on it to check if IC is enabled, use isIncrementalCompilationEnabled instead @get:Internal var incremental: Boolean = false - get() = field set(value) { field = value logger.kotlinDebug { "Set $this.incremental=$value" } @@ -176,117 +196,45 @@ abstract class AbstractKotlinCompile : AbstractKotl @get:Internal internal var reportingSettings = ReportingSettings() - @get:Internal - internal val taskData: KotlinCompileTaskData = KotlinCompileTaskData.get(project, name) - @get:Input - internal open var useModuleDetection: Boolean - get() = taskData.useModuleDetection.get() - set(value) { - taskData.useModuleDetection.set(value) - } + internal val useModuleDetection: Property = objects.property(Boolean::class.java).value(false) @get:Internal protected val multiModuleICSettings: MultiModuleICSettings - get() = MultiModuleICSettings(taskData.buildHistoryFile, useModuleDetection) + get() = MultiModuleICSettings(buildHistoryFile.get().asFile, useModuleDetection.get()) @get:InputFiles @get:Classpath - open val pluginClasspath: FileCollection by project.provider { - // FIXME support compiler plugins with PM20 - (taskData.compilation as? KotlinCompilation<*>?)?.pluginConfigurationName?.let(project.configurations::getByName) - ?: project.files() - } + open val pluginClasspath: ConfigurableFileCollection = objects.fileCollection() @get:Internal internal val pluginOptions = CompilerPluginOptions() - @get:Classpath - @get:InputFiles - protected val additionalClasspath = arrayListOf() - - @get:Internal - internal val objects = project.objects - - // Store this file collection before it is filtered by File::exists to ensure that Gradle Instant execution doesn't serialize the - // filtered files, losing those that don't exist yet and will only be created during build - private val compileClasspathImpl by project.provider { - classpath + objects.fileCollection().from(additionalClasspath) - } - - @get:Internal // classpath already participates in the checks - internal val compileClasspath: Iterable - get() = compileClasspathImpl - - @field:Transient - private val sourceFilesExtensionsSources: MutableList> = mutableListOf() - @get:Input - val sourceFilesExtensions: List by project.provider { - DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS + sourceFilesExtensionsSources.flatten() - } + val sourceFilesExtensions: ListProperty = objects.listProperty(String::class.java).value(DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS) - internal fun sourceFilesExtensions(extensions: Iterable) { - sourceFilesExtensionsSources.add(extensions) - } - - @get:Internal - @field:Transient - internal val kotlinExtProvider: KotlinTopLevelExtension = project.extensions.findByType(KotlinTopLevelExtension::class.java)!! - - override fun getDestinationDir(): File = - taskData.destinationDir.get() - - override fun setDestinationDir(provider: Provider) { - taskData.destinationDir.set(provider) - } - - fun setDestinationDir(provider: () -> File) { - taskData.destinationDir.set(project.provider(provider)) - } - - override fun setDestinationDir(destinationDir: File) { - taskData.destinationDir.set(destinationDir) - } - - @get:Internal - internal var coroutinesFromGradleProperties: Coroutines? = null // Input is needed to force rebuild even if source files are not changed - @get:Input - internal val coroutinesStr: Provider = project.provider { coroutines.get().name } - - @get:Input - internal val coroutines: Provider = project.provider { - kotlinExtProvider.experimental.coroutines - ?: coroutinesFromGradleProperties - ?: Coroutines.DEFAULT - } + internal val coroutines: Property = objects.property(Coroutines::class.java) @get:Internal - internal var javaOutputDir: File? - get() = taskData.javaOutputDir - set(value) { - taskData.javaOutputDir = value - } + internal val javaOutputDir: DirectoryProperty = objects.directoryProperty() @get:Internal - internal val sourceSetName: String - get() = taskData.compilation.compilationPurpose + internal val sourceSetName: Property = objects.property(String::class.java) @get:InputFiles @get:PathSensitive(PathSensitivity.RELATIVE) - internal var commonSourceSet: FileCollection = project.files() //TODO + internal val commonSourceSet: ConfigurableFileCollection = objects.fileCollection() @get:Input - internal val moduleName: String by project.provider { - taskData.compilation.moduleName - } + internal val moduleName: Property = objects.property(String::class.java) + + @get:Internal + internal val friendSourceSets = objects.listProperty(String::class.java) @get:Internal // takes part in the compiler arguments - val friendPaths: FileCollection = project.files( - project.provider { taskData.compilation.friendPaths } - ) + val friendPaths: ConfigurableFileCollection = objects.fileCollection() private val kotlinLogger by lazy { GradleKotlinLogger(logger) } @@ -376,7 +324,7 @@ abstract class AbstractKotlinCompile : AbstractKotl sourceRoots.log(this.name, logger) val args = prepareCompilerArguments() - taskBuildDirectory.mkdirs() + taskBuildDirectory.get().asFile.mkdirs() callCompilerAsync(args, sourceRoots, ChangedFiles(inputs)) } @@ -390,9 +338,7 @@ abstract class AbstractKotlinCompile : AbstractKotl internal abstract fun callCompilerAsync(args: T, sourceRoots: SourceRoots, changedFiles: ChangedFiles) @get:Input - internal val isMultiplatform: Boolean by lazy { - project.plugins.any { it is KotlinPlatformPluginBase || it is KotlinMultiplatformPluginWrapper || it is KotlinPm20PluginWrapper } - } + internal val multiPlatformEnabled: Property = objects.property(Boolean::class.java) @get:Internal internal val abstractKotlinCompileArgumentsContributor by lazy { @@ -408,74 +354,59 @@ abstract class AbstractKotlinCompile : AbstractKotl ) } - internal fun setupPlugins(compilerArgs: T) { - compilerArgs.pluginClasspaths = pluginClasspath.toSortedPathsArray() - compilerArgs.pluginOptions = pluginOptions.arguments.toTypedArray() - } - protected fun hasFilesInTaskBuildDirectory(): Boolean { - val taskBuildDir = taskBuildDirectory + val taskBuildDir = taskBuildDirectory.get().asFile return taskBuildDir.walk().any { it != taskBuildDir && it.isFile } } } open class KotlinCompileArgumentsProvider>(taskProvider: T) { - val coroutines: Provider - val logger: Logger - val isMultiplatform: Boolean - val pluginClasspath: FileCollection - val pluginOptions: CompilerPluginOptions - - init { - coroutines = taskProvider.coroutines - logger = taskProvider.logger - isMultiplatform = taskProvider.isMultiplatform - pluginClasspath = taskProvider.pluginClasspath - pluginOptions = taskProvider.pluginOptions - } + val coroutines: Provider = taskProvider.coroutines + val logger: Logger = taskProvider.logger + val isMultiplatform: Boolean = taskProvider.multiPlatformEnabled.get() + val pluginClasspath: FileCollection = taskProvider.pluginClasspath + val pluginOptions: CompilerPluginOptions = taskProvider.pluginOptions } class KotlinJvmCompilerArgumentsProvider (taskProvider: KotlinCompile) : KotlinCompileArgumentsProvider(taskProvider) { - - val moduleName: String - val friendPaths: FileCollection - val compileClasspath: Iterable - val destinationDir: File - internal val kotlinOptions: List - - init { -// super(taskProvider) - moduleName = taskProvider.moduleName - friendPaths = taskProvider.friendPaths - compileClasspath = taskProvider.compileClasspath - destinationDir = taskProvider.destinationDir - kotlinOptions = listOfNotNull( - taskProvider.parentKotlinOptionsImpl, - taskProvider.kotlinOptions as KotlinJvmOptionsImpl - ) - } + val moduleName: String = taskProvider.moduleName.get() + val friendPaths: FileCollection = taskProvider.friendPaths + val compileClasspath: Iterable = taskProvider.classpath + val destinationDir: File = taskProvider.destinationDir + internal val kotlinOptions: List = listOfNotNull( + taskProvider.parentKotlinOptionsImpl.orNull as? KotlinJvmOptionsImpl, + taskProvider.kotlinOptions as KotlinJvmOptionsImpl + ) } internal inline val T.thisTaskProvider: TaskProvider get() = checkNotNull(project.locateTask(name)) @CacheableTask -open class KotlinCompile : AbstractKotlinCompile(), KotlinJvmCompile { - @get:Internal - internal var parentKotlinOptionsImpl: KotlinJvmOptionsImpl? = null +abstract class KotlinCompile : AbstractKotlinCompile(), KotlinJvmCompile { - override val kotlinOptions: KotlinJvmOptions - get() = taskData.compilation.kotlinOptions as KotlinJvmOptions + class Configurator(kotlinCompilation: KotlinCompilationData<*>) : AbstractKotlinCompile.Configurator(kotlinCompilation) { + override fun configure(task: KotlinCompile) { + super.configure(task) + + task.kotlinOptionsProperty.set(compilation.kotlinOptions as KotlinJvmOptions) + } + } + + @get:Internal + internal val parentKotlinOptionsImpl: Property = objects.property(KotlinJvmOptions::class.java) + + override val kotlinOptionsProperty: Property = objects.property(KotlinJvmOptions::class.java) @get:Internal @field:Transient - internal open val sourceRootsContainer = FilteringSourceRootsContainer(project.objects) + internal open val sourceRootsContainer = FilteringSourceRootsContainer(objects) 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) + SourceRoots.ForJvm.create(source, sourceRootsContainer, sourceFilesExtensions.get()) } /** A package prefix that is used for locating Java sources in a directory structure with non-full-depth packages. @@ -530,7 +461,7 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl logger.info(USING_JVM_INCREMENTAL_COMPILATION_MESSAGE) IncrementalCompilationEnvironment( if (hasFilesInTaskBuildDirectory()) changedFiles else ChangedFiles.Unknown(), - taskBuildDirectory, + taskBuildDirectory.get().asFile, usePreciseJavaTracking = usePreciseJavaTracking, disableMultiModuleIC = disableMultiModuleIC, multiModuleICSettings = multiModuleICSettings @@ -542,7 +473,7 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl outputFiles = allOutputFiles(), reportingSettings = reportingSettings, incrementalCompilationEnvironment = icEnv, - kotlinScriptExtensions = sourceFilesExtensions.toTypedArray() + kotlinScriptExtensions = sourceFilesExtensions.get().toTypedArray() ) compilerRunner.runJvmCompilerAsync( sourceRoots.kotlinSourceFiles, @@ -556,7 +487,7 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl @get:Input val disableMultiModuleIC: Boolean by lazy { - if (!isIncrementalCompilationEnabled() || javaOutputDir == null) { + if (!isIncrementalCompilationEnabled() || !javaOutputDir.isPresent) { false } else { @@ -565,7 +496,7 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl if (it is AbstractCompile && it !is JavaCompile && it !is AbstractKotlinCompile<*> && - javaOutputDir!!.isParentOf(it.destinationDir) + javaOutputDir.get().asFile.isParentOf(it.destinationDir) ) { illegalTaskOrNull = illegalTaskOrNull ?: it } @@ -596,7 +527,7 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl } @CacheableTask -internal open class KotlinCompileWithWorkers @Inject constructor( +internal abstract class KotlinCompileWithWorkers @Inject constructor( private val workerExecutor: WorkerExecutor ) : KotlinCompile() { @@ -612,7 +543,7 @@ internal open class KotlinCompileWithWorkers @Inject constructor( } @CacheableTask -internal open class Kotlin2JsCompileWithWorkers @Inject constructor( +internal abstract class Kotlin2JsCompileWithWorkers @Inject constructor( objectFactory: ObjectFactory, private val workerExecutor: WorkerExecutor ) : Kotlin2JsCompile(objectFactory) { @@ -629,7 +560,7 @@ internal open class Kotlin2JsCompileWithWorkers @Inject constructor( } @CacheableTask -internal open class KotlinCompileCommonWithWorkers @Inject constructor( +internal abstract class KotlinCompileCommonWithWorkers @Inject constructor( private val workerExecutor: WorkerExecutor ) : KotlinCompileCommon() { override fun compilerRunner( @@ -644,7 +575,7 @@ internal open class KotlinCompileCommonWithWorkers @Inject constructor( } @CacheableTask -open class Kotlin2JsCompile @Inject constructor( +abstract class Kotlin2JsCompile @Inject constructor( objectFactory: ObjectFactory ) : AbstractKotlinCompile(), KotlinJsCompile { @@ -652,11 +583,28 @@ open class Kotlin2JsCompile @Inject constructor( incremental = true } - override val kotlinOptions = taskData.compilation.kotlinOptions as KotlinJsOptions + open class Configurator(compilation: KotlinCompilationData<*>) : AbstractKotlinCompile.Configurator(compilation) { - @get:Internal - protected val defaultOutputFile: File - get() = File(destinationDir, "${taskData.compilation.ownModuleName}.js") + override fun configure(task: T) { + super.configure(task) + + task.kotlinOptionsProperty.set(compilation.kotlinOptions as KotlinJsOptions) + task.outputFile.value( + task.kotlinOptionsProperty.map { + it.outputFile?.let(::File) + ?: task.destinationDirectory.locationOnly.get().asFile.resolve("${compilation.ownModuleName}.js") + } + ).disallowChanges() + task.optionalOutputFile.fileProvider( + task.kotlinOptionsProperty.flatMap { jsOptions -> + task.outputFile.takeIf { !jsOptions.isProduceUnzippedKlib() } + ?: task.project.objects.fileProperty().asFile + } + ).disallowChanges() + } + } + + override val kotlinOptionsProperty: Property = objectFactory.property(KotlinJsOptions::class.java) @get:Input internal var incrementalJsKlib: Boolean = true @@ -669,20 +617,13 @@ open class Kotlin2JsCompile @Inject constructor( else -> incremental } + // This can be file or directory @get:Internal - val outputFile: File - get() = kotlinOptions.outputFile?.let(::File) ?: defaultOutputFile + abstract val outputFile: Property @get:OutputFile @get:Optional - val outputFileOrNull: File? - get() = outputFile.let { file -> - if (!kotlinOptions.isProduceUnzippedKlib()) { - file - } else { - null - } - } + abstract val optionalOutputFile: RegularFileProperty override fun findKotlinCompilerClasspath(project: Project): List = findKotlinJsCompilerClasspath(project) @@ -695,20 +636,20 @@ open class Kotlin2JsCompile @Inject constructor( super.setupCompilerArgs(args, defaultsOnly = defaultsOnly, ignoreClasspathResolutionErrors = ignoreClasspathResolutionErrors) try { - outputFile.canonicalPath + outputFile.get().canonicalPath } catch (ex: Throwable) { - logger.warn("IO EXCEPTION: outputFile: ${outputFile.path}") + logger.warn("IO EXCEPTION: outputFile: ${outputFile.get().path}") throw ex } - args.outputFile = outputFile.absoluteFile.normalize().absolutePath + args.outputFile = outputFile.get().absoluteFile.normalize().absolutePath if (defaultsOnly) return (kotlinOptions as KotlinJsOptionsImpl).updateArguments(args) } - override fun getSourceRoots() = SourceRoots.KotlinOnly.create(getSource(), sourceFilesExtensions) + override fun getSourceRoots() = SourceRoots.KotlinOnly.create(getSource(), sourceFilesExtensions.get()) @get:InputFiles @get:Optional @@ -776,7 +717,7 @@ open class Kotlin2JsCompile @Inject constructor( logger.info(USING_JS_IR_BACKEND_MESSAGE) } - val dependencies = compileClasspath + val dependencies = classpath .filter { it.exists() && libraryFilter(it) } .map { it.canonicalPath } @@ -802,7 +743,7 @@ open class Kotlin2JsCompile @Inject constructor( logger.info(USING_JS_INCREMENTAL_COMPILATION_MESSAGE) IncrementalCompilationEnvironment( if (hasFilesInTaskBuildDirectory()) changedFiles else ChangedFiles.Unknown(), - taskBuildDirectory, + taskBuildDirectory.get().asFile, multiModuleICSettings = multiModuleICSettings ) } else null