Skip to content

Commit 3513728

Browse files
mcpiromanSpace Team
authored andcommitted
[IR] Update element checkers
A mechanical refactor to all element checkers: - Change supertype to IrElementChecker - Pass `elementClass` to the IrElementChecker constructor (the same as the type argument). - Rename parameter of `check()` to `element` to match the overridden one - Move parameters of `check()` to the same line KT-76601
1 parent 1aabffe commit 3513728

25 files changed

+141
-190
lines changed

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

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,20 @@
66
package org.jetbrains.kotlin.backend.common.checkers.declaration
77

88
import org.jetbrains.kotlin.backend.common.checkers.context.CheckerContext
9+
import org.jetbrains.kotlin.backend.common.checkers.IrElementChecker
910
import org.jetbrains.kotlin.ir.declarations.IrConstructor
1011
import org.jetbrains.kotlin.ir.declarations.IrFunction
1112
import org.jetbrains.kotlin.ir.declarations.IrParameterKind
1213
import org.jetbrains.kotlin.ir.util.constructedClass
1314

14-
internal object IrConstructorReceiverChecker : IrFunctionChecker {
15-
override fun check(
16-
declaration: IrFunction,
17-
context: CheckerContext,
18-
) {
19-
if (declaration !is IrConstructor) return
20-
if (!declaration.constructedClass.isInner && declaration.dispatchReceiverParameter != null) {
21-
context.error(declaration, "Constructors of non-inner classes can't have dispatch receiver parameters")
15+
internal object IrConstructorReceiverChecker : IrElementChecker<IrFunction>(IrFunction::class) {
16+
override fun check(element: IrFunction, context: CheckerContext) {
17+
if (element !is IrConstructor) return
18+
if (!element.constructedClass.isInner && element.dispatchReceiverParameter != null) {
19+
context.error(element, "Constructors of non-inner classes can't have dispatch receiver parameters")
2220
}
23-
if (declaration.parameters.any { it.kind == IrParameterKind.ExtensionReceiver }) {
24-
context.error(declaration, "Constructors can't have extension receiver parameters")
21+
if (element.parameters.any { it.kind == IrParameterKind.ExtensionReceiver }) {
22+
context.error(element, "Constructors can't have extension receiver parameters")
2523
}
2624
}
2725
}

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,15 @@
55

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

8+
import org.jetbrains.kotlin.backend.common.checkers.IrElementChecker
89
import org.jetbrains.kotlin.backend.common.checkers.context.CheckerContext
910
import org.jetbrains.kotlin.ir.declarations.IrFunction
1011
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
1112

12-
internal object IrExpressionBodyInFunctionChecker : IrFunctionChecker {
13-
override fun check(
14-
declaration: IrFunction,
15-
context: CheckerContext,
16-
) {
17-
if (declaration.body is IrExpressionBody) {
18-
context.error(declaration, "IrFunction body cannot be of type IrExpressionBody. Use IrBlockBody instead.")
13+
internal object IrExpressionBodyInFunctionChecker : IrElementChecker<IrFunction>(IrFunction::class) {
14+
override fun check(element: IrFunction, context: CheckerContext) {
15+
if (element.body is IrExpressionBody) {
16+
context.error(element, "IrFunction body cannot be of type IrExpressionBody. Use IrBlockBody instead.")
1917
}
2018
}
2119
}

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

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

88
import org.jetbrains.kotlin.backend.common.checkers.context.CheckerContext
9+
import org.jetbrains.kotlin.backend.common.checkers.IrElementChecker
910
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
1011
import org.jetbrains.kotlin.ir.declarations.IrField
1112
import org.jetbrains.kotlin.ir.util.hasAnnotation
@@ -14,7 +15,7 @@ import org.jetbrains.kotlin.name.ClassId
1415
/**
1516
* Makes sure that all encountered [IrField]s are private unless they participate in Java interop.
1617
*/
17-
internal object IrFieldVisibilityChecker : IrFieldChecker {
18+
internal object IrFieldVisibilityChecker : IrElementChecker<IrField>(IrField::class) {
1819
private val JVM_FIELD_CLASS_ID = ClassId.fromString("kotlin/jvm/JvmField")
1920

2021
// TODO: Some backing fields inherit their visibility from their corresponding properties.
@@ -23,12 +24,9 @@ internal object IrFieldVisibilityChecker : IrFieldChecker {
2324
get() = correspondingPropertySymbol?.owner?.isConst == true ||
2425
hasAnnotation(JVM_FIELD_CLASS_ID)
2526

26-
override fun check(
27-
declaration: IrField,
28-
context: CheckerContext,
29-
) {
30-
if (declaration.visibility != DescriptorVisibilities.PRIVATE && !declaration.isExemptFromValidation) {
31-
context.error(declaration, "Kotlin fields are expected to always be private")
27+
override fun check(element: IrField, context: CheckerContext) {
28+
if (element.visibility != DescriptorVisibilities.PRIVATE && !element.isExemptFromValidation) {
29+
context.error(element, "Kotlin fields are expected to always be private")
3230
}
3331
}
3432
}

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,14 @@
66
package org.jetbrains.kotlin.backend.common.checkers.declaration
77

88
import org.jetbrains.kotlin.backend.common.checkers.context.CheckerContext
9+
import org.jetbrains.kotlin.backend.common.checkers.IrElementChecker
910
import org.jetbrains.kotlin.ir.declarations.IrFunction
1011
import org.jetbrains.kotlin.ir.types.IrDynamicType
1112

12-
internal object IrFunctionDispatchReceiverChecker : IrFunctionChecker {
13-
override fun check(
14-
declaration: IrFunction,
15-
context: CheckerContext,
16-
) {
17-
if (declaration.dispatchReceiverParameter?.type is IrDynamicType) {
18-
context.error(declaration, "Dispatch receivers with 'dynamic' type are not allowed")
13+
internal object IrFunctionDispatchReceiverChecker : IrElementChecker<IrFunction>(IrFunction::class) {
14+
override fun check(element: IrFunction, context: CheckerContext) {
15+
if (element.dispatchReceiverParameter?.type is IrDynamicType) {
16+
context.error(element, "Dispatch receivers with 'dynamic' type are not allowed")
1917
}
2018
}
2119
}

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

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,30 @@ package org.jetbrains.kotlin.backend.common.checkers.declaration
77

88
import org.jetbrains.kotlin.DeprecatedForRemovalCompilerApi
99
import org.jetbrains.kotlin.backend.common.checkers.context.CheckerContext
10+
import org.jetbrains.kotlin.backend.common.checkers.IrElementChecker
1011
import org.jetbrains.kotlin.ir.declarations.IrFunction
1112
import org.jetbrains.kotlin.ir.declarations.IrParameterKind
1213

13-
internal object IrFunctionParametersChecker : IrFunctionChecker {
14-
override fun check(
15-
declaration: IrFunction,
16-
context: CheckerContext,
17-
) {
14+
internal object IrFunctionParametersChecker : IrElementChecker<IrFunction>(IrFunction::class) {
15+
override fun check(element: IrFunction, context: CheckerContext) {
1816
@OptIn(DeprecatedForRemovalCompilerApi::class)
19-
for ((i, param) in declaration.valueParameters.withIndex()) {
17+
for ((i, param) in element.valueParameters.withIndex()) {
2018
if (param.indexInOldValueParameters != i) {
21-
context.error(declaration, "Inconsistent index (old API) of value parameter ${param.indexInOldValueParameters} != $i")
19+
context.error(element, "Inconsistent index (old API) of value parameter ${param.indexInOldValueParameters} != $i")
2220
}
2321
}
2422

2523
var lastKind: IrParameterKind? = null
26-
for ((i, param) in declaration.parameters.withIndex()) {
24+
for ((i, param) in element.parameters.withIndex()) {
2725
if (param.indexInParameters != i) {
28-
context.error(declaration, "Inconsistent index (new API) of value parameter ${param.indexInParameters} != $i")
26+
context.error(element, "Inconsistent index (new API) of value parameter ${param.indexInParameters} != $i")
2927
}
3028

3129
val kind = param.kind
3230
if (lastKind != null) {
3331
if (kind < lastKind) {
3432
context.error(
35-
declaration,
33+
element,
3634
"Invalid order of function parameters: $kind is placed after $lastKind.\n" +
3735
"Parameters must follow a strict order: " +
3836
"[dispatch receiver, context parameters, extension receiver, regular parameters]."
@@ -41,17 +39,17 @@ internal object IrFunctionParametersChecker : IrFunctionChecker {
4139

4240
if (kind == IrParameterKind.DispatchReceiver || kind == IrParameterKind.ExtensionReceiver) {
4341
if (kind == lastKind) {
44-
context.error(declaration, "Function may have only one $kind parameter")
42+
context.error(element, "Function may have only one $kind parameter")
4543
}
4644
}
4745
}
4846

4947
lastKind = kind
5048
}
5149

52-
for ((i, param) in declaration.typeParameters.withIndex()) {
50+
for ((i, param) in element.typeParameters.withIndex()) {
5351
if (param.index != i) {
54-
context.error(declaration, "Inconsistent index of type parameter ${param.index} != $i")
52+
context.error(element, "Inconsistent index of type parameter ${param.index} != $i")
5553
}
5654
}
5755
}

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

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,17 @@
66
package org.jetbrains.kotlin.backend.common.checkers.declaration
77

88
import org.jetbrains.kotlin.backend.common.checkers.context.CheckerContext
9+
import org.jetbrains.kotlin.backend.common.checkers.IrElementChecker
910
import org.jetbrains.kotlin.ir.declarations.IrFunction
1011
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
1112
import org.jetbrains.kotlin.ir.util.render
1213

13-
internal object IrFunctionPropertiesChecker : IrFunctionChecker {
14-
override fun check(
15-
declaration: IrFunction,
16-
context: CheckerContext,
17-
) {
18-
if (declaration is IrSimpleFunction) {
19-
val property = declaration.correspondingPropertySymbol?.owner
20-
if (property != null && property.getter != declaration && property.setter != declaration) {
21-
context.error(declaration, "Orphaned property getter/setter ${declaration.render()}")
14+
internal object IrFunctionPropertiesChecker : IrElementChecker<IrFunction>(IrFunction::class) {
15+
override fun check(element: IrFunction, context: CheckerContext) {
16+
if (element is IrSimpleFunction) {
17+
val property = element.correspondingPropertySymbol?.owner
18+
if (property != null && property.getter != element && property.setter != element) {
19+
context.error(element, "Orphaned property getter/setter ${element.render()}")
2220
}
2321
}
2422
}

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,20 @@
66
package org.jetbrains.kotlin.backend.common.checkers.declaration
77

88
import org.jetbrains.kotlin.backend.common.checkers.context.CheckerContext
9+
import org.jetbrains.kotlin.backend.common.checkers.IrElementChecker
910
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
1011
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
1112
import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithVisibility
1213
import org.jetbrains.kotlin.ir.declarations.IrOverridableDeclaration
1314
import org.jetbrains.kotlin.ir.util.render
1415

15-
internal object IrPrivateDeclarationOverrideChecker : IrDeclarationChecker<IrDeclaration> {
16-
override fun check(
17-
declaration: IrDeclaration,
18-
context: CheckerContext,
19-
) {
20-
if (declaration is IrOverridableDeclaration<*>) {
21-
for (overriddenSymbol in declaration.overriddenSymbols) {
16+
internal object IrPrivateDeclarationOverrideChecker : IrElementChecker<IrDeclaration>(IrDeclaration::class) {
17+
override fun check(element: IrDeclaration, context: CheckerContext) {
18+
if (element is IrOverridableDeclaration<*>) {
19+
for (overriddenSymbol in element.overriddenSymbols) {
2220
val overriddenDeclaration = overriddenSymbol.owner as? IrDeclarationWithVisibility ?: continue
2321
if (overriddenDeclaration.visibility == DescriptorVisibilities.PRIVATE) {
24-
context.error(declaration, "Overrides private declaration ${overriddenDeclaration.render()}")
22+
context.error(element, "Overrides private declaration ${overriddenDeclaration.render()}")
2523
}
2624
}
2725
}

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

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,25 @@
66
package org.jetbrains.kotlin.backend.common.checkers.declaration
77

88
import org.jetbrains.kotlin.backend.common.checkers.context.CheckerContext
9+
import org.jetbrains.kotlin.backend.common.checkers.IrElementChecker
910
import org.jetbrains.kotlin.ir.declarations.IrProperty
1011
import org.jetbrains.kotlin.ir.util.render
1112

12-
internal object IrPropertyAccessorsChecker : IrPropertyChecker {
13-
override fun check(
14-
declaration: IrProperty,
15-
context: CheckerContext,
16-
) {
17-
declaration.getter?.let {
18-
if (it.correspondingPropertySymbol != declaration.symbol) {
13+
internal object IrPropertyAccessorsChecker : IrElementChecker<IrProperty>(IrProperty::class) {
14+
override fun check(element: IrProperty, context: CheckerContext) {
15+
element.getter?.let {
16+
if (it.correspondingPropertySymbol != element.symbol) {
1917
context.error(
20-
declaration,
21-
"Getter of property '${declaration.render()}' has an inconsistent corresponding property symbol."
18+
element,
19+
"Getter of property '${element.render()}' has an inconsistent corresponding property symbol."
2220
)
2321
}
2422
}
25-
declaration.setter?.let {
26-
if (it.correspondingPropertySymbol != declaration.symbol) {
23+
element.setter?.let {
24+
if (it.correspondingPropertySymbol != element.symbol) {
2725
context.error(
28-
declaration,
29-
"Setter of property '${declaration.render()}' has an inconsistent corresponding property symbol."
26+
element,
27+
"Setter of property '${element.render()}' has an inconsistent corresponding property symbol."
3028
)
3129
}
3230
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,21 @@
66
package org.jetbrains.kotlin.backend.common.checkers.declaration
77

88
import org.jetbrains.kotlin.backend.common.checkers.context.CheckerContext
9+
import org.jetbrains.kotlin.backend.common.checkers.IrElementChecker
910
import org.jetbrains.kotlin.backend.common.checkers.validateVararg
1011
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
11-
import org.jetbrains.kotlin.ir.expressions.IrExpression
1212
import org.jetbrains.kotlin.ir.expressions.IrVararg
1313

1414
/**
1515
* Makes sure that: [IrVararg.type] is an array of [IrVararg.varargElementType].
1616
*/
17-
internal object IrValueParameterVarargTypesChecker : IrValueParameterChecker {
17+
internal object IrValueParameterVarargTypesChecker : IrElementChecker<IrValueParameter>(IrValueParameter::class) {
1818
override fun check(
19-
declaration: IrValueParameter,
19+
element: IrValueParameter,
2020
context: CheckerContext
2121
) {
22-
declaration.varargElementType?.let {
23-
validateVararg(declaration, declaration.type, it, context)
22+
element.varargElementType?.let {
23+
validateVararg(element, element.type, it, context)
2424
}
2525
}
2626
}

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

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

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

8+
import org.jetbrains.kotlin.backend.common.checkers.IrElementChecker
89
import org.jetbrains.kotlin.backend.common.checkers.context.CheckerContext
910
import org.jetbrains.kotlin.backend.common.checkers.ensureTypeIs
1011
import org.jetbrains.kotlin.ir.expressions.IrCall
@@ -14,12 +15,9 @@ import org.jetbrains.kotlin.ir.types.IrSimpleType
1415
import org.jetbrains.kotlin.ir.types.classifierOrNull
1516
import org.jetbrains.kotlin.ir.util.resolveFakeOverrideMaybeAbstract
1617

17-
internal object IrCallTypeChecker : IrCallChecker {
18-
override fun check(
19-
expression: IrCall,
20-
context: CheckerContext,
21-
) {
22-
val callee = expression.symbol.owner
18+
internal object IrCallTypeChecker : IrElementChecker<IrCall>(IrCall::class) {
19+
override fun check(element: IrCall, context: CheckerContext) {
20+
val callee = element.symbol.owner
2321
// TODO: We don't have the proper type substitution yet, so skip generics for now.
2422
val actualCallee = callee.resolveFakeOverrideMaybeAbstract {
2523
it.isFakeOverride || it.returnType.classifierOrNull !is IrTypeParameterSymbol
@@ -29,7 +27,7 @@ internal object IrCallTypeChecker : IrCallChecker {
2927
returnType.classifier is IrClassSymbol &&
3028
returnType.arguments.isEmpty()
3129
) {
32-
expression.ensureTypeIs(callee.returnType, context)
30+
element.ensureTypeIs(callee.returnType, context)
3331
}
3432
}
3533
}

0 commit comments

Comments
 (0)