Skip to content

Commit 1278657

Browse files
committed
Use Task Providers for task initialization
This change improves performance by leveraging Gradle's lazy task configuration, avoiding the immediate creation and configuration of the source `SpotlessTask`. The corresponding test suites have been updated to reflect this shift from direct task creation to task registration with providers.
1 parent 88c83de commit 1278657

File tree

7 files changed

+80
-84
lines changed

7 files changed

+80
-84
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1139,7 +1139,7 @@ public TaskProvider<SpotlessApply> createIndependentApplyTaskLazy(String taskNam
11391139
return spotless.project.getTasks().register(taskName, SpotlessApply.class,
11401140
task -> {
11411141
task.dependsOn(spotlessTask);
1142-
task.init(spotlessTask.get());
1142+
task.init(spotlessTask);
11431143
});
11441144
}
11451145

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.gradle.api.tasks.Input;
3333
import org.gradle.api.tasks.Internal;
3434
import org.gradle.api.tasks.TaskAction;
35+
import org.gradle.api.tasks.TaskProvider;
3536
import org.gradle.work.DisableCachingByDefault;
3637
import org.jetbrains.annotations.NotNull;
3738

@@ -133,10 +134,10 @@ public void visitFile(FileVisitDetails fileVisitDetails) {
133134
abstract Property<String> getProjectPath();
134135

135136
@Override
136-
void init(SpotlessTaskImpl impl) {
137+
void init(TaskProvider<SpotlessTaskImpl> impl) {
137138
super.init(impl);
138139
getProjectPath().set(getProject().getPath());
139-
getEncoding().set(impl.getEncoding());
140+
getEncoding().set(impl.map(SpotlessTask::getEncoding));
140141
getRunToFixMessage().convention(
141142
"Run '" + calculateGradleCommand() + " spotlessApply' to fix all violations.");
142143
}

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.gradle.api.DefaultTask;
2525
import org.gradle.api.tasks.Internal;
2626
import org.gradle.api.tasks.TaskAction;
27+
import org.gradle.api.tasks.TaskProvider;
2728
import org.gradle.api.tasks.UntrackedTask;
2829

2930
import com.diffplug.spotless.Formatter;
@@ -33,10 +34,10 @@
3334

3435
@UntrackedTask(because = "undeclared inputs/outputs")
3536
public class SpotlessDiagnoseTask extends DefaultTask {
36-
SpotlessTask source;
37+
TaskProvider<? extends SpotlessTask> source;
3738

3839
@Internal
39-
public SpotlessTask getSource() {
40+
public TaskProvider<? extends SpotlessTask> getSource() {
4041
return source;
4142
}
4243

@@ -45,10 +46,10 @@ public SpotlessTask getSource() {
4546
public void performAction() throws IOException {
4647
Path srcRoot = getProject().getProjectDir().toPath();
4748
Path diagnoseRoot = getProject().getLayout().getBuildDirectory().getAsFile().get()
48-
.toPath().resolve("spotless-diagnose-" + source.formatName());
49+
.toPath().resolve("spotless-diagnose-" + source.get().formatName());
4950
getProject().delete(diagnoseRoot.toFile());
50-
try (Formatter formatter = source.buildFormatter()) {
51-
for (File file : source.target) {
51+
try (Formatter formatter = source.get().buildFormatter()) {
52+
for (File file : source.get().target) {
5253
getLogger().debug("Running padded cell check on " + file);
5354
PaddedCell padded = PaddedCell.check(formatter, file);
5455
if (!padded.misbehaved()) {

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,19 +78,18 @@ protected void createFormatTasks(String name, FormatExtension formatExtension) {
7878

7979
// create the check and apply control tasks
8080
TaskProvider<SpotlessApply> applyTask = tasks.register(taskName + APPLY, SpotlessApply.class, task -> {
81-
task.init(spotlessTask.get());
81+
task.init(spotlessTask);
8282
task.setGroup(TASK_GROUP);
8383
task.setEnabled(ideHook.path == null);
8484
task.dependsOn(spotlessTask);
8585
});
8686
rootApplyTask.configure(task -> task.dependsOn(ideHook.path == null ? applyTask : spotlessTask));
8787

8888
TaskProvider<SpotlessCheck> checkTask = tasks.register(taskName + CHECK, SpotlessCheck.class, task -> {
89-
SpotlessTaskImpl source = spotlessTask.get();
9089
task.setGroup(TASK_GROUP);
91-
task.init(source);
90+
task.init(spotlessTask);
9291
task.setEnabled(ideHook.path == null);
93-
task.dependsOn(source);
92+
task.dependsOn(spotlessTask);
9493

9594
// if the user runs both, make sure that apply happens first,
9695
task.mustRunAfter(applyTask);
@@ -99,7 +98,7 @@ protected void createFormatTasks(String name, FormatExtension formatExtension) {
9998

10099
// create the diagnose task
101100
TaskProvider<SpotlessDiagnoseTask> diagnoseTask = tasks.register(taskName + DIAGNOSE, SpotlessDiagnoseTask.class, task -> {
102-
task.source = spotlessTask.get();
101+
task.source = spotlessTask;
103102
task.setGroup(TASK_GROUP);
104103
task.mustRunAfter(BasePlugin.CLEAN_TASK_NAME);
105104
});

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.gradle.api.services.BuildService;
3939
import org.gradle.api.services.BuildServiceParameters;
4040
import org.gradle.api.tasks.Internal;
41+
import org.gradle.api.tasks.TaskProvider;
4142
import org.gradle.tooling.events.FinishEvent;
4243
import org.gradle.tooling.events.OperationCompletionListener;
4344

@@ -125,12 +126,12 @@ abstract static class ClientTask extends DefaultTask {
125126
@Inject
126127
protected abstract ObjectFactory getConfigCacheWorkaround();
127128

128-
void init(SpotlessTaskImpl impl) {
129-
usesServiceTolerateTestFailure(this, impl.getTaskServiceProvider());
130-
getSpotlessCleanDirectory().set(impl.getCleanDirectory());
131-
getSpotlessLintsDirectory().set(impl.getLintsDirectory());
132-
getTaskService().set(impl.getTaskService());
133-
getProjectDir().set(impl.getProjectDir());
129+
void init(TaskProvider<SpotlessTaskImpl> impl) {
130+
usesServiceTolerateTestFailure(this, impl.flatMap(SpotlessTaskImpl::getTaskServiceProvider));
131+
getSpotlessCleanDirectory().set(impl.map(SpotlessTask::getCleanDirectory));
132+
getSpotlessLintsDirectory().set(impl.map(SpotlessTask::getLintsDirectory));
133+
getTaskService().set(impl.flatMap(SpotlessTask::getTaskService));
134+
getProjectDir().set(impl.flatMap(SpotlessTask::getProjectDir));
134135
}
135136

136137
String sourceTaskPath() {

plugin-gradle/src/test/java/com/diffplug/gradle/spotless/DiffMessageFormatterTest.java

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.gradle.api.Project;
2727
import org.gradle.api.provider.Provider;
2828
import org.gradle.api.services.BuildServiceParameters;
29+
import org.gradle.api.tasks.TaskProvider;
2930
import org.junit.jupiter.api.Test;
3031

3132
import com.diffplug.common.base.StringPrinter;
@@ -48,34 +49,30 @@ public BuildServiceParameters.None getParameters() {
4849
});
4950

5051
File file;
51-
SpotlessTaskImpl task;
52-
SpotlessCheck check;
52+
TaskProvider<SpotlessTaskImpl> task;
53+
TaskProvider<SpotlessCheck> check;
5354

5455
Bundle(String name) throws IOException {
5556
file = setFile("src/test." + name).toContent("CCC");
56-
task = createFormatTask(name);
57-
check = createCheckTask(name, task);
58-
createApplyTask(name, task);
57+
task = registerFormatTask(name);
58+
check = registerCheckTask(name, task);
59+
registerApplyTask(name, task);
5960
}
6061

61-
private SpotlessTaskImpl createFormatTask(String name) {
62-
SpotlessTaskImpl task = project.getTasks().create("spotless" + SpotlessPlugin.capitalize(name), SpotlessTaskImpl.class);
63-
task.init(taskService);
64-
task.setLineEndingsPolicy(project.provider(LineEnding.UNIX::createPolicy));
65-
task.setTarget(Collections.singletonList(file));
66-
return task;
62+
private TaskProvider<SpotlessTaskImpl> registerFormatTask(String name) {
63+
return project.getTasks().register("spotless" + SpotlessPlugin.capitalize(name), SpotlessTaskImpl.class, task -> {
64+
task.init(taskService);
65+
task.setLineEndingsPolicy(project.provider(LineEnding.UNIX::createPolicy));
66+
task.setTarget(Collections.singletonList(file));
67+
});
6768
}
6869

69-
private SpotlessCheck createCheckTask(String name, SpotlessTaskImpl source) {
70-
SpotlessCheck task = project.getTasks().create("spotless" + SpotlessPlugin.capitalize(name) + "Check", SpotlessCheck.class);
71-
task.init(source);
72-
return task;
70+
private TaskProvider<SpotlessCheck> registerCheckTask(String name, TaskProvider<SpotlessTaskImpl> source) {
71+
return project.getTasks().register("spotless" + SpotlessPlugin.capitalize(name) + "Check", SpotlessCheck.class, task -> task.init(source));
7372
}
7473

75-
private SpotlessApply createApplyTask(String name, SpotlessTaskImpl source) {
76-
SpotlessApply task = project.getTasks().create("spotless" + SpotlessPlugin.capitalize(name) + "Apply", SpotlessApply.class);
77-
task.init(source);
78-
return task;
74+
private TaskProvider<SpotlessApply> registerApplyTask(String name, TaskProvider<SpotlessTaskImpl> source) {
75+
return project.getTasks().register("spotless" + SpotlessPlugin.capitalize(name) + "Apply", SpotlessApply.class, task -> task.init(source));
7976
}
8077

8178
String checkFailureMsg() {
@@ -88,8 +85,8 @@ String checkFailureMsg() {
8885
}
8986

9087
void check() throws Exception {
91-
Tasks.execute(task);
92-
check.performActionTest();
88+
Tasks.execute(task.get());
89+
check.get().performActionTest();
9390
}
9491
}
9592

@@ -99,8 +96,8 @@ private Bundle create(File... files) throws IOException {
9996

10097
private Bundle create(List<File> files) throws IOException {
10198
Bundle bundle = new Bundle("underTest");
102-
bundle.task.setLineEndingsPolicy(bundle.project.provider(LineEnding.UNIX::createPolicy));
103-
bundle.task.setTarget(files);
99+
bundle.task.get().setLineEndingsPolicy(bundle.project.provider(LineEnding.UNIX::createPolicy));
100+
bundle.task.get().setTarget(files);
104101
return bundle;
105102
}
106103

@@ -138,7 +135,7 @@ void lineEndingProblem() throws Exception {
138135
void customRunToFixMessage() throws Exception {
139136
Bundle task = create(setFile("testFile").toContent("A\r\nB\r\nC\r\n"));
140137
String customMessage = "Formatting issues detected, please read automatic-code-formatting.txt and correct.";
141-
task.check.getRunToFixMessage().set(customMessage);
138+
task.check.get().getRunToFixMessage().set(customMessage);
142139

143140
String msg = task.checkFailureMsg();
144141

@@ -150,7 +147,7 @@ void customRunToFixMessage() throws Exception {
150147
@Test
151148
void whitespaceProblem() throws Exception {
152149
Bundle spotless = create(setFile("testFile").toContent("A \nB\t\nC \n"));
153-
spotless.task.setSteps(List.of(TrimTrailingWhitespaceStep.create()));
150+
spotless.task.get().setSteps(List.of(TrimTrailingWhitespaceStep.create()));
154151
assertCheckFailure(spotless,
155152
" testFile",
156153
" @@ -1,3 +1,3 @@",

plugin-gradle/src/test/java/com/diffplug/gradle/spotless/PaddedCellTaskTest.java

Lines changed: 37 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2016-2024 DiffPlug
2+
* Copyright 2016-2025 DiffPlug
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@
2626
import org.gradle.api.Project;
2727
import org.gradle.api.provider.Provider;
2828
import org.gradle.api.services.BuildServiceParameters;
29+
import org.gradle.api.tasks.TaskProvider;
2930
import org.junit.jupiter.api.Assertions;
3031
import org.junit.jupiter.api.Test;
3132

@@ -49,40 +50,36 @@ public BuildServiceParameters.None getParameters() {
4950
}
5051
});
5152
File file;
52-
File outputFile;
53-
SpotlessTaskImpl source;
54-
SpotlessCheck check;
55-
SpotlessApply apply;
53+
Provider<File> outputFile;
54+
TaskProvider<SpotlessTaskImpl> source;
55+
TaskProvider<SpotlessCheck> check;
56+
TaskProvider<SpotlessApply> apply;
5657

5758
Bundle(String name, SerializedFunction<String, String> function) throws IOException {
5859
this.name = name;
5960
file = setFile("src/test." + name).toContent("CCC");
6061
FormatterStep step = NeverUpToDateStep.create(name, function);
61-
source = createFormatTask(name, step);
62-
check = createCheckTask(name, source);
63-
apply = createApplyTask(name, source);
64-
outputFile = new File(source.getCleanDirectory() + "/src", file.getName());
62+
source = registerFormatTask(name, step);
63+
check = registerCheckTask(name, source);
64+
apply = registerApplyTask(name, source);
65+
outputFile = source.map(task -> new File(task.getCleanDirectory() + "/src", file.getName()));
6566
}
6667

67-
private SpotlessTaskImpl createFormatTask(String name, FormatterStep step) {
68-
SpotlessTaskImpl task = project.getTasks().create("spotless" + SpotlessPlugin.capitalize(name), SpotlessTaskImpl.class);
69-
task.init(taskService);
70-
task.setSteps(List.of(step));
71-
task.setLineEndingsPolicy(project.provider(LineEnding.UNIX::createPolicy));
72-
task.setTarget(Collections.singletonList(file));
73-
return task;
68+
private TaskProvider<SpotlessTaskImpl> registerFormatTask(String name, FormatterStep step) {
69+
return project.getTasks().register("spotless" + SpotlessPlugin.capitalize(name), SpotlessTaskImpl.class, task -> {
70+
task.init(taskService);
71+
task.setSteps(List.of(step));
72+
task.setLineEndingsPolicy(project.provider(LineEnding.UNIX::createPolicy));
73+
task.setTarget(Collections.singletonList(file));
74+
});
7475
}
7576

76-
private SpotlessCheck createCheckTask(String name, SpotlessTaskImpl source) {
77-
SpotlessCheck task = project.getTasks().create("spotless" + SpotlessPlugin.capitalize(name) + "Check", SpotlessCheck.class);
78-
task.init(source);
79-
return task;
77+
private TaskProvider<SpotlessCheck> registerCheckTask(String name, TaskProvider<SpotlessTaskImpl> source) {
78+
return project.getTasks().register("spotless" + SpotlessPlugin.capitalize(name) + "Check", SpotlessCheck.class, task -> task.init(source));
8079
}
8180

82-
private SpotlessApply createApplyTask(String name, SpotlessTaskImpl source) {
83-
SpotlessApply task = project.getTasks().create("spotless" + SpotlessPlugin.capitalize(name) + "Apply", SpotlessApply.class);
84-
task.init(source);
85-
return task;
81+
private TaskProvider<SpotlessApply> registerApplyTask(String name, TaskProvider<SpotlessTaskImpl> source) {
82+
return project.getTasks().register("spotless" + SpotlessPlugin.capitalize(name) + "Apply", SpotlessApply.class, task -> task.init(source));
8683
}
8784

8885
String checkFailureMsg() {
@@ -95,23 +92,23 @@ String checkFailureMsg() {
9592
}
9693

9794
void diagnose() throws IOException {
98-
SpotlessDiagnoseTask diagnose = project.getTasks().create("spotless" + SpotlessPlugin.capitalize(name) + "Diagnose", SpotlessDiagnoseTask.class);
99-
diagnose.source = source;
100-
diagnose.performAction();
95+
TaskProvider<SpotlessDiagnoseTask> diagnose = project.getTasks().register("spotless" + SpotlessPlugin.capitalize(name) + "Diagnose", SpotlessDiagnoseTask.class);
96+
diagnose.get().source = source;
97+
diagnose.get().performAction();
10198
}
10299

103100
void format() throws Exception {
104-
Tasks.execute(source);
101+
Tasks.execute(source.get());
105102
}
106103

107104
void apply() throws Exception {
108-
Tasks.execute(source);
109-
apply.performAction();
105+
Tasks.execute(source.get());
106+
apply.get().performAction();
110107
}
111108

112109
void check() throws Exception {
113-
Tasks.execute(source);
114-
check.performActionTest();
110+
Tasks.execute(source.get());
111+
check.get().performActionTest();
115112
}
116113
}
117114

@@ -143,10 +140,10 @@ void paddedCellFormat() throws Exception {
143140
converge.format();
144141
diverge.format();
145142

146-
assertFile(wellbehaved.outputFile).hasContent("42"); // cycle -> first element in cycle
147-
assertFile(cycle.outputFile).hasContent("A"); // cycle -> first element in cycle
148-
assertFile(converge.outputFile).hasContent(""); // converge -> converges
149-
assertThat(diverge.outputFile).doesNotExist(); // diverge -> no change
143+
assertFile(wellbehaved.outputFile.get()).hasContent("42"); // cycle -> first element in cycle
144+
assertFile(cycle.outputFile.get()).hasContent("A"); // cycle -> first element in cycle
145+
assertFile(converge.outputFile.get()).hasContent(""); // converge -> converges
146+
assertThat(diverge.outputFile.get()).doesNotExist(); // diverge -> no change
150147
}
151148

152149
@Test
@@ -161,10 +158,10 @@ void paddedCellApplyCheck() throws Exception {
161158
converge.apply();
162159
diverge.apply();
163160

164-
assertFile(wellbehaved.file).hasContent("42"); // cycle -> first element in cycle
165-
assertFile(cycle.file).hasContent("A"); // cycle -> first element in cycle
166-
assertFile(converge.file).hasContent(""); // converge -> converges
167-
assertFile(diverge.file).hasContent("CCC"); // diverge -> no change
161+
assertFile(wellbehaved.file).hasContent("42"); // cycle -> first element in cycle
162+
assertFile(cycle.file).hasContent("A"); // cycle -> first element in cycle
163+
assertFile(converge.file).hasContent(""); // converge -> converges
164+
assertFile(diverge.file).hasContent("CCC"); // diverge -> no change
168165

169166
// After apply, check should pass
170167
wellbehaved.check();

0 commit comments

Comments
 (0)