Skip to content

Commit

Permalink
Implemented max lines width changing support for Kotlin ktfmt formatt…
Browse files Browse the repository at this point in the history
…er for Gradle plugin. (#1145)
  • Loading branch information
nedtwigg committed Mar 28, 2022
2 parents 1ce515b + fb62f36 commit 878b67b
Show file tree
Hide file tree
Showing 17 changed files with 502 additions and 44 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Expand Up @@ -10,6 +10,7 @@ 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 setting custom parameters for Kotlin ktfmt in Gradle and Maven plugins. ([#1145](https://github.com/diffplug/spotless/pull/1145))

## [2.23.0] - 2022-02-15
### Added
Expand Down
10 changes: 10 additions & 0 deletions lib/build.gradle
Expand Up @@ -9,6 +9,7 @@ apply from: rootProject.file('gradle/java-publish.gradle')
def NEEDS_GLUE = [
'sortPom',
'palantirJavaFormat',
'ktfmt',
'ktlint',
'flexmark'
]
Expand All @@ -34,6 +35,15 @@ dependencies {

palantirJavaFormatCompileOnly 'com.palantir.javaformat:palantir-java-format:1.1.0'

String VER_KTFMT = '0.34'
ktfmtCompileOnly "com.facebook:ktfmt:$VER_KTFMT"
String VER_KTLINT_GOOGLE_JAVA_FORMAT = '1.7' // for JDK 8 compatibility
ktfmtCompileOnly("com.google.googlejavaformat:google-java-format") {
version {
strictly VER_KTLINT_GOOGLE_JAVA_FORMAT
}
}

String VER_KTLINT='0.43.2'
ktlintCompileOnly "com.pinterest:ktlint:$VER_KTLINT"
ktlintCompileOnly "com.pinterest.ktlint:ktlint-core:$VER_KTLINT"
Expand Down
@@ -0,0 +1,88 @@
/*
* Copyright 2022 DiffPlug
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.diffplug.spotless.glue.ktfmt;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

import com.facebook.ktfmt.format.Formatter;
import com.facebook.ktfmt.format.FormattingOptions;

import com.diffplug.spotless.FormatterFunc;

public final class KtfmtFormatterFunc implements FormatterFunc {

@Nonnull
private final KtfmtStyle style;

@Nullable
private final KtfmtFormattingOptions ktfmtFormattingOptions;

public KtfmtFormatterFunc() {
this(KtfmtStyle.DEFAULT, null);
}

public KtfmtFormatterFunc(@Nonnull KtfmtStyle style) {
this(style, null);
}

public KtfmtFormatterFunc(@Nullable KtfmtFormattingOptions ktfmtFormattingOptions) {
this(KtfmtStyle.DEFAULT, ktfmtFormattingOptions);
}

public KtfmtFormatterFunc(@Nonnull KtfmtStyle style, @Nullable KtfmtFormattingOptions ktfmtFormattingOptions) {
this.style = style;
this.ktfmtFormattingOptions = ktfmtFormattingOptions;
}

@Nonnull
@Override
public String apply(@Nonnull String input) throws Exception {
return Formatter.format(createFormattingOptions(), input);
}

private FormattingOptions createFormattingOptions() {
FormattingOptions formattingOptions;
switch (style) {
case DEFAULT:
formattingOptions = new FormattingOptions();
break;
case DROPBOX:
formattingOptions = Formatter.DROPBOX_FORMAT;
break;
case GOOGLE:
formattingOptions = Formatter.GOOGLE_FORMAT;
break;
case KOTLIN_LANG:
formattingOptions = Formatter.KOTLINLANG_FORMAT;
break;
default:
throw new IllegalStateException("Unknown formatting option");
}

if (ktfmtFormattingOptions != null) {
formattingOptions = formattingOptions.copy(
formattingOptions.getStyle(),
ktfmtFormattingOptions.getMaxWidth().orElse(formattingOptions.getMaxWidth()),
ktfmtFormattingOptions.getBlockIndent().orElse(formattingOptions.getBlockIndent()),
ktfmtFormattingOptions.getContinuationIndent().orElse(formattingOptions.getBlockIndent()),
ktfmtFormattingOptions.getRemoveUnusedImport().orElse(formattingOptions.getRemoveUnusedImports()),
formattingOptions.getDebuggingPrintOpsAfterFormatting());
}

return formattingOptions;
}
}
@@ -0,0 +1,92 @@
/*
* Copyright 2022 DiffPlug
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.diffplug.spotless.glue.ktfmt;

import java.util.Optional;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

public final class KtfmtFormattingOptions {

@Nullable
private Integer maxWidth;

@Nullable
private Integer blockIndent;

@Nullable
private Integer continuationIndent;

@Nullable
private Boolean removeUnusedImport;

public KtfmtFormattingOptions(
@Nullable Integer maxWidth,
@Nullable Integer blockIndent,
@Nullable Integer continuationIndent,
@Nullable Boolean removeUnusedImport) {
this.maxWidth = maxWidth;
this.blockIndent = blockIndent;
this.continuationIndent = continuationIndent;
this.removeUnusedImport = removeUnusedImport;
}

@Nonnull
public Optional<Integer> getMaxWidth() {
return Optional.ofNullable(maxWidth);
}

@Nonnull
public Optional<Integer> getBlockIndent() {
return Optional.ofNullable(blockIndent);
}

@Nonnull
public Optional<Integer> getContinuationIndent() {
return Optional.ofNullable(continuationIndent);
}

@Nonnull
public Optional<Boolean> getRemoveUnusedImport() {
return Optional.ofNullable(removeUnusedImport);
}

public void setMaxWidth(int maxWidth) {
if (maxWidth <= 0) {
throw new IllegalArgumentException("Max width cannot be negative value or 0");
}
this.maxWidth = maxWidth;
}

public void setBlockIndent(int blockIndent) {
if (blockIndent < 0) {
throw new IllegalArgumentException("Block indent cannot be negative value");
}
this.blockIndent = blockIndent;
}

public void setContinuationIndent(int continuationIndent) {
if (continuationIndent < 0) {
throw new IllegalArgumentException("Continuation indent cannot be negative value");
}
this.continuationIndent = continuationIndent;
}

public void setRemoveUnusedImport(boolean removeUnusedImport) {
this.removeUnusedImport = removeUnusedImport;
}
}
@@ -0,0 +1,20 @@
/*
* Copyright 2022 DiffPlug
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.diffplug.spotless.glue.ktfmt;

public enum KtfmtStyle {
DEFAULT, DROPBOX, GOOGLE, KOTLIN_LANG
}

0 comments on commit 878b67b

Please sign in to comment.