From 1ed19a755ee4b485e5bdd746bb507d3e76b1d90c Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Tue, 5 Dec 2023 11:21:31 -0800 Subject: [PATCH 1/4] Refactor EquoResourceHarness to go through `StepHarnessWithFile`. --- .../cpp/EclipseCdtFormatterStepTest.java | 9 ++-- .../extra/eclipse/EquoResourceHarness.java | 48 ++----------------- .../groovy/GrEclipseFormatterStepTest.java | 5 +- .../java/EclipseJdtFormatterStepTest.java | 16 +++---- 4 files changed, 18 insertions(+), 60 deletions(-) diff --git a/lib-extra/src/test/java/com/diffplug/spotless/extra/cpp/EclipseCdtFormatterStepTest.java b/lib-extra/src/test/java/com/diffplug/spotless/extra/cpp/EclipseCdtFormatterStepTest.java index 9ed9f2f227..a548d3077b 100644 --- a/lib-extra/src/test/java/com/diffplug/spotless/extra/cpp/EclipseCdtFormatterStepTest.java +++ b/lib-extra/src/test/java/com/diffplug/spotless/extra/cpp/EclipseCdtFormatterStepTest.java @@ -24,17 +24,16 @@ import com.diffplug.spotless.extra.eclipse.EquoResourceHarness; class EclipseCdtFormatterStepTest extends EquoResourceHarness { - private final static String INPUT = "#include ;\nint main(int argc, \nchar *argv[]) {}"; - private final static String EXPECTED = "#include ;\nint main(int argc, char *argv[]) {\n}\n"; - public EclipseCdtFormatterStepTest() { - super(EclipseCdtFormatterStep.createBuilder(TestProvisioner.mavenCentral()), INPUT, EXPECTED); + super(EclipseCdtFormatterStep.createBuilder(TestProvisioner.mavenCentral())); } @ParameterizedTest @MethodSource void formatWithVersion(String version) throws Exception { - assertFormatted(version); + harnessFor(version).test("main.c", + "#include ;\nint main(int argc, \nchar *argv[]) {}", + "#include ;\nint main(int argc, char *argv[]) {\n}\n"); } private static Stream formatWithVersion() { diff --git a/lib-extra/src/test/java/com/diffplug/spotless/extra/eclipse/EquoResourceHarness.java b/lib-extra/src/test/java/com/diffplug/spotless/extra/eclipse/EquoResourceHarness.java index 8d5d955c02..0cb2e4c700 100644 --- a/lib-extra/src/test/java/com/diffplug/spotless/extra/eclipse/EquoResourceHarness.java +++ b/lib-extra/src/test/java/com/diffplug/spotless/extra/eclipse/EquoResourceHarness.java @@ -15,14 +15,12 @@ */ package com.diffplug.spotless.extra.eclipse; -import static org.assertj.core.api.Assertions.assertThat; - import java.io.File; import java.util.Arrays; import com.diffplug.spotless.FormatterStep; -import com.diffplug.spotless.LineEnding; import com.diffplug.spotless.ResourceHarness; +import com.diffplug.spotless.StepHarnessWithFile; import com.diffplug.spotless.extra.EquoBasedStepBuilder; /** @@ -43,57 +41,19 @@ */ public class EquoResourceHarness extends ResourceHarness { private final EquoBasedStepBuilder stepBuilder; - private final String fileName; - private final String input; - private final String expected; - - /** - * Create harness to be used for several versions of the formatter step - * @param builder Eclipse Formatter step builder - * @param unformatted Simple unformatted input - * @param formatted Expected formatted output - */ - public EquoResourceHarness(EquoBasedStepBuilder builder, String unformatted, String formatted) { - this(builder, "someSourceFile", unformatted, formatted); - } /** * Create harness to be used for several versions of the formatter step * @param builder Eclipse Formatter step builder - * @param sourceFileName File name of the source file - * @param unformatted Simple unformatted input - * @param formatted Expected formatted output */ - public EquoResourceHarness(EquoBasedStepBuilder builder, String sourceFileName, String unformatted, String formatted) { + public EquoResourceHarness(EquoBasedStepBuilder builder) { stepBuilder = builder; - fileName = sourceFileName; - input = unformatted; - expected = formatted; } - /** - * Assert that formatting input results in expected output - * @param formatterVersion Formatter version - * @param settingsFiles Formatter settings - * @return Formatted string - */ - protected String assertFormatted(String formatterVersion, File... settingsFiles) throws Exception { - String output = format(formatterVersion, settingsFiles); - assertThat(output).isEqualTo(expected); - return output; - } - - /** - * Formatting input results and returns output - * @param formatterVersion Formatter version - * @param settingsFiles Formatter settings - * @return Formatted string - */ - protected String format(String formatterVersion, File... settingsFiles) throws Exception { - File inputFile = setFile(fileName).toContent(input); + protected StepHarnessWithFile harnessFor(String formatterVersion, File... settingsFiles) throws Exception { stepBuilder.setVersion(formatterVersion); stepBuilder.setPreferences(Arrays.asList(settingsFiles)); FormatterStep step = stepBuilder.build(); - return LineEnding.toUnix(step.format(input, inputFile)); + return StepHarnessWithFile.forStep(this, step); } } diff --git a/lib-extra/src/test/java/com/diffplug/spotless/extra/groovy/GrEclipseFormatterStepTest.java b/lib-extra/src/test/java/com/diffplug/spotless/extra/groovy/GrEclipseFormatterStepTest.java index 2bd68d0281..b5d294e71c 100644 --- a/lib-extra/src/test/java/com/diffplug/spotless/extra/groovy/GrEclipseFormatterStepTest.java +++ b/lib-extra/src/test/java/com/diffplug/spotless/extra/groovy/GrEclipseFormatterStepTest.java @@ -28,13 +28,14 @@ public class GrEclipseFormatterStepTest extends EquoResourceHarness { private final static String EXPECTED = "class F{\n\tdef m(){}\n}"; public GrEclipseFormatterStepTest() { - super(GrEclipseFormatterStep.createBuilder(TestProvisioner.mavenCentral()), INPUT, EXPECTED); + super(GrEclipseFormatterStep.createBuilder(TestProvisioner.mavenCentral())); } @ParameterizedTest @MethodSource void formatWithVersion(String version) throws Exception { - assertFormatted(version); + harnessFor(version).test("test.groovy", + "class F{ def m(){} }", "class F{\n\tdef m(){}\n}"); } private static Stream formatWithVersion() { diff --git a/lib-extra/src/test/java/com/diffplug/spotless/extra/java/EclipseJdtFormatterStepTest.java b/lib-extra/src/test/java/com/diffplug/spotless/extra/java/EclipseJdtFormatterStepTest.java index 91bc8740ab..5567a590c0 100644 --- a/lib-extra/src/test/java/com/diffplug/spotless/extra/java/EclipseJdtFormatterStepTest.java +++ b/lib-extra/src/test/java/com/diffplug/spotless/extra/java/EclipseJdtFormatterStepTest.java @@ -15,7 +15,6 @@ */ package com.diffplug.spotless.extra.java; -import java.io.File; import java.util.stream.Stream; import org.junit.jupiter.api.Nested; @@ -28,21 +27,20 @@ import com.diffplug.spotless.extra.eclipse.EquoResourceHarness; class EclipseJdtFormatterStepTest extends EquoResourceHarness { - private final static String INPUT = "package p; class C{}"; - private final static String EXPECTED = "package p;\nclass C {\n}"; - private static EquoBasedStepBuilder createBuilder() { return EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral()); } public EclipseJdtFormatterStepTest() { - super(createBuilder(), INPUT, EXPECTED); + super(createBuilder()); } @ParameterizedTest @MethodSource void formatWithVersion(String version) throws Exception { - assertFormatted(version); + harnessFor(version).test("test.java", + "package p; class C{}", + "package p;\nclass C {\n}"); } private static Stream formatWithVersion() { @@ -53,13 +51,13 @@ private static Stream formatWithVersion() { @Nested class NewFormatInterface extends EquoResourceHarness { public NewFormatInterface() { - super(createBuilder(), "module-info.java", getTestResource("java/eclipse/ModuleInfoUnformatted.test"), getTestResource("java/eclipse/ModuleInfoFormatted.test")); + super(createBuilder()); } @Test void formatModuleInfo() throws Exception { - File settingsFile = createTestFile("java/eclipse/ModuleInfo.prefs"); - assertFormatted("4.11", settingsFile); + harnessFor("4.11", createTestFile("java/eclipse/ModuleInfo.prefs")) + .testResource("module-info.java", "java/eclipse/ModuleInfoUnformatted.test", "java/eclipse/ModuleInfoFormatted.test"); } } } From 6173676581acd238504488df81562cad1d4e1cae Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Wed, 6 Dec 2023 00:13:48 -0800 Subject: [PATCH 2/4] Make the equo-based formatters serializable. --- .../spotless/extra/EquoBasedStepBuilder.java | 74 +++++++++++-------- .../diffplug/spotless/StepHarnessBase.java | 2 + 2 files changed, 46 insertions(+), 30 deletions(-) diff --git a/lib-extra/src/main/java/com/diffplug/spotless/extra/EquoBasedStepBuilder.java b/lib-extra/src/main/java/com/diffplug/spotless/extra/EquoBasedStepBuilder.java index 3d3bb68241..95fd08fb90 100644 --- a/lib-extra/src/main/java/com/diffplug/spotless/extra/EquoBasedStepBuilder.java +++ b/lib-extra/src/main/java/com/diffplug/spotless/extra/EquoBasedStepBuilder.java @@ -34,7 +34,7 @@ import com.diffplug.spotless.FormatterStep; import com.diffplug.spotless.JarState; import com.diffplug.spotless.Provisioner; -import com.diffplug.spotless.ThrowingEx; +import com.diffplug.spotless.SerializedFunction; import dev.equo.solstice.NestedJars; import dev.equo.solstice.p2.P2ClientCache; @@ -48,19 +48,19 @@ public abstract class EquoBasedStepBuilder { private final String formatterName; private final Provisioner mavenProvisioner; - private final ThrowingEx.Function stateToFormatter; + private final SerializedFunction stateToFormatter; private String formatterVersion; private Iterable settingsFiles = new ArrayList<>(); private Map p2Mirrors = Map.of(); /** @deprecated if you use this constructor you *must* call {@link #setVersion(String)} before calling {@link #build()} */ @Deprecated - public EquoBasedStepBuilder(String formatterName, Provisioner mavenProvisioner, ThrowingEx.Function stateToFormatter) { + public EquoBasedStepBuilder(String formatterName, Provisioner mavenProvisioner, SerializedFunction stateToFormatter) { this(formatterName, mavenProvisioner, null, stateToFormatter); } /** Initialize valid default configuration, taking latest version */ - public EquoBasedStepBuilder(String formatterName, Provisioner mavenProvisioner, @Nullable String defaultVersion, ThrowingEx.Function stateToFormatter) { + public EquoBasedStepBuilder(String formatterName, Provisioner mavenProvisioner, @Nullable String defaultVersion, SerializedFunction stateToFormatter) { this.formatterName = formatterName; this.mavenProvisioner = mavenProvisioner; this.formatterVersion = defaultVersion; @@ -83,11 +83,6 @@ public void setP2Mirrors(Collection p2Mirrors) { this.p2Mirrors = p2Mirrors.stream().collect(toMap(P2Mirror::getPrefix, P2Mirror::getUrl)); } - /** Returns the FormatterStep (whose state will be calculated lazily). */ - public FormatterStep build() { - return FormatterStep.createLazy(formatterName, this::get, stateToFormatter); - } - protected abstract P2Model model(String version); protected void addPlatformRepo(P2Model model, String version) { @@ -107,26 +102,28 @@ protected void addPlatformRepo(P2Model model, String version) { } } - /** Creates the state of the configuration. */ - EquoBasedStepBuilder.State get() throws Exception { - P2QueryResult query; - try { - query = createModelWithMirrors().query(P2ClientCache.PREFER_OFFLINE, P2QueryCache.ALLOW); - } catch (Exception x) { - throw new IOException("Failed to load " + formatterName + ": " + x, x); - } - var classpath = new ArrayList(); - var mavenDeps = new ArrayList(); - mavenDeps.add("dev.equo.ide:solstice:1.7.4"); - mavenDeps.add("com.diffplug.durian:durian-swt.os:4.2.0"); - mavenDeps.addAll(query.getJarsOnMavenCentral()); - classpath.addAll(mavenProvisioner.provisionWithTransitives(false, mavenDeps)); - classpath.addAll(query.getJarsNotOnMavenCentral()); - for (var nested : NestedJars.inFiles(query.getJarsNotOnMavenCentral()).extractAllNestedJars()) { - classpath.add(nested.getValue()); - } - var jarState = JarState.preserveOrder(classpath); - return new State(formatterVersion, jarState, FileSignature.signAsList(settingsFiles)); + /** Returns the FormatterStep (whose state will be calculated lazily). */ + public FormatterStep build() { + var roundtrippableState = new EquoStep(formatterVersion, FileSignature.promise(settingsFiles), JarState.promise(() -> { + P2QueryResult query; + try { + query = createModelWithMirrors().query(P2ClientCache.PREFER_OFFLINE, P2QueryCache.ALLOW); + } catch (Exception x) { + throw new IOException("Failed to load " + formatterName + ": " + x, x); + } + var classpath = new ArrayList(); + var mavenDeps = new ArrayList(); + mavenDeps.add("dev.equo.ide:solstice:1.7.4"); + mavenDeps.add("com.diffplug.durian:durian-swt.os:4.2.0"); + mavenDeps.addAll(query.getJarsOnMavenCentral()); + classpath.addAll(mavenProvisioner.provisionWithTransitives(false, mavenDeps)); + classpath.addAll(query.getJarsNotOnMavenCentral()); + for (var nested : NestedJars.inFiles(query.getJarsNotOnMavenCentral()).extractAllNestedJars()) { + classpath.add(nested.getValue()); + } + return JarState.preserveOrder(classpath); + })); + return FormatterStep.create(formatterName, roundtrippableState, EquoStep::state, stateToFormatter); } private P2Model createModelWithMirrors() { @@ -152,12 +149,29 @@ private P2Model createModelWithMirrors() { return model; } + static class EquoStep implements Serializable { + private static final long serialVersionUID = 1; + private final String semanticVersion; + private final FileSignature.Promised settingsPromise; + private final JarState.Promised jarPromise; + + EquoStep(String semanticVersion, FileSignature.Promised settingsPromise, JarState.Promised jarPromise) { + this.semanticVersion = semanticVersion; + this.settingsPromise = settingsPromise; + this.jarPromise = jarPromise; + } + + private State state() { + return new State(semanticVersion, jarPromise.get(), settingsPromise.get()); + } + } + /** * State of Eclipse configuration items, providing functionality to derived information * based on the state. */ public static class State implements Serializable { - private static final long serialVersionUID = 584400372246020995L; + private static final long serialVersionUID = 1; final String semanticVersion; final JarState jarState; final FileSignature settingsFiles; diff --git a/testlib/src/main/java/com/diffplug/spotless/StepHarnessBase.java b/testlib/src/main/java/com/diffplug/spotless/StepHarnessBase.java index 0a0154176b..3ebed8a48d 100644 --- a/testlib/src/main/java/com/diffplug/spotless/StepHarnessBase.java +++ b/testlib/src/main/java/com/diffplug/spotless/StepHarnessBase.java @@ -43,6 +43,8 @@ protected StepHarnessBase(Formatter formatter) { supportsRoundTrip = true; } else if (onlyStepName.equals("diktat")) { supportsRoundTrip = true; + } else if (onlyStepName.equals("eclipse jdt formatter") || onlyStepName.equals("eclipse cdt formatter") || onlyStepName.equals("eclipse groovy formatter")) { + supportsRoundTrip = true; } } } From f5762675552fd9cd725cbd2341341aecd3fa94b9 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Tue, 23 Jan 2024 15:52:25 -0800 Subject: [PATCH 3/4] Add back the method we removed before, because it avoids IOExceptions. --- lib/src/main/java/com/diffplug/spotless/FileSignature.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/src/main/java/com/diffplug/spotless/FileSignature.java b/lib/src/main/java/com/diffplug/spotless/FileSignature.java index d6a23a8fd1..10bba7a716 100644 --- a/lib/src/main/java/com/diffplug/spotless/FileSignature.java +++ b/lib/src/main/java/com/diffplug/spotless/FileSignature.java @@ -121,6 +121,10 @@ public Promised asPromise() { return new Promised(files, this); } + public static Promised promise(Iterable files) { + return new Promised(MoreIterables.toNullHostileList(files), null); + } + /** Returns all of the files in this signature, throwing an exception if there are more or less than 1 file. */ public Collection files() { return Collections.unmodifiableList(files); From 99eebec05c26294a0e3a90255728854698e618ef Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Tue, 23 Jan 2024 15:52:35 -0800 Subject: [PATCH 4/4] Fix copyright headers. --- .../com/diffplug/spotless/extra/EquoBasedStepBuilder.java | 4 ++-- .../spotless/extra/cpp/EclipseCdtFormatterStepTest.java | 2 +- .../diffplug/spotless/extra/eclipse/EquoResourceHarness.java | 2 +- .../spotless/extra/groovy/GrEclipseFormatterStepTest.java | 2 +- .../spotless/extra/java/EclipseJdtFormatterStepTest.java | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib-extra/src/main/java/com/diffplug/spotless/extra/EquoBasedStepBuilder.java b/lib-extra/src/main/java/com/diffplug/spotless/extra/EquoBasedStepBuilder.java index 95fd08fb90..eaedfb55d3 100644 --- a/lib-extra/src/main/java/com/diffplug/spotless/extra/EquoBasedStepBuilder.java +++ b/lib-extra/src/main/java/com/diffplug/spotless/extra/EquoBasedStepBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2023 DiffPlug + * Copyright 2016-2024 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -113,7 +113,7 @@ public FormatterStep build() { } var classpath = new ArrayList(); var mavenDeps = new ArrayList(); - mavenDeps.add("dev.equo.ide:solstice:1.7.4"); + mavenDeps.add("dev.equo.ide:solstice:1.7.5"); mavenDeps.add("com.diffplug.durian:durian-swt.os:4.2.0"); mavenDeps.addAll(query.getJarsOnMavenCentral()); classpath.addAll(mavenProvisioner.provisionWithTransitives(false, mavenDeps)); diff --git a/lib-extra/src/test/java/com/diffplug/spotless/extra/cpp/EclipseCdtFormatterStepTest.java b/lib-extra/src/test/java/com/diffplug/spotless/extra/cpp/EclipseCdtFormatterStepTest.java index a548d3077b..144310b654 100644 --- a/lib-extra/src/test/java/com/diffplug/spotless/extra/cpp/EclipseCdtFormatterStepTest.java +++ b/lib-extra/src/test/java/com/diffplug/spotless/extra/cpp/EclipseCdtFormatterStepTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2023 DiffPlug + * Copyright 2016-2024 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/lib-extra/src/test/java/com/diffplug/spotless/extra/eclipse/EquoResourceHarness.java b/lib-extra/src/test/java/com/diffplug/spotless/extra/eclipse/EquoResourceHarness.java index 0cb2e4c700..185bbd1326 100644 --- a/lib-extra/src/test/java/com/diffplug/spotless/extra/eclipse/EquoResourceHarness.java +++ b/lib-extra/src/test/java/com/diffplug/spotless/extra/eclipse/EquoResourceHarness.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2023 DiffPlug + * Copyright 2016-2024 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/lib-extra/src/test/java/com/diffplug/spotless/extra/groovy/GrEclipseFormatterStepTest.java b/lib-extra/src/test/java/com/diffplug/spotless/extra/groovy/GrEclipseFormatterStepTest.java index b5d294e71c..7bfddc8e1c 100644 --- a/lib-extra/src/test/java/com/diffplug/spotless/extra/groovy/GrEclipseFormatterStepTest.java +++ b/lib-extra/src/test/java/com/diffplug/spotless/extra/groovy/GrEclipseFormatterStepTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2023 DiffPlug + * Copyright 2016-2024 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/lib-extra/src/test/java/com/diffplug/spotless/extra/java/EclipseJdtFormatterStepTest.java b/lib-extra/src/test/java/com/diffplug/spotless/extra/java/EclipseJdtFormatterStepTest.java index 5567a590c0..dbbfdb04a0 100644 --- a/lib-extra/src/test/java/com/diffplug/spotless/extra/java/EclipseJdtFormatterStepTest.java +++ b/lib-extra/src/test/java/com/diffplug/spotless/extra/java/EclipseJdtFormatterStepTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2023 DiffPlug + * Copyright 2016-2024 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License.