Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

.editorconfig for ktlint. #1041

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -36,15 +38,17 @@ public class KtlintFormatterFunc implements FormatterFunc.NeedsFile {
private static final Logger logger = Logger.getLogger(KtlintFormatterFunc.class.getName());

private final List<RuleSet> rulesets;
private final Map<String, String> userData;
private final Function2<? super LintError, ? super Boolean, Unit> formatterCallback;
private final boolean isScript;
private final Map<String, String> userData;
private final String editorConfig;

public KtlintFormatterFunc(boolean isScript, Map<String, String> userData) {
public KtlintFormatterFunc(boolean isScript, Map<String, String> 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<LintError, Boolean, Unit> {
Expand All @@ -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(
Expand All @@ -66,7 +92,7 @@ public String applyWithFile(String unix, File file) throws Exception {
userData,
formatterCallback,
isScript,
null,
searchEditorConfig(file),
false));
}
}
30 changes: 21 additions & 9 deletions lib/src/main/java/com/diffplug/spotless/kotlin/KtLintStep.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -53,22 +55,30 @@ public static FormatterStep create(String version, Provisioner provisioner) {
}

public static FormatterStep create(String version, Provisioner provisioner, Map<String, String> userData) {
return create(version, provisioner, false, userData);
return create(version, provisioner, userData, null);
}

public static FormatterStep create(String version, Provisioner provisioner, Map<String, String> 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<String, String> 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<String, String> userData) {
public static FormatterStep createForScript(String version, Provisioner provisioner, Map<String, String> userData, @Nullable String editorConfig) {
return create(version, provisioner, true, userData, editorConfig);
}

private static FormatterStep create(String version, Provisioner provisioner, boolean isScript, Map<String, String> 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);
}

Expand All @@ -85,10 +95,10 @@ static final class State implements Serializable {
/** The jar that contains the eclipse formatter. */
final JarState jarState;
private final TreeMap<String, String> userData;
private final String editorConfig;
private final boolean useParams;

State(String version, Provisioner provisioner, boolean isScript, Map<String, String> userData) throws IOException {
this.userData = new TreeMap<>(userData);
State(String version, Provisioner provisioner, boolean isScript, Map<String, String> userData, @Nullable String editorConfig) throws IOException {
String coordinate;
if (BadSemver.version(version) < BadSemver.version(0, 32)) {
coordinate = MAVEN_COORDINATE_PRE_0_32;
Expand All @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ public class KotlinFormatExtension {

private final String version;
private Map<String, String> userData;
private String editorConfig;

KotlinFormatExtension(String version, Map<String, String> config) {
this.version = version;
Expand All @@ -82,8 +83,13 @@ public void userData(Map<String, String> 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);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public class KotlinFormatExtension {

private final String version;
private Map<String, String> userData;
private String editorConfig;

KotlinFormatExtension(String version, Map<String, String> config) {
this.version = version;
Expand All @@ -68,8 +69,13 @@ public void userData(Map<String, String> 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);
}
}

Expand Down