Skip to content

Commit 8a7bf7e

Browse files
mcpiromanSpace Team
authored andcommitted
[IR] Specify required context updaters for each checker
So that the callee does not forget to add it when adding a checker.
1 parent 6007b23 commit 8a7bf7e

File tree

4 files changed

+19
-4
lines changed

4 files changed

+19
-4
lines changed

compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/IrValidator.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ private class IrFileValidator(
9696
config: IrValidatorConfig,
9797
private val context: CheckerContext
9898
) : IrTreeSymbolsVisitor() {
99-
private val contextUpdaters: MutableList<ContextUpdater> = mutableListOf(ParentChainUpdater)
99+
private val contextUpdaters: MutableSet<ContextUpdater> = mutableSetOf(ParentChainUpdater)
100100
private val elementCheckers: MutableList<IrElementChecker<*>> = mutableListOf(
101101
IrNoInlineUseSitesChecker, IrSetValueAssignabilityChecker,
102102
IrFunctionDispatchReceiverChecker, IrFunctionParametersChecker, IrConstructorReceiverChecker,
@@ -108,11 +108,9 @@ private class IrFileValidator(
108108

109109
init {
110110
if (config.checkValueScopes) {
111-
contextUpdaters.add(ValueScopeUpdater)
112111
elementCheckers.add(IrValueAccessScopeChecker)
113112
}
114113
if (config.checkTypeParameterScopes) {
115-
contextUpdaters.add(TypeParameterScopeUpdater)
116114
typeCheckers.add(IrTypeParameterScopeChecker)
117115
}
118116
if (config.checkAllKotlinFieldsArePrivate) {
@@ -146,6 +144,10 @@ private class IrFileValidator(
146144
if (config.checkOverridePrivateDeclaration) {
147145
elementCheckers.add(IrPrivateDeclarationOverrideChecker)
148146
}
147+
148+
for (checker in elementCheckers + symbolCheckers + typeCheckers) {
149+
contextUpdaters += checker.requiredContextUpdaters
150+
}
149151
}
150152

151153
private val checkersPerElement = object : ClassValue<List<IrElementChecker<*>>>() {

compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/checkers/IrChecker.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import org.jetbrains.kotlin.ir.symbols.IrSymbol
1212
import org.jetbrains.kotlin.ir.types.IrType
1313
import kotlin.reflect.KClass
1414

15-
sealed interface IrChecker
15+
sealed interface IrChecker {
16+
val requiredContextUpdaters : Set<ContextUpdater>
17+
get() = emptySet()
18+
}
1619

1720
abstract class IrElementChecker<in E : IrElement>(
1821
elementClass: KClass<in E>,

compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/checkers/expression/IrValueAccessScopeChecker.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,14 @@ package org.jetbrains.kotlin.backend.common.checkers.expression
77

88
import org.jetbrains.kotlin.backend.common.checkers.IrElementChecker
99
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.ValueScopeUpdater
1012
import org.jetbrains.kotlin.ir.expressions.IrValueAccessExpression
1113

1214
object IrValueAccessScopeChecker : IrElementChecker<IrValueAccessExpression>(IrValueAccessExpression::class) {
15+
override val requiredContextUpdaters: Set<ContextUpdater>
16+
get() = setOf(ValueScopeUpdater)
17+
1318
override fun check(element: IrValueAccessExpression, context: CheckerContext) {
1419
if (!context.valueSymbolScopeStack.isVisibleInCurrentScope(element.symbol)) {
1520
context.error(element, "The following expression references a value that is not available in the current scope.")

compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/checkers/type/IrTypeParameterScopeChecker.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ package org.jetbrains.kotlin.backend.common.checkers.type
77

88
import org.jetbrains.kotlin.backend.common.checkers.IrTypeChecker
99
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.TypeParameterScopeUpdater
1012
import org.jetbrains.kotlin.ir.IrElement
1113
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
1214
import org.jetbrains.kotlin.ir.types.IrSimpleType
@@ -17,6 +19,9 @@ import org.jetbrains.kotlin.ir.util.render
1719
* Makes sure that all the type parameter references are within the scope of the corresponding type parameters.
1820
*/
1921
object IrTypeParameterScopeChecker : IrTypeChecker {
22+
override val requiredContextUpdaters: Set<ContextUpdater>
23+
get() = setOf(TypeParameterScopeUpdater)
24+
2025
override fun check(
2126
type: IrType,
2227
container: IrElement,

0 commit comments

Comments
 (0)