Skip to content

Commit d12de4f

Browse files
committed
Make FenceStep compatible with roundtrip serialization.
1 parent 1cbc391 commit d12de4f

File tree

3 files changed

+55
-10
lines changed

3 files changed

+55
-10
lines changed

lib/src/main/java/com/diffplug/spotless/generic/FenceStep.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.diffplug.spotless.FormatterFunc;
3030
import com.diffplug.spotless.FormatterStep;
3131
import com.diffplug.spotless.LineEnding;
32+
import com.diffplug.spotless.SerializedFunction;
3233

3334
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
3435

@@ -82,6 +83,7 @@ public FormatterStep preserveWithin(List<FormatterStep> steps) {
8283
assertRegexSet();
8384
return FormatterStep.createLazy(name,
8485
() -> new PreserveWithin(regex, steps),
86+
SerializedFunction.identity(),
8587
state -> FormatterFunc.Closeable.of(state.buildFormatter(), state));
8688
}
8789

@@ -93,6 +95,7 @@ public FormatterStep applyWithin(List<FormatterStep> steps) {
9395
assertRegexSet();
9496
return FormatterStep.createLazy(name,
9597
() -> new ApplyWithin(regex, steps),
98+
SerializedFunction.identity(),
9699
state -> FormatterFunc.Closeable.of(state.buildFormatter(), state));
97100
}
98101

testlib/src/main/java/com/diffplug/spotless/StepHarnessBase.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ protected StepHarnessBase(Formatter formatter) {
4646
supportsRoundTrip = true;
4747
} else if (onlyStepName.toLowerCase(Locale.ROOT).contains("eclipse")) {
4848
supportsRoundTrip = true;
49+
} else if (onlyStepName.equals("fence")) {
50+
supportsRoundTrip = true;
4951
}
5052
}
5153
}

testlib/src/test/java/com/diffplug/spotless/generic/FenceStepTest.java

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,17 @@
1515
*/
1616
package com.diffplug.spotless.generic;
1717

18+
import java.io.File;
19+
import java.io.Serializable;
1820
import java.util.Arrays;
19-
import java.util.Locale;
21+
import java.util.Objects;
22+
23+
import javax.annotation.Nullable;
2024

2125
import org.junit.jupiter.api.Test;
2226

2327
import com.diffplug.common.base.StringPrinter;
28+
import com.diffplug.spotless.FormatterFunc;
2429
import com.diffplug.spotless.FormatterStep;
2530
import com.diffplug.spotless.ResourceHarness;
2631
import com.diffplug.spotless.StepHarness;
@@ -29,8 +34,8 @@
2934
class FenceStepTest extends ResourceHarness {
3035
@Test
3136
void single() {
32-
FormatterStep fence = FenceStep.named("underTest").openClose("spotless:off", "spotless:on")
33-
.preserveWithin(Arrays.asList(FormatterStep.createNeverUpToDate("lowercase", str -> str.toLowerCase(Locale.ROOT))));
37+
FormatterStep fence = FenceStep.named("fence").openClose("spotless:off", "spotless:on")
38+
.preserveWithin(Arrays.asList(createNeverUpToDateSerializable("lowercase", String::toLowerCase)));
3439
StepHarness harness = StepHarness.forSteps(fence);
3540
harness.test(
3641
StringPrinter.buildStringFromLines(
@@ -49,8 +54,8 @@ void single() {
4954

5055
@Test
5156
void multiple() {
52-
FormatterStep fence = FenceStep.named("underTest").openClose("spotless:off", "spotless:on")
53-
.preserveWithin(Arrays.asList(FormatterStep.createNeverUpToDate("lowercase", str -> str.toLowerCase(Locale.ROOT))));
57+
FormatterStep fence = FenceStep.named("fence").openClose("spotless:off", "spotless:on")
58+
.preserveWithin(Arrays.asList(createNeverUpToDateSerializable("lowercase", String::toLowerCase)));
5459
StepHarness harness = StepHarness.forSteps(fence);
5560
harness.test(
5661
StringPrinter.buildStringFromLines(
@@ -83,8 +88,8 @@ void multiple() {
8388

8489
@Test
8590
void broken() {
86-
FormatterStep fence = FenceStep.named("underTest").openClose("spotless:off", "spotless:on")
87-
.preserveWithin(Arrays.asList(FormatterStep.createNeverUpToDate("uppercase", str -> str.toUpperCase(Locale.ROOT))));
91+
FormatterStep fence = FenceStep.named("fence").openClose("spotless:off", "spotless:on")
92+
.preserveWithin(Arrays.asList(createNeverUpToDateSerializable("uppercase", String::toUpperCase)));
8893
StepHarnessWithFile harness = StepHarnessWithFile.forStep(this, fence);
8994
// this fails because uppercase turns spotless:off into SPOTLESS:OFF, etc
9095
harness.testExceptionMsg(newFile("test"), StringPrinter.buildStringFromLines("A B C",
@@ -96,9 +101,8 @@ void broken() {
96101

97102
@Test
98103
void andApply() {
99-
FormatterStep fence = FenceStep.named("lowercaseSometimes").openClose("<lower>", "</lower>")
100-
.applyWithin(Arrays.asList(
101-
FormatterStep.createNeverUpToDate("lowercase", str -> str.toLowerCase(Locale.ROOT))));
104+
FormatterStep fence = FenceStep.named("fence").openClose("<lower>", "</lower>")
105+
.applyWithin(Arrays.asList(createNeverUpToDateSerializable("lowercase", String::toLowerCase)));
102106
StepHarness.forSteps(fence).test(
103107
StringPrinter.buildStringFromLines(
104108
"A B C",
@@ -113,4 +117,40 @@ void andApply() {
113117
"</lower>",
114118
"G H I"));
115119
}
120+
121+
/**
122+
* @param name
123+
* The name of the formatter step
124+
* @param function
125+
* The function used by the formatter step
126+
* @return A FormatterStep which will never report that it is up-to-date, because
127+
* it is not equal to the serialized representation of itself.
128+
*/
129+
static <T extends FormatterFunc & Serializable> FormatterStep createNeverUpToDateSerializable(
130+
String name,
131+
T function) {
132+
Objects.requireNonNull(function, "function");
133+
return new NeverUpToDateSerializable(name, function);
134+
}
135+
136+
static class NeverUpToDateSerializable<T extends FormatterFunc & Serializable> implements FormatterStep, Serializable {
137+
private final String name;
138+
private final T formatterFunc;
139+
140+
private NeverUpToDateSerializable(String name, T formatterFunc) {
141+
this.name = name;
142+
this.formatterFunc = formatterFunc;
143+
}
144+
145+
@Override
146+
public String getName() {
147+
return name;
148+
}
149+
150+
@Nullable
151+
@Override
152+
public String format(String rawUnix, File file) throws Exception {
153+
return formatterFunc.apply(rawUnix, file);
154+
}
155+
}
116156
}

0 commit comments

Comments
 (0)