/
NamingRules.kt
120 lines (107 loc) · 5.46 KB
/
NamingRules.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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package io.gitlab.arturbosch.detekt.rules.naming
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.Rule
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtConstructor
import org.jetbrains.kotlin.psi.KtEnumEntry
import org.jetbrains.kotlin.psi.KtLambdaExpression
import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.KtObjectDeclaration
import org.jetbrains.kotlin.psi.KtPackageDirective
import org.jetbrains.kotlin.psi.KtParameter
import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.KtVariableDeclaration
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
class NamingRules(config: Config = Config.empty) :
@Suppress("DEPRECATION")
io.gitlab.arturbosch.detekt.api.MultiRule() {
private val variableNamingRule = VariableNaming(config)
private val variableMinNameLengthRule = VariableMinLength(config)
private val variableMaxNameLengthRule = VariableMaxLength(config)
private val topLevelPropertyRule = TopLevelPropertyNaming(config)
private val objectConstantNamingRule = ObjectPropertyNaming(config)
private val nonBooleanPropertyPrefixedWithIsRule = NonBooleanPropertyPrefixedWithIs(config)
private val packageNamingRule = PackageNaming(config)
private val classOrObjectNamingRule = ClassNaming(config)
private val enumEntryNamingRule = EnumNaming(config)
private val functionNamingRule = FunctionNaming(config)
private val functionMaxNameLengthRule = FunctionMaxLength(config)
private val functionMinNameLengthRule = FunctionMinLength(config)
private val forbiddenClassNameRule = ForbiddenClassName(config)
private val constructorParameterNamingRule = ConstructorParameterNaming(config)
private val functionParameterNamingRule = FunctionParameterNaming(config)
private val lambdaParameterNamingRule = LambdaParameterNaming(config)
private val booleanPropertyNamingRule = BooleanPropertyNaming(config)
override val rules: List<Rule> = listOf(
variableNamingRule,
variableMinNameLengthRule,
variableMaxNameLengthRule,
topLevelPropertyRule,
objectConstantNamingRule,
nonBooleanPropertyPrefixedWithIsRule,
packageNamingRule,
classOrObjectNamingRule,
enumEntryNamingRule,
functionNamingRule,
functionMaxNameLengthRule,
functionMinNameLengthRule,
forbiddenClassNameRule,
constructorParameterNamingRule,
functionParameterNamingRule,
lambdaParameterNamingRule,
booleanPropertyNamingRule,
)
override fun visitPackageDirective(directive: KtPackageDirective) {
super.visitPackageDirective(directive)
packageNamingRule.runIfActive { visitPackageDirective(directive) }
}
override fun visitNamedDeclaration(declaration: KtNamedDeclaration) {
if (declaration.nameAsSafeName.isSpecial) {
return
}
if (declaration.nameIdentifier?.parent?.javaClass != null) {
when (declaration) {
is KtProperty -> handleProperty(declaration)
is KtNamedFunction -> handleFunction(declaration)
is KtEnumEntry -> enumEntryNamingRule.runIfActive { visitEnumEntry(declaration) }
is KtClassOrObject -> handleClassOrObject(declaration)
is KtParameter -> handleParameter(declaration)
}
}
super.visitNamedDeclaration(declaration)
}
private fun handleClassOrObject(declaration: KtClassOrObject) {
classOrObjectNamingRule.runIfActive { visitClassOrObject(declaration) }
forbiddenClassNameRule.runIfActive { visitClassOrObject(declaration) }
}
private fun handleFunction(declaration: KtNamedFunction) {
functionNamingRule.runIfActive { visitNamedFunction(declaration) }
functionMaxNameLengthRule.runIfActive { visitNamedFunction(declaration) }
functionMinNameLengthRule.runIfActive { visitNamedFunction(declaration) }
}
private fun handleProperty(declaration: KtProperty) {
variableMaxNameLengthRule.runIfActive { visitProperty(declaration) }
variableMinNameLengthRule.runIfActive { visitProperty(declaration) }
nonBooleanPropertyPrefixedWithIsRule.runIfActive { visitProperty(declaration) }
booleanPropertyNamingRule.runIfActive { visitProperty(declaration) }
when {
declaration.isTopLevel -> topLevelPropertyRule.runIfActive { visitProperty(declaration) }
declaration.withinObjectDeclaration() -> objectConstantNamingRule.runIfActive { visitProperty(declaration) }
else -> variableNamingRule.runIfActive { visitProperty(declaration) }
}
}
private fun handleParameter(declaration: KtParameter) {
when (declaration.ownerFunction) {
is KtConstructor<*> -> constructorParameterNamingRule.runIfActive { visitParameter(declaration) }
is KtNamedFunction -> functionParameterNamingRule.runIfActive { visitParameter(declaration) }
}
}
override fun visitLambdaExpression(lambdaExpression: KtLambdaExpression) {
super.visitLambdaExpression(lambdaExpression)
lambdaExpression.valueParameters
.forEach { lambdaParameterNamingRule.runIfActive { visitParameter(it) } }
}
private fun KtVariableDeclaration.withinObjectDeclaration(): Boolean =
this.getNonStrictParentOfType<KtObjectDeclaration>() != null
}