Skip to content

Commit 53b0c8b

Browse files
mcpiromanSpace Team
authored andcommitted
[IR] Extract inline callsite validation callback to the checker
1 parent 8a7bf7e commit 53b0c8b

File tree

4 files changed

+29
-31
lines changed

4 files changed

+29
-31
lines changed

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

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase
2525
import org.jetbrains.kotlin.ir.declarations.IrFile
2626
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
2727
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
28-
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
2928
import org.jetbrains.kotlin.ir.symbols.IrSymbol
3029
import org.jetbrains.kotlin.ir.types.IrType
3130
import org.jetbrains.kotlin.ir.util.IrTreeSymbolsVisitor
@@ -52,23 +51,6 @@ data class IrValidatorConfig(
5251
val checkOverridePrivateDeclaration: Boolean = true,
5352
)
5453

55-
fun interface InlineFunctionUseSiteChecker {
56-
/**
57-
* Check if the given use site of the inline function is permitted at the current phase of IR validation.
58-
*
59-
* Example 1: Check use sites after inlining all private functions.
60-
* It is permitted to have only use sites of non-private functions in the whole IR tree. So, for a use site
61-
* of a private inline function we should return `false` if it is met in the IR. For any other use site
62-
* we should return `true` (== permitted).
63-
*
64-
* Example 2: Check use sites after inlining all functions.
65-
* Normally, no use sites of inline functions should remain in the whole IR tree. So, if we met one we shall
66-
* return `false` (== not permitted). However, there are a few exceptions that are temporarily permitted.
67-
* For example, `inline external` intrinsics in Native (KT-66734).
68-
*/
69-
fun isPermitted(inlineFunctionUseSite: IrFunctionAccessExpression): Boolean
70-
}
71-
7254
private class IrValidator(
7355
val validatorConfig: IrValidatorConfig,
7456
val irBuiltIns: IrBuiltIns,
@@ -78,15 +60,15 @@ private class IrValidator(
7860
throw IllegalStateException("IR validation must start from files, modules, or declarations")
7961

8062
override fun visitFile(declaration: IrFile) {
81-
val context = CheckerContext(irBuiltIns, validatorConfig.checkInlineFunctionUseSites, declaration, reportError)
63+
val context = CheckerContext(irBuiltIns, declaration, reportError)
8264
val fileValidator = IrFileValidator(validatorConfig, context)
8365
declaration.acceptVoid(fileValidator)
8466
}
8567

8668
override fun visitModuleFragment(declaration: IrModuleFragment) = declaration.acceptChildrenVoid(this)
8769

8870
override fun visitDeclaration(declaration: IrDeclarationBase) {
89-
val context = CheckerContext(irBuiltIns, validatorConfig.checkInlineFunctionUseSites, declaration.file, reportError)
71+
val context = CheckerContext(irBuiltIns, declaration.file, reportError)
9072
val fileValidator = IrFileValidator(validatorConfig, context)
9173
declaration.acceptVoid(fileValidator)
9274
}
@@ -98,7 +80,7 @@ private class IrFileValidator(
9880
) : IrTreeSymbolsVisitor() {
9981
private val contextUpdaters: MutableSet<ContextUpdater> = mutableSetOf(ParentChainUpdater)
10082
private val elementCheckers: MutableList<IrElementChecker<*>> = mutableListOf(
101-
IrNoInlineUseSitesChecker, IrSetValueAssignabilityChecker,
83+
IrSetValueAssignabilityChecker,
10284
IrFunctionDispatchReceiverChecker, IrFunctionParametersChecker, IrConstructorReceiverChecker,
10385
IrTypeOperatorTypeOperandChecker,
10486
IrPropertyAccessorsChecker, IrFunctionPropertiesChecker,
@@ -144,6 +126,9 @@ private class IrFileValidator(
144126
if (config.checkOverridePrivateDeclaration) {
145127
elementCheckers.add(IrPrivateDeclarationOverrideChecker)
146128
}
129+
config.checkInlineFunctionUseSites?.let {
130+
elementCheckers.add(IrNoInlineUseSitesChecker(it))
131+
}
147132

148133
for (checker in elementCheckers + symbolCheckers + typeCheckers) {
149134
contextUpdaters += checker.requiredContextUpdaters

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
package org.jetbrains.kotlin.backend.common.checkers
77

8-
import org.jetbrains.kotlin.backend.common.InlineFunctionUseSiteChecker
8+
import org.jetbrains.kotlin.backend.common.checkers.expression.InlineFunctionUseSiteChecker
99
import org.jetbrains.kotlin.backend.common.checkers.context.CheckerContext
1010
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
1111
import org.jetbrains.kotlin.descriptors.Visibilities
@@ -15,8 +15,6 @@ import org.jetbrains.kotlin.ir.IrElement
1515
import org.jetbrains.kotlin.ir.declarations.*
1616
import org.jetbrains.kotlin.ir.expressions.IrExpression
1717
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
18-
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
19-
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
2018
import org.jetbrains.kotlin.ir.symbols.IrSymbol
2119
import org.jetbrains.kotlin.ir.symbols.impl.DescriptorlessExternalPackageFragmentSymbol
2220
import org.jetbrains.kotlin.ir.types.*

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
package org.jetbrains.kotlin.backend.common.checkers.context
77

8-
import org.jetbrains.kotlin.backend.common.InlineFunctionUseSiteChecker
98
import org.jetbrains.kotlin.backend.common.ReportIrValidationError
109
import org.jetbrains.kotlin.backend.common.ScopeStack
1110
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
@@ -20,7 +19,6 @@ import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
2019

2120
class CheckerContext(
2221
val irBuiltIns: IrBuiltIns,
23-
val checkInlineFunctionUseSites: InlineFunctionUseSiteChecker?,
2422
val file: IrFile,
2523
private val reportError: ReportIrValidationError,
2624
) {

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

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,27 @@ import org.jetbrains.kotlin.backend.common.checkers.checkFunctionUseSite
1010
import org.jetbrains.kotlin.backend.common.checkers.context.CheckerContext
1111
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
1212

13-
object IrNoInlineUseSitesChecker : IrElementChecker<IrFunctionAccessExpression>(IrFunctionAccessExpression::class) {
13+
fun interface InlineFunctionUseSiteChecker {
14+
/**
15+
* Check if the given use site of the inline function is permitted at the current phase of IR validation.
16+
*
17+
* Example 1: Check use sites after inlining all private functions.
18+
* It is permitted to have only use sites of non-private functions in the whole IR tree. So, for a use site
19+
* of a private inline function we should return `false` if it is met in the IR. For any other use site
20+
* we should return `true` (== permitted).
21+
*
22+
* Example 2: Check use sites after inlining all functions.
23+
* Normally, no use sites of inline functions should remain in the whole IR tree. So, if we met one we shall
24+
* return `false` (== not permitted). However, there are a few exceptions that are temporarily permitted.
25+
* For example, `inline external` intrinsics in Native (KT-66734).
26+
*/
27+
fun isPermitted(inlineFunctionUseSite: IrFunctionAccessExpression): Boolean
28+
}
29+
30+
class IrNoInlineUseSitesChecker(
31+
private val inlineFunctionUseSiteChecker: InlineFunctionUseSiteChecker
32+
) : IrElementChecker<IrFunctionAccessExpression>(IrFunctionAccessExpression::class) {
1433
override fun check(element: IrFunctionAccessExpression, context: CheckerContext) {
15-
context.checkInlineFunctionUseSites?.let {
16-
checkFunctionUseSite(element, it, context)
17-
}
34+
checkFunctionUseSite(element, inlineFunctionUseSiteChecker, context)
1835
}
19-
}
36+
}

0 commit comments

Comments
 (0)