Skip to content

Commit 38d41e2

Browse files
mcpiromanSpace Team
authored andcommitted
[IR] Adjust use-sites of IrValidatorConfig
In correspondence to the previous commit, migrate places that create IrValidatorConfig to the new API. The sets of checks enabled should be preserved. KT-76601 KT-77819
1 parent ec54f0c commit 38d41e2

File tree

5 files changed

+80
-76
lines changed

5 files changed

+80
-76
lines changed

compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ package org.jetbrains.kotlin.fir.pipeline
77

88
import org.jetbrains.kotlin.backend.common.*
99
import org.jetbrains.kotlin.backend.common.actualizer.*
10+
import org.jetbrains.kotlin.backend.common.checkers.declaration.IrFieldVisibilityChecker
11+
import org.jetbrains.kotlin.backend.common.checkers.expression.IrCrossFileFieldUsageChecker
1012
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
1113
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
1214
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
@@ -42,6 +44,7 @@ import org.jetbrains.kotlin.ir.visitors.IrVisitorVoid
4244
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
4345
import org.jetbrains.kotlin.ir.visitors.acceptVoid
4446
import org.jetbrains.kotlin.platform.jvm.isJvm
47+
import org.jetbrains.kotlin.utils.addToStdlib.applyIf
4548
import org.jetbrains.kotlin.utils.addToStdlib.runIf
4649
import org.jetbrains.kotlin.utils.exceptions.rethrowIntellijPlatformExceptionIfNeeded
4750

@@ -341,11 +344,7 @@ private class Fir2IrPipeline(
341344
mainIrFragment,
342345
irBuiltIns,
343346
phaseName = "",
344-
IrValidatorConfig(
345-
checkTreeConsistency = false,
346-
checkIrExpressionBodyInFunction = false,
347-
checkUnboundSymbols = true,
348-
)
347+
IrValidatorConfig(checkUnboundSymbols = true)
349348
)
350349
}
351350
}
@@ -475,16 +474,17 @@ private fun IrPluginContext.runMandatoryIrValidation(
475474
module,
476475
irBuiltIns,
477476
phaseName = "",
478-
IrValidatorConfig(
479-
// Invalid parents and duplicated IR nodes don't always result in broken KLIBs,
480-
// so we disable them not to cause too much breakage.
481-
checkTreeConsistency = false,
477+
// Invalid parents and duplicated IR nodes don't always result in broken KLIBs,
478+
// so we disable them not to cause too much breakage.
479+
IrValidatorConfig(checkTreeConsistency = false)
480+
.withBasicChecks()
482481
// Cross-file field accesses, though, do result in invalid KLIBs, so report them as early as possible.
483-
checkCrossFileFieldUsage = true,
484-
// FIXME(KT-71243): This should be true, but currently the ExplicitBackingFields feature de-facto allows specifying
485-
// non-private visibilities for fields.
486-
checkAllKotlinFieldsArePrivate = !fir2IrConfiguration.languageVersionSettings.supportsFeature(LanguageFeature.ExplicitBackingFields),
487-
)
482+
.withCheckers(IrCrossFileFieldUsageChecker)
483+
.applyIf(!fir2IrConfiguration.languageVersionSettings.supportsFeature(LanguageFeature.ExplicitBackingFields)) {
484+
// FIXME(KT-71243): This checker should be added unconditionally, but currently the ExplicitBackingFields feature de-facto allows specifying
485+
// non-private visibilities for fields.
486+
withCheckers(IrFieldVisibilityChecker)
487+
}
488488
)
489489
}
490490
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.backend.common.phaser
88
import org.jetbrains.kotlin.backend.common.ErrorReportingContext
99
import org.jetbrains.kotlin.backend.common.IrValidatorConfig
1010
import org.jetbrains.kotlin.backend.common.LoweringContext
11+
import org.jetbrains.kotlin.backend.common.withBasicChecks
12+
import org.jetbrains.kotlin.backend.common.withTypeChecks
1113
import org.jetbrains.kotlin.backend.common.validateIr
1214
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
1315
import org.jetbrains.kotlin.config.IrVerificationMode
@@ -24,6 +26,7 @@ import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
2426
import org.jetbrains.kotlin.ir.visitors.acceptVoid
2527
import org.jetbrains.kotlin.name.FqName
2628
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
29+
import org.jetbrains.kotlin.utils.addToStdlib.applyIf
2730
import java.io.File
2831

