diff --git a/.editorconfig b/.editorconfig index a8061a0816..6712fd66cc 100644 --- a/.editorconfig +++ b/.editorconfig @@ -16,6 +16,8 @@ indent_size = 2 # Doc: https://youtrack.jetbrains.com/issue/IDEA-170643#focus=streamItem-27-3708697.0-0 ij_java_imports_layout = java.**,|,javax.**,|,org.**,|,com.**,|,com.diffplug.**,|,* ij_java_use_single_class_imports = true +ij_java_class_count_to_use_import_on_demand = 999 +ij_java_names_count_to_use_import_on_demand = 999 [*.xml.mustache] indent_style = space diff --git a/CHANGES.md b/CHANGES.md index 8d2011de17..0a3351fe91 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,6 +10,8 @@ This document is intended for Spotless developers. We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (starting after version `1.27.0`). ## [Unreleased] +### Added +* Support for `editorConfigOverride` in `ktlint`. ([#1218](https://github.com/diffplug/spotless/pull/1218) fixes [#1193](https://github.com/diffplug/spotless/issues/1193)) ## [2.25.3] - 2022-05-10 ### Fixed 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 b3ef570180..1cd79a6ba9 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 @@ -17,18 +17,26 @@ import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; import com.pinterest.ktlint.core.KtLint; -import com.pinterest.ktlint.core.KtLint.Params; +import com.pinterest.ktlint.core.KtLint.ExperimentalParams; import com.pinterest.ktlint.core.LintError; import com.pinterest.ktlint.core.RuleSet; +import com.pinterest.ktlint.core.api.DefaultEditorConfigProperties; +import com.pinterest.ktlint.core.api.EditorConfigOverride; +import com.pinterest.ktlint.core.api.UsesEditorConfigProperties; import com.pinterest.ktlint.ruleset.experimental.ExperimentalRuleSetProvider; import com.pinterest.ktlint.ruleset.standard.StandardRuleSetProvider; import com.diffplug.spotless.FormatterFunc; +import kotlin.Pair; import kotlin.Unit; import kotlin.jvm.functions.Function2; @@ -38,8 +46,13 @@ public class KtlintFormatterFunc implements FormatterFunc.NeedsFile { private final Map userData; private final Function2 formatterCallback; private final boolean isScript; + private final EditorConfigOverride editorConfigOverride; - public KtlintFormatterFunc(boolean isScript, boolean useExperimental, Map userData) { + /** + * Non-empty editorConfigOverrideMap requires KtLint 0.45.2. + */ + public KtlintFormatterFunc(boolean isScript, boolean useExperimental, Map userData, + Map editorConfigOverrideMap) { rulesets = new ArrayList<>(); rulesets.add(new StandardRuleSetProvider().get()); @@ -49,6 +62,46 @@ public KtlintFormatterFunc(boolean isScript, boolean useExperimental, Map editorConfigOverrideMap) { + // Get properties from rules in the rule sets + Stream> ruleProperties = rulesets.stream() + .flatMap(ruleSet -> Arrays.stream(ruleSet.getRules())) + .filter(rule -> rule instanceof UsesEditorConfigProperties) + .flatMap(rule -> ((UsesEditorConfigProperties) rule).getEditorConfigProperties().stream()); + + // Create a mapping of properties to their names based on rule properties and default properties + Map> supportedProperties = Stream + .concat(ruleProperties, DefaultEditorConfigProperties.INSTANCE.getDefaultEditorConfigProperties().stream()) + .distinct() + .collect(Collectors.toMap(property -> property.getType().getName(), property -> property)); + + // Create config properties based on provided property names and values + @SuppressWarnings("unchecked") + Pair, ?>[] properties = editorConfigOverrideMap.entrySet().stream() + .map(entry -> { + UsesEditorConfigProperties.EditorConfigProperty property = supportedProperties.get(entry.getKey()); + if (property != null) { + return new Pair<>(property, entry.getValue()); + } else { + return null; + } + }) + .filter(Objects::nonNull) + .toArray(Pair[]::new); + + return EditorConfigOverride.Companion.from(properties); } static class FormatterCallback implements Function2 { @@ -63,14 +116,31 @@ public Unit invoke(LintError lint, Boolean corrected) { @Override public String applyWithFile(String unix, File file) throws Exception { - return KtLint.INSTANCE.format(new Params( - file.getName(), - unix, - rulesets, - userData, - formatterCallback, - isScript, - null, - false)); + + if (editorConfigOverride != null) { + // Use ExperimentalParams with EditorConfigOverride which requires KtLint 0.45.2 + return KtLint.INSTANCE.format(new ExperimentalParams( + file.getName(), + unix, + rulesets, + userData, + formatterCallback, + isScript, + null, + false, + editorConfigOverride, + false)); + } else { + // Use Params for backward compatibility + return KtLint.INSTANCE.format(new KtLint.Params( + file.getName(), + unix, + rulesets, + userData, + formatterCallback, + isScript, + null, + false)); + } } } diff --git a/lib/src/main/java/com/diffplug/spotless/kotlin/BadSemver.java b/lib/src/main/java/com/diffplug/spotless/kotlin/BadSemver.java index ae500e55b4..771c27eb3e 100644 --- a/lib/src/main/java/com/diffplug/spotless/kotlin/BadSemver.java +++ b/lib/src/main/java/com/diffplug/spotless/kotlin/BadSemver.java @@ -1,5 +1,5 @@ /* - * Copyright 2021 DiffPlug + * Copyright 2021-2022 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,13 +26,18 @@ protected static int version(String input) { } String major = matcher.group(1); String minor = matcher.group(2); - return version(Integer.parseInt(major), Integer.parseInt(minor)); + String patch = matcher.group(3); + return version(Integer.parseInt(major), Integer.parseInt(minor), patch != null ? Integer.parseInt(patch) : 0); } /** Ambiguous after 2147.483647.blah-blah */ + protected static int version(int major, int minor, int patch) { + return major * 1_000_000 + minor * 1_000 + patch; + } + protected static int version(int major, int minor) { - return major * 1_000_000 + minor; + return version(major, minor, 0); } - private static final Pattern BAD_SEMVER = Pattern.compile("(\\d+)\\.(\\d+)"); + private static final Pattern BAD_SEMVER = Pattern.compile("(\\d+)\\.(\\d+)\\.*(\\d+)*"); } 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 de099b04d1..d58331ec1b 100644 --- a/lib/src/main/java/com/diffplug/spotless/kotlin/KtLintStep.java +++ b/lib/src/main/java/com/diffplug/spotless/kotlin/KtLintStep.java @@ -50,26 +50,29 @@ public static FormatterStep create(Provisioner provisioner) { } public static FormatterStep create(String version, Provisioner provisioner) { - return create(version, provisioner, false, Collections.emptyMap()); + return create(version, provisioner, false, Collections.emptyMap(), Collections.emptyMap()); } - public static FormatterStep create(String version, Provisioner provisioner, boolean useExperimental, Map userData) { - return create(version, provisioner, false, useExperimental, userData); + public static FormatterStep create(String version, Provisioner provisioner, boolean useExperimental, + Map userData, Map editorConfigOverride) { + return create(version, provisioner, false, useExperimental, userData, editorConfigOverride); } public static FormatterStep createForScript(String version, Provisioner provisioner) { - return create(version, provisioner, true, false, Collections.emptyMap()); + return create(version, provisioner, true, false, Collections.emptyMap(), Collections.emptyMap()); } - public static FormatterStep createForScript(String version, Provisioner provisioner, boolean useExperimental, Map userData) { - return create(version, provisioner, true, useExperimental, userData); + public static FormatterStep createForScript(String version, Provisioner provisioner, boolean useExperimental, + Map userData, Map editorConfigOverride) { + return create(version, provisioner, true, useExperimental, userData, editorConfigOverride); } - private static FormatterStep create(String version, Provisioner provisioner, boolean isScript, boolean useExperimental, Map userData) { + private static FormatterStep create(String version, Provisioner provisioner, boolean isScript, boolean useExperimental, + Map userData, Map editorConfigOverride) { Objects.requireNonNull(version, "version"); Objects.requireNonNull(provisioner, "provisioner"); return FormatterStep.createLazy(NAME, - () -> new State(version, provisioner, isScript, useExperimental, userData), + () -> new State(version, provisioner, isScript, useExperimental, userData, editorConfigOverride), State::createFormat); } @@ -87,11 +90,20 @@ static final class State implements Serializable { final JarState jarState; private final boolean useExperimental; private final TreeMap userData; + private final TreeMap editorConfigOverride; private final boolean useParams; - State(String version, Provisioner provisioner, boolean isScript, boolean useExperimental, Map userData) throws IOException { + State(String version, Provisioner provisioner, boolean isScript, boolean useExperimental, + Map userData, Map editorConfigOverride) throws IOException { + + if (!editorConfigOverride.isEmpty() && + BadSemver.version(version) < BadSemver.version(0, 45, 2)) { + throw new IllegalStateException("KtLint editorConfigOverride supported for version 0.45.2 and later"); + } + this.useExperimental = useExperimental; this.userData = new TreeMap<>(userData); + this.editorConfigOverride = new TreeMap<>(editorConfigOverride); String coordinate; if (BadSemver.version(version) < BadSemver.version(0, 32)) { coordinate = MAVEN_COORDINATE_PRE_0_32; @@ -108,8 +120,8 @@ static final class State implements Serializable { FormatterFunc createFormat() throws Exception { if (useParams) { Class formatterFunc = jarState.getClassLoader().loadClass("com.diffplug.spotless.glue.ktlint.KtlintFormatterFunc"); - Constructor constructor = formatterFunc.getConstructor(boolean.class, boolean.class, Map.class); - return (FormatterFunc.NeedsFile) constructor.newInstance(isScript, useExperimental, userData); + Constructor constructor = formatterFunc.getConstructor(boolean.class, boolean.class, Map.class, Map.class); + return (FormatterFunc.NeedsFile) constructor.newInstance(isScript, useExperimental, userData, editorConfigOverride); } ClassLoader classLoader = jarState.getClassLoader(); diff --git a/plugin-gradle/CHANGES.md b/plugin-gradle/CHANGES.md index e67e6546bb..0732a18cee 100644 --- a/plugin-gradle/CHANGES.md +++ b/plugin-gradle/CHANGES.md @@ -3,6 +3,9 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (starting after version `3.27.0`). ## [Unreleased] +### Added +* Support for `editorConfigOverride` in `ktlint`. ([#1218](https://github.com/diffplug/spotless/pull/1218) fixes [#1193](https://github.com/diffplug/spotless/issues/1193)) + * If you are using properties like `indent_size`, you should pass now pass them as `editorConfigOverride` and not as `userData`. ## [6.6.1] - 2022-05-13 ### Fixed diff --git a/plugin-gradle/README.md b/plugin-gradle/README.md index 72eb58cb2b..e7f1f92107 100644 --- a/plugin-gradle/README.md +++ b/plugin-gradle/README.md @@ -335,15 +335,18 @@ spotless { ### ktlint -[homepage](https://github.com/pinterest/ktlint). [changelog](https://github.com/pinterest/ktlint/releases). Spotless does not ([yet](https://github.com/diffplug/spotless/issues/142)) respect the `.editorconfig` settings ([ktlint docs](https://github.com/pinterest/ktlint#editorconfig)), but you can provide them manually as `userData`. +[homepage](https://github.com/pinterest/ktlint). [changelog](https://github.com/pinterest/ktlint/releases). Spotless does not ([yet](https://github.com/diffplug/spotless/issues/142)) respect the `.editorconfig` settings ([ktlint docs](https://github.com/pinterest/ktlint#editorconfig)), but you can provide them manually as `editorConfigOverride`. ```kotlin spotless { kotlin { - // version, setUseExperimental and userData are all optional - ktlint('0.43.2') + // version, setUseExperimental, userData and editorConfigOverride are all optional + ktlint("0.45.2") .setUseExperimental(true) - .userData(mapOf('indent_size' to '2', 'continuation_indent_size' to '2')) + .userData(mapOf("android" to "true")) + .editorConfigOverride(mapOf("indent_size" to 2)) + } +} ``` ### diktat 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 f7cb7a20f0..546efab46d 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 @@ -30,6 +30,7 @@ import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.tasks.SourceSet; +import com.diffplug.common.collect.ImmutableSortedMap; import com.diffplug.spotless.FileSignature; import com.diffplug.spotless.FormatterStep; import com.diffplug.spotless.kotlin.DiktatStep; @@ -59,7 +60,7 @@ public LicenseHeaderConfig licenseHeaderFile(Object licenseHeaderFile) { /** Adds the specified version of ktlint. */ public KotlinFormatExtension ktlint(String version) { Objects.requireNonNull(version); - return new KotlinFormatExtension(version, false, Collections.emptyMap()); + return new KotlinFormatExtension(version, false, Collections.emptyMap(), Collections.emptyMap()); } public KotlinFormatExtension ktlint() { @@ -71,11 +72,14 @@ public class KotlinFormatExtension { private final String version; private boolean useExperimental; private Map userData; + private Map editorConfigOverride; - KotlinFormatExtension(String version, boolean useExperimental, Map config) { + KotlinFormatExtension(String version, boolean useExperimental, Map config, + Map editorConfigOverride) { this.version = version; this.useExperimental = useExperimental; this.userData = config; + this.editorConfigOverride = editorConfigOverride; addStep(createStep()); } @@ -88,13 +92,21 @@ public KotlinFormatExtension setUseExperimental(boolean useExperimental) { public KotlinFormatExtension userData(Map userData) { // Copy the map to a sorted map because up-to-date checking is based on binary-equals of the serialized // representation. - this.userData = userData; + this.userData = ImmutableSortedMap.copyOf(userData); + replaceStep(createStep()); + return this; + } + + public KotlinFormatExtension editorConfigOverride(Map editorConfigOverride) { + // Copy the map to a sorted map because up-to-date checking is based on binary-equals of the serialized + // representation. + this.editorConfigOverride = ImmutableSortedMap.copyOf(editorConfigOverride); replaceStep(createStep()); return this; } private FormatterStep createStep() { - return KtLintStep.create(version, provisioner(), useExperimental, userData); + return KtLintStep.create(version, provisioner(), useExperimental, userData, editorConfigOverride); } } 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 7a98c211bc..c1abe62bd1 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 @@ -45,7 +45,7 @@ public KotlinGradleExtension(SpotlessExtension spotless) { /** Adds the specified version of ktlint. */ public KotlinFormatExtension ktlint(String version) { Objects.requireNonNull(version, "version"); - return new KotlinFormatExtension(version, false, Collections.emptyMap()); + return new KotlinFormatExtension(version, false, Collections.emptyMap(), Collections.emptyMap()); } public KotlinFormatExtension ktlint() { @@ -57,11 +57,14 @@ public class KotlinFormatExtension { private final String version; private boolean useExperimental; private Map userData; + private Map editorConfigOverride; - KotlinFormatExtension(String version, boolean useExperimental, Map config) { + KotlinFormatExtension(String version, boolean useExperimental, Map config, + Map editorConfigOverride) { this.version = version; this.useExperimental = useExperimental; this.userData = config; + this.editorConfigOverride = editorConfigOverride; addStep(createStep()); } @@ -79,8 +82,16 @@ public KotlinFormatExtension userData(Map userData) { return this; } + public KotlinFormatExtension editorConfigOverride(Map editorConfigOverride) { + // Copy the map to a sorted map because up-to-date checking is based on binary-equals of the serialized + // representation. + this.editorConfigOverride = ImmutableSortedMap.copyOf(editorConfigOverride); + replaceStep(createStep()); + return this; + } + private FormatterStep createStep() { - return KtLintStep.createForScript(version, provisioner(), useExperimental, userData); + return KtLintStep.createForScript(version, provisioner(), useExperimental, userData, editorConfigOverride); } } diff --git a/plugin-gradle/src/test/java/com/diffplug/gradle/spotless/KotlinExtensionTest.java b/plugin-gradle/src/test/java/com/diffplug/gradle/spotless/KotlinExtensionTest.java index f10be630ef..da2a604681 100644 --- a/plugin-gradle/src/test/java/com/diffplug/gradle/spotless/KotlinExtensionTest.java +++ b/plugin-gradle/src/test/java/com/diffplug/gradle/spotless/KotlinExtensionTest.java @@ -16,6 +16,7 @@ package com.diffplug.gradle.spotless; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.condition.JRE.JAVA_11; import java.io.IOException; @@ -175,6 +176,50 @@ void withExperimental_0_32() throws IOException { assertFile("src/main/kotlin/basic.kt").sameAsResource("kotlin/ktlint/basic.clean"); } + @Test + void withExperimentalEditorConfigOverride() throws IOException { + setFile("build.gradle").toLines( + "plugins {", + " id 'org.jetbrains.kotlin.jvm' version '1.5.31'", + " id 'com.diffplug.spotless'", + "}", + "repositories { mavenCentral() }", + "spotless {", + " kotlin {", + " ktlint().setUseExperimental(true)", + " .editorConfigOverride([", + " ij_kotlin_allow_trailing_comma: true,", + " ij_kotlin_allow_trailing_comma_on_call_site: true", + " ])", + " }", + "}"); + setFile("src/main/kotlin/experimental.kt").toResource("kotlin/ktlint/experimentalEditorConfigOverride.dirty"); + gradleRunner().withArguments("spotlessApply").build(); + assertFile("src/main/kotlin/experimental.kt").sameAsResource("kotlin/ktlint/experimentalEditorConfigOverride.clean"); + } + + @Test + void withEditorConfigOverride_0_45_1() throws IOException { + setFile("build.gradle").toLines( + "plugins {", + " id 'org.jetbrains.kotlin.jvm' version '1.5.31'", + " id 'com.diffplug.spotless'", + "}", + "repositories { mavenCentral() }", + "spotless {", + " kotlin {", + " ktlint('0.45.1')", + " .editorConfigOverride([", + " indent_size: 5", + " ])", + " }", + "}"); + setFile("src/main/kotlin/basic.kt").toResource("kotlin/ktlint/basic.dirty"); + Throwable error = assertThrows(Throwable.class, + () -> gradleRunner().withArguments("spotlessApply").build()); + assertThat(error).hasMessageContaining("KtLint editorConfigOverride supported for version 0.45.2 and later"); + } + /** * Check that the sample used to verify the experimental ruleset is untouched by the default ruleset, to verify * that enabling the experimental ruleset is actually doing something. diff --git a/plugin-gradle/src/test/java/com/diffplug/gradle/spotless/KotlinGradleExtensionTest.java b/plugin-gradle/src/test/java/com/diffplug/gradle/spotless/KotlinGradleExtensionTest.java index d1ffff0718..034174cf73 100644 --- a/plugin-gradle/src/test/java/com/diffplug/gradle/spotless/KotlinGradleExtensionTest.java +++ b/plugin-gradle/src/test/java/com/diffplug/gradle/spotless/KotlinGradleExtensionTest.java @@ -16,6 +16,7 @@ package com.diffplug.gradle.spotless; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.condition.JRE.JAVA_11; import java.io.IOException; @@ -137,13 +138,13 @@ void withExperimental() throws IOException { "}", "repositories { mavenCentral() }", "spotless {", - " kotlin {", + " kotlinGradle {", " ktlint().setUseExperimental(true)", " }", "}"); - setFile("src/main/kotlin/experimental.kt").toResource("kotlin/ktlint/experimental.dirty"); + setFile("configuration.gradle.kts").toResource("kotlin/ktlint/experimental.dirty"); gradleRunner().withArguments("spotlessApply").build(); - assertFile("src/main/kotlin/experimental.kt").sameAsResource("kotlin/ktlint/experimental.clean"); + assertFile("configuration.gradle.kts").sameAsResource("kotlin/ktlint/experimental.clean"); } @Test @@ -155,13 +156,57 @@ void withExperimental_0_32() throws IOException { "}", "repositories { mavenCentral() }", "spotless {", - " kotlin {", + " kotlinGradle {", " ktlint('0.32.0').setUseExperimental(true)", " }", "}"); - setFile("src/main/kotlin/basic.kt").toResource("kotlin/ktlint/basic.dirty"); + setFile("configuration.gradle.kts").toResource("kotlin/ktlint/basic.dirty"); + gradleRunner().withArguments("spotlessApply").build(); + assertFile("configuration.gradle.kts").sameAsResource("kotlin/ktlint/basic.clean"); + } + + @Test + void withExperimentalEditorConfigOverride() throws IOException { + setFile("build.gradle").toLines( + "plugins {", + " id 'org.jetbrains.kotlin.jvm' version '1.5.31'", + " id 'com.diffplug.spotless'", + "}", + "repositories { mavenCentral() }", + "spotless {", + " kotlinGradle {", + " ktlint().setUseExperimental(true)", + " .editorConfigOverride([", + " ij_kotlin_allow_trailing_comma: true,", + " ij_kotlin_allow_trailing_comma_on_call_site: true", + " ])", + " }", + "}"); + setFile("configuration.gradle.kts").toResource("kotlin/ktlint/experimentalEditorConfigOverride.dirty"); gradleRunner().withArguments("spotlessApply").build(); - assertFile("src/main/kotlin/basic.kt").sameAsResource("kotlin/ktlint/basic.clean"); + assertFile("configuration.gradle.kts").sameAsResource("kotlin/ktlint/experimentalEditorConfigOverride.clean"); + } + + @Test + void withEditorConfigOverride_0_45_1() throws IOException { + setFile("build.gradle").toLines( + "plugins {", + " id 'org.jetbrains.kotlin.jvm' version '1.5.31'", + " id 'com.diffplug.spotless'", + "}", + "repositories { mavenCentral() }", + "spotless {", + " kotlinGradle {", + " ktlint('0.45.1')", + " .editorConfigOverride([", + " indent_size: 5", + " ])", + " }", + "}"); + setFile("configuration.gradle.kts").toResource("kotlin/ktlint/basic.dirty"); + Throwable error = assertThrows(Throwable.class, + () -> gradleRunner().withArguments("spotlessApply").build()); + assertThat(error).hasMessageContaining("KtLint editorConfigOverride supported for version 0.45.2 and later"); } /** @@ -180,13 +225,13 @@ void experimentalSampleUnchangedWithDefaultRuleset() throws IOException { "}", "repositories { mavenCentral() }", "spotless {", - " kotlin {", + " kotlinGradle {", " ktlint()", " }", "}"); - setFile("src/main/kotlin/experimental.kt").toResource("kotlin/ktlint/experimental.dirty"); + setFile("configuration.gradle.kts").toResource("kotlin/ktlint/experimental.dirty"); gradleRunner().withArguments("spotlessApply").build(); - assertFile("src/main/kotlin/experimental.kt").sameAsResource("kotlin/ktlint/experimental.dirty"); + assertFile("configuration.gradle.kts").sameAsResource("kotlin/ktlint/experimental.dirty"); } @Test diff --git a/testlib/src/main/resources/kotlin/ktlint/experimentalEditorConfigOverride.clean b/testlib/src/main/resources/kotlin/ktlint/experimentalEditorConfigOverride.clean new file mode 100644 index 0000000000..532177d038 --- /dev/null +++ b/testlib/src/main/resources/kotlin/ktlint/experimentalEditorConfigOverride.clean @@ -0,0 +1,5 @@ +fun main() { + val list = listOf( + "hello", + ) +} diff --git a/testlib/src/main/resources/kotlin/ktlint/experimentalEditorConfigOverride.dirty b/testlib/src/main/resources/kotlin/ktlint/experimentalEditorConfigOverride.dirty new file mode 100644 index 0000000000..1610d6ba6d --- /dev/null +++ b/testlib/src/main/resources/kotlin/ktlint/experimentalEditorConfigOverride.dirty @@ -0,0 +1,5 @@ +fun main() { + val list = listOf( + "hello" + ) +} diff --git a/testlib/src/test/java/com/diffplug/spotless/kotlin/KtLintStepTest.java b/testlib/src/test/java/com/diffplug/spotless/kotlin/KtLintStepTest.java index ecca9e6cc6..af61ac4cd0 100644 --- a/testlib/src/test/java/com/diffplug/spotless/kotlin/KtLintStepTest.java +++ b/testlib/src/test/java/com/diffplug/spotless/kotlin/KtLintStepTest.java @@ -77,6 +77,13 @@ void worksAlpha1() throws Exception { .testResource("kotlin/ktlint/basic.dirty", "kotlin/ktlint/basic.clean"); } + @Test + void worksPre0_45_2() throws Exception { + FormatterStep step = KtLintStep.create("0.45.1", TestProvisioner.mavenCentral()); + StepHarness.forStep(step) + .testResource("kotlin/ktlint/basic.dirty", "kotlin/ktlint/basic.clean"); + } + @Test void equality() throws Exception { new SerializableEqualityTester() {