Skip to content

Commit ef87827

Browse files
committed
fix(FormatExtension/Gradle): Fix step setup with toggleFence and targetExcludeContentPattern
With a non-null `toggleFence`, `com.diffplug.gradle.spotless.FormatExtension#setupTask` creates a new `List` via `List.of()`. Also having a non-null `targetExcludeContentPattern` leads to an `UnsupportedOperationException` thrown by `List.replaceAll`, because `List.of` yields an immutable list. Change includes (integeration) tests.
1 parent b0eec1f commit ef87827

File tree

5 files changed

+66
-1
lines changed

5 files changed

+66
-1
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1061,7 +1061,9 @@ protected void setupTask(SpotlessTask task) {
10611061
task.setTarget(totalTarget);
10621062
List<FormatterStep> steps;
10631063
if (toggleFence != null) {
1064-
steps = List.of(toggleFence.preserveWithin(this.steps));
1064+
// need a mutable List, 'steps' is mutated by 'steps.replaceAll()' below
1065+
steps = new ArrayList<>();
1066+
steps.add(toggleFence.preserveWithin(this.steps));
10651067
} else {
10661068
steps = this.steps;
10671069
}

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

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,56 @@ void removeUnusedImportsWithCleanthat() throws IOException {
8080
gradleRunner().withArguments("spotlessApply").build();
8181
assertFile("src/main/java/test.java").sameAsResource("java/removeunusedimports/Jdk17TextBlockFormatted.test");
8282
}
83+
84+
/**
85+
* Triggers the special case in {@link FormatExtension#setupTask(SpotlessTask)} with {@code toggleFence} and
86+
* {@code targetExcludeContentPattern} both being not {@code null}.
87+
*/
88+
@Test
89+
void fenceWithTargetExcludeNoMatch() throws Exception {
90+
setFile("build.gradle").toLines(
91+
"plugins {",
92+
" id 'com.diffplug.spotless'",
93+
" id 'java'",
94+
"}",
95+
"repositories { mavenCentral() }",
96+
"",
97+
"spotless {",
98+
" java {" +
99+
" licenseHeader('// my-copyright')",
100+
" toggleOffOn()",
101+
" targetExcludeIfContentContains('excludeMe')",
102+
" }",
103+
"}");
104+
105+
setFile("src/main/java/test.java").toResource("java/targetExclude/TargetExcludeNoMatchUnformatted.test");
106+
gradleRunner().withArguments("spotlessApply").build();
107+
assertFile("src/main/java/test.java").sameAsResource("java/targetExclude/TargetExcludeNoMatchFormatted.test");
108+
}
109+
110+
/**
111+
* Triggers the special case in {@link FormatExtension#setupTask(SpotlessTask)} with {@code toggleFence} and
112+
* {@code targetExcludeContentPattern} both being not {@code null}.
113+
*/
114+
@Test
115+
void fenceWithTargetExcludeMatch() throws Exception {
116+
setFile("build.gradle").toLines(
117+
"plugins {",
118+
" id 'com.diffplug.spotless'",
119+
" id 'java'",
120+
"}",
121+
"repositories { mavenCentral() }",
122+
"",
123+
"spotless {",
124+
" java {" +
125+
" licenseHeader('// my-copyright')",
126+
" toggleOffOn()",
127+
" targetExcludeIfContentContains('excludeMe')",
128+
" }",
129+
"}");
130+
131+
setFile("src/main/java/test.java").toResource("java/targetExclude/TargetExcludeMatch.test");
132+
gradleRunner().withArguments("spotlessApply").build();
133+
assertFile("src/main/java/test.java").sameAsResource("java/targetExclude/TargetExcludeMatch.test");
134+
}
83135
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// excludeMe
2+
import foo.Bar;
3+
4+
class Bar {}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// my-copyright
2+
import foo.Bar;
3+
4+
class Bar {}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import foo.Bar;
2+
3+
class Bar {}

0 commit comments

Comments
 (0)