/
DuplicateCaseInWhenExpression.kt
61 lines (56 loc) · 2.07 KB
/
DuplicateCaseInWhenExpression.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package io.gitlab.arturbosch.detekt.rules.bugs
import io.gitlab.arturbosch.detekt.api.CodeSmell
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.Debt
import io.gitlab.arturbosch.detekt.api.Entity
import io.gitlab.arturbosch.detekt.api.Issue
import io.gitlab.arturbosch.detekt.api.Rule
import io.gitlab.arturbosch.detekt.api.Severity
import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault
import org.jetbrains.kotlin.psi.KtWhenExpression
/**
* Flags duplicate `case` statements in `when` expressions.
*
* If a `when` expression contains the same `case` statement multiple times they should be merged. Otherwise, it might be
* easy to miss one of the cases when reading the code, leading to unwanted side effects.
*
* <noncompliant>
* when (i) {
* 1 -> println("one")
* 1 -> println("one")
* else -> println("else")
* }
* </noncompliant>
*
* <compliant>
* when (i) {
* 1 -> println("one")
* else -> println("else")
* }
* </compliant>
*/
@ActiveByDefault(since = "1.0.0")
@Deprecated("Rule deprecated as compiler performs this check by default")
class DuplicateCaseInWhenExpression(config: Config) : Rule(config) {
override val issue = Issue(
"DuplicateCaseInWhenExpression",
Severity.Warning,
"Duplicated `case` statements in a `when` expression detected. Both cases should be merged.",
Debt.TEN_MINS
)
override fun visitWhenExpression(expression: KtWhenExpression) {
val distinctEntries = expression.entries.distinctBy { entry -> entry.conditions.joinToString { it.text } }
if (distinctEntries != expression.entries) {
val duplicateEntries = expression.entries
.subtract(distinctEntries)
.map { entry -> entry.conditions.joinToString { it.text } }
report(
CodeSmell(
issue,
Entity.from(expression),
"When expression has multiple case statements for ${duplicateEntries.joinToString("; ")}."
)
)
}
}
}