2121package net.devrieze.gradlecodegen
2222
2323import groovy.lang.Closure
24- import org.gradle.api.DefaultTask
25- import org.gradle.api.NamedDomainObjectContainer
26- import org.gradle.api.Plugin
27- import org.gradle.api.Project
24+ import org.gradle.api.*
2825import org.gradle.api.file.FileCollection
2926import org.gradle.api.internal.HasConvention
27+ import org.gradle.api.internal.tasks.DefaultSourceSetOutput
28+ import org.gradle.api.internal.tasks.TaskDependencyInternal
29+ import org.gradle.api.internal.tasks.TaskDependencyResolveContext
3030import org.gradle.api.plugins.BasePlugin
3131import org.gradle.api.plugins.JavaBasePlugin
3232import org.gradle.api.plugins.JavaPlugin
@@ -214,6 +214,7 @@ class CodegenPlugin : Plugin<Project> {
214214 generateConfiguration.files (object : Closure <Any >(this ) {
215215 override fun call () = generateTask.outputDir
216216 })
217+
217218 project.dependencies.add(sourceSet.compileConfigurationName, project.files(Callable { generateConfiguration.files }))
218219
219220 // Late bind the actual output directory
@@ -226,13 +227,39 @@ class CodegenPlugin : Plugin<Project> {
226227 clean.doFirst { project.delete(outputDir) }
227228 }
228229
229- project.tasks.getByName(sourceSet.compileJavaTaskName).dependsOn.add(generateTask)
230- project.tasks.getByName(sourceSet.getCompileTaskName(" kotlin" )).dependsOn(generateTask)
230+ project.configurations.getByName(sourceSet.compileConfigurationName).extendsFrom(generateConfiguration)
231+
232+ addGenerateTaskAsDependency(generateTask, generateTaskName, project, sourceSet)
231233
232234 project.afterEvaluate {
233235 project.extensions.getByType(IdeaModel ::class .java)?.let { ideaModel ->
234236 ideaModel.module.generatedSourceDirs.add(project.file(generateTask.outputDir))
235237 }
236238 }
237239 }
240+
241+ private fun addGenerateTaskAsDependency (generateTask : GenerateTask , generateTaskName : String , project : Project , sourceSet : SourceSet ) {
242+ val classesTask = project.tasks.findByName(sourceSet.classesTaskName)
243+ val tasks = mutableListOf<Task >()
244+ val depVisitor = object : TaskDependencyResolveContext {
245+ override fun add (dependency : Any ) {
246+ when (dependency) {
247+ is Task -> tasks.add(dependency)
248+ is TaskDependency -> dependency.getDependencies(classesTask).forEach { dep -> tasks.add(dep) }
249+ is Buildable -> dependency.buildDependencies.getDependencies(classesTask).forEach { dep -> tasks.add(dep) }
250+ else -> project.logger.warn(" Unsupported dependency type: ${dependency.javaClass} " )
251+ }
252+ }
253+
254+ override fun getTask () = classesTask
255+ }
256+ (classesTask.taskDependencies as TaskDependencyInternal ).visitDependencies(depVisitor)
257+ // Hack to just add it to the kotlin dependency set.
258+ project.tasks.findByName(sourceSet.getCompileTaskName(" kotlin" ))?.let { if (! tasks.contains(it)) {tasks.add(it)} }
259+
260+ tasks.forEach { task ->
261+ task.dependsOn(generateTask)
262+ project.logger.debug(" Make task ${task.name} depend on $generateTaskName " )
263+ }
264+ }
238265}
0 commit comments