diff --git a/plugin-gradle/CHANGES.md b/plugin-gradle/CHANGES.md index 4922d385dc..5727e65819 100644 --- a/plugin-gradle/CHANGES.md +++ b/plugin-gradle/CHANGES.md @@ -3,6 +3,7 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (starting after version `3.27.0`). ## [Unreleased] +* Support for ktfmt in KotlinGradleExtension ([#583](https://github.com/diffplug/spotless/pull/583)) ## [4.0.1] - 2020-05-21 ### Fixed 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 88fcc80185..24ab55d9a9 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 @@ -22,6 +22,7 @@ import com.diffplug.common.collect.ImmutableSortedMap; import com.diffplug.spotless.FormatterStep; import com.diffplug.spotless.kotlin.KtLintStep; +import com.diffplug.spotless.kotlin.KtfmtStep; public class KotlinGradleExtension extends FormatExtension { private static final String GRADLE_KOTLIN_DSL_FILE_EXTENSION = "*.gradle.kts"; @@ -65,6 +66,33 @@ private FormatterStep createStep() { } } + /** Uses the [ktfmt](https://github.com/facebookincubator/ktfmt) jar to format source code. */ + public KtfmtConfig ktfmt() { + return ktfmt(KtfmtStep.defaultVersion()); + } + + /** + * Uses the given version of [ktfmt](https://github.com/facebookincubator/ktfmt) to format source + * code. + */ + public KtfmtConfig ktfmt(String version) { + Objects.requireNonNull(version); + return new KtfmtConfig(version); + } + + public class KtfmtConfig { + final String version; + + KtfmtConfig(String version) { + this.version = Objects.requireNonNull(version); + addStep(createStep()); + } + + private FormatterStep createStep() { + return KtfmtStep.create(version, GradleProvisioner.fromProject(getProject())); + } + } + @Override protected void setupTask(SpotlessTask task) { if (target == null) { 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 64a008b6d4..e87fce1741 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 @@ -22,6 +22,8 @@ import org.gradle.testkit.runner.BuildResult; import org.junit.Test; +import com.diffplug.spotless.JreVersion; + public class KotlinGradleExtensionTest extends GradleIntegrationTest { @Test public void integration() throws IOException { @@ -109,6 +111,28 @@ public void indentStep() throws IOException { assertThat(result.getOutput()).contains("Unexpected indentation (4) (it should be 6)"); } + @Test + public void integration_ktfmt() throws IOException { + if (JreVersion.thisVm() == JreVersion._8) { + // ktfmt's dependency, google-java-format 1.8 requires a minimum of JRE 11+. + return; + } + setFile("build.gradle").toLines( + "plugins {", + " id 'nebula.kotlin' version '1.0.6'", + " id 'com.diffplug.gradle.spotless'", + "}", + "repositories { mavenCentral() }", + "spotless {", + " kotlinGradle {", + " ktfmt()", + " }", + "}"); + setFile("configuration.gradle.kts").toResource("kotlin/ktfmt/basic.dirty"); + gradleRunner().withArguments("spotlessApply").build(); + assertFile("configuration.gradle.kts").sameAsResource("kotlin/ktfmt/basic.clean"); + } + @Test public void integration_lint_script_files_without_top_level_declaration() throws IOException { setFile("build.gradle").toLines(