Skip to content

Commit dcfd57c

Browse files
authored
Support ktlint 0.50.0 and drop support for 0.47.0 (#1748 resolves #1741)
2 parents b27632e + c0bee92 commit dcfd57c

File tree

25 files changed

+356
-281
lines changed

25 files changed

+356
-281
lines changed

CHANGES.md

+4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ This document is intended for Spotless developers.
1010
We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (starting after version `1.27.0`).
1111

1212
## [Unreleased]
13+
### Added
14+
* Bump default `ktlint` version to latest `0.49.1` -> `0.50.0`.([#1741](https://github.com/diffplug/spotless/issues/1741))
15+
* Dropped support for `ktlint 0.47.x` following our policy of supporting two breaking changes at a time.
16+
* Dropped support for deprecated `useExperimental` parameter in favor of the `ktlint_experimental` property.
1317
### Changes
1418
* Bump default `cleanthat` version to latest `2.13` -> `2.16`. ([#1725](https://github.com/diffplug/spotless/pull/1725))
1519
### Fixed

lib/build.gradle

+7-5
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ versionCompatibility {
4444
// we will support no more than 2 breaking changes at a time = 3 incompatible versions
4545
// we will try to drop down to only one version if a stable API can be maintained for a full year
4646
versions = [
47-
'0.47.0',
4847
'0.48.0',
4948
'0.49.0',
49+
'0.50.0',
5050
]
5151
targetSourceSetName = 'ktlint'
5252
}
@@ -95,16 +95,18 @@ dependencies {
9595
strictly '1.7' // for JDK 8 compatibility
9696
}
9797
}
98-
// ktlint
99-
compatKtLint0Dot47Dot0CompileOnly 'com.pinterest.ktlint:ktlint-core:0.47.0'
100-
compatKtLint0Dot47Dot0CompileOnly 'com.pinterest.ktlint:ktlint-ruleset-experimental:0.47.0'
101-
compatKtLint0Dot47Dot0CompileOnly 'com.pinterest.ktlint:ktlint-ruleset-standard:0.47.0'
98+
// ktlint oldest supported version
10299
compatKtLint0Dot48Dot0CompileAndTestOnly 'com.pinterest.ktlint:ktlint-core:0.48.0'
103100
compatKtLint0Dot48Dot0CompileAndTestOnly 'com.pinterest.ktlint:ktlint-ruleset-experimental:0.48.0'
104101
compatKtLint0Dot48Dot0CompileAndTestOnly 'com.pinterest.ktlint:ktlint-ruleset-standard:0.48.0'
102+
// ktlint previous supported version
105103
compatKtLint0Dot49Dot0CompileAndTestOnly 'com.pinterest.ktlint:ktlint-rule-engine:0.49.0'
106104
compatKtLint0Dot49Dot0CompileAndTestOnly 'com.pinterest.ktlint:ktlint-ruleset-standard:0.49.0'
107105
compatKtLint0Dot49Dot0CompileAndTestOnly 'org.slf4j:slf4j-api:2.0.0'
106+
// ktlint latest supported version
107+
compatKtLint0Dot50Dot0CompileAndTestOnly 'com.pinterest.ktlint:ktlint-rule-engine:0.50.0'
108+
compatKtLint0Dot50Dot0CompileAndTestOnly 'com.pinterest.ktlint:ktlint-ruleset-standard:0.50.0'
109+
compatKtLint0Dot50Dot0CompileAndTestOnly 'org.slf4j:slf4j-api:2.0.0'
108110
// palantirJavaFormat
109111
palantirJavaFormatCompileOnly 'com.palantir.javaformat:palantir-java-format:1.1.0' // this version needs to stay compilable against Java 8 for CI Job testNpm
110112
// scalafmt

lib/src/compatKtLint0Dot47Dot0/java/com/diffplug/spotless/glue/ktlint/compat/KtLintCompat0Dot47Dot0Adapter.java

-139
This file was deleted.

lib/src/compatKtLint0Dot48Dot0/java/com/diffplug/spotless/glue/ktlint/compat/KtLintCompat0Dot48Dot0Adapter.java

+14-15
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
import java.nio.file.Path;
2020
import java.util.ArrayList;
2121
import java.util.Collections;
22-
import java.util.LinkedHashSet;
2322
import java.util.List;
2423
import java.util.Map;
2524
import java.util.Objects;
25+
import java.util.ServiceLoader;
2626
import java.util.Set;
2727
import java.util.stream.Collectors;
2828
import java.util.stream.Stream;
@@ -31,6 +31,7 @@
3131
import com.pinterest.ktlint.core.LintError;
3232
import com.pinterest.ktlint.core.Rule;
3333
import com.pinterest.ktlint.core.RuleProvider;
34+
import com.pinterest.ktlint.core.RuleSetProviderV2;
3435
import com.pinterest.ktlint.core.api.EditorConfigDefaults;
3536
import com.pinterest.ktlint.core.api.EditorConfigOverride;
3637
import com.pinterest.ktlint.core.api.UsesEditorConfigProperties;
@@ -42,8 +43,6 @@
4243
import com.pinterest.ktlint.core.api.editorconfig.InsertFinalNewLineEditorConfigPropertyKt;
4344
import com.pinterest.ktlint.core.api.editorconfig.MaxLineLengthEditorConfigPropertyKt;
4445
import com.pinterest.ktlint.core.api.editorconfig.RuleExecutionEditorConfigPropertyKt;
45-
import com.pinterest.ktlint.ruleset.experimental.ExperimentalRuleSetProvider;
46-
import com.pinterest.ktlint.ruleset.standard.StandardRuleSetProvider;
4746

4847
import kotlin.Pair;
4948
import kotlin.Unit;
@@ -79,16 +78,14 @@ public Unit invoke(LintError lint, Boolean corrected) {
7978

8079
@Override
8180
public String format(final String text, Path path, final boolean isScript,
82-
final boolean useExperimental,
8381
Path editorConfigPath, final Map<String, String> userData,
8482
final Map<String, Object> editorConfigOverrideMap) {
8583
final FormatterCallback formatterCallback = new FormatterCallback();
8684

87-
Set<RuleProvider> allRuleProviders = new LinkedHashSet<>(
88-
new StandardRuleSetProvider().getRuleProviders());
89-
if (useExperimental) {
90-
allRuleProviders.addAll(new ExperimentalRuleSetProvider().getRuleProviders());
91-
}
85+
Set<RuleProvider> allRuleProviders = ServiceLoader.load(RuleSetProviderV2.class, RuleSetProviderV2.class.getClassLoader())
86+
.stream()
87+
.flatMap(loader -> loader.get().getRuleProviders().stream())
88+
.collect(Collectors.toUnmodifiableSet());
9289

9390
EditorConfigOverride editorConfigOverride;
9491
if (editorConfigOverrideMap.isEmpty()) {
@@ -111,7 +108,7 @@ public String format(final String text, Path path, final boolean isScript,
111108
editorConfig,
112109
editorConfigOverride,
113110
false)
114-
.format(path, formatterCallback);
111+
.format(path, formatterCallback);
115112
}
116113

117114
/**
@@ -134,9 +131,8 @@ private static EditorConfigOverride createEditorConfigOverride(final List<Rule>
134131
Pair<EditorConfigProperty<?>, ?>[] properties = editorConfigOverrideMap.entrySet().stream()
135132
.map(entry -> {
136133
EditorConfigProperty<?> property = supportedProperties.get(entry.getKey());
137-
if (property != null) {
138-
return new Pair<>(property, entry.getValue());
139-
} else if (entry.getKey().startsWith("ktlint_")) {
134+
135+
if (property == null && entry.getKey().startsWith("ktlint_")) {
140136
String[] parts = entry.getKey().substring(7).split("_", 2);
141137
if (parts.length == 1) {
142138
// convert ktlint_{ruleset} to {ruleset}
@@ -147,9 +143,12 @@ private static EditorConfigOverride createEditorConfigOverride(final List<Rule>
147143
String qualifiedRuleId = parts[0] + ":" + parts[1];
148144
property = RuleExecutionEditorConfigPropertyKt.createRuleExecutionEditorConfigProperty(qualifiedRuleId);
149145
}
150-
return new Pair<>(property, entry.getValue());
151-
} else {
146+
}
147+
148+
if (property == null) {
152149
return null;
150+
} else {
151+
return new Pair<>(property, entry.getValue());
153152
}
154153
})
155154
.filter(Objects::nonNull)

lib/src/compatKtLint0Dot49Dot0/java/com/diffplug/spotless/glue/ktlint/compat/KtLintCompat0Dot49Dot0Adapter.java

+17-24
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,18 @@
2121
import java.nio.file.Path;
2222
import java.util.ArrayList;
2323
import java.util.Collections;
24-
import java.util.LinkedHashSet;
2524
import java.util.List;
2625
import java.util.Map;
2726
import java.util.Objects;
27+
import java.util.ServiceLoader;
2828
import java.util.Set;
2929
import java.util.stream.Collectors;
3030
import java.util.stream.Stream;
3131

3232
import org.slf4j.Logger;
3333
import org.slf4j.LoggerFactory;
3434

35+
import com.pinterest.ktlint.cli.ruleset.core.api.RuleSetProviderV3;
3536
import com.pinterest.ktlint.rule.engine.api.Code;
3637
import com.pinterest.ktlint.rule.engine.api.EditorConfigDefaults;
3738
import com.pinterest.ktlint.rule.engine.api.EditorConfigOverride;
@@ -48,7 +49,6 @@
4849
import com.pinterest.ktlint.rule.engine.core.api.editorconfig.MaxLineLengthEditorConfigPropertyKt;
4950
import com.pinterest.ktlint.rule.engine.core.api.editorconfig.RuleExecution;
5051
import com.pinterest.ktlint.rule.engine.core.api.editorconfig.RuleExecutionEditorConfigPropertyKt;
51-
import com.pinterest.ktlint.ruleset.standard.StandardRuleSetProvider;
5252

5353
import kotlin.Pair;
5454
import kotlin.Unit;
@@ -123,23 +123,14 @@ public Unit invoke(LintError lint, Boolean corrected) {
123123

124124
@Override
125125
public String format(final String text, Path path, final boolean isScript,
126-
final boolean useExperimental,
127126
Path editorConfigPath, final Map<String, String> userData,
128127
final Map<String, Object> editorConfigOverrideMap) {
129128
final FormatterCallback formatterCallback = new FormatterCallback();
130129

131-
Set<RuleProvider> allRuleProviders = new LinkedHashSet<>(
132-
new StandardRuleSetProvider().getRuleProviders());
133-
134-
// TODO: Should we keep `useExperimental` now that ktlint uses an EditorConfig property for this purpose?
135-
if (useExperimental) {
136-
String experimentalRulesPropertyName = RuleExecutionEditorConfigPropertyKt.getEXPERIMENTAL_RULES_EXECUTION_PROPERTY().getName();
137-
Object experimentalOverride = editorConfigOverrideMap.get(experimentalRulesPropertyName);
138-
if (experimentalOverride != null) {
139-
logger.warn("`useExperimental` parameter is `true` and `ktlint_experimental` property is set, `useExperimental` will take priority!");
140-
editorConfigOverrideMap.put(experimentalRulesPropertyName, "enabled");
141-
}
142-
}
130+
Set<RuleProvider> allRuleProviders = ServiceLoader.load(RuleSetProviderV3.class, RuleSetProviderV3.class.getClassLoader())
131+
.stream()
132+
.flatMap(loader -> loader.get().getRuleProviders().stream())
133+
.collect(Collectors.toUnmodifiableSet());
143134

144135
EditorConfigOverride editorConfigOverride;
145136
if (editorConfigOverrideMap.isEmpty()) {
@@ -184,22 +175,24 @@ private static EditorConfigOverride createEditorConfigOverride(final List<Rule>
184175
Pair<EditorConfigProperty<?>, ?>[] properties = editorConfigOverrideMap.entrySet().stream()
185176
.map(entry -> {
186177
EditorConfigProperty<?> property = supportedProperties.get(entry.getKey());
187-
if (property != null) {
188-
return new Pair<>(property, entry.getValue());
189-
} else if (entry.getKey().startsWith("ktlint_")) {
178+
179+
if (property == null && entry.getKey().startsWith("ktlint_")) {
190180
String[] parts = entry.getKey().substring(7).split("_", 2);
191181
if (parts.length == 1) {
192182
// convert ktlint_{ruleset} to {ruleset}
193-
String qualifiedRuleId = parts[0] + ":";
194-
property = createRuleSetExecution(qualifiedRuleId, RuleExecution.disabled);
183+
String id = parts[0];
184+
property = createRuleSetExecution(id, RuleExecution.enabled);
195185
} else {
196186
// convert ktlint_{ruleset}_{rulename} to {ruleset}:{rulename}
197-
String qualifiedRuleId = parts[0] + ":" + parts[1];
198-
property = createRuleExecution(qualifiedRuleId, RuleExecution.disabled);
187+
String id = parts[0] + ":" + parts[1];
188+
property = createRuleExecution(id, RuleExecution.enabled);
199189
}
200-
return new Pair<>(property, entry.getValue());
201-
} else {
190+
}
191+
192+
if (property == null) {
202193
return null;
194+
} else {
195+
return new Pair<>(property, entry.getValue());
203196
}
204197
})
205198
.filter(Objects::nonNull)

0 commit comments

Comments
 (0)