Skip to content

Commit bbcc423

Browse files
committed
Skip KSP config resolution when no KSP dependencies exist
Similar to PR #159, this optimizes configuration time by skipping expensive KSP resolution for projects/variants without KSP deps. - Add hasKspDependencies() to check project's base ksp configuration - Conditionally process KSP configs only when dependencies exist - Skip processor class extraction and resolution when not needed
1 parent 4223e0a commit bbcc423

File tree

1 file changed

+61
-25
lines changed

1 file changed

+61
-25
lines changed

grazel-gradle-plugin/src/main/kotlin/com/grab/grazel/tasks/internal/ResolveVariantDependenciesTask.kt

Lines changed: 61 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.grab.grazel.tasks.internal
1818

1919
import com.grab.grazel.gradle.dependencies.KspProcessorClassExtractor
2020
import com.grab.grazel.gradle.dependencies.ResolvedComponentsVisitor
21+
import com.grab.grazel.gradle.hasKsp
2122
import com.grab.grazel.gradle.dependencies.model.ExcludeRule
2223
import com.grab.grazel.gradle.dependencies.model.ResolveDependenciesResult
2324
import 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

Comments
 (0)