5
5
6
6
package org.jetbrains.kotlin.backend.common
7
7
8
- import org.jetbrains.kotlin.backend.common.checkers.IrElementChecker
9
- import org.jetbrains.kotlin.backend.common.checkers.IrValidationError
10
- import org.jetbrains.kotlin.backend.common.checkers.TreeConsistencyError
11
- import org.jetbrains.kotlin.backend.common.checkers.checkTreeConsistency
12
- import org.jetbrains.kotlin.backend.common.checkers.context.*
13
- import org.jetbrains.kotlin.backend.common.checkers.declaration.*
14
- import org.jetbrains.kotlin.backend.common.checkers.expression.*
15
- import org.jetbrains.kotlin.backend.common.checkers.symbol.IrVisibilityChecker
16
- import org.jetbrains.kotlin.backend.common.checkers.IrSymbolChecker
17
- import org.jetbrains.kotlin.backend.common.checkers.IrTypeChecker
18
- import org.jetbrains.kotlin.backend.common.checkers.type.IrTypeParameterScopeChecker
8
+ import org.jetbrains.kotlin.backend.common.checkers.*
9
+ import org.jetbrains.kotlin.backend.common.checkers.context.CheckerContext
10
+ import org.jetbrains.kotlin.backend.common.checkers.context.ContextUpdater
11
+ import org.jetbrains.kotlin.backend.common.checkers.context.ParentChainUpdater
19
12
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
20
13
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
21
14
import org.jetbrains.kotlin.config.IrVerificationMode
@@ -36,21 +29,6 @@ import org.jetbrains.kotlin.ir.visitors.acceptVoid
36
29
37
30
typealias ReportIrValidationError = (IrFile ? , IrElement , String , List <IrElement >) -> Unit
38
31
39
- data class IrValidatorConfig (
40
- val checkTreeConsistency : Boolean = true ,
41
- val checkTypes : Boolean = false ,
42
- val checkValueScopes : Boolean = false ,
43
- val checkTypeParameterScopes : Boolean = false ,
44
- val checkCrossFileFieldUsage : Boolean = false ,
45
- val checkAllKotlinFieldsArePrivate : Boolean = false ,
46
- val checkVisibilities : Boolean = false ,
47
- val checkVarargTypes : Boolean = false ,
48
- val checkIrExpressionBodyInFunction : Boolean = true ,
49
- val checkUnboundSymbols : Boolean = false ,
50
- val checkInlineFunctionUseSites : InlineFunctionUseSiteChecker ? = null ,
51
- val checkOverridePrivateDeclaration : Boolean = true ,
52
- )
53
-
54
32
private class IrValidator (
55
33
val validatorConfig : IrValidatorConfig ,
56
34
val irBuiltIns : IrBuiltIns ,
@@ -78,62 +56,10 @@ private class IrFileValidator(
78
56
config : IrValidatorConfig ,
79
57
private val context : CheckerContext
80
58
) : IrTreeSymbolsVisitor() {
81
- private val contextUpdaters: MutableSet <ContextUpdater > = mutableSetOf (ParentChainUpdater )
82
- private val elementCheckers: MutableList <IrElementChecker <* >> = mutableListOf (
83
- IrSetValueAssignabilityChecker ,
84
- IrFunctionDispatchReceiverChecker , IrFunctionParametersChecker , IrConstructorReceiverChecker ,
85
- IrTypeOperatorTypeOperandChecker ,
86
- IrPropertyAccessorsChecker , IrFunctionPropertiesChecker ,
87
- )
88
- private val symbolCheckers: MutableList <IrSymbolChecker > = mutableListOf ()
89
- private val typeCheckers: MutableList <IrTypeChecker > = mutableListOf ()
90
-
91
- init {
92
- if (config.checkValueScopes) {
93
- elementCheckers.add(IrValueAccessScopeChecker )
94
- }
95
- if (config.checkTypeParameterScopes) {
96
- typeCheckers.add(IrTypeParameterScopeChecker )
97
- }
98
- if (config.checkAllKotlinFieldsArePrivate) {
99
- elementCheckers.add(IrFieldVisibilityChecker )
100
- }
101
- if (config.checkCrossFileFieldUsage) {
102
- elementCheckers.add(IrCrossFileFieldUsageChecker )
103
- }
104
- if (config.checkVisibilities) {
105
- symbolCheckers.add(IrVisibilityChecker )
106
- }
107
- if (config.checkVarargTypes) {
108
- elementCheckers.add(IrVarargTypesChecker )
109
- elementCheckers.add(IrValueParameterVarargTypesChecker )
110
- }
111
- if (config.checkTypes) {
112
- elementCheckers.add(IrConstTypeChecker )
113
- elementCheckers.add(IrStringConcatenationTypeChecker )
114
- elementCheckers.add(IrGetObjectValueTypeChecker )
115
- elementCheckers.add(IrGetValueTypeChecker )
116
- elementCheckers.add(IrUnitTypeExpressionChecker )
117
- elementCheckers.add(IrNothingTypeExpressionChecker )
118
- elementCheckers.add(IrGetFieldTypeChecker )
119
- elementCheckers.add(IrCallTypeChecker )
120
- elementCheckers.add(IrTypeOperatorTypeChecker )
121
- elementCheckers.add(IrDynamicTypeFieldAccessChecker )
122
- }
123
- if (config.checkIrExpressionBodyInFunction) {
124
- elementCheckers.add(IrExpressionBodyInFunctionChecker )
125
- }
126
- if (config.checkOverridePrivateDeclaration) {
127
- elementCheckers.add(IrPrivateDeclarationOverrideChecker )
128
- }
129
- config.checkInlineFunctionUseSites?.let {
130
- elementCheckers.add(IrNoInlineUseSitesChecker (it))
131
- }
132
-
133
- for (checker in elementCheckers + symbolCheckers + typeCheckers) {
134
- contextUpdaters + = checker.requiredContextUpdaters
135
- }
136
- }
59
+ private val contextUpdaters: List <ContextUpdater > = listOf (ParentChainUpdater ) + config.checkers.flatMap { it.requiredContextUpdaters }
60
+ private val elementCheckers: List <IrElementChecker <* >> = config.checkers.filterIsInstance<IrElementChecker <* >>()
61
+ private val symbolCheckers: List <IrSymbolChecker > = config.checkers.filterIsInstance<IrSymbolChecker >()
62
+ private val typeCheckers: List <IrTypeChecker > = config.checkers.filterIsInstance<IrTypeChecker >()
137
63
138
64
private val checkersPerElement = object : ClassValue <List <IrElementChecker <* >>>() {
139
65
override fun computeValue (type : Class <* >): List <IrElementChecker <* >> =
@@ -193,9 +119,11 @@ private fun performBasicIrValidation(
193
119
}
194
120
}
195
121
196
- // Phase 2: Traverse the IR tree again to run additional checks based on the validator configuration.
197
- val validator = IrValidator (validatorConfig, irBuiltIns, reportError)
198
- element.acceptVoid(validator)
122
+ if (validatorConfig.checkers.isNotEmpty()) {
123
+ // Phase 2: Traverse the IR tree again to run additional checks based on the validator configuration.
124
+ val validator = IrValidator (validatorConfig, irBuiltIns, reportError)
125
+ element.acceptVoid(validator)
126
+ }
199
127
}
200
128
201
129
/* *
0 commit comments