Skip to content

Commit 2e7ef03

Browse files
committed
Make GoogleJavaFormatStep round-trippable
1 parent f86c268 commit 2e7ef03

File tree

1 file changed

+51
-37
lines changed

1 file changed

+51
-37
lines changed

lib/src/main/java/com/diffplug/spotless/java/GoogleJavaFormatStep.java

Lines changed: 51 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,39 @@
2424
import com.diffplug.spotless.JarState;
2525
import com.diffplug.spotless.Jvm;
2626
import com.diffplug.spotless.Provisioner;
27+
import com.diffplug.spotless.RoundedStep;
2728

2829
/** Wraps up <a href="https://github.com/google/google-java-format">google-java-format</a> as a FormatterStep. */
29-
public class GoogleJavaFormatStep {
30-
// prevent direct instantiation
31-
private GoogleJavaFormatStep() {}
32-
30+
public class GoogleJavaFormatStep implements RoundedStep {
31+
private static final long serialVersionUID = 1L;
3332
private static final String DEFAULT_STYLE = "GOOGLE";
3433
private static final boolean DEFAULT_REFLOW_LONG_STRINGS = false;
3534
private static final boolean DEFAULT_REORDER_IMPORTS = false;
3635
private static final boolean DEFAULT_FORMAT_JAVADOC = true;
37-
static final String NAME = "google-java-format";
38-
public static final String MAVEN_COORDINATE = "com.google.googlejavaformat:google-java-format";
36+
private static final String NAME = "google-java-format";
37+
private static final String MAVEN_COORDINATE = "com.google.googlejavaformat:google-java-format";
38+
39+
/** The jar that contains the formatter. */
40+
private final JarState.Promised jarState;
41+
private final String version;
42+
private final String style;
43+
private final boolean reflowLongStrings;
44+
private final boolean reorderImports;
45+
private final boolean formatJavadoc;
46+
47+
private GoogleJavaFormatStep(JarState.Promised jarState,
48+
String version,
49+
String style,
50+
boolean reflowLongStrings,
51+
boolean reorderImports,
52+
boolean formatJavadoc) {
53+
this.jarState = jarState;
54+
this.version = version;
55+
this.style = style;
56+
this.reflowLongStrings = reflowLongStrings;
57+
this.reorderImports = reorderImports;
58+
this.formatJavadoc = formatJavadoc;
59+
}
3960

4061
/** Creates a step which formats everything - code, import order, and unused imports. */
4162
public static FormatterStep create(Provisioner provisioner) {
@@ -74,12 +95,13 @@ public static FormatterStep create(String groupArtifact, String version, String
7495
Objects.requireNonNull(version, "version");
7596
Objects.requireNonNull(style, "style");
7697
Objects.requireNonNull(provisioner, "provisioner");
77-
return FormatterStep.createLazy(NAME,
78-
() -> new State(NAME, groupArtifact, version, style, provisioner, reflowLongStrings, reorderImports, formatJavadoc),
98+
return FormatterStep.create(NAME,
99+
new GoogleJavaFormatStep(JarState.promise(() -> JarState.from(groupArtifact + ":" + version, provisioner)), version, style, reflowLongStrings, reorderImports, formatJavadoc),
100+
GoogleJavaFormatStep::equalityState,
79101
State::createFormat);
80102
}
81103

82-
static final Jvm.Support<String> JVM_SUPPORT = Jvm.<String> support(NAME)
104+
private static final Jvm.Support<String> JVM_SUPPORT = Jvm.<String> support(NAME)
83105
.addMin(11, "1.8") // we only support google-java-format >= 1.8 due to api changes
84106
.addMin(16, "1.10.0") // java 16 requires at least 1.10.0 due to jdk api changes in JavaTokenizer
85107
.addMin(21, "1.17.0") // java 21 requires at least 1.17.0 due to https://github.com/google/google-java-format/issues/898
@@ -91,7 +113,7 @@ public static String defaultGroupArtifact() {
91113

92114
/** Get default formatter version */
93115
public static String defaultVersion() {
94-
return JVM_SUPPORT.getRecommendedFormatterVersion();
116+
return Objects.requireNonNull(JVM_SUPPORT.getRecommendedFormatterVersion());
95117
}
96118

97119
public static String defaultStyle() {
@@ -110,39 +132,33 @@ public static boolean defaultFormatJavadoc() {
110132
return DEFAULT_FORMAT_JAVADOC;
111133
}
112134

135+
private State equalityState() {
136+
return new State(version, style, jarState.get(), reflowLongStrings, reorderImports, formatJavadoc);
137+
}
138+
113139
static final class State implements Serializable {
114140
private static final long serialVersionUID = 1L;
115141

116-
/** The jar that contains the formatter. */
117-
final JarState jarState;
118-
final String stepName;
119-
final String version;
120-
final String style;
121-
final boolean reflowLongStrings;
122-
final boolean reorderImports;
123-
final boolean formatJavadoc;
124-
125-
State(String stepName, String version, Provisioner provisioner) throws Exception {
126-
this(stepName, version, DEFAULT_STYLE, provisioner);
127-
}
142+
private final JarState jarState;
143+
private final String version;
144+
private final String style;
145+
private final boolean reflowLongStrings;
146+
private final boolean reorderImports;
147+
private final boolean formatJavadoc;
128148

129-
State(String stepName, String version, String style, Provisioner provisioner) throws Exception {
130-
this(stepName, version, style, provisioner, DEFAULT_REFLOW_LONG_STRINGS);
149+
State(String version, JarState jarState) {
150+
this(version, DEFAULT_STYLE, jarState, DEFAULT_REFLOW_LONG_STRINGS, DEFAULT_REORDER_IMPORTS, DEFAULT_FORMAT_JAVADOC);
131151
}
132152

133-
State(String stepName, String version, String style, Provisioner provisioner, boolean reflowLongStrings) throws Exception {
134-
this(stepName, version, style, provisioner, reflowLongStrings, DEFAULT_REORDER_IMPORTS);
135-
}
136-
137-
State(String stepName, String version, String style, Provisioner provisioner, boolean reflowLongStrings, boolean reorderImports) throws Exception {
138-
this(stepName, MAVEN_COORDINATE, version, style, provisioner, reflowLongStrings, reorderImports, DEFAULT_FORMAT_JAVADOC);
139-
}
140-
141-
State(String stepName, String groupArtifact, String version, String style, Provisioner provisioner, boolean reflowLongStrings, boolean reorderImports, boolean formatJavadoc) throws Exception {
153+
State(String version,
154+
String style,
155+
JarState jarState,
156+
boolean reflowLongStrings,
157+
boolean reorderImports,
158+
boolean formatJavadoc) {
142159
JVM_SUPPORT.assertFormatterSupported(version);
143160
ModuleHelper.doOpenInternalPackagesIfRequired();
144-
this.jarState = JarState.from(groupArtifact + ":" + version, provisioner);
145-
this.stepName = stepName;
161+
this.jarState = jarState;
146162
this.version = version;
147163
this.style = style;
148164
this.reflowLongStrings = reflowLongStrings;
@@ -167,7 +183,5 @@ FormatterFunc createRemoveUnusedImportsOnly() throws Exception {
167183

168184
return JVM_SUPPORT.suggestLaterVersionOnError(version, googleJavaFormatRemoveUnusedImporterFormatterFunc);
169185
}
170-
171186
}
172-
173187
}

0 commit comments

Comments
 (0)