Skip to content

Commit

Permalink
Include KSP configurations in hiltJavaCompile task.
Browse files Browse the repository at this point in the history
This adds supports for SPI Plugins used in KSP to be discoverable during ComponentProcessor's run in the dedicate Dagger compile task when aggregation is turned ON.

RELNOTES=N/A
PiperOrigin-RevId: 544737396
  • Loading branch information
danysantiago authored and Dagger Team committed Jun 30, 2023
1 parent b3fd56f commit cf05eeb
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 23 deletions.
1 change: 1 addition & 0 deletions java/dagger/hilt/android/plugin/main/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ dependencies {
testImplementation 'org.javassist:javassist:3.26.0-GA'
testPluginCompile 'com.android.tools.build:gradle:7.1.2'
testPluginCompile 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0'
testPluginCompile 'com.google.devtools.ksp:symbol-processing-gradle-plugin:1.8.0-1.0.9'
}

// Configure the generating task of plugin-under-test-metadata.properties to
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import dagger.hilt.android.plugin.util.addKspTaskProcessorOptions
import dagger.hilt.android.plugin.util.capitalize
import dagger.hilt.android.plugin.util.getAndroidComponentsExtension
import dagger.hilt.android.plugin.util.getKaptConfigName
import dagger.hilt.android.plugin.util.getKspConfigName
import dagger.hilt.android.plugin.util.isKspTask
import dagger.hilt.processor.internal.optionvalues.GradleProjectType
import java.io.File
Expand Down Expand Up @@ -279,8 +280,10 @@ class HiltGradlePlugin @Inject constructor(
val hiltCompileConfiguration = project.configurations.create(
"hiltCompileOnly${variant.name.capitalize()}"
).apply {
description = "Hilt aggregated compile only dependencies for '${variant.name}'"
isCanBeConsumed = false
isCanBeResolved = true
isVisible = false
}
// Add the JavaCompile task classpath and output dir to the config, the task's classpath
// will contain:
Expand All @@ -301,14 +304,23 @@ class HiltGradlePlugin @Inject constructor(
val hiltAnnotationProcessorConfiguration = project.configurations.create(
"hiltAnnotationProcessor${variant.name.capitalize()}"
).also { config ->
config.description = "Hilt annotation processor classpath for '${variant.name}'"
config.isCanBeConsumed = false
config.isCanBeResolved = true
config.isVisible = false
// Add user annotation processor configuration, so that SPI plugins and other processors
// are discoverable.
val apConfigurations: List<Configuration> = buildList {
add(variant.annotationProcessorConfiguration)
// TODO(danysantiago): Also add KSP config
project.configurations.findByName(getKaptConfigName(variant))?.let { add(it) }
project.plugins.withId("kotlin-kapt") {
project.configurations.findByName(getKaptConfigName(variant))?.let { add(it) }
}
project.plugins.withId("com.google.devtools.ksp") {
// Add the main 'ksp' config since the variant aware config does not extend main.
// https://github.com/google/ksp/issues/1433
project.configurations.findByName("ksp")?.let { add(it) }
project.configurations.findByName(getKspConfigName(variant))?.let { add(it) }
}
}
config.extendsFrom(*apConfigurations.toTypedArray())
// Add hilt-compiler even though it might be in the AP configurations already.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,31 @@
package dagger.hilt.android.plugin.util

@Suppress("DEPRECATION") // Older variant API is deprecated
internal fun getKaptConfigName(variant: com.android.build.gradle.api.BaseVariant): String {
// KAPT config names don't follow the usual convention:
internal fun getKaptConfigName(variant: com.android.build.gradle.api.BaseVariant)
= getConfigName(variant, "kapt")

@Suppress("DEPRECATION") // Older variant API is deprecated
internal fun getKspConfigName(variant: com.android.build.gradle.api.BaseVariant)
= getConfigName(variant, "ksp")

@Suppress("DEPRECATION") // Older variant API is deprecated
internal fun getConfigName(
variant: com.android.build.gradle.api.BaseVariant,
prefix: String
): String {
// Config names don't follow the usual task name conventions:
// <Variant Name> -> <Config Name>
// debug -> kaptDebug
// debugAndroidTest -> kaptAndroidTestDebug
// debugUnitTest -> kaptTestDebug
// release -> kaptRelease
// releaseUnitTest -> kaptTestRelease
// debug -> <prefix>Debug
// debugAndroidTest -> <prefix>AndroidTestDebug
// debugUnitTest -> <prefix>TestDebug
// release -> <prefix>Release
// releaseUnitTest -> <prefix>TestRelease
return when (variant) {
is com.android.build.gradle.api.TestVariant ->
"kaptAndroidTest${variant.name.substringBeforeLast("AndroidTest").capitalize()}"
"${prefix}AndroidTest${variant.name.substringBeforeLast("AndroidTest").capitalize()}"
is com.android.build.gradle.api.UnitTestVariant ->
"kaptTest${variant.name.substringBeforeLast("UnitTest").capitalize()}"
"${prefix}Test${variant.name.substringBeforeLast("UnitTest").capitalize()}"
else ->
"kapt${variant.name.capitalize()}"
"${prefix}${variant.name.capitalize()}"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@

package spi;

import dagger.model.BindingGraph;
import dagger.model.BindingGraph.ComponentNode;
import dagger.spi.BindingGraphPlugin;
import dagger.spi.DiagnosticReporter;
import dagger.spi.model.BindingGraph;
import dagger.spi.model.BindingGraph.ComponentNode;
import dagger.spi.model.BindingGraphPlugin;
import dagger.spi.model.DiagnosticReporter;
import javax.tools.Diagnostic;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import org.junit.runner.RunWith
import org.junit.runners.Parameterized

@RunWith(Parameterized::class)
class SPIPluginTest(val withKapt: Boolean) {
class SPIPluginTest(val backend: Backend) {
@get:Rule
val testProjectDir = TemporaryFolder()

Expand All @@ -43,11 +43,18 @@ class SPIPluginTest(val withKapt: Boolean) {
""".trimIndent()
)
}
val processorConfig = if (withKapt) "kapt" else "annotationProcessor"
if (withKapt) {
gradleRunner.addPluginClasspath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0")
val processorConfig = when (backend) {
Backend.JAVAC -> "annotationProcessor"
Backend.KAPT -> "kapt"
Backend.KSP -> "ksp"
}
if (backend == Backend.KAPT || backend == Backend.KSP) {
gradleRunner.addPluginId("kotlin-android")
gradleRunner.addPluginId("kotlin-kapt")
if (backend == Backend.KAPT) {
gradleRunner.addPluginId("kotlin-kapt")
} else {
gradleRunner.addPluginId("com.google.devtools.ksp")
}
gradleRunner.addAdditionalClosure("""
|kotlin {
| jvmToolchain(11)
Expand Down Expand Up @@ -91,7 +98,11 @@ class SPIPluginTest(val withKapt: Boolean) {

companion object {
@JvmStatic
@Parameterized.Parameters(name = "withKapt = {0}")
fun params() = listOf(false, true)
@Parameterized.Parameters(name = "backend = {0}")
fun params() = listOf(Backend.JAVAC, Backend.KAPT, Backend.KSP)

enum class Backend {
JAVAC, KAPT, KSP
}
}
}

0 comments on commit cf05eeb

Please sign in to comment.