2932
private val IrElement.elementName: String
@@ -115,7 +118,9 @@ fun <Context : ErrorReportingContext, Data> getIrValidator(checkTypes: Boolean):
115118
element,
116119
context.heldBackendContext.irBuiltIns,
117120
phaseName = "${state.beforeOrAfter.name.toLowerCaseAsciiOnly()} ${state.phase}",
118-
config = IrValidatorConfig(checkTypes = checkTypes),
121+
config = IrValidatorConfig(checkTreeConsistency = true)
122+
.withBasicChecks()
123+
.applyIf(checkTypes) { withTypeChecks() }
119124
)
120125
}
121126
}

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

Lines changed: 55 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,19 @@
66
package org.jetbrains.kotlin.backend.common.phaser
77

88
import org.jetbrains.kotlin.backend.common.*
9+
import org.jetbrains.kotlin.backend.common.checkers.declaration.IrFieldVisibilityChecker
10+
import org.jetbrains.kotlin.backend.common.checkers.declaration.IrExpressionBodyInFunctionChecker
11+
import org.jetbrains.kotlin.backend.common.checkers.declaration.IrPrivateDeclarationOverrideChecker
12+
import org.jetbrains.kotlin.backend.common.checkers.expression.IrCrossFileFieldUsageChecker
13+
import org.jetbrains.kotlin.backend.common.checkers.expression.IrValueAccessScopeChecker
914
import org.jetbrains.kotlin.backend.common.checkers.expression.InlineFunctionUseSiteChecker
15+
import org.jetbrains.kotlin.backend.common.checkers.symbol.IrVisibilityChecker
16+
import org.jetbrains.kotlin.backend.common.withBasicChecks
17+
import org.jetbrains.kotlin.backend.common.withInlineFunctionCallsiteCheck
18+
import org.jetbrains.kotlin.backend.common.withVarargChecks
1019
import org.jetbrains.kotlin.config.*
1120
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
21+
import org.jetbrains.kotlin.utils.addToStdlib.applyIf
1222

