|
16 | 16 | package com.diffplug.gradle.spotless;
|
17 | 17 |
|
18 | 18 | import org.gradle.api.Project;
|
| 19 | +import org.gradle.api.Task; |
| 20 | +import org.gradle.api.plugins.BasePlugin; |
| 21 | +import org.gradle.api.plugins.JavaBasePlugin; |
19 | 22 |
|
20 | 23 | public class SpotlessExtensionModern extends SpotlessExtensionBase {
|
21 | 24 | public SpotlessExtensionModern(Project project) {
|
22 | 25 | super(project);
|
| 26 | + rootCheckTask = project.task(EXTENSION + CHECK); |
| 27 | + rootCheckTask.setGroup(TASK_GROUP); |
| 28 | + rootCheckTask.setDescription(CHECK_DESCRIPTION); |
| 29 | + rootApplyTask = project.task(EXTENSION + APPLY); |
| 30 | + rootApplyTask.setGroup(TASK_GROUP); |
| 31 | + rootApplyTask.setDescription(APPLY_DESCRIPTION); |
| 32 | + rootDiagnoseTask = project.task(EXTENSION + DIAGNOSE); |
| 33 | + rootDiagnoseTask.setGroup(TASK_GROUP); // no description on purpose |
| 34 | + |
| 35 | + project.afterEvaluate(unused -> { |
| 36 | + if (enforceCheck) { |
| 37 | + project.getTasks().named(JavaBasePlugin.CHECK_TASK_NAME) |
| 38 | + .configure(task -> task.dependsOn(rootCheckTask)); |
| 39 | + } |
| 40 | + }); |
23 | 41 | }
|
24 | 42 |
|
| 43 | + final Task rootCheckTask, rootApplyTask, rootDiagnoseTask; |
| 44 | + |
25 | 45 | @Override
|
26 | 46 | protected void createFormatTasks(String name, FormatExtension formatExtension) {
|
27 | 47 | // TODO level 1: implement SpotlessExtension::createFormatTasks, but using config avoidance
|
28 | 48 | // TODO level 2: override configure(String name, Class<T> clazz, Action<T> configure) so that it is lazy
|
| 49 | + |
| 50 | + // create the SpotlessTask |
| 51 | + String taskName = EXTENSION + SpotlessPlugin.capitalize(name); |
| 52 | + SpotlessTaskModern spotlessTask = project.getTasks().create(taskName, SpotlessTaskModern.class); |
| 53 | + project.afterEvaluate(unused -> formatExtension.setupTask(spotlessTask)); |
| 54 | + |
| 55 | + // clean removes the SpotlessCache, so we have to run after clean |
| 56 | + Task clean = project.getTasks().getByName(BasePlugin.CLEAN_TASK_NAME); |
| 57 | + spotlessTask.mustRunAfter(clean); |
| 58 | + |
| 59 | + // create the check and apply control tasks |
| 60 | + SpotlessCheck checkTask = project.getTasks().create(taskName + CHECK, SpotlessCheck.class); |
| 61 | + checkTask.setSpotlessOutDirectory(spotlessTask.getOutputDirectory()); |
| 62 | + checkTask.source = spotlessTask; |
| 63 | + checkTask.dependsOn(spotlessTask); |
| 64 | + |
| 65 | + SpotlessApply applyTask = project.getTasks().create(taskName + APPLY, SpotlessApply.class); |
| 66 | + applyTask.setSpotlessOutDirectory(spotlessTask.getOutputDirectory()); |
| 67 | + applyTask.linkSource(spotlessTask); |
| 68 | + applyTask.dependsOn(spotlessTask); |
| 69 | + |
| 70 | + // if the user runs both, make sure that apply happens first, |
| 71 | + checkTask.mustRunAfter(applyTask); |
| 72 | + |
| 73 | + // the root tasks depend on the control tasks |
| 74 | + rootCheckTask.dependsOn(checkTask); |
| 75 | + rootApplyTask.dependsOn(applyTask); |
| 76 | + |
| 77 | + // create the diagnose task |
| 78 | + SpotlessDiagnoseTask diagnoseTask = project.getTasks().create(taskName + DIAGNOSE, SpotlessDiagnoseTask.class); |
| 79 | + diagnoseTask.source = spotlessTask; |
| 80 | + rootDiagnoseTask.dependsOn(diagnoseTask); |
| 81 | + diagnoseTask.mustRunAfter(clean); |
| 82 | + |
| 83 | + if (project.hasProperty(IdeHook.PROPERTY)) { |
| 84 | + // disable the normal tasks, to disable their up-to-date checking |
| 85 | + spotlessTask.setEnabled(false); |
| 86 | + checkTask.setEnabled(false); |
| 87 | + applyTask.setEnabled(false); |
| 88 | + // the rootApplyTask is no longer just a marker task, now it does a bit of work itself |
| 89 | + rootApplyTask.doLast(unused -> IdeHook.performHook(spotlessTask)); |
| 90 | + } |
29 | 91 | }
|
30 | 92 | }
|
0 commit comments