@@ -18,6 +18,7 @@ package com.grab.grazel.tasks.internal
1818
1919import com.grab.grazel.gradle.dependencies.KspProcessorClassExtractor
2020import com.grab.grazel.gradle.dependencies.ResolvedComponentsVisitor
21+ import com.grab.grazel.gradle.hasKsp
2122import com.grab.grazel.gradle.dependencies.model.ExcludeRule
2223import com.grab.grazel.gradle.dependencies.model.ResolveDependenciesResult
2324import com.grab.grazel.gradle.dependencies.model.ResolveDependenciesResult.Companion.Scope.COMPILE
@@ -285,6 +286,28 @@ internal abstract class ResolveVariantDependenciesTask : DefaultTask() {
285286 return hasDirectDeps
286287 }
287288
289+ /* *
290+ * Check if a variant has any KSP dependencies.
291+ * Checks the project's base 'ksp' configuration which should exist at configuration time.
292+ */
293+ private fun hasKspDependencies (variant : Variant <* >, project : Project ): Boolean {
294+ if (! project.hasKsp) return false
295+
296+ // Check if project has any KSP dependencies declared
297+ // The 'ksp' configuration is the base config that variant-specific configs extend from
298+ val kspConfig = project.configurations.findByName(" ksp" )
299+ val hasKspDeps = kspConfig?.dependencies
300+ ?.filterIsInstance<ExternalDependency >()
301+ ?.isNotEmpty() == true
302+
303+ if (! hasKspDeps) {
304+ project.logger.info(
305+ " Grazel: Skipping KSP resolution for variant '${variant.name} ' (no KSP dependencies)"
306+ )
307+ }
308+ return hasKspDeps
309+ }
310+
288311 private fun processVariant (
289312 project : Project ,
290313 variant : Variant <* >,
@@ -327,25 +350,36 @@ internal abstract class ResolveVariantDependenciesTask : DefaultTask() {
327350 }.filterValues { it.isNotEmpty() }
328351 }
329352
330- // Collect KSP direct dependencies
331- val kspConfigurationProvider = project.provider { variant.kspConfiguration }
332- val kspExternalDependencies = kspConfigurationProvider.map { configs ->
333- configs
334- .filter { it.isCanBeResolved }
335- .asSequence()
336- .flatMap { it.incoming.dependencies }
337- .filterIsInstance<ExternalDependency >()
338- }
339- val directDependenciesKsp = kspExternalDependencies.map { deps ->
340- deps.associateTo(TreeMap ()) { " ${it.group} :${it.name} " to " ${it.group} :${it.name} " }
341- }
342- // Extract processor classes from KSP JARs
343- val processorClasses = kspConfigurationProvider.map { configs ->
344- configs
345- .filter { it.isCanBeResolved }
346- .flatMap { KspProcessorClassExtractor .extractProcessorClasses(it).entries }
347- .associate { it.key to it.value.firstOrNull().orEmpty() }
348- .filterValues { it.isNotEmpty() }
353+ // Check if variant has KSP dependencies before processing
354+ val hasKsp = hasKspDependencies(variant, project)
355+
356+ // Collect KSP direct dependencies only if variant has KSP deps
357+ val directDependenciesKsp: org.gradle.api.provider.Provider <Map <String , String >>
358+ val processorClasses: org.gradle.api.provider.Provider <Map <String , String >>
359+
360+ if (hasKsp) {
361+ val kspConfigurationProvider = project.provider { variant.kspConfiguration }
362+ val kspExternalDependencies = kspConfigurationProvider.map { configs ->
363+ configs
364+ .filter { it.isCanBeResolved }
365+ .asSequence()
366+ .flatMap { it.incoming.dependencies }
367+ .filterIsInstance<ExternalDependency >()
368+ }
369+ directDependenciesKsp = kspExternalDependencies.map { deps ->
370+ deps.associateTo(TreeMap ()) { " ${it.group} :${it.name} " to " ${it.group} :${it.name} " }
371+ }
372+ // Extract processor classes from KSP JARs
373+ processorClasses = kspConfigurationProvider.map { configs ->
374+ configs
375+ .filter { it.isCanBeResolved }
376+ .flatMap { KspProcessorClassExtractor .extractProcessorClasses(it).entries }
377+ .associate { it.key to it.value.firstOrNull().orEmpty() }
378+ .filterValues { it.isNotEmpty() }
379+ }
380+ } else {
381+ directDependenciesKsp = project.provider { emptyMap() }
382+ processorClasses = project.provider { emptyMap() }
349383 }
350384
351385 val resolveVariantDependenciesTask = project.tasks
@@ -359,12 +393,14 @@ internal abstract class ResolveVariantDependenciesTask : DefaultTask() {
359393 compileConfiguration.add(it.incoming.resolutionResult.rootComponent)
360394 }
361395
362- // Resolve KSP configurations
363- variant.kspConfiguration
364- .filter { it.isCanBeResolved }
365- .forEach {
366- kspConfiguration.add(it.incoming.resolutionResult.rootComponent)
367- }
396+ // Resolve KSP configurations only if variant has KSP deps
397+ if (hasKsp) {
398+ variant.kspConfiguration
399+ .filter { it.isCanBeResolved }
400+ .forEach {
401+ kspConfiguration.add(it.incoming.resolutionResult.rootComponent)
402+ }
403+ }
368404
369405 compileDirectDependencies.set(directDependenciesCompile)
370406 compileExcludeRules.set(excludeRulesCompile)
0 commit comments