1323
abstract class IrValidationPhase<Context : LoweringContext>(val context: Context) : ModuleLoweringPass {
1424
protected abstract val defaultValidationConfig: IrValidatorConfig
@@ -30,73 +40,79 @@ abstract class IrValidationPhase<Context : LoweringContext>(val context: Context
3040
protected open fun IrValidationContext.additionalValidation(irModule: IrModuleFragment, phaseName: String) {}
3141
}
3242

33-
@PhaseDescription(name = "ValidateIrBeforeLowering")
3443
abstract class IrValidationBeforeLoweringPhase<Context : LoweringContext>(context: Context) : IrValidationPhase<Context>(context) {
3544
override val defaultValidationConfig: IrValidatorConfig
36-
get() = IrValidatorConfig(
37-
checkTypes = false, // TODO: Re-enable checking types (KT-68663)
38-
checkValueScopes = true,
39-
checkTypeParameterScopes = false, // TODO: Re-enable checking out-of-scope type parameter usages (KT-69305)
40-
checkVisibilities = context.configuration.getBoolean(CommonConfigurationKeys.ENABLE_IR_VISIBILITY_CHECKS),
41-
checkVarargTypes = context.configuration.getBoolean(CommonConfigurationKeys.ENABLE_IR_VARARG_TYPES_CHECKS),
42-
checkIrExpressionBodyInFunction = false,
43-
)
45+
get() = IrValidatorConfig(checkTreeConsistency = true, checkUnboundSymbols = true)
46+
.withBasicChecks()
47+
.withCheckers(IrValueAccessScopeChecker)
48+
//.withTypeChecks() // TODO: Re-enable checking types (KT-68663)
49+
//.withCheckers(IrTypeParameterScopeChecker) // TODO: Re-enable checking out-of-scope type parameter usages (KT-69305)
50+
.applyIf(context.configuration.enableIrVisibilityChecks) {
51+
withCheckers(IrVisibilityChecker)
52+
}
53+
.applyIf(context.configuration.enableIrVarargTypesChecks) {
54+
withVarargChecks()
55+
}
4456
}
4557

4658
class KlibIrValidationBeforeLoweringPhase<Context : LoweringContext>(context: Context) : IrValidationBeforeLoweringPhase<Context>(context) {
4759
override val defaultValidationConfig: IrValidatorConfig
48-
get() = super.defaultValidationConfig.copy(
49-
checkCrossFileFieldUsage = context.configuration.getBoolean(CommonConfigurationKeys.ENABLE_IR_VISIBILITY_CHECKS),
50-
// FIXME(KT-71243): This should be true, but currently the ExplicitBackingFields feature de-facto allows specifying
51-
// non-private visibilities for fields.
52-
checkAllKotlinFieldsArePrivate = context.configuration.getBoolean(CommonConfigurationKeys.ENABLE_IR_VISIBILITY_CHECKS) &&
53-
!context.configuration.languageVersionSettings.supportsFeature(LanguageFeature.ExplicitBackingFields),
54-
checkIrExpressionBodyInFunction = true,
55-
)
60+
get() = super.defaultValidationConfig
61+
.applyIf(context.configuration.enableIrVisibilityChecks) {
62+
withCheckers(IrCrossFileFieldUsageChecker)
63+
// FIXME(KT-71243): This checker should be added unconditionally, but currently the ExplicitBackingFields feature de-facto allows specifying
64+
// non-private visibilities for fields.
65+
.applyIf(!context.configuration.languageVersionSettings.supportsFeature(LanguageFeature.ExplicitBackingFields)) {
66+
withCheckers(IrFieldVisibilityChecker)
67+
}
68+
}
69+
.withCheckers(IrExpressionBodyInFunctionChecker)
5670
}
5771

72+
5873
@PhaseDescription(name = "IrValidationAfterInliningOnlyPrivateFunctionsPhase")
5974
class IrValidationAfterInliningOnlyPrivateFunctionsPhase<Context : LoweringContext>(
6075
context: Context,
61-
private val checkInlineFunctionCallSites: InlineFunctionUseSiteChecker
76+
private val checkInlineFunctionCallSites: InlineFunctionUseSiteChecker,
6277
) : IrValidationPhase<Context>(context) {
6378
override val defaultValidationConfig: IrValidatorConfig
64-
get() = IrValidatorConfig(
65-
checkTypes = false, // TODO: Re-enable checking types (KT-68663)
66-
checkVisibilities = false, // TODO: Enable checking visibilities (KT-69516)
67-
checkInlineFunctionUseSites = checkInlineFunctionCallSites,
68-
checkVarargTypes = context.configuration.getBoolean(CommonConfigurationKeys.ENABLE_IR_VARARG_TYPES_CHECKS),
69-
)
79+
get() = IrValidatorConfig(checkTreeConsistency = true)
80+
.withBasicChecks()
81+
//.withVisibilityChecks() // TODO: Enable checking visibilities (KT-69516)
82+
//.withTypeChecks() // TODO: Re-enable checking types (KT-68663)
83+
.applyIf(context.configuration.enableIrVarargTypesChecks) {
84+
withVarargChecks()
85+
}
86+
.withInlineFunctionCallsiteCheck(checkInlineFunctionCallSites)
7087
}
7188

7289
class IrValidationAfterInliningAllFunctionsOnTheSecondStagePhase<Context : LoweringContext>(
7390
context: Context,
74-
private val checkInlineFunctionCallSites: InlineFunctionUseSiteChecker? = null
91+
private val checkInlineFunctionCallSites: InlineFunctionUseSiteChecker? = null,
7592
) : IrValidationPhase<Context>(context) {
7693
override val defaultValidationConfig: IrValidatorConfig
77-
get() = IrValidatorConfig(
78-
checkTypes = false, // TODO: Re-enable checking types (KT-68663)
79-
checkValueScopes = context.configuration.enableIrVisibilityChecks,
80-
checkCrossFileFieldUsage = context.configuration.enableIrVisibilityChecks,
81-
checkTypeParameterScopes = false,
82-
checkVisibilities = context.configuration.enableIrVisibilityChecks,
83-
checkInlineFunctionUseSites = checkInlineFunctionCallSites,
84-
checkVarargTypes = context.configuration.enableIrVarargTypesChecks,
85-
)
94+
get() = IrValidatorConfig(checkTreeConsistency = true)
95+
//.withTypeChecks() // TODO: Re-enable checking types (KT-68663)
96+
.applyIf(context.configuration.enableIrVisibilityChecks) {
97+
withCheckers(IrVisibilityChecker, IrCrossFileFieldUsageChecker, IrValueAccessScopeChecker)
98+
}
99+
.applyIf(context.configuration.enableIrVarargTypesChecks) {
100+
withVarargChecks()
101+
}
102+
.withInlineFunctionCallsiteCheck(checkInlineFunctionCallSites)
86103
}
87104

88105
class IrValidationAfterInliningAllFunctionsOnTheFirstStagePhase<Context : LoweringContext>(
89106
context: Context,
90107
private val checkInlineFunctionCallSites: InlineFunctionUseSiteChecker? = null
91108
) : IrValidationPhase<Context>(context) {
92109
override val defaultValidationConfig: IrValidatorConfig
93-
get() = IrValidatorConfig(
94-
checkInlineFunctionUseSites = checkInlineFunctionCallSites,
95-
checkOverridePrivateDeclaration = false,
96-
)
110+
get() = IrValidatorConfig()
111+
.withBasicChecks().withoutCheckers(IrPrivateDeclarationOverrideChecker)
112+
.withInlineFunctionCallsiteCheck(checkInlineFunctionCallSites)
97113
}
98114

99115
open class IrValidationAfterLoweringPhase<Context : LoweringContext>(context: Context) : IrValidationPhase<Context>(context) {
100116
override val defaultValidationConfig: IrValidatorConfig
101-
get() = IrValidatorConfig()
117+
get() = IrValidatorConfig(checkTreeConsistency = true)
102118
}

compiler/ir/backend.common/test/org/jetbrains/kotlin/backend/common/IrValidatorTest.kt

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -50,17 +50,9 @@ class IrValidatorTest {
5050

5151
private lateinit var messageCollector: MessageCollectorImpl
5252
private lateinit var module: IrModuleFragment
53-
private val defaultValidationConfig = IrValidatorConfig(
54-
checkTypes = true,
55-
checkValueScopes = true,
56-
checkTypeParameterScopes = true,
57-
checkCrossFileFieldUsage = true,
58-
checkAllKotlinFieldsArePrivate = true,
59-
checkVisibilities = true,
60-
checkVarargTypes = true,
61-
checkUnboundSymbols = true,
62-
checkInlineFunctionUseSites = { it.symbol.owner.name.toString() != "inlineFunctionUseSiteNotPermitted" }
63-
)
53+
private val defaultValidationConfig = IrValidatorConfig(checkTreeConsistency = true, checkUnboundSymbols = true)
54+
.withAllChecks()
55+
.withInlineFunctionCallsiteCheck { it.symbol.owner.name.toString() != "inlineFunctionUseSiteNotPermitted" }
6456

6557
@BeforeTest
6658
fun setUp() {
@@ -314,10 +306,8 @@ class IrValidatorTest {
314306
CompilerMessageLocation.create("test.kt", 1, 7, null),
315307
),
316308
),
317-
config = IrValidatorConfig(
318-
checkTreeConsistency = false,
319-
checkTypes = true,
320-
)
309+
config = IrValidatorConfig()
310+
.withTypeChecks()
321311
)
322312
}
323313

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,6 @@ internal class JvmIrValidationBeforeLoweringPhase(
3030
internal class JvmIrValidationAfterLoweringPhase(
3131
context: JvmBackendContext
3232
) : IrValidationAfterLoweringPhase<JvmBackendContext>(context) {
33-
override val defaultValidationConfig: IrValidatorConfig
34-
get() = super.defaultValidationConfig.copy(
35-
checkCrossFileFieldUsage = false,
36-
checkAllKotlinFieldsArePrivate = false,
37-
checkIrExpressionBodyInFunction = false,
38-
)
39-
4033
override fun IrValidationContext.additionalValidation(irModule: IrModuleFragment, phaseName: String) {
4134
for (file in irModule.files) {
4235
for (declaration in file.declarations) {

0 commit comments

Comments
 (0)