Skip to content

Commit e0306b3

Browse files
committed
Rework step mapping of Eclipse JDT formatter
1 parent 7a4dc77 commit e0306b3

File tree

7 files changed

+162
-50
lines changed

7 files changed

+162
-50
lines changed

lib-extra/src/jdt/java/com/diffplug/spotless/extra/glue/jdt/EclipseJdtSortMembers.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,11 @@ static class SortProperties {
236236
}
237237

238238
static SortProperties from(Map<String, String> properties) {
239-
boolean enabled = Boolean.parseBoolean(properties.getOrDefault("members.order.enabled", "false"));
240-
String membersOrder = properties.getOrDefault("members.order", "");
241-
boolean doNotSortFields = Boolean.parseBoolean(properties.getOrDefault("members.doNotSortFields", "true"));
242-
boolean sortByVisibility = Boolean.parseBoolean(properties.getOrDefault("visibility.order.enabled", "false"));
243-
String visibilityOrder = properties.getOrDefault("visibility.order", "");
239+
boolean enabled = Boolean.parseBoolean(properties.getOrDefault("sp_cleanup.sort_members", "false"));
240+
String membersOrder = properties.getOrDefault("outlinesortoption", "");
241+
boolean doNotSortFields = !Boolean.parseBoolean(properties.getOrDefault("sp_cleanup.sort_members_all", "false"));
242+
boolean sortByVisibility = Boolean.parseBoolean(properties.getOrDefault("org.eclipse.jdt.ui.enable.visibility.order", "false"));
243+
String visibilityOrder = properties.getOrDefault("org.eclipse.jdt.ui.visibility.order", "");
244244
return new SortProperties(enabled, membersOrder, doNotSortFields, sortByVisibility, visibilityOrder);
245245
}
246246
}

lib-extra/src/main/java/com/diffplug/spotless/extra/java/EclipseJdtFormatterStep.java

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,6 @@ protected P2Model model(String version) {
7474
return model;
7575
}
7676

77-
public void setMembersOrdering(String order, boolean doNotSortFields) {
78-
stepProperties.put("members.order.enabled", "true");
79-
stepProperties.put("members.order", order);
80-
stepProperties.put("members.doNotSortFields", Boolean.toString(doNotSortFields));
81-
}
82-
83-
public void setVisibilityOrdering(String order) {
84-
stepProperties.put("visibility.order.enabled", "true");
85-
stepProperties.put("visibility.order", order);
86-
}
87-
8877
@Override
8978
public void setVersion(String version) {
9079
if (version.endsWith(".0")) {
@@ -94,5 +83,26 @@ public void setVersion(String version) {
9483
}
9584
super.setVersion(version);
9685
}
86+
87+
public void sortMembersDoNotSortFields(boolean doNotSortFields) {
88+
boolean sortAllMembers = !doNotSortFields;
89+
stepProperties.put("sp_cleanup.sort_members_all", String.valueOf(sortAllMembers));
90+
}
91+
92+
public void sortMembersEnabled(boolean enabled) {
93+
stepProperties.put("sp_cleanup.sort_members", String.valueOf(enabled));
94+
}
95+
96+
public void sortMembersOrder(String order) {
97+
stepProperties.put("outlinesortoption", order);
98+
}
99+
100+
public void sortMembersVisibilityOrder(String order) {
101+
stepProperties.put("org.eclipse.jdt.ui.visibility.order", order);
102+
}
103+
104+
public void sortMembersVisibilityOrderEnabled(boolean enabled) {
105+
stepProperties.put("org.eclipse.jdt.ui.enable.visibility.order", String.valueOf(enabled));
106+
}
97107
}
98108
}

lib-extra/src/test/java/com/diffplug/spotless/extra/java/EclipseJdtFormatterStepSpecialCaseTest.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,49 +39,63 @@ void issue_1638() {
3939
@Test
4040
void sort_members_global_by_visibility() {
4141
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral());
42-
builder.setMembersOrdering("SF,SI,SM,F,I,C,M,T", false);
43-
builder.setVisibilityOrdering("B,R,D,V");
42+
builder.sortMembersEnabled(true);
43+
builder.sortMembersOrder("SF,SI,SM,F,I,C,M,T");
44+
builder.sortMembersDoNotSortFields(false);
45+
builder.sortMembersVisibilityOrderEnabled(true);
46+
builder.sortMembersVisibilityOrder("B,R,D,V");
4447
StepHarness.forStep(builder.build())
4548
.testResource("java/eclipse/SortExample.test", "java/eclipse/SortExample.sortMembersByVisibility.clean");
4649
}
4750

4851
@Test
4952
void sort_members_global_enabled() {
5053
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral());
51-
builder.setMembersOrdering("SF,SI,SM,F,I,C,M,T", false);
54+
builder.sortMembersEnabled(true);
55+
builder.sortMembersOrder("SF,SI,SM,F,I,C,M,T");
56+
builder.sortMembersDoNotSortFields(false);
5257
StepHarness.forStep(builder.build())
5358
.testResource("java/eclipse/SortExample.test", "java/eclipse/SortExample.sortMembers.clean");
5459
}
5560

5661
@Test
5762
void sort_members_global_no_fields() {
5863
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral());
59-
builder.setMembersOrdering("SF,SI,SM,F,I,C,M,T", true);
64+
builder.sortMembersEnabled(true);
65+
builder.sortMembersOrder("SF,SI,SM,F,I,C,M,T");
66+
builder.sortMembersDoNotSortFields(true);
6067
StepHarness.forStep(builder.build())
6168
.testResource("java/eclipse/SortExample.test", "java/eclipse/SortExample.sortMembersNoFields.clean");
6269
}
6370

6471
@Test
6572
void sort_members_local_by_visibility() {
6673
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral());
67-
builder.setMembersOrdering("SF,SI,SM,F,I,C,M,T", false);
68-
builder.setVisibilityOrdering("B,R,D,V");
74+
builder.sortMembersEnabled(true);
75+
builder.sortMembersOrder("SF,SI,SM,F,I,C,M,T");
76+
builder.sortMembersDoNotSortFields(false);
77+
builder.sortMembersVisibilityOrderEnabled(true);
78+
builder.sortMembersVisibilityOrder("B,R,D,V");
6979
StepHarness.forStep(builder.build())
7080
.testResource("java/eclipse/SortExample.localSortByVisibility.test", "java/eclipse/SortExample.localSortByVisibility.clean");
7181
}
7282

7383
@Test
7484
void sort_members_local_enabled_false() {
7585
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral());
76-
builder.setMembersOrdering("SF,SI,SM,F,I,C,M,T", false);
86+
builder.sortMembersEnabled(true);
87+
builder.sortMembersOrder("SF,SI,SM,F,I,C,M,T");
88+
builder.sortMembersDoNotSortFields(false);
7789
StepHarness.forStep(builder.build())
7890
.testResource("java/eclipse/SortExample.localEnabledFalse.test", "java/eclipse/SortExample.localEnabledFalse.clean");
7991
}
8092

8193
@Test
8294
void sort_members_local_no_fields() {
8395
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral());
84-
builder.setMembersOrdering("SF,SI,SM,F,I,C,M,T", false);
96+
builder.sortMembersEnabled(true);
97+
builder.sortMembersOrder("SF,SI,SM,F,I,C,M,T");
98+
builder.sortMembersDoNotSortFields(false);
8599
StepHarness.forStep(builder.build())
86100
.testResource("java/eclipse/SortExample.localDoNotSortFields.test", "java/eclipse/SortExample.localDoNotSortFields.clean");
87101
}

plugin-gradle/README.md

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -275,28 +275,32 @@ control system). It is turned off by default, but you might want to consider ena
275275
for a project.
276276

277277
The format to specify the sort order follows the `outlinesortoption` and `org.eclipse.jdt.ui.visibility.order`
278-
properties that can be found in the workspace folder of your Eclipse IDE. Look up the
278+
properties that can be found in the workspace folder of your Eclipse IDE. You can look at the
279279
file `.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs` in your workspace directory.
280280

281281
###### Define Sort Members settings on project level
282282

283283
```gradle
284284
spotless {
285285
java {
286-
// specify the sort order of the member categories
287-
// SF,SI,SM,F,I,C,M,T = Static Fields, Static Initializers, Static Methods, Fields, Initializers, Constructors, Methods, (Nested) Types
288-
val memberCategoryOrder = "SF,SI,SM,F,I,C,M,T"
289-
val doNotSortFields = true
290-
eclipse().sortMembers(memberCategoryOrder, doNotSortFields)
291-
// optional: specify ordering of members of the same category by the visibility within the category
292-
// B,R,D,V = Public, Protected, Package, Private
293-
val visibilityOrder = "B,R,D,V"
294-
eclipse().sortMembers(memberCategoryOrder, doNotSortFields, visibilityOrder)
286+
eclipse()
287+
// Optional: Enable the Sort Members feature globally. (default: false)
288+
.sortMembersEnabled(true)
289+
// Optional: Specify the sort order of the member categories. (default: T,SF,SI,SM,F,I,C,M)
290+
// SF,SI,SM,F,I,C,M,T = Static Fields, Static Initializers, Static Methods, Fields, Initializers, Constructors, Methods, (Nested) Types
291+
.sortMembersOrder("SF,SI,SM,F,I,C,M,T")
292+
// Optional: Enable the reordering of fields, enum constants, and initializers. (default: true)
293+
.sortMembersDoNotSortFields(false)
294+
// Optional: Enable reordering of members of the same category by the visibility within the category. (default: false)
295+
.sortMembersVisibilityOrderEnabled(true)
296+
// Optional: Specify the ordering of members of the same category by the visibility within the category. (default: B,V,R,D)
297+
// B,R,D,V = Public, Protected, Package, Private
298+
.sortMembersVisibilityOrder("B,R,D,V")
295299
```
296300

297301
###### Overwrite Sort Members settings on file level
298302

299-
You can enable/disable the sort properties on file level by adding the following comments:
303+
You can enable/disable the globally defined sort properties on file level by adding the following comments:
300304
- `// @SortMembers:enabled=false` - disable the Sort Members feature for this file
301305
- `// @SortMembers:doNotSortFields=true` - disable the sorting of static and instance fields
302306
- `// @SortMembers:sortByVisibility=false` - don't sort members by its visibility modifier

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

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -305,21 +305,34 @@ public EclipseConfig configFile(Object... configFiles) {
305305
return this;
306306
}
307307

308-
public EclipseConfig sortMembers(String memberCategoryOrder, boolean doNotSortFields) {
309-
requireElementsNonNull(memberCategoryOrder);
310-
builder.setMembersOrdering(memberCategoryOrder, doNotSortFields);
308+
public EclipseConfig sortMembersDoNotSortFields(boolean doNotSortFields) {
309+
builder.sortMembersDoNotSortFields(doNotSortFields);
311310
replaceStep(builder.build());
312311
return this;
313312
}
314313

315-
public EclipseConfig sortMembers(
316-
String memberCategoryOrder,
317-
boolean doNotSortFields,
318-
String visibilityOrder) {
319-
requireElementsNonNull(memberCategoryOrder);
320-
requireElementsNonNull(visibilityOrder);
321-
builder.setMembersOrdering(memberCategoryOrder, doNotSortFields);
322-
builder.setVisibilityOrdering(visibilityOrder);
314+
public EclipseConfig sortMembersEnabled(boolean enabled) {
315+
builder.sortMembersEnabled(enabled);
316+
replaceStep(builder.build());
317+
return this;
318+
}
319+
320+
public EclipseConfig sortMembersOrder(String order) {
321+
requireElementsNonNull(order);
322+
builder.sortMembersOrder(order);
323+
replaceStep(builder.build());
324+
return this;
325+
}
326+
327+
public EclipseConfig sortMembersVisibilityOrder(String order) {
328+
requireElementsNonNull(order);
329+
builder.sortMembersVisibilityOrder(order);
330+
replaceStep(builder.build());
331+
return this;
332+
}
333+
334+
public EclipseConfig sortMembersVisibilityOrderEnabled(boolean enabled) {
335+
builder.sortMembersVisibilityOrderEnabled(enabled);
323336
replaceStep(builder.build());
324337
return this;
325338
}

plugin-maven/README.md

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,11 +261,50 @@ any other maven phase (i.e. compile) then it can be configured as below;
261261

262262
```xml
263263
<eclipse>
264-
<version>4.26</version> <!-- optional version of Eclipse Formatter -->
265-
<file>${project.basedir}/eclipse-formatter.xml</file> <!-- optional -->
264+
<!-- Optional: Specify the Eclipse JDT version to use. -->
265+
<version>4.26</version>
266+
<!-- Optional: Specify a file which contains all formatting options. -->
267+
<file>${project.basedir}/eclipse-formatter.xml</file>
266268
</eclipse>
267269
```
268270

271+
#### Sort Members
272+
273+
Not only can you format your code with Eclipse JDT, but you can also sort the members as you know it from Eclipse IDE.
274+
This ensures that the methods are always in sorted order (and thus reduces the likelihood of collisions in a version
275+
control system). It is turned off by default, but you might want to consider enabling it when setting coding standards
276+
for a project.
277+
278+
The format to specify the sort order follows the `outlinesortoption` and `org.eclipse.jdt.ui.visibility.order`
279+
properties that can be found in the workspace folder of your Eclipse IDE. You can look at the
280+
file `.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs` in your workspace directory.
281+
282+
###### Define Sort Members settings on project level
283+
284+
```xml
285+
<eclipse>
286+
<!-- Optional: Enable the Sort Members feature globally. (default: false) -->
287+
<sortMembersEnabled>true</sortMembersEnabled>
288+
<!-- Optional: Specify the sort order of the member categories. (default: T,SF,SI,SM,F,I,C,M)
289+
SF,SI,SM,F,I,C,M,T = Static Fields, Static Initializers, Static Methods, Fields, Initializers, Constructors, Methods, (Nested) Types -->
290+
<sortMembersOrder>SF,SI,SM,F,I,C,M,T</sortMembersOrder>
291+
<!-- Optional: Enable the reordering of fields, enum constants, and initializers. (default: true) -->
292+
<sortMembersDoNotSortFields>false</sortMembersDoNotSortFields>
293+
<!-- Optional: Enable reordering of members of the same category by the visibility within the category. (default: false) -->
294+
<sortMembersVisibilityOrderEnabled>true</sortMembersVisibilityOrderEnabled>
295+
<!-- Optional: Specify the ordering of members of the same category by the visibility within the category. (default: B,V,R,D)
296+
B,R,D,V = Public, Protected, Package, Private -->
297+
<sortMembersVisibilityOrder>B,R,D,V</sortMembersVisibilityOrder>
298+
</eclipse>
299+
```
300+
301+
###### Overwrite Sort Members settings on file level
302+
303+
You can enable/disable the globally defined sort properties on file level by adding the following comments:
304+
- `// @SortMembers:enabled=false` - disable the Sort Members feature for this file
305+
- `// @SortMembers:doNotSortFields=true` - disable the sorting of static and instance fields
306+
- `// @SortMembers:sortByVisibility=false` - don't sort members by its visibility modifier
307+
269308
### formatAnnotations
270309

271310
Type annotations should be on the same line as the type that they qualify.

plugin-maven/src/main/java/com/diffplug/spotless/maven/java/Eclipse.java

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.eclipse.aether.RepositorySystemSession;
2525

2626
import com.diffplug.spotless.FormatterStep;
27-
import com.diffplug.spotless.extra.EquoBasedStepBuilder;
2827
import com.diffplug.spotless.extra.P2Mirror;
2928
import com.diffplug.spotless.extra.java.EclipseJdtFormatterStep;
3029
import com.diffplug.spotless.maven.FormatterStepConfig;
@@ -41,11 +40,26 @@ public class Eclipse implements FormatterStepFactory {
4140
@Parameter
4241
private List<P2Mirror> p2Mirrors = new ArrayList<>();
4342

43+
@Parameter
44+
private Boolean sortMembersDoNotSortFields = true;
45+
46+
@Parameter
47+
private Boolean sortMembersEnabled = false;
48+
49+
@Parameter
50+
private String sortMembersOrder;
51+
52+
@Parameter
53+
private String sortMembersVisibilityOrder;
54+
55+
@Parameter
56+
private Boolean sortMembersVisibilityOrderEnabled = false;
57+
4458
private File cacheDirectory;
4559

4660
@Override
4761
public FormatterStep newFormatterStep(FormatterStepConfig stepConfig) {
48-
EquoBasedStepBuilder eclipseConfig = EclipseJdtFormatterStep.createBuilder(stepConfig.getProvisioner());
62+
EclipseJdtFormatterStep.Builder eclipseConfig = EclipseJdtFormatterStep.createBuilder(stepConfig.getProvisioner());
4963
eclipseConfig.setVersion(version == null ? EclipseJdtFormatterStep.defaultVersion() : version);
5064
if (null != file) {
5165
File settingsFile = stepConfig.getFileLocator().locateFile(file);
@@ -55,6 +69,24 @@ public FormatterStep newFormatterStep(FormatterStepConfig stepConfig) {
5569
if (null != cacheDirectory) {
5670
eclipseConfig.setCacheDirectory(cacheDirectory);
5771
}
72+
if (null != sortMembersEnabled) {
73+
eclipseConfig.sortMembersEnabled(sortMembersEnabled);
74+
}
75+
if (null != sortMembersOrder) {
76+
eclipseConfig.sortMembersOrder(sortMembersOrder);
77+
}
78+
if (null != sortMembersDoNotSortFields) {
79+
eclipseConfig.sortMembersDoNotSortFields(sortMembersDoNotSortFields);
80+
}
81+
if (null != sortMembersVisibilityOrder) {
82+
eclipseConfig.sortMembersVisibilityOrder(sortMembersVisibilityOrder);
83+
}
84+
if (null != sortMembersVisibilityOrderEnabled) {
85+
eclipseConfig.sortMembersVisibilityOrderEnabled(sortMembersVisibilityOrderEnabled);
86+
}
87+
if (null != cacheDirectory) {
88+
eclipseConfig.setCacheDirectory(cacheDirectory);
89+
}
5890
return eclipseConfig.build();
5991
}
6092

0 commit comments

Comments
 (0)