Skip to content

Commit 0dc8947

Browse files
mcpiromanSpace Team
authored andcommitted
[JVM] Migrate custom IR checks to IrElementChecker
This removes an additional tree traversal.
1 parent 38d41e2 commit 0dc8947

File tree

2 files changed

+25
-39
lines changed

2 files changed

+25
-39
lines changed

compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/IrValidationPhase.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,8 @@ abstract class IrValidationPhase<Context : LoweringContext>(val context: Context
3333
phaseName,
3434
defaultValidationConfig,
3535
)
36-
additionalValidation(irModule, phaseName)
3736
}
3837
}
39-
40-
protected open fun IrValidationContext.additionalValidation(irModule: IrModuleFragment, phaseName: String) {}
4138
}
4239

4340
abstract class IrValidationBeforeLoweringPhase<Context : LoweringContext>(context: Context) : IrValidationPhase<Context>(context) {

compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/irValidation.kt

Lines changed: 25 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@ package org.jetbrains.kotlin.backend.jvm.lower
77

88
import org.jetbrains.kotlin.backend.common.IrValidationContext
99
import org.jetbrains.kotlin.backend.common.IrValidatorConfig
10+
import org.jetbrains.kotlin.backend.common.checkers.IrElementChecker
11+
import org.jetbrains.kotlin.backend.common.checkers.context.CheckerContext
1012
import org.jetbrains.kotlin.backend.common.phaser.IrValidationAfterLoweringPhase
1113
import org.jetbrains.kotlin.backend.common.phaser.IrValidationBeforeLoweringPhase
1214
import org.jetbrains.kotlin.backend.common.phaser.PhaseDescription
1315
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
1416
import org.jetbrains.kotlin.ir.IrElement
1517
import org.jetbrains.kotlin.ir.declarations.IrAnonymousInitializer
1618
import org.jetbrains.kotlin.ir.declarations.IrClass
19+
import org.jetbrains.kotlin.ir.declarations.IrFile
1720
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
1821
import org.jetbrains.kotlin.ir.declarations.IrProperty
1922
import org.jetbrains.kotlin.ir.util.fileOrNull
@@ -23,50 +26,36 @@ import org.jetbrains.kotlin.ir.visitors.acceptVoid
2326

2427
@PhaseDescription(name = "JvmValidateIrBeforeLowering")
2528
internal class JvmIrValidationBeforeLoweringPhase(
26-
context: JvmBackendContext
29+
context: JvmBackendContext,
2730
) : IrValidationBeforeLoweringPhase<JvmBackendContext>(context)
2831

2932
@PhaseDescription(name = "JvmValidateIrAfterLowering")
3033
internal class JvmIrValidationAfterLoweringPhase(
31-
context: JvmBackendContext
34+
context: JvmBackendContext,
3235
) : IrValidationAfterLoweringPhase<JvmBackendContext>(context) {
33-
override fun IrValidationContext.additionalValidation(irModule: IrModuleFragment, phaseName: String) {
34-
for (file in irModule.files) {
35-
for (declaration in file.declarations) {
36-
if (declaration !is IrClass) {
37-
reportIrValidationError(
38-
file,
39-
declaration,
40-
"The only top-level declarations left should be IrClasses",
41-
phaseName,
42-
)
43-
}
44-
}
45-
}
36+
override val defaultValidationConfig: IrValidatorConfig
37+
get() = super.defaultValidationConfig
38+
.withCheckers(NoTopLevelDeclarationsChecker, NoPropertiesChecker, NoAnonymousInitializersChecker)
39+
}
4640

47-
val validator = object : IrVisitorVoid() {
48-
override fun visitElement(element: IrElement) {
49-
element.acceptChildrenVoid(this)
41+
private object NoTopLevelDeclarationsChecker : IrElementChecker<IrFile>(IrFile::class) {
42+
override fun check(element: IrFile, context: CheckerContext) {
43+
for (declaration in element.declarations) {
44+
if (declaration !is IrClass) {
45+
context.error(declaration, "The only top-level declarations left should be IrClasses")
5046
}
47+
}
48+
}
49+
}
5150

52-
override fun visitProperty(declaration: IrProperty) {
53-
reportIrValidationError(
54-
declaration.fileOrNull,
55-
declaration,
56-
"No properties should remain at this stage",
57-
phaseName,
58-
)
59-
}
51+
private object NoPropertiesChecker : IrElementChecker<IrProperty>(IrProperty::class) {
52+
override fun check(element: IrProperty, context: CheckerContext) {
53+
context.error(element, "No properties should remain at this stage")
54+
}
55+
}
6056

61-
override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer) {
62-
reportIrValidationError(
63-
declaration.fileOrNull,
64-
declaration,
65-
"No anonymous initializers should remain at this stage",
66-
phaseName,
67-
)
68-
}
69-
}
70-
irModule.acceptVoid(validator)
57+
private object NoAnonymousInitializersChecker : IrElementChecker<IrAnonymousInitializer>(IrAnonymousInitializer::class) {
58+
override fun check(element: IrAnonymousInitializer, context: CheckerContext) {
59+
context.error(element, "No anonymous initializers should remain at this stage")
7160
}
7261
}

0 commit comments

Comments
 (0)