Skip to content

Commit 80a209b

Browse files
committed
Add support for KtLint 0.47.0
1 parent 8c59a06 commit 80a209b

File tree

6 files changed

+145
-0
lines changed

6 files changed

+145
-0
lines changed

Diff for: CHANGES.md

+1
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

1414
### Changes
1515
* Extend minimum supported version for `ktlint` to `0.31.0` ([#1303](https://github.com/diffplug/spotless/pull/1303)).
16+
* Support `ktlint` version 0.47.0 ([#1303](https://github.com/diffplug/spotless/pull/1303)) fixes [#1281](https://github.com/diffplug/spotless/issues/1281).
1617

1718
## [2.29.0] - 2022-08-23
1819
### Added

Diff for: lib/build.gradle

+4
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ versionCompatibility {
3333
'0.34.2',
3434
'0.45.2',
3535
'0.46.0',
36+
'0.47.0',
3637
]
3738
targetSourceSetName = 'ktlint'
3839
}
@@ -86,6 +87,9 @@ dependencies {
8687
compatKtLint0Dot46Dot0CompileOnly 'com.pinterest.ktlint:ktlint-core:0.46.0'
8788
compatKtLint0Dot46Dot0CompileOnly 'com.pinterest.ktlint:ktlint-ruleset-experimental:0.46.0'
8889
compatKtLint0Dot46Dot0CompileOnly 'com.pinterest.ktlint:ktlint-ruleset-standard:0.46.0'
90+
compatKtLint0Dot47Dot0CompileOnly 'com.pinterest.ktlint:ktlint-core:0.47.0'
91+
compatKtLint0Dot47Dot0CompileOnly 'com.pinterest.ktlint:ktlint-ruleset-experimental:0.47.0'
92+
compatKtLint0Dot47Dot0CompileOnly 'com.pinterest.ktlint:ktlint-ruleset-standard:0.47.0'
8993

9094
String VER_SCALAFMT="3.5.9"
9195
scalafmtCompileOnly "org.scalameta:scalafmt-core_2.13:$VER_SCALAFMT"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/*
2+
* Copyright 2022 DiffPlug
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.diffplug.spotless.glue.ktlint.compat;
17+
18+
import static java.util.Collections.emptySet;
19+
20+
import java.util.LinkedHashSet;
21+
import java.util.List;
22+
import java.util.Map;
23+
import java.util.Objects;
24+
import java.util.Set;
25+
import java.util.stream.Collectors;
26+
import java.util.stream.Stream;
27+
28+
import com.pinterest.ktlint.core.KtLint;
29+
import com.pinterest.ktlint.core.LintError;
30+
import com.pinterest.ktlint.core.Rule;
31+
import com.pinterest.ktlint.core.RuleProvider;
32+
import com.pinterest.ktlint.core.api.DefaultEditorConfigProperties;
33+
import com.pinterest.ktlint.core.api.EditorConfigDefaults;
34+
import com.pinterest.ktlint.core.api.EditorConfigOverride;
35+
import com.pinterest.ktlint.core.api.UsesEditorConfigProperties;
36+
import com.pinterest.ktlint.ruleset.experimental.ExperimentalRuleSetProvider;
37+
import com.pinterest.ktlint.ruleset.standard.StandardRuleSetProvider;
38+
39+
import kotlin.Pair;
40+
import kotlin.Unit;
41+
import kotlin.jvm.functions.Function2;
42+
43+
public class KtLintCompat0Dot47Dot0Adapter implements KtLintCompatAdapter {
44+
45+
static class FormatterCallback implements Function2<LintError, Boolean, Unit> {
46+
@Override
47+
public Unit invoke(LintError lint, Boolean corrected) {
48+
if (!corrected) {
49+
KtLintCompatReporting.report(lint.getLine(), lint.getCol(), lint.getRuleId(), lint.getDetail());
50+
}
51+
return null;
52+
}
53+
}
54+
55+
@Override
56+
public String format(final String text, final String name, final boolean isScript,
57+
final boolean useExperimental,
58+
final Map<String, String> userData,
59+
final Map<String, Object> editorConfigOverrideMap) {
60+
final FormatterCallback formatterCallback = new FormatterCallback();
61+
62+
Set<RuleProvider> allRuleProviders = new LinkedHashSet<>(
63+
new StandardRuleSetProvider().getRuleProviders());
64+
if (useExperimental) {
65+
allRuleProviders.addAll(new ExperimentalRuleSetProvider().getRuleProviders());
66+
}
67+
68+
EditorConfigOverride editorConfigOverride;
69+
if (editorConfigOverrideMap.isEmpty()) {
70+
editorConfigOverride = EditorConfigOverride.Companion.getEmptyEditorConfigOverride();
71+
} else {
72+
editorConfigOverride = createEditorConfigOverride(allRuleProviders.stream().map(
73+
RuleProvider::createNewRuleInstance).collect(
74+
Collectors.toList()),
75+
editorConfigOverrideMap);
76+
}
77+
78+
return KtLint.INSTANCE.format(new KtLint.ExperimentalParams(
79+
name,
80+
text,
81+
emptySet(),
82+
allRuleProviders,
83+
userData,
84+
formatterCallback,
85+
isScript,
86+
null,
87+
false,
88+
EditorConfigDefaults.Companion.getEmptyEditorConfigDefaults(),
89+
editorConfigOverride,
90+
false));
91+
}
92+
93+
/**
94+
* Create EditorConfigOverride from user provided parameters.
95+
* Calling this method requires KtLint 0.45.2.
96+
*/
97+
private static EditorConfigOverride createEditorConfigOverride(final List<Rule> rules, Map<String, Object> editorConfigOverrideMap) {
98+
// Get properties from rules in the rule sets
99+
Stream<UsesEditorConfigProperties.EditorConfigProperty<?>> ruleProperties = rules.stream()
100+
.filter(rule -> rule instanceof UsesEditorConfigProperties)
101+
.flatMap(rule -> ((UsesEditorConfigProperties) rule).getEditorConfigProperties().stream());
102+
103+
// Create a mapping of properties to their names based on rule properties and default properties
104+
Map<String, UsesEditorConfigProperties.EditorConfigProperty<?>> supportedProperties = Stream
105+
.concat(ruleProperties, DefaultEditorConfigProperties.INSTANCE.getEditorConfigProperties().stream())
106+
.distinct()
107+
.collect(Collectors.toMap(property -> property.getType().getName(), property -> property));
108+
109+
// Create config properties based on provided property names and values
110+
@SuppressWarnings("unchecked")
111+
Pair<UsesEditorConfigProperties.EditorConfigProperty<?>, ?>[] properties = editorConfigOverrideMap.entrySet().stream()
112+
.map(entry -> {
113+
UsesEditorConfigProperties.EditorConfigProperty<?> property = supportedProperties.get(entry.getKey());
114+
if (property != null) {
115+
return new Pair<>(property, entry.getValue());
116+
} else {
117+
return null;
118+
}
119+
})
120+
.filter(Objects::nonNull)
121+
.toArray(Pair[]::new);
122+
123+
return EditorConfigOverride.Companion.from(properties);
124+
}
125+
}

Diff for: plugin-gradle/CHANGES.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (
66

77
### Changes
88
* Extend minimum supported version for `ktlint` to `0.31.0` ([#1303](https://github.com/diffplug/spotless/pull/1303)).
9+
* Support `ktlint` version 0.47.0 ([#1303](https://github.com/diffplug/spotless/pull/1303)) fixes [#1281](https://github.com/diffplug/spotless/issues/1281).
910

1011
## [6.10.0] - 2022-08-23
1112
### Added

Diff for: plugin-maven/CHANGES.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (
66

77
### Changes
88
* Extend minimum supported version for `ktlint` to `0.31.0` ([#1303](https://github.com/diffplug/spotless/pull/1303)).
9+
* Support `ktlint` version 0.47.0 ([#1303](https://github.com/diffplug/spotless/pull/1303)) fixes [#1281](https://github.com/diffplug/spotless/issues/1281).
910

1011
## [2.25.0] - 2022-08-23
1112
### Added

Diff for: testlib/src/test/java/com/diffplug/spotless/kotlin/KtLintStepTest.java

+13
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,19 @@ void works0_46_0() throws Exception {
118118
});
119119
}
120120

121+
@Test
122+
void works0_47_0() throws Exception {
123+
FormatterStep step = KtLintStep.create("0.47.0", TestProvisioner.mavenCentral());
124+
StepHarness.forStep(step)
125+
.testResource("kotlin/ktlint/basic.dirty", "kotlin/ktlint/basic.clean")
126+
.testResourceException("kotlin/ktlint/unsolvable.dirty", assertion -> {
127+
assertion.isInstanceOf(AssertionError.class);
128+
assertion.hasMessage("Error on line: 1, column: 1\n" +
129+
"rule: no-wildcard-imports\n" +
130+
"Wildcard import");
131+
});
132+
}
133+
121134
@Test
122135
void equality() throws Exception {
123136
new SerializableEqualityTester() {

0 commit comments

Comments
 (0)