![JAR search and dependency download from the Maven repository](/logo.png)
org.jetbrains.kotlin.gradle.tasks.configuration.KaptConfig.kt Maven / Gradle / Ivy
/*
* Copyright 2010-2022 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.
*/
@file:Suppress("MemberVisibilityCanBePrivate")
package org.jetbrains.kotlin.gradle.tasks.configuration
import com.intellij.util.lang.JavaVersion
import org.gradle.api.Project
import org.gradle.api.attributes.Attribute
import org.gradle.api.file.FileCollection
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.TaskProvider
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.dsl.topLevelExtension
import org.jetbrains.kotlin.gradle.internal.*
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.classLoadersCacheSize
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.disableClassloaderCacheForProcessors
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isIncludeCompileClasspath
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.isIncrementalKapt
import org.jetbrains.kotlin.gradle.internal.kapt.incremental.CLASS_STRUCTURE_ARTIFACT_TYPE
import org.jetbrains.kotlin.gradle.internal.kapt.incremental.StructureTransformAction
import org.jetbrains.kotlin.gradle.internal.kapt.incremental.StructureTransformLegacyAction
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.tasks.toCompilerPluginOptions
import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.gradle.utils.detachedResolvable
import org.jetbrains.kotlin.gradle.utils.listProperty
import java.io.File
internal open class KaptConfig(
project: Project,
protected val ext: KaptExtension,
) : TaskConfigAction(project) {
init {
configureTaskProvider { taskProvider ->
val kaptClasspathSnapshot = getKaptClasspathSnapshot(taskProvider)
taskProvider.configure { task ->
task.verbose.set(KaptTask.queryKaptVerboseProperty(project))
task.isIncremental = project.isIncrementalKapt()
task.useBuildCache = ext.useBuildCache
task.includeCompileClasspath.set(ext.includeCompileClasspath ?: project.isIncludeCompileClasspath())
task.classpathStructure.from(kaptClasspathSnapshot)
task.localStateDirectories.from({ task.incAptCache.orNull })
task.onlyIf {
it as KaptTask
it.includeCompileClasspath.get() || !it.kaptClasspath.isEmpty
}
}
}
}
internal constructor(
project: Project,
kaptGenerateStubsTask: TaskProvider,
ext: KaptExtension
) : this(project, ext) {
configureTask { task ->
task.classpath.from(
kaptGenerateStubsTask.map { it.libraries }
)
task.compiledSources
.from(
kaptGenerateStubsTask.flatMap { it.kotlinCompileDestinationDirectory },
{ kaptGenerateStubsTask.get().javaOutputDir.takeIf { it.isPresent } }
)
.disallowChanges()
task.sourceSetName.value(kaptGenerateStubsTask.flatMap { it.sourceSetName }).disallowChanges()
val kaptSources = objectFactory.fileCollection()
.from(kaptGenerateStubsTask.map { it.javaSources }, task.stubsDir)
.asFileTree
.matching { it.include("**/*.java") }
.filter {
it.exists() &&
!isAncestor(task.destinationDir.get().asFile, it) &&
!isAncestor(task.classesDir.get().asFile, it)
}
task.source.from(kaptSources).disallowChanges()
}
}
private fun getKaptClasspathSnapshot(taskProvider: TaskProvider): FileCollection? {
return if (project.isIncrementalKapt()) {
maybeRegisterTransform(project)
val classStructureConfiguration = project.configurations.detachedResolvable()
// Wrap the `kotlinCompile.classpath` into a file collection, so that, if the classpath is represented by a configuration,
// the configuration is not extended (via extendsFrom, which normally happens when one configuration is _added_ into another)
// but is instead included as the (lazily) resolved files. This is needed because the class structure configuration doesn't have
// the attributes that are potentially needed to resolve dependencies on MPP modules, and the classpath configuration does.
classStructureConfiguration.dependencies.add(project.dependencies.create(project.files(project.provider { taskProvider.get().classpath })))
classStructureConfiguration.incoming.artifactView { viewConfig ->
viewConfig.attributes.setAttribute(artifactType, CLASS_STRUCTURE_ARTIFACT_TYPE)
}.files
} else null
}
private fun maybeRegisterTransform(project: Project) {
if (!project.extensions.extraProperties.has("KaptStructureTransformAdded")) {
val transformActionClass =
if (GradleVersion.current() >= GradleVersion.version("5.4"))
StructureTransformAction::class.java
else
StructureTransformLegacyAction::class.java
project.dependencies.registerTransform(transformActionClass) { transformSpec ->
transformSpec.from.setAttribute(artifactType, "jar")
transformSpec.to.setAttribute(artifactType, CLASS_STRUCTURE_ARTIFACT_TYPE)
}
project.dependencies.registerTransform(transformActionClass) { transformSpec ->
transformSpec.from.setAttribute(artifactType, "directory")
transformSpec.to.setAttribute(artifactType, CLASS_STRUCTURE_ARTIFACT_TYPE)
}
project.extensions.extraProperties["KaptStructureTransformAdded"] = true
}
}
internal fun getJavaOptions(defaultJavaSourceCompatibility: Provider): Provider
© 2015 - 2025 Weber Informatics LLC | Privacy Policy