21
21
package net.devrieze.gradlecodegen
22
22
23
23
import 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.*
28
25
import org.gradle.api.file.FileCollection
29
26
import 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
30
30
import org.gradle.api.plugins.BasePlugin
31
31
import org.gradle.api.plugins.JavaBasePlugin
32
32
import org.gradle.api.plugins.JavaPlugin
@@ -214,6 +214,7 @@ class CodegenPlugin : Plugin<Project> {
214
214
generateConfiguration.files (object : Closure <Any >(this ) {
215
215
override fun call () = generateTask.outputDir
216
216
})
217
+
217
218
project.dependencies.add(sourceSet.compileConfigurationName, project.files(Callable { generateConfiguration.files }))
218
219
219
220
// Late bind the actual output directory
@@ -226,13 +227,39 @@ class CodegenPlugin : Plugin<Project> {
226
227
clean.doFirst { project.delete(outputDir) }
227
228
}
228
229
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)
231
233
232
234
project.afterEvaluate {
233
235
project.extensions.getByType(IdeaModel ::class .java)?.let { ideaModel ->
234
236
ideaModel.module.generatedSourceDirs.add(project.file(generateTask.outputDir))
235
237
}
236
238
}
237
239
}
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
+ }
238
265
}
0 commit comments