From 03f1d6cbc05695dd75c30035c0c27570176c5fa9 Mon Sep 17 00:00:00 2001 From: UK-taniyama Date: Thu, 16 Dec 2021 23:11:33 +0900 Subject: [PATCH] .editorconfig for ktlint. - set .editorcofig fullpath ktlint().editorConfig(project.file(".editorconfig").absolutePath) - set "?": recursively search the closest .editorconfig ktlint().editorConfig("?") --- .../glue/ktlint/KtlintFormatterFunc.java | 34 ++++++++++++++++--- .../diffplug/spotless/kotlin/KtLintStep.java | 30 +++++++++++----- .../gradle/spotless/KotlinExtension.java | 8 ++++- .../spotless/KotlinGradleExtension.java | 8 ++++- 4 files changed, 65 insertions(+), 15 deletions(-) diff --git a/lib/src/ktlint/java/com/diffplug/spotless/glue/ktlint/KtlintFormatterFunc.java b/lib/src/ktlint/java/com/diffplug/spotless/glue/ktlint/KtlintFormatterFunc.java index 2147c22e90..afc058332d 100644 --- a/lib/src/ktlint/java/com/diffplug/spotless/glue/ktlint/KtlintFormatterFunc.java +++ b/lib/src/ktlint/java/com/diffplug/spotless/glue/ktlint/KtlintFormatterFunc.java @@ -16,6 +16,8 @@ package com.diffplug.spotless.glue.ktlint; import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Collections; import java.util.List; import java.util.Map; @@ -36,15 +38,17 @@ public class KtlintFormatterFunc implements FormatterFunc.NeedsFile { private static final Logger logger = Logger.getLogger(KtlintFormatterFunc.class.getName()); private final List rulesets; - private final Map userData; private final Function2 formatterCallback; private final boolean isScript; + private final Map userData; + private final String editorConfig; - public KtlintFormatterFunc(boolean isScript, Map userData) { + public KtlintFormatterFunc(boolean isScript, Map userData, String editorConfig) { rulesets = Collections.singletonList(new StandardRuleSetProvider().get()); - this.userData = userData; formatterCallback = new FormatterCallback(); this.isScript = isScript; + this.userData = userData; + this.editorConfig = editorConfig; } static class FormatterCallback implements Function2 { @@ -57,6 +61,28 @@ public Unit invoke(LintError lint, Boolean corrected) { } } + String searchEditorConfig(File file) { + if (this.editorConfig == null) { + return null; + } + if (!this.editorConfig.equals("?")) { + return editorConfig; + } + Path path = file.toPath().toAbsolutePath(); + while (true) { + Path dir = path.getParent(); + if (dir == null) { + break; + } + Path editorConfig = dir.resolve(".editorconfig"); + if (Files.isRegularFile(editorConfig)) { + return editorConfig.toString(); + } + path = dir; + } + return null; + } + @Override public String applyWithFile(String unix, File file) throws Exception { return KtLint.INSTANCE.format(new Params( @@ -66,7 +92,7 @@ public String applyWithFile(String unix, File file) throws Exception { userData, formatterCallback, isScript, - null, + searchEditorConfig(file), false)); } } diff --git a/lib/src/main/java/com/diffplug/spotless/kotlin/KtLintStep.java b/lib/src/main/java/com/diffplug/spotless/kotlin/KtLintStep.java index 0265ef499a..4383b555e3 100644 --- a/lib/src/main/java/com/diffplug/spotless/kotlin/KtLintStep.java +++ b/lib/src/main/java/com/diffplug/spotless/kotlin/KtLintStep.java @@ -26,6 +26,8 @@ import java.util.Objects; import java.util.TreeMap; +import javax.annotation.Nullable; + import com.diffplug.spotless.FormatterFunc; import com.diffplug.spotless.FormatterStep; import com.diffplug.spotless.JarState; @@ -53,22 +55,30 @@ public static FormatterStep create(String version, Provisioner provisioner) { } public static FormatterStep create(String version, Provisioner provisioner, Map userData) { - return create(version, provisioner, false, userData); + return create(version, provisioner, userData, null); + } + + public static FormatterStep create(String version, Provisioner provisioner, Map userData, @Nullable String editorConfig) { + return create(version, provisioner, false, userData, editorConfig); } public static FormatterStep createForScript(String version, Provisioner provisioner) { - return create(version, provisioner, true, Collections.emptyMap()); + return create(version, provisioner, true, Collections.emptyMap(), null); } public static FormatterStep createForScript(String version, Provisioner provisioner, Map userData) { - return create(version, provisioner, true, userData); + return create(version, provisioner, true, userData, null); } - private static FormatterStep create(String version, Provisioner provisioner, boolean isScript, Map userData) { + public static FormatterStep createForScript(String version, Provisioner provisioner, Map userData, @Nullable String editorConfig) { + return create(version, provisioner, true, userData, editorConfig); + } + + private static FormatterStep create(String version, Provisioner provisioner, boolean isScript, Map userData, @Nullable String editorConfig) { Objects.requireNonNull(version, "version"); Objects.requireNonNull(provisioner, "provisioner"); return FormatterStep.createLazy(NAME, - () -> new State(version, provisioner, isScript, userData), + () -> new State(version, provisioner, isScript, userData, editorConfig), State::createFormat); } @@ -85,10 +95,10 @@ static final class State implements Serializable { /** The jar that contains the eclipse formatter. */ final JarState jarState; private final TreeMap userData; + private final String editorConfig; private final boolean useParams; - State(String version, Provisioner provisioner, boolean isScript, Map userData) throws IOException { - this.userData = new TreeMap<>(userData); + State(String version, Provisioner provisioner, boolean isScript, Map userData, @Nullable String editorConfig) throws IOException { String coordinate; if (BadSemver.version(version) < BadSemver.version(0, 32)) { coordinate = MAVEN_COORDINATE_PRE_0_32; @@ -100,13 +110,15 @@ static final class State implements Serializable { this.useParams = BadSemver.version(version) >= BadSemver.version(0, 34); this.jarState = JarState.from(coordinate + version, provisioner); this.isScript = isScript; + this.userData = new TreeMap<>(userData); + this.editorConfig = editorConfig; } FormatterFunc createFormat() throws Exception { if (useParams) { Class formatterFunc = jarState.getClassLoader().loadClass("com.diffplug.spotless.glue.ktlint.KtlintFormatterFunc"); - Constructor constructor = formatterFunc.getConstructor(boolean.class, Map.class); - return (FormatterFunc.NeedsFile) constructor.newInstance(isScript, userData); + Constructor constructor = formatterFunc.getConstructor(boolean.class, Map.class, String.class); + return (FormatterFunc.NeedsFile) constructor.newInstance(isScript, userData, editorConfig); } ClassLoader classLoader = jarState.getClassLoader(); diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/KotlinExtension.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/KotlinExtension.java index d88b4aac7f..3b8b1e549f 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/KotlinExtension.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/KotlinExtension.java @@ -68,6 +68,7 @@ public class KotlinFormatExtension { private final String version; private Map userData; + private String editorConfig; KotlinFormatExtension(String version, Map config) { this.version = version; @@ -82,8 +83,13 @@ public void userData(Map userData) { replaceStep(createStep()); } + public void editorConfig(String editorConfig) { + this.editorConfig = editorConfig; + replaceStep(createStep()); + } + private FormatterStep createStep() { - return KtLintStep.create(version, provisioner(), userData); + return KtLintStep.create(version, provisioner(), userData, editorConfig); } } diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/KotlinGradleExtension.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/KotlinGradleExtension.java index 5ea3c29594..bbff311047 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/KotlinGradleExtension.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/KotlinGradleExtension.java @@ -54,6 +54,7 @@ public class KotlinFormatExtension { private final String version; private Map userData; + private String editorConfig; KotlinFormatExtension(String version, Map config) { this.version = version; @@ -68,8 +69,13 @@ public void userData(Map userData) { replaceStep(createStep()); } + public void editorConfig(String editorConfig) { + this.editorConfig = editorConfig; + replaceStep(createStep()); + } + private FormatterStep createStep() { - return KtLintStep.createForScript(version, provisioner(), userData); + return KtLintStep.createForScript(version, provisioner(), userData, editorConfig); } }