/
LambdaParameterNaming.kt
53 lines (47 loc) · 2 KB
/
LambdaParameterNaming.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
package io.gitlab.arturbosch.detekt.rules.naming
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.config
import io.gitlab.arturbosch.detekt.api.internal.Configuration
import org.jetbrains.kotlin.psi.KtLambdaExpression
import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.psi.KtParameter
/**
* Reports lambda parameter names that do not follow the specified naming convention.
*/
class LambdaParameterNaming(config: Config = Config.empty) : Rule(config) {
override val issue = Issue(
javaClass.simpleName,
Severity.Style,
"Lambda parameter names should follow the naming convention set in the projects configuration.",
debt = Debt.FIVE_MINS
)
@Configuration("naming pattern")
private val parameterPattern: Regex by config("[a-z][A-Za-z0-9]*|_", String::toRegex)
override fun visitLambdaExpression(lambdaExpression: KtLambdaExpression) {
super.visitLambdaExpression(lambdaExpression)
lambdaExpression.valueParameters
.flatMap { it.getNamedDeclarations() }
.mapNotNull { it.nameIdentifier }
.forEach {
val identifier = it.text
if (!identifier.matches(parameterPattern)) {
report(
CodeSmell(
issue,
Entity.from(it),
message = "Lambda parameter names should match the pattern: $parameterPattern",
)
)
}
}
}
private fun KtParameter.getNamedDeclarations(): List<KtNamedDeclaration> {
return this.destructuringDeclaration?.entries ?: listOf(this)
}
}