Skip to content

Commit 13a36fc

Browse files
committed
Remove deprecated useExperimental parameter in favor of ktlint_${RuleSetId} properties and loading all current RuleSetProviders
1 parent 3bafa6a commit 13a36fc

File tree

17 files changed

+61
-106
lines changed

17 files changed

+61
-106
lines changed

CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (
1313
### Added
1414
* Bump default `ktlint` version to latest `0.49.1` -> `0.50.0`.([#1741](https://github.com/diffplug/spotless/issues/1741))
1515
* 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.
1617
### Changes
1718
* Bump default `cleanthat` version to latest `2.13` -> `2.16`. ([#1725](https://github.com/diffplug/spotless/pull/1725))
1819
### Fixed

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

Lines changed: 7 additions & 10 deletions
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,
83-
Path editorConfigPath, final Map<String, String> userData,
81+
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()) {

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

Lines changed: 7 additions & 16 deletions
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,
127-
Path editorConfigPath, final Map<String, String> userData,
126+
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()) {

lib/src/compatKtLint0Dot50Dot0/java/com/diffplug/spotless/glue/ktlint/compat/KtLintCompat0Dot50Dot0Adapter.java

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,18 @@
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;
2929

3030
import org.slf4j.Logger;
3131
import org.slf4j.LoggerFactory;
3232

33+
import com.pinterest.ktlint.cli.ruleset.core.api.RuleSetProviderV3;
3334
import com.pinterest.ktlint.rule.engine.api.Code;
3435
import com.pinterest.ktlint.rule.engine.api.EditorConfigDefaults;
3536
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;
@@ -85,23 +85,14 @@ public Unit invoke(LintError lint, Boolean corrected) {
8585

8686
@Override
8787
public String format(final String text, Path path, final boolean isScript,
88-
final boolean useExperimental,
89-
Path editorConfigPath, final Map<String, String> userData,
88+
Path editorConfigPath, final Map<String, String> userData,
9089
final Map<String, Object> editorConfigOverrideMap) {
9190
final FormatterCallback formatterCallback = new FormatterCallback();
9291

93-
Set<RuleProvider> allRuleProviders = new LinkedHashSet<>(
94-
new StandardRuleSetProvider().getRuleProviders());
95-
96-
// TODO: Should we keep `useExperimental` now that ktlint uses an EditorConfig property for this purpose?
97-
if (useExperimental) {
98-
String experimentalRulesPropertyName = RuleExecutionEditorConfigPropertyKt.getEXPERIMENTAL_RULES_EXECUTION_PROPERTY().getName();
99-
Object experimentalOverride = editorConfigOverrideMap.get(experimentalRulesPropertyName);
100-
if (experimentalOverride != null) {
101-
logger.warn("`useExperimental` parameter is `true` and `ktlint_experimental` property is set, `useExperimental` will take priority!");
102-
editorConfigOverrideMap.put(experimentalRulesPropertyName, "enabled");
103-
}
104-
}
92+
Set<RuleProvider> allRuleProviders = ServiceLoader.load(RuleSetProviderV3.class, RuleSetProviderV3.class.getClassLoader())
93+
.stream()
94+
.flatMap(loader -> loader.get().getRuleProviders().stream())
95+
.collect(Collectors.toUnmodifiableSet());
10596

10697
EditorConfigOverride editorConfigOverride;
10798
if (editorConfigOverrideMap.isEmpty()) {

lib/src/compatKtLintApi/java/com/diffplug/spotless/glue/ktlint/compat/KtLintCompatAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@
2020

2121
public interface KtLintCompatAdapter {
2222

23-
String format(String text, Path path, boolean isScript, boolean useExperimental, Path editorConfigPath, Map<String, String> userData,
24-
Map<String, Object> editorConfigOverrideMap);
23+
String format(String text, Path path, boolean isScript, Path editorConfigPath, Map<String, String> userData,
24+
Map<String, Object> editorConfigOverrideMap);
2525
}

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,10 @@ public class KtlintFormatterFunc implements FormatterFunc.NeedsFile {
2828
private final Map<String, String> userData;
2929
private final boolean isScript;
3030
private final KtLintCompatAdapter adapter;
31-
private final boolean useExperimental;
3231
private final FileSignature editorConfigPath;
3332
private final Map<String, Object> editorConfigOverrideMap;
3433

35-
public KtlintFormatterFunc(String version, boolean isScript, boolean useExperimental, FileSignature editorConfigPath, Map<String, String> userData,
34+
public KtlintFormatterFunc(String version, boolean isScript, FileSignature editorConfigPath, Map<String, String> userData,
3635
Map<String, Object> editorConfigOverrideMap) {
3736
int minorVersion = Integer.parseInt(version.split("\\.")[1]);
3837
if (minorVersion >= 50) {
@@ -50,7 +49,6 @@ public KtlintFormatterFunc(String version, boolean isScript, boolean useExperime
5049
this.adapter = new KtLintCompat0Dot48Dot0Adapter();
5150
}
5251
this.editorConfigPath = editorConfigPath;
53-
this.useExperimental = useExperimental;
5452
this.editorConfigOverrideMap = editorConfigOverrideMap;
5553
this.userData = userData;
5654
this.isScript = isScript;
@@ -63,6 +61,6 @@ public String applyWithFile(String unix, File file) {
6361
if (editorConfigPath != null) {
6462
absoluteEditorConfigPath = editorConfigPath.getOnlyFile().toPath();
6563
}
66-
return adapter.format(unix, file.toPath(), isScript, useExperimental, absoluteEditorConfigPath, userData, editorConfigOverrideMap);
64+
return adapter.format(unix, file.toPath(), isScript, absoluteEditorConfigPath, userData, editorConfigOverrideMap);
6765
}
6866
}

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

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,28 +46,26 @@ public static FormatterStep create(Provisioner provisioner) {
4646
}
4747

4848
public static FormatterStep create(String version, Provisioner provisioner) {
49-
return create(version, provisioner, false, Collections.emptyMap(), Collections.emptyMap());
49+
return create(version, provisioner, Collections.emptyMap(), Collections.emptyMap());
5050
}
5151

52-
public static FormatterStep create(String version, Provisioner provisioner, boolean useExperimental,
53-
Map<String, String> userData, Map<String, Object> editorConfigOverride) {
54-
return create(version, provisioner, false, useExperimental, null, userData, editorConfigOverride);
52+
public static FormatterStep create(String version, Provisioner provisioner,
53+
Map<String, String> userData, Map<String, Object> editorConfigOverride) {
54+
return create(version, provisioner, false, null, userData, editorConfigOverride);
5555
}
5656

5757
public static FormatterStep createForScript(String version, Provisioner provisioner) {
58-
return create(version, provisioner, true, false, null, Collections.emptyMap(), Collections.emptyMap());
58+
return create(version, provisioner, true, null, Collections.emptyMap(), Collections.emptyMap());
5959
}
6060

6161
public static FormatterStep createForScript(String version,
6262
Provisioner provisioner,
63-
boolean useExperimental,
6463
@Nullable FileSignature editorConfigPath,
6564
Map<String, String> userData,
6665
Map<String, Object> editorConfigOverride) {
6766
return create(version,
6867
provisioner,
6968
true,
70-
useExperimental,
7169
editorConfigPath,
7270
userData,
7371
editorConfigOverride);
@@ -76,14 +74,13 @@ public static FormatterStep createForScript(String version,
7674
public static FormatterStep create(String version,
7775
Provisioner provisioner,
7876
boolean isScript,
79-
boolean useExperimental,
8077
@Nullable FileSignature editorConfig,
8178
Map<String, String> userData,
8279
Map<String, Object> editorConfigOverride) {
8380
Objects.requireNonNull(version, "version");
8481
Objects.requireNonNull(provisioner, "provisioner");
8582
return FormatterStep.createLazy(NAME,
86-
() -> new State(version, provisioner, isScript, useExperimental, editorConfig, userData, editorConfigOverride),
83+
() -> new State(version, provisioner, isScript, editorConfig, userData, editorConfigOverride),
8784
State::createFormat);
8885
}
8986

@@ -98,7 +95,6 @@ static final class State implements Serializable {
9895
private final boolean isScript;
9996
/** The jar that contains the formatter. */
10097
final JarState jarState;
101-
private final boolean useExperimental;
10298
private final TreeMap<String, String> userData;
10399
private final TreeMap<String, Object> editorConfigOverride;
104100
private final String version;
@@ -108,15 +104,13 @@ static final class State implements Serializable {
108104
State(String version,
109105
Provisioner provisioner,
110106
boolean isScript,
111-
boolean useExperimental,
112107
@Nullable FileSignature editorConfigPath,
113108
Map<String, String> userData,
114109
Map<String, Object> editorConfigOverride) throws IOException {
115110
if (BadSemver.version(version) < BadSemver.version(0, 46, 0)) {
116111
throw new IllegalStateException("KtLint versions < 0.46.0 not supported!");
117112
}
118113
this.version = version;
119-
this.useExperimental = useExperimental;
120114
this.userData = new TreeMap<>(userData);
121115
this.editorConfigOverride = new TreeMap<>(editorConfigOverride);
122116
this.jarState = JarState.from(MAVEN_COORDINATE + version, provisioner);
@@ -128,8 +122,8 @@ FormatterFunc createFormat() throws Exception {
128122
final ClassLoader classLoader = jarState.getClassLoader();
129123
Class<?> formatterFunc = classLoader.loadClass("com.diffplug.spotless.glue.ktlint.KtlintFormatterFunc");
130124
Constructor<?> constructor = formatterFunc.getConstructor(
131-
String.class, boolean.class, boolean.class, FileSignature.class, Map.class, Map.class);
132-
return (FormatterFunc.NeedsFile) constructor.newInstance(version, isScript, useExperimental, editorConfigPath, userData, editorConfigOverride);
125+
String.class, boolean.class, FileSignature.class, Map.class, Map.class);
126+
return (FormatterFunc.NeedsFile) constructor.newInstance(version, isScript, editorConfigPath, userData, editorConfigOverride);
133127
}
134128
}
135129
}

lib/src/testCompatKtLint0Dot48Dot0/java/com/diffplug/spotless/glue/ktlint/compat/KtLintCompat0Dot48Dot0AdapterTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public void testDefaults(@TempDir Path path) throws IOException {
4040

4141
Map<String, Object> editorConfigOverrideMap = new HashMap<>();
4242

43-
String formatted = ktLintCompat0Dot48Dot0Adapter.format(text, filePath, false, false, null, userData, editorConfigOverrideMap);
43+
String formatted = ktLintCompat0Dot48Dot0Adapter.format(text, filePath, false, null, userData, editorConfigOverrideMap);
4444
assertEquals("class empty_class_body\n", formatted);
4545
}
4646

@@ -58,7 +58,7 @@ public void testEditorConfigCanDisable(@TempDir Path path) throws IOException {
5858
// ktlint_filename is an invalid rule in ktlint 0.48.0
5959
editorConfigOverrideMap.put("ktlint_filename", "disabled");
6060

61-
String formatted = ktLintCompat0Dot48Dot0Adapter.format(text, filePath, false, false, null, userData, editorConfigOverrideMap);
61+
String formatted = ktLintCompat0Dot48Dot0Adapter.format(text, filePath, false, null, userData, editorConfigOverrideMap);
6262
assertEquals("class fails_no_semicolons {\n\tval i = 0;\n}\n", formatted);
6363
}
6464

lib/src/testCompatKtLint0Dot49Dot0/java/com/diffplug/spotless/glue/ktlint/compat/KtLintCompat0Dot49Dot0AdapterTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public void testDefaults(@TempDir Path path) throws IOException {
4040

4141
Map<String, Object> editorConfigOverrideMap = new HashMap<>();
4242

43-
String formatted = ktLintCompat0Dot49Dot0Adapter.format(text, filePath, false, false, null, userData, editorConfigOverrideMap);
43+
String formatted = ktLintCompat0Dot49Dot0Adapter.format(text, filePath, false, null, userData, editorConfigOverrideMap);
4444
assertEquals("class EmptyClassBody\n", formatted);
4545
}
4646

@@ -56,7 +56,7 @@ public void testEditorConfigCanDisable(@TempDir Path path) throws IOException {
5656
editorConfigOverrideMap.put("indent_style", "tab");
5757
editorConfigOverrideMap.put("ktlint_standard_no-semi", "disabled");
5858

59-
String formatted = ktLintCompat0Dot49Dot0Adapter.format(text, filePath, false, false, null, userData, editorConfigOverrideMap);
59+
String formatted = ktLintCompat0Dot49Dot0Adapter.format(text, filePath, false, null, userData, editorConfigOverrideMap);
6060
assertEquals("class FailsNoSemicolons {\n\tval i = 0;\n}\n", formatted);
6161
}
6262

lib/src/testCompatKtLint0Dot50Dot0/java/com/diffplug/spotless/glue/ktlint/compat/KtLintCompat0Dot50Dot0AdapterTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public void testDefaults(@TempDir Path path) throws IOException {
4040

4141
Map<String, Object> editorConfigOverrideMap = new HashMap<>();
4242

43-
String formatted = KtLintCompat0Dot50Dot0Adapter.format(text, filePath, false, false, null, userData, editorConfigOverrideMap);
43+
String formatted = KtLintCompat0Dot50Dot0Adapter.format(text, filePath, false, null, userData, editorConfigOverrideMap);
4444
assertEquals("class EmptyClassBody\n", formatted);
4545
}
4646

@@ -56,7 +56,7 @@ public void testEditorConfigCanDisable(@TempDir Path path) throws IOException {
5656
editorConfigOverrideMap.put("indent_style", "tab");
5757
editorConfigOverrideMap.put("ktlint_standard_no-semi", "disabled");
5858

59-
String formatted = KtLintCompat0Dot50Dot0Adapter.format(text, filePath, false, false, null, userData, editorConfigOverrideMap);
59+
String formatted = KtLintCompat0Dot50Dot0Adapter.format(text, filePath, false, null, userData, editorConfigOverrideMap);
6060
assertEquals("class FailsNoSemicolons {\n\tval i = 0;\n}\n", formatted);
6161
}
6262

plugin-gradle/CHANGES.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (
44

55
## [Unreleased]
66
### Added
7-
* Bump default `ktlint` version to latest `0.49.1` -> `0.50.0`.([#1741](https://github.com/diffplug/spotless/issues/1741))
7+
* Bump default `ktlint` version to latest `0.49.1` -> `0.50.0`. ([#1741](https://github.com/diffplug/spotless/issues/1741))
88
* Dropped support for `ktlint 0.47.x` following our policy of supporting two breaking changes at a time.
9+
* Dropped support for deprecated `useExperimental` parameter in favor of the `ktlint_experimental` property.
910
### Fixed
1011
* Correctly support the syntax
1112
```

plugin-gradle/README.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -397,9 +397,8 @@ Additionally, `editorConfigOverride` options will override what's supplied in `.
397397
```kotlin
398398
spotless {
399399
kotlin {
400-
// version, setUseExperimental, userData and editorConfigOverride are all optional
401-
ktlint("0.45.2")
402-
.setUseExperimental(true)
400+
// version, userData and editorConfigOverride are all optional
401+
ktlint("0.50.0")
403402
.userData(mapOf("android" to "true"))
404403
.setEditorConfigPath("$projectDir/config/.editorconfig") // sample unusual placement
405404
.editorConfigOverride(mapOf("indent_size" to 2))

0 commit comments

Comments
 (0)