@@ -7,13 +7,16 @@ package org.jetbrains.kotlin.backend.jvm.lower
7
7
8
8
import org.jetbrains.kotlin.backend.common.IrValidationContext
9
9
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
10
12
import org.jetbrains.kotlin.backend.common.phaser.IrValidationAfterLoweringPhase
11
13
import org.jetbrains.kotlin.backend.common.phaser.IrValidationBeforeLoweringPhase
12
14
import org.jetbrains.kotlin.backend.common.phaser.PhaseDescription
13
15
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
14
16
import org.jetbrains.kotlin.ir.IrElement
15
17
import org.jetbrains.kotlin.ir.declarations.IrAnonymousInitializer
16
18
import org.jetbrains.kotlin.ir.declarations.IrClass
19
+ import org.jetbrains.kotlin.ir.declarations.IrFile
17
20
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
18
21
import org.jetbrains.kotlin.ir.declarations.IrProperty
19
22
import org.jetbrains.kotlin.ir.util.fileOrNull
@@ -23,50 +26,36 @@ import org.jetbrains.kotlin.ir.visitors.acceptVoid
23
26
24
27
@PhaseDescription(name = " JvmValidateIrBeforeLowering" )
25
28
internal class JvmIrValidationBeforeLoweringPhase (
26
- context : JvmBackendContext
29
+ context : JvmBackendContext ,
27
30
) : IrValidationBeforeLoweringPhase<JvmBackendContext>(context)
28
31
29
32
@PhaseDescription(name = " JvmValidateIrAfterLowering" )
30
33
internal class JvmIrValidationAfterLoweringPhase (
31
- context : JvmBackendContext
34
+ context : JvmBackendContext ,
32
35
) : 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
+ }
46
40
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" )
50
46
}
47
+ }
48
+ }
49
+ }
51
50
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
+ }
60
56
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" )
71
60
}
72
61
}
0 commit comments