Skip to content

Commit 76b5819

Browse files
danysantiagoDagger Team
authored and
Dagger Team
committed
Update Hilt Gradle Plugin KSP configuration to support KSP2
The plugin does per-variant / per-platform configuration by adding a CommandLineArgumentProvider to the KSP task, with KSP2 the task class is different and does not implement the KSP1 base class. This CL updates the plugin integration to find and also configure the KSP2 task. Fixes #4303 RELNOTES=Upgrade Hilt Gradle Plugin to support KSP2 configuration. PiperOrigin-RevId: 708292642
1 parent 013a9a4 commit 76b5819

File tree

1 file changed

+36
-11
lines changed
  • java/dagger/hilt/android/plugin/main/src/main/kotlin/dagger/hilt/android/plugin/util

1 file changed

+36
-11
lines changed

java/dagger/hilt/android/plugin/main/src/main/kotlin/dagger/hilt/android/plugin/util/Tasks.kt

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
package dagger.hilt.android.plugin.util
1818

1919
import com.android.build.api.variant.ComponentIdentity
20-
import com.google.devtools.ksp.gradle.KspTaskJvm
20+
import com.google.devtools.ksp.gradle.KspAATask
21+
import com.google.devtools.ksp.gradle.KspTask
22+
import kotlin.reflect.KClass
2123
import org.gradle.api.Project
2224
import org.gradle.api.Task
2325
import org.gradle.api.tasks.compile.JavaCompile
@@ -73,7 +75,7 @@ internal fun addKspTaskProcessorOptions(
7375
variantIdentity: ComponentIdentity,
7476
produceArgProvider: (Task) -> CommandLineArgumentProvider
7577
) = project.plugins.withId("com.google.devtools.ksp") {
76-
checkClass("com.google.devtools.ksp.gradle.KspTaskJvm") {
78+
check(kspOneTaskClass != null || kspTwoTaskClass != null) {
7779
"""
7880
The KSP plugin was detected to be applied but its task class could not be found.
7981
@@ -85,13 +87,25 @@ internal fun addKspTaskProcessorOptions(
8587
See https://github.com/google/dagger/issues/3965 for more details.
8688
""".trimIndent()
8789
}
88-
project.tasks.withType(KspTaskJvm::class.java).configureEach { task ->
89-
if (task.name == "ksp${variantIdentity.name.capitalize()}Kotlin" ||
90+
fun <T : Task> configureEach(
91+
kclass: KClass<T>,
92+
block: T.(CommandLineArgumentProvider) -> Unit
93+
) {
94+
project.tasks.withType(kclass.java).configureEach { task ->
95+
if (task.name == "ksp${variantIdentity.name.capitalize()}Kotlin" ||
9096
// Task names in shared/src/AndroidMain in KMP projects has a platform suffix.
9197
task.name == "ksp${variantIdentity.name.capitalize()}KotlinAndroid") {
92-
task.commandLineArgumentProviders.add(produceArgProvider.invoke(task))
98+
val argProvider = produceArgProvider.invoke(task)
99+
task.block(argProvider)
100+
}
93101
}
94102
}
103+
if (kspOneTaskClass != null) {
104+
configureEach(KspTask::class) { commandLineArgumentProviders.add(it) }
105+
}
106+
if (kspTwoTaskClass != null) {
107+
configureEach(KspAATask::class) { commandLineArgumentProviders.add(it) }
108+
}
95109
}
96110

97111
private inline fun checkClass(fqn: String, msg: () -> String) {
@@ -102,10 +116,21 @@ private inline fun checkClass(fqn: String, msg: () -> String) {
102116
}
103117
}
104118

105-
internal fun Task.isKspTask(): Boolean = try {
106-
val kspTaskClass = Class.forName("com.google.devtools.ksp.gradle.KspTask")
107-
kspTaskClass.isAssignableFrom(this::class.java)
108-
} catch (ex: ClassNotFoundException) {
109-
false
110-
}
119+
private val kspOneTaskClass =
120+
try {
121+
Class.forName("com.google.devtools.ksp.gradle.KspTask")
122+
} catch (ex: ClassNotFoundException) {
123+
null
124+
}
125+
126+
private val kspTwoTaskClass =
127+
try {
128+
Class.forName("com.google.devtools.ksp.gradle.KspAATask")
129+
} catch (ex: ClassNotFoundException) {
130+
null
131+
}
132+
133+
internal fun Task.isKspTask() =
134+
kspOneTaskClass?.isAssignableFrom(this::class.java) == true ||
135+
kspTwoTaskClass?.isAssignableFrom(this::class.java) == true
111136

0 commit comments

Comments
 (0)