Skip to content

Commit aa42229

Browse files
authored
Merge pull request #618 from diffplug/feat/lazy
Execute the configuration actions lazily
2 parents 1cc5f54 + 1e2801d commit aa42229

File tree

4 files changed

+36
-20
lines changed

4 files changed

+36
-20
lines changed

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

+2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import javax.annotation.Nullable;
2929

30+
import org.gradle.api.Action;
3031
import org.gradle.api.GradleException;
3132
import org.gradle.api.Project;
3233
import org.gradle.api.Task;
@@ -56,6 +57,7 @@
5657
/** Adds a `spotless{Name}Check` and `spotless{Name}Apply` task. */
5758
public class FormatExtension {
5859
final SpotlessExtensionBase spotless;
60+
final List<Action<FormatExtension>> modernLazyActions = new ArrayList<>();
5961

6062
public FormatExtension(SpotlessExtensionBase spotless) {
6163
this.spotless = Objects.requireNonNull(spotless);

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public SpotlessExtension(Project project) {
4444
*/
4545
@Deprecated
4646
public void css(Action<CssExtension> closure) {
47-
configure(CssExtension.NAME, CssExtension.class, closure);
47+
format(CssExtension.NAME, CssExtension.class, closure);
4848
}
4949

5050
/**
@@ -55,7 +55,7 @@ public void css(Action<CssExtension> closure) {
5555
*/
5656
@Deprecated
5757
public void xml(Action<XmlExtension> closure) {
58-
configure(XmlExtension.NAME, XmlExtension.class, closure);
58+
format(XmlExtension.NAME, XmlExtension.class, closure);
5959
}
6060

6161
/**

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

+15-15
Original file line numberDiff line numberDiff line change
@@ -115,63 +115,63 @@ public void ratchetFrom(String ratchetFrom) {
115115
/** Configures the special java-specific extension. */
116116
public void java(Action<JavaExtension> closure) {
117117
requireNonNull(closure);
118-
configure(JavaExtension.NAME, JavaExtension.class, closure);
118+
format(JavaExtension.NAME, JavaExtension.class, closure);
119119
}
120120

121121
/** Configures the special scala-specific extension. */
122122
public void scala(Action<ScalaExtension> closure) {
123123
requireNonNull(closure);
124-
configure(ScalaExtension.NAME, ScalaExtension.class, closure);
124+
format(ScalaExtension.NAME, ScalaExtension.class, closure);
125125
}
126126

127127
/** Configures the special kotlin-specific extension. */
128128
public void kotlin(Action<KotlinExtension> closure) {
129129
requireNonNull(closure);
130-
configure(KotlinExtension.NAME, KotlinExtension.class, closure);
130+
format(KotlinExtension.NAME, KotlinExtension.class, closure);
131131
}
132132

133133
/** Configures the special Gradle Kotlin DSL specific extension. */
134134
public void kotlinGradle(Action<KotlinGradleExtension> closure) {
135135
requireNonNull(closure);
136-
configure(KotlinGradleExtension.NAME, KotlinGradleExtension.class, closure);
136+
format(KotlinGradleExtension.NAME, KotlinGradleExtension.class, closure);
137137
}
138138

139139
/** Configures the special freshmark-specific extension. */
140140
public void freshmark(Action<FreshMarkExtension> closure) {
141141
requireNonNull(closure);
142-
configure(FreshMarkExtension.NAME, FreshMarkExtension.class, closure);
142+
format(FreshMarkExtension.NAME, FreshMarkExtension.class, closure);
143143
}
144144

145145
/** Configures the special groovy-specific extension. */
146146
public void groovy(Action<GroovyExtension> closure) {
147-
configure(GroovyExtension.NAME, GroovyExtension.class, closure);
147+
format(GroovyExtension.NAME, GroovyExtension.class, closure);
148148
}
149149

150150
/** Configures the special groovy-specific extension for Gradle files. */
151151
public void groovyGradle(Action<GroovyGradleExtension> closure) {
152-
configure(GroovyGradleExtension.NAME, GroovyGradleExtension.class, closure);
152+
format(GroovyGradleExtension.NAME, GroovyGradleExtension.class, closure);
153153
}
154154

155155
/** Configures the special sql-specific extension for SQL files. */
156156
public void sql(Action<SqlExtension> closure) {
157-
configure(SqlExtension.NAME, SqlExtension.class, closure);
157+
format(SqlExtension.NAME, SqlExtension.class, closure);
158158
}
159159

160160
/** Configures the special C/C++-specific extension. */
161161
public void cpp(Action<CppExtension> closure) {
162-
configure(CppExtension.NAME, CppExtension.class, closure);
162+
format(CppExtension.NAME, CppExtension.class, closure);
163163
}
164164

165165
/** Configures the special typescript-specific extension for typescript files. */
166166
public void typescript(Action<TypescriptExtension> closure) {
167-
configure(TypescriptExtension.NAME, TypescriptExtension.class, closure);
167+
format(TypescriptExtension.NAME, TypescriptExtension.class, closure);
168168
}
169169

170170
/** Configures a custom extension. */
171171
public void format(String name, Action<FormatExtension> closure) {
172172
requireNonNull(name, "name");
173173
requireNonNull(closure, "closure");
174-
configure(name, FormatExtension.class, closure);
174+
format(name, FormatExtension.class, closure);
175175
}
176176

177177
/** Makes it possible to remove a format which was created earlier. */
@@ -200,13 +200,13 @@ public void setEnforceCheck(boolean enforceCheck) {
200200
this.enforceCheck = enforceCheck;
201201
}
202202

203-
protected <T extends FormatExtension> void configure(String name, Class<T> clazz, Action<T> configure) {
204-
T value = maybeCreate(name, clazz);
205-
configure.execute(value);
203+
public <T extends FormatExtension> void format(String name, Class<T> clazz, Action<T> configure) {
204+
T format = maybeCreate(name, clazz);
205+
configure.execute(format);
206206
}
207207

208208
@SuppressWarnings("unchecked")
209-
private <T extends FormatExtension> T maybeCreate(String name, Class<T> clazz) {
209+
protected final <T extends FormatExtension> T maybeCreate(String name, Class<T> clazz) {
210210
FormatExtension existing = formats.get(name);
211211
if (existing != null) {
212212
if (!existing.getClass().equals(clazz)) {

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

+17-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package com.diffplug.gradle.spotless;
1717

18+
import org.gradle.api.Action;
1819
import org.gradle.api.Project;
1920
import org.gradle.api.plugins.BasePlugin;
2021
import org.gradle.api.plugins.JavaBasePlugin;
@@ -46,10 +47,14 @@ public SpotlessExtensionModern(Project project) {
4647

4748
final TaskProvider<?> rootCheckTask, rootApplyTask, rootDiagnoseTask;
4849

50+
@SuppressWarnings("unchecked")
4951
@Override
50-
protected void createFormatTasks(String name, FormatExtension formatExtension) {
51-
// TODO override configure(String name, Class<T> clazz, Action<T> configure) so that it is lazy
52+
public <T extends FormatExtension> void format(String name, Class<T> clazz, Action<T> configure) {
53+
maybeCreate(name, clazz).modernLazyActions.add((Action<FormatExtension>) configure);
54+
}
5255

56+
@Override
57+
protected void createFormatTasks(String name, FormatExtension formatExtension) {
5358
boolean isIdeHook = project.hasProperty(IdeHook.PROPERTY);
5459
TaskContainer tasks = project.getTasks();
5560
TaskProvider<?> cleanTask = tasks.named(BasePlugin.CLEAN_TASK_NAME);
@@ -62,7 +67,16 @@ protected void createFormatTasks(String name, FormatExtension formatExtension) {
6267
task.mustRunAfter(cleanTask);
6368
});
6469

65-
project.afterEvaluate(unused -> spotlessTask.configure(formatExtension::setupTask));
70+
project.afterEvaluate(unused -> {
71+
spotlessTask.configure(task -> {
72+
// now that the task is being configured, we execute our actions
73+
for (Action<FormatExtension> lazyAction : formatExtension.modernLazyActions) {
74+
lazyAction.execute(formatExtension);
75+
}
76+
// and now we'll setup the task
77+
formatExtension.setupTask(task);
78+
});
79+
});
6680

6781
// create the check and apply control tasks
6882
TaskProvider<SpotlessApply> applyTask = tasks.register(taskName + APPLY, SpotlessApply.class, task -> {

0 commit comments

Comments
 (0)