1616package com .diffplug .gradle .spotless ;
1717
1818import org .gradle .api .Project ;
19- import org .gradle .api .Task ;
2019import org .gradle .api .plugins .BasePlugin ;
2120import org .gradle .api .plugins .JavaBasePlugin ;
21+ import org .gradle .api .tasks .TaskContainer ;
22+ import org .gradle .api .tasks .TaskProvider ;
2223
2324public 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