Skip to content

Commit 1cc5f54

Browse files
authored
Merge pull request #617 from bigdaz/lazy-task-creation
Avoid eager creation of tasks for Spotless plugin
2 parents 183c0b4 + 78cfd65 commit 1cc5f54

File tree

1 file changed

+52
-43
lines changed

1 file changed

+52
-43
lines changed

plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionModern.java

Lines changed: 52 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,25 @@
1616
package com.diffplug.gradle.spotless;
1717

1818
import org.gradle.api.Project;
19-
import org.gradle.api.Task;
2019
import org.gradle.api.plugins.BasePlugin;
2120
import org.gradle.api.plugins.JavaBasePlugin;
21+
import org.gradle.api.tasks.TaskContainer;
22+
import org.gradle.api.tasks.TaskProvider;
2223

2324
public class SpotlessExtensionModern extends SpotlessExtensionBase {
2425
public SpotlessExtensionModern(Project project) {
2526
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
27+
rootCheckTask = project.getTasks().register(EXTENSION + CHECK, task -> {
28+
task.setGroup(TASK_GROUP);
29+
task.setDescription(CHECK_DESCRIPTION);
30+
});
31+
rootApplyTask = project.getTasks().register(EXTENSION + APPLY, task -> {
32+
task.setGroup(TASK_GROUP);
33+
task.setDescription(APPLY_DESCRIPTION);
34+
});
35+
rootDiagnoseTask = project.getTasks().register(EXTENSION + DIAGNOSE, task -> {
36+
task.setGroup(TASK_GROUP); // no description on purpose
37+
});
3438

3539
project.afterEvaluate(unused -> {
3640
if (enforceCheck) {
@@ -40,53 +44,58 @@ public SpotlessExtensionModern(Project project) {
4044
});
4145
}
4246

43-
final Task rootCheckTask, rootApplyTask, rootDiagnoseTask;
47+
final TaskProvider<?> rootCheckTask, rootApplyTask, rootDiagnoseTask;
4448

4549
@Override
4650
protected void createFormatTasks(String name, FormatExtension formatExtension) {
47-
// TODO level 1: implement SpotlessExtension::createFormatTasks, but using config avoidance
48-
// TODO level 2: override configure(String name, Class<T> clazz, Action<T> configure) so that it is lazy
51+
// TODO override configure(String name, Class<T> clazz, Action<T> configure) so that it is lazy
52+
53+
boolean isIdeHook = project.hasProperty(IdeHook.PROPERTY);
54+
TaskContainer tasks = project.getTasks();
55+
TaskProvider<?> cleanTask = tasks.named(BasePlugin.CLEAN_TASK_NAME);
4956

5057
// create the SpotlessTask
5158
String taskName = EXTENSION + SpotlessPlugin.capitalize(name);
52-
SpotlessTaskModern spotlessTask = project.getTasks().create(taskName, SpotlessTaskModern.class);
53-
project.afterEvaluate(unused -> formatExtension.setupTask(spotlessTask));
59+
TaskProvider<SpotlessTaskModern> spotlessTask = tasks.register(taskName, SpotlessTaskModern.class, task -> {
60+
task.setEnabled(!isIdeHook);
61+
// clean removes the SpotlessCache, so we have to run after clean
62+
task.mustRunAfter(cleanTask);
63+
});
5464

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);
65+
project.afterEvaluate(unused -> spotlessTask.configure(formatExtension::setupTask));
5866

5967
// 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);
68+
TaskProvider<SpotlessApply> applyTask = tasks.register(taskName + APPLY, SpotlessApply.class, task -> {
69+
task.setEnabled(!isIdeHook);
70+
task.dependsOn(spotlessTask);
71+
task.setSpotlessOutDirectory(spotlessTask.get().getOutputDirectory());
72+
task.linkSource(spotlessTask.get());
73+
});
74+
rootApplyTask.configure(task -> {
75+
task.dependsOn(applyTask);
6476

65-
SpotlessApply applyTask = project.getTasks().create(taskName + APPLY, SpotlessApply.class);
66-
applyTask.setSpotlessOutDirectory(spotlessTask.getOutputDirectory());
67-
applyTask.linkSource(spotlessTask);
68-
applyTask.dependsOn(spotlessTask);
77+
if (isIdeHook) {
78+
// the rootApplyTask is no longer just a marker task, now it does a bit of work itself
79+
task.doLast(unused -> IdeHook.performHook(spotlessTask.get()));
80+
}
81+
});
6982

70-
// if the user runs both, make sure that apply happens first,
71-
checkTask.mustRunAfter(applyTask);
83+
TaskProvider<SpotlessCheck> checkTask = tasks.register(taskName + CHECK, SpotlessCheck.class, task -> {
84+
task.setEnabled(!isIdeHook);
85+
task.dependsOn(spotlessTask);
86+
task.setSpotlessOutDirectory(spotlessTask.get().getOutputDirectory());
87+
task.source = spotlessTask.get();
7288

73-
// the root tasks depend on the control tasks
74-
rootCheckTask.dependsOn(checkTask);
75-
rootApplyTask.dependsOn(applyTask);
89+
// if the user runs both, make sure that apply happens first,
90+
task.mustRunAfter(applyTask);
91+
});
92+
rootCheckTask.configure(task -> task.dependsOn(checkTask));
7693

7794
// 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-
}
95+
TaskProvider<SpotlessDiagnoseTask> diagnoseTask = tasks.register(taskName + DIAGNOSE, SpotlessDiagnoseTask.class, task -> {
96+
task.source = spotlessTask.get();
97+
task.mustRunAfter(cleanTask);
98+
});
99+
rootDiagnoseTask.configure(task -> task.dependsOn(diagnoseTask));
91100
}
92101
}

0 commit comments

Comments
 (0)