Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -209,18 +209,22 @@ abstract class KspAATask @Inject constructor(
target
)
)
val apOptions = mutableMapOf<String, String>()
apOptions.putAll(kspExtension.apOptions)
kspExtension.commandLineArgumentProviders.forEach { provider ->
provider.asArguments().forEach { argument ->
val kv = Regex("(\\S+)=(\\S+)").matchEntire(argument)?.groupValues
if (kv == null || kv.size != 3) {
throw IllegalArgumentException("KSP apoption does not match (\\S+)=(\\S+): $argument")
cfg.processorOptions.putAll(kspExtension.apOptions)
cfg.processorOptions.putAll(
kspExtension.commandLineArgumentProviders.map { providers ->
buildMap {
for (provider in providers) {
provider.asArguments().forEach { argument ->
val kv = Regex("(\\S+)=(\\S+)").matchEntire(argument)?.groupValues
require(kv != null && kv.size == 3) {
"KSP apoption does not match (\\S+)=(\\S+): $argument"
}
put(kv[1], kv[2])
}
}
}
apOptions.put(kv[1], kv[2])
}
}
cfg.processorOptions.value(apOptions)
)
val logLevel = LogLevel.values().first {
project.logger.isEnabled(it)
}
Expand All @@ -229,10 +233,16 @@ abstract class KspAATask @Inject constructor(
cfg.excludedProcessors.value(kspExtension.excludedProcessors)

cfg.incremental.value(
project.providers.gradleProperty("ksp.incremental").orNull?.toBoolean() ?: true
project.providers
.gradleProperty("ksp.incremental")
.map { it.toBoolean() }
.orElse(true)
)
cfg.incrementalLog.value(
project.providers.gradleProperty("ksp.incremental.log").orNull?.toBoolean() ?: false
project.providers
.gradleProperty("ksp.incremental.log")
.map { it.toBoolean() }
.orElse(false)
)

cfg.classpathStructure.from(getClassStructureFiles(project, cfg.libraries))
Expand Down Expand Up @@ -454,6 +464,7 @@ abstract class KspAAWorkerAction : WorkAction<KspAAWorkParameter> {
removedSources = parameters.removedSources
changedClasses = parameters.changedClasses
}

val platformType = gradleCfg.platformType.get()
val kspConfig = when (platformType) {
KotlinPlatformType.jvm, KotlinPlatformType.androidJvm -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,24 @@
package com.google.devtools.ksp.gradle

import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.provider.Provider
import org.gradle.process.CommandLineArgumentProvider
import javax.inject.Inject

abstract class KspExtension {
internal val apOptions = mutableMapOf<String, String>()
internal val commandLineArgumentProviders = mutableListOf<CommandLineArgumentProvider>()
internal val excludedProcessors = mutableSetOf<String>()
abstract class KspExtension @Inject constructor(project: Project) {
internal val apOptions = project.objects.mapProperty(String::class.java, String::class.java)
internal val commandLineArgumentProviders = project.objects.listProperty(CommandLineArgumentProvider::class.java)
.also { it.finalizeValueOnRead() }
internal val excludedProcessors = project.objects.setProperty(String::class.java)
.also { it.finalizeValueOnRead() }

// Specify sources that should be excluded from KSP.
// If you have a task that generates sources, you can call `ksp.excludedSources.from(task)`.
abstract val excludedSources: ConfigurableFileCollection

open val arguments: Map<String, String> get() = apOptions.toMap()
open val arguments: Map<String, String> get() = apOptions.get()

open fun arg(k: String, v: String) {
if ('=' in k) {
Expand All @@ -39,6 +44,13 @@ abstract class KspExtension {
apOptions.put(k, v)
}

open fun arg(k: String, v: Provider<String>) {
if ('=' in k) {
throw GradleException("'=' is not allowed in custom option's name.")
}
apOptions.put(k, v)
}

open fun arg(arg: CommandLineArgumentProvider) {
commandLineArgumentProviders.add(arg)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,58 +106,86 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool
sourceSetName: String,
target: String,
isIncremental: Boolean,
allWarningsAsErrors: Boolean,
allWarningsAsErrors: Provider<Boolean>,
commandLineArgumentProviders: ListProperty<CommandLineArgumentProvider>,
commonSources: List<File>,
): List<SubpluginOption> {
val options = mutableListOf<SubpluginOption>()
options +=
commonSources: Provider<List<File>>,
): Provider<List<SubpluginOption>> {
val options = project.objects.listProperty(SubpluginOption::class.java)
options.add(
InternalSubpluginOption("classOutputDir", getKspClassOutputDir(project, sourceSetName, target).path)
options +=
)
options.add(
InternalSubpluginOption("javaOutputDir", getKspJavaOutputDir(project, sourceSetName, target).path)
options +=
)
options.add(
InternalSubpluginOption("kotlinOutputDir", getKspKotlinOutputDir(project, sourceSetName, target).path)
options += InternalSubpluginOption(
"resourceOutputDir",
getKspResourceOutputDir(project, sourceSetName, target).path
)
options += InternalSubpluginOption("cachesDir", getKspCachesDir(project, sourceSetName, target).path)
options += InternalSubpluginOption("kspOutputDir", getKspOutputDir(project, sourceSetName, target).path)
options += SubpluginOption("incremental", isIncremental.toString())
options += SubpluginOption(
"incrementalLog",
project.providers.gradleProperty("ksp.incremental.log").orNull ?: "false"
options.add(
InternalSubpluginOption(
"resourceOutputDir",
getKspResourceOutputDir(project, sourceSetName, target).path
)
)
options.add(
InternalSubpluginOption("cachesDir", getKspCachesDir(project, sourceSetName, target).path)
)
options.add(
InternalSubpluginOption("kspOutputDir", getKspOutputDir(project, sourceSetName, target).path)
)
options.add(
SubpluginOption("incremental", isIncremental.toString())
)
options.add(
project.providers.gradleProperty("ksp.incremental.log")
.orElse("false")
.map { SubpluginOption("incrementalLog", it) }
)
options += InternalSubpluginOption("projectBaseDir", project.project.projectDir.canonicalPath)
options += SubpluginOption("allWarningsAsErrors", allWarningsAsErrors.toString())
options.add(
InternalSubpluginOption("projectBaseDir", project.project.projectDir.canonicalPath)
)
options.add(allWarningsAsErrors.map { SubpluginOption("allWarningsAsErrors", it.toString()) })
// Turn this on by default to work KT-30172 around. It is off by default in the compiler plugin.
options += SubpluginOption(
"returnOkOnError",
project.providers.gradleProperty("ksp.return.ok.on.error").orNull ?: "true"
options.add(
project.providers.gradleProperty("ksp.return.ok.on.error")
.orElse("true")
.map { SubpluginOption("returnOkOnError", it) }
)
commonSources.ifNotEmpty {
options += FilesSubpluginOption("commonSources", this)
}

kspExtension.apOptions.forEach {
options += SubpluginOption("apoption", "${it.key}=${it.value}")
}
options += SubpluginOption(
"excludedProcessors",
kspExtension.excludedProcessors.joinToString(":")
options.addAll(
commonSources.map { sources ->
if (sources.isNotEmpty()) {
listOf(FilesSubpluginOption("commonSources", sources))
} else {
emptyList()
}
}
)
options.addAll(
kspExtension.apOptions.map { apOptions ->
apOptions.map { (k, v) -> SubpluginOption("apoption", "$k=$v") }
}
)
options += SubpluginOption(
"mapAnnotationArgumentsInJava",
project.providers.gradleProperty("ksp.map.annotation.arguments.in.java").orNull ?: "false"
options.add(
kspExtension.excludedProcessors.map {
SubpluginOption("excludedProcessors", it.joinToString(":"))
}
)
options.add(
project.providers.gradleProperty("ksp.map.annotation.arguments.in.java")
.orElse("false")
.map { SubpluginOption("mapAnnotationArgumentsInJava", it) }
)
commandLineArgumentProviders.get().forEach {
it.asArguments().forEach { argument ->
if (!argument.matches(Regex("\\S+=\\S+"))) {
throw IllegalArgumentException("KSP apoption does not match \\S+=\\S+: $argument")
options.addAll(
commandLineArgumentProviders.map { providers ->
providers.flatMap { provider ->
provider.asArguments().map { argument ->
require(argument.matches(Regex("\\S+=\\S+"))) {
"KSP apoption does not match \\S+=\\S+: $argument"
}
InternalSubpluginOption("apoption", argument)
}
}
options += InternalSubpluginOption("apoption", argument)
}
}
)
return options
}
}
Expand Down Expand Up @@ -270,20 +298,18 @@ class KspGradleSubplugin @Inject internal constructor(private val registry: Tool
kspTask.commandLineArgumentProviders.addAll(kspExtension.commandLineArgumentProviders)

kspTask.options.addAll(
kspTask.project.provider {
getSubpluginOptions(
project,
kspExtension,
sourceSetName,
target,
isIncremental,
kspExtension.allWarningsAsErrors,
kspTask.commandLineArgumentProviders,
emptyList(),
)
}
getSubpluginOptions(
project = project,
kspExtension = kspExtension,
sourceSetName = sourceSetName,
target = target,
isIncremental = isIncremental,
allWarningsAsErrors = project.provider { kspExtension.allWarningsAsErrors },
commandLineArgumentProviders = kspTask.commandLineArgumentProviders,
commonSources = project.provider { emptyList() },
)
)
kspTask.inputs.property("apOptions", kspExtension.arguments)
kspTask.inputs.property("apOptions", kspExtension.apOptions)
kspTask.inputs.files(processorClasspath).withNormalizer(ClasspathNormalizer::class.java)
}

Expand Down