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

Implemented max lines width changing support for Kotlin ktfmt formatter for Gradle plugin. #1145

Merged
merged 2 commits into from Mar 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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
}