Skip to content

Commit 6dc01fa

Browse files
committed
Fix ktlint 0.48
1 parent d9eae0d commit 6dc01fa

File tree

9 files changed

+119
-27
lines changed

9 files changed

+119
-27
lines changed

gradle.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# To fix metaspace errors
22
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=1024m -Dfile.encoding=UTF-8
3+
org.gradle.parallel=true
4+
org.gradle.caching=true
35
name=spotless
46
description=Spotless - keep your code spotless with Gradle
57
org=diffplug

lib/build.gradle

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ versionCompatibility {
3434
'0.45.2',
3535
'0.46.0',
3636
'0.47.0',
37-
'0.48.0',
37+
'0.48.1',
3838
]
3939
targetSourceSetName = 'ktlint'
4040
}
@@ -91,9 +91,9 @@ dependencies {
9191
compatKtLint0Dot47Dot0CompileOnly 'com.pinterest.ktlint:ktlint-core:0.47.0'
9292
compatKtLint0Dot47Dot0CompileOnly 'com.pinterest.ktlint:ktlint-ruleset-experimental:0.47.0'
9393
compatKtLint0Dot47Dot0CompileOnly 'com.pinterest.ktlint:ktlint-ruleset-standard:0.47.0'
94-
compatKtLint0Dot48Dot0CompileOnly 'com.pinterest.ktlint:ktlint-core:0.48.0'
95-
compatKtLint0Dot48Dot0CompileOnly 'com.pinterest.ktlint:ktlint-ruleset-experimental:0.48.0'
96-
compatKtLint0Dot48Dot0CompileOnly 'com.pinterest.ktlint:ktlint-ruleset-standard:0.48.0'
94+
compatKtLint0Dot48Dot1CompileOnly 'com.pinterest.ktlint:ktlint-core:0.48.1'
95+
compatKtLint0Dot48Dot1CompileOnly 'com.pinterest.ktlint:ktlint-ruleset-experimental:0.48.1'
96+
compatKtLint0Dot48Dot1CompileOnly 'com.pinterest.ktlint:ktlint-ruleset-standard:0.48.1'
9797

9898
String VER_SCALAFMT="3.6.1"
9999
scalafmtCompileOnly "org.scalameta:scalafmt-core_2.13:$VER_SCALAFMT"
@@ -105,10 +105,16 @@ dependencies {
105105
flexmarkCompileOnly 'com.vladsch.flexmark:flexmark-all:0.62.2'
106106
}
107107

108+
configurations.named('testCompatKtLint0Dot48Dot1Implementation').configure {
109+
extendsFrom(configurations.testImplementation, configurations.compatKtLint0Dot48Dot1CompileOnly)
110+
}
111+
108112
// we'll hold the core lib to a high standard
109113
spotbugs { reportLevel = 'low' } // low|medium|high (low = sensitive to even minor mistakes)
110114

111-
test { useJUnitPlatform() }
115+
tasks.withType(Test).configureEach {
116+
useJUnitPlatform()
117+
}
112118

113119
jar {
114120
for (glue in NEEDS_GLUE) {
Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
*/
1616
package com.diffplug.spotless.glue.ktlint.compat;
1717

18+
import java.nio.file.Paths;
19+
import java.util.ArrayList;
20+
import java.util.Collections;
1821
import java.util.LinkedHashSet;
1922
import java.util.List;
2023
import java.util.Map;
@@ -23,31 +26,53 @@
2326
import java.util.stream.Collectors;
2427
import java.util.stream.Stream;
2528

26-
import com.pinterest.ktlint.core.KtLint;
29+
import com.pinterest.ktlint.core.KtLintRuleEngine;
2730
import com.pinterest.ktlint.core.LintError;
2831
import com.pinterest.ktlint.core.Rule;
2932
import com.pinterest.ktlint.core.RuleProvider;
30-
import com.pinterest.ktlint.core.api.DefaultEditorConfigProperties;
3133
import com.pinterest.ktlint.core.api.EditorConfigDefaults;
3234
import com.pinterest.ktlint.core.api.EditorConfigOverride;
3335
import com.pinterest.ktlint.core.api.UsesEditorConfigProperties;
36+
import com.pinterest.ktlint.core.api.editorconfig.CodeStyleEditorConfigPropertyKt;
37+
import com.pinterest.ktlint.core.api.editorconfig.DisabledRulesEditorConfigPropertyKt;
3438
import com.pinterest.ktlint.core.api.editorconfig.EditorConfigProperty;
39+
import com.pinterest.ktlint.core.api.editorconfig.IndentSizeEditorConfigPropertyKt;
40+
import com.pinterest.ktlint.core.api.editorconfig.IndentStyleEditorConfigPropertyKt;
41+
import com.pinterest.ktlint.core.api.editorconfig.InsertFinalNewLineEditorConfigPropertyKt;
42+
import com.pinterest.ktlint.core.api.editorconfig.MaxLineLengthEditorConfigPropertyKt;
43+
import com.pinterest.ktlint.core.api.editorconfig.RuleExecutionEditorConfigPropertyKt;
3544
import com.pinterest.ktlint.ruleset.experimental.ExperimentalRuleSetProvider;
3645
import com.pinterest.ktlint.ruleset.standard.StandardRuleSetProvider;
3746

3847
import kotlin.Pair;
3948
import kotlin.Unit;
4049
import kotlin.jvm.functions.Function2;
4150

42-
public class KtLintCompat0Dot48Dot0Adapter implements KtLintCompatAdapter {
51+
public class KtLintCompat0Dot48Dot1Adapter implements KtLintCompatAdapter {
52+
53+
private static final List<EditorConfigProperty<?>> DEFAULT_EDITOR_CONFIG_PROPERTIES;
54+
55+
static {
56+
List<EditorConfigProperty<?>> list = new ArrayList<>();
57+
list.add(CodeStyleEditorConfigPropertyKt.getCODE_STYLE_PROPERTY());
58+
//noinspection deprecation
59+
list.add(DisabledRulesEditorConfigPropertyKt.getDISABLED_RULES_PROPERTY());
60+
//noinspection KotlinInternalInJava,deprecation
61+
list.add(DisabledRulesEditorConfigPropertyKt.getKTLINT_DISABLED_RULES_PROPERTY());
62+
list.add(IndentStyleEditorConfigPropertyKt.getINDENT_STYLE_PROPERTY());
63+
list.add(IndentSizeEditorConfigPropertyKt.getINDENT_SIZE_PROPERTY());
64+
list.add(InsertFinalNewLineEditorConfigPropertyKt.getINSERT_FINAL_NEWLINE_PROPERTY());
65+
list.add(MaxLineLengthEditorConfigPropertyKt.getMAX_LINE_LENGTH_PROPERTY());
66+
DEFAULT_EDITOR_CONFIG_PROPERTIES = Collections.unmodifiableList(list);
67+
}
4368

4469
static class FormatterCallback implements Function2<LintError, Boolean, Unit> {
4570
@Override
4671
public Unit invoke(LintError lint, Boolean corrected) {
4772
if (!corrected) {
4873
KtLintCompatReporting.report(lint.getLine(), lint.getCol(), lint.getRuleId(), lint.getDetail());
4974
}
50-
return null;
75+
return Unit.INSTANCE;
5176
}
5277
}
5378

@@ -66,25 +91,18 @@ public String format(final String text, final String name, final boolean isScrip
6691

6792
EditorConfigOverride editorConfigOverride;
6893
if (editorConfigOverrideMap.isEmpty()) {
69-
editorConfigOverride = EditorConfigOverride.Companion.getEmptyEditorConfigOverride();
94+
editorConfigOverride = EditorConfigOverride.Companion.getEMPTY_EDITOR_CONFIG_OVERRIDE();
7095
} else {
7196
editorConfigOverride = createEditorConfigOverride(allRuleProviders.stream().map(
7297
RuleProvider::createNewRuleInstance).collect(
7398
Collectors.toList()),
7499
editorConfigOverrideMap);
75100
}
76101

77-
return KtLint.INSTANCE.format(new KtLint.ExperimentalParams(
78-
name,
79-
text,
80-
allRuleProviders,
81-
userData,
82-
formatterCallback,
83-
isScript,
84-
false,
85-
EditorConfigDefaults.Companion.getEmptyEditorConfigDefaults(),
86-
editorConfigOverride,
87-
false));
102+
EditorConfigDefaults editorConfigDefaults = EditorConfigDefaults.Companion.getEMPTY_EDITOR_CONFIG_DEFAULTS();
103+
boolean isInvokedFromCli = false;
104+
KtLintRuleEngine ktLintRuleEngine = new KtLintRuleEngine(allRuleProviders, editorConfigDefaults, editorConfigOverride, isInvokedFromCli);
105+
return ktLintRuleEngine.format(text, Paths.get(name), formatterCallback);
88106
}
89107

90108
/**
@@ -98,7 +116,7 @@ private static EditorConfigOverride createEditorConfigOverride(final List<Rule>
98116

99117
// Create a mapping of properties to their names based on rule properties and default properties
100118
Map<String, EditorConfigProperty<?>> supportedProperties = Stream
101-
.concat(ruleProperties, DefaultEditorConfigProperties.INSTANCE.getEditorConfigProperties().stream())
119+
.concat(ruleProperties, DEFAULT_EDITOR_CONFIG_PROPERTIES.stream())
102120
.distinct()
103121
.collect(Collectors.toMap(EditorConfigProperty::getName, property -> property));
104122

@@ -109,6 +127,18 @@ private static EditorConfigOverride createEditorConfigOverride(final List<Rule>
109127
EditorConfigProperty<?> property = supportedProperties.get(entry.getKey());
110128
if (property != null) {
111129
return new Pair<>(property, entry.getValue());
130+
} else if (entry.getKey().startsWith("ktlint_")) {
131+
String[] parts = entry.getKey().substring(7).split("_", 2);
132+
if (parts.length == 1) {
133+
// convert ktlint_{ruleset} to {ruleset}
134+
String qualifiedRuleId = parts[0];
135+
property = RuleExecutionEditorConfigPropertyKt.createRuleSetExecutionEditorConfigProperty(qualifiedRuleId);
136+
} else {
137+
// convert ktlint_{ruleset}_{rulename} to {ruleset}:{rulename}
138+
String qualifiedRuleId = parts[0] + ":" + parts[1];
139+
property = RuleExecutionEditorConfigPropertyKt.createRuleExecutionEditorConfigProperty(qualifiedRuleId);
140+
}
141+
return new Pair<>(property, entry.getValue());
112142
} else {
113143
return null;
114144
}

lib/src/ktlint/java/com/diffplug/spotless/glue/ktlint/KtlintFormatterFunc.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import com.diffplug.spotless.glue.ktlint.compat.KtLintCompat0Dot45Dot2Adapter;
2828
import com.diffplug.spotless.glue.ktlint.compat.KtLintCompat0Dot46Dot0Adapter;
2929
import com.diffplug.spotless.glue.ktlint.compat.KtLintCompat0Dot47Dot0Adapter;
30-
import com.diffplug.spotless.glue.ktlint.compat.KtLintCompat0Dot48Dot0Adapter;
30+
import com.diffplug.spotless.glue.ktlint.compat.KtLintCompat0Dot48Dot1Adapter;
3131
import com.diffplug.spotless.glue.ktlint.compat.KtLintCompatAdapter;
3232

3333
public class KtlintFormatterFunc implements FormatterFunc.NeedsFile {
@@ -44,7 +44,7 @@ public KtlintFormatterFunc(String version, boolean isScript, boolean useExperime
4444
int minorVersion = Integer.parseInt(version.split("\\.")[1]);
4545
if (minorVersion >= 48) {
4646
// ExperimentalParams lost two constructor arguments, EditorConfigProperty moved to its own class
47-
this.adapter = new KtLintCompat0Dot48Dot0Adapter();
47+
this.adapter = new KtLintCompat0Dot48Dot1Adapter();
4848
} else if (minorVersion == 47) {
4949
// rename RuleSet to RuleProvider
5050
this.adapter = new KtLintCompat0Dot47Dot0Adapter();

lib/src/main/java/com/diffplug/spotless/kotlin/KtLintStep.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public class KtLintStep {
3333
// prevent direct instantiation
3434
private KtLintStep() {}
3535

36-
private static final String DEFAULT_VERSION = "0.48.0";
36+
private static final String DEFAULT_VERSION = "0.48.1";
3737
static final String NAME = "ktlint";
3838
static final String PACKAGE_PRE_0_32 = "com.github.shyiko";
3939
static final String PACKAGE = "com.pinterest";
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.diffplug.spotless.glue.ktlint.compat;
2+
3+
import java.io.IOException;
4+
import java.io.InputStream;
5+
import java.nio.file.Files;
6+
import java.nio.file.Path;
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
10+
import org.junit.jupiter.api.Test;
11+
import org.junit.jupiter.api.io.TempDir;
12+
13+
import static org.junit.jupiter.api.Assertions.assertEquals;
14+
15+
public class KtLintCompat0Dot48Dot1AdapterTest {
16+
@Test
17+
public void testDefaults(@TempDir Path path) throws IOException {
18+
KtLintCompat0Dot48Dot1Adapter KtLintCompat0Dot48Dot1Adapter = new KtLintCompat0Dot48Dot1Adapter();
19+
try (InputStream is = KtLintCompat0Dot48Dot1AdapterTest.class.getResourceAsStream("/empty_class_body.kt")) {
20+
Files.copy(is, path.resolve("empty_class_body.kt"));
21+
}
22+
String text = new String(Files.readAllBytes(path.resolve("empty_class_body.kt")));
23+
24+
Map<String, String> userData = new HashMap<>();
25+
26+
Map<String, Object> editorConfigOverrideMap = new HashMap<>();
27+
28+
String formatted = KtLintCompat0Dot48Dot1Adapter.format(text, "empty_class_body.kt", false, false, userData, editorConfigOverrideMap);
29+
assertEquals("class empty_class_body\n", formatted);
30+
}
31+
32+
@Test
33+
public void testEditorConfigCanDisable(@TempDir Path path) throws IOException {
34+
KtLintCompat0Dot48Dot1Adapter KtLintCompat0Dot48Dot1Adapter = new KtLintCompat0Dot48Dot1Adapter();
35+
try (InputStream is = KtLintCompat0Dot48Dot1AdapterTest.class.getResourceAsStream("/fails_no_semicolons.kt")) {
36+
Files.copy(is, path.resolve("fails_no_semicolons.kt"));
37+
}
38+
String text = new String(Files.readAllBytes(path.resolve("fails_no_semicolons.kt")));
39+
40+
Map<String, String> userData = new HashMap<>();
41+
42+
Map<String, Object> editorConfigOverrideMap = new HashMap<>();
43+
editorConfigOverrideMap.put("ktlint_standard_no-semi", "disabled");
44+
45+
String formatted = KtLintCompat0Dot48Dot1Adapter.format(text, "fails_no_semicolons.kt", false, false, userData, editorConfigOverrideMap);
46+
assertEquals("class fails_no_semicolons {\n\tval i = 0;\n}\n", formatted);
47+
}
48+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class empty_class_body {
2+
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class fails_no_semicolons {
2+
val i = 0;
3+
}

testlib/src/test/java/com/diffplug/spotless/kotlin/KtLintStepTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ void works0_47_1() {
130130
}
131131

132132
@Test
133-
void works0_48_0() {
134-
FormatterStep step = KtLintStep.create("0.48.0", TestProvisioner.mavenCentral());
133+
void works0_48_1() {
134+
FormatterStep step = KtLintStep.create("0.48.1", TestProvisioner.mavenCentral());
135135
StepHarnessWithFile.forStep(this, step)
136136
.testResource("kotlin/ktlint/basic.dirty", "kotlin/ktlint/basic.clean")
137137
.testResourceExceptionMsg("kotlin/ktlint/unsolvable.dirty").isEqualTo("Error on line: 1, column: 1\n" +

0 commit comments

Comments
 (0)