@@ -3,6 +3,7 @@ package org.cqfn.diktat.ruleset.rules
3
3
import org.cqfn.diktat.common.config.rules.DIKTAT_COMMON
4
4
import org.cqfn.diktat.common.config.rules.RulesConfig
5
5
import org.cqfn.diktat.common.config.rules.RulesConfigReader
6
+ import org.cqfn.diktat.ruleset.constants.EmitType
6
7
import org.cqfn.diktat.ruleset.constants.Warnings
7
8
import org.cqfn.diktat.ruleset.dummy.DummyWarning
8
9
import org.cqfn.diktat.ruleset.rules.chapter1.FileNaming
@@ -79,8 +80,10 @@ import org.cqfn.diktat.ruleset.rules.chapter6.classes.SingleConstructorRule
79
80
import org.cqfn.diktat.ruleset.rules.chapter6.classes.SingleInitRule
80
81
import org.cqfn.diktat.ruleset.rules.chapter6.classes.StatelessClassesRule
81
82
83
+ import com.pinterest.ktlint.core.Rule
82
84
import com.pinterest.ktlint.core.RuleSet
83
85
import com.pinterest.ktlint.core.RuleSetProvider
86
+ import org.jetbrains.kotlin.com.intellij.lang.ASTNode
84
87
import org.jetbrains.kotlin.org.jline.utils.Levenshtein
85
88
import org.slf4j.LoggerFactory
86
89
@@ -226,10 +229,12 @@ class DiktatRuleSetProvider(private var diktatConfigFile: String = DIKTAT_ANALYS
226
229
.map {
227
230
it.invoke(configRules)
228
231
}
229
- .toTypedArray()
232
+ val orderedRules = rules.mapIndexed { index, rule ->
233
+ if (index != 0 ) OrderedRule (rule, rules[index - 1 ]) else rule
234
+ }
230
235
return RuleSet (
231
236
DIKTAT_RULE_SET_ID ,
232
- * rules
237
+ rules = orderedRules.toTypedArray()
233
238
)
234
239
}
235
240
@@ -262,7 +267,43 @@ class DiktatRuleSetProvider(private var diktatConfigFile: String = DIKTAT_ANALYS
262
267
263
268
private fun resolveConfigFileFromSystemProperty (): String? = System .getProperty(DIKTAT_CONF_PROPERTY )
264
269
270
+ /* *
271
+ * This is a wrapper around Ktlint Rule which adjusts visitorModifiers to keep order with prevRule
272
+ * Added as a workaround after introducing a new logic for sorting KtLint Rules: https://github.com/pinterest/ktlint/issues/1478
273
+ *
274
+ * @property rule KtLink Rule which this class wraps
275
+ *
276
+ * @param prevRule previous KtLink Rule, the wrapped rule is called after prevRule
277
+ */
278
+ internal class OrderedRule (val rule : Rule , prevRule : Rule ) : Rule(rule.id, adjustVisitorModifiers(rule, prevRule)) {
279
+ /* *
280
+ * Delegating a call of this method
281
+ */
282
+ override fun visit (
283
+ node : ASTNode ,
284
+ autoCorrect : Boolean ,
285
+ emit : EmitType
286
+ ) {
287
+ rule.visit(node, autoCorrect, emit)
288
+ }
289
+ }
290
+
265
291
companion object {
266
292
private val log = LoggerFactory .getLogger(DiktatRuleSetProvider ::class .java)
293
+
294
+ private fun adjustVisitorModifiers (rule : Rule , prevRule : Rule ): Set <Rule .VisitorModifier > {
295
+ val visitorModifiers: Set <Rule .VisitorModifier > = rule.visitorModifiers
296
+ require(visitorModifiers.none { it is Rule .VisitorModifier .RunAfterRule }) {
297
+ " Rule ${rule.id} already contains VisitorModifier.RunAfterRule"
298
+ }
299
+ require(rule.id != prevRule.id) {
300
+ " PrevRule has same ID as rule: ${rule.id} "
301
+ }
302
+ return visitorModifiers + Rule .VisitorModifier .RunAfterRule (
303
+ ruleId = prevRule.id,
304
+ loadOnlyWhenOtherRuleIsLoaded = false ,
305
+ runOnlyWhenOtherRuleIsEnabled = false
306
+ )
307
+ }
267
308
}
268
309
}
0 commit comments