diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt index 48a255fedbc..2a667343242 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt @@ -209,7 +209,6 @@ private class FirConstCheckVisitor(private val session: FirSession) : FirVisitor propertyAccessExpression: FirPropertyAccessExpression, data: Nothing? ): ConstantArgumentKind { val propertySymbol = propertyAccessExpression.toReference()?.toResolvedCallableSymbol(discardErrorReference = true) - when (propertySymbol) { null -> return ConstantArgumentKind.VALID_CONST is FirPropertySymbol -> { @@ -218,8 +217,26 @@ private class FirConstCheckVisitor(private val session: FirSession) : FirVisitor return ConstantArgumentKind.ENUM_NOT_CONST } - if (propertySymbol.isConst) { - return ConstantArgumentKind.VALID_CONST + when { + propertySymbol.unwrapFakeOverrides().canBeEvaluated() || propertySymbol.isCompileTimeBuiltinProperty() -> { + val receiver = listOf(propertyAccessExpression.dispatchReceiver, propertyAccessExpression.extensionReceiver) + .single { it != null } + return receiver?.accept(this, data) ?: ConstantArgumentKind.VALID_CONST + } + propertySymbol.isLocal -> return ConstantArgumentKind.NOT_CONST + propertyAccessExpression.getExpandedType().classId == StandardClassIds.KClass -> return ConstantArgumentKind.NOT_KCLASS_LITERAL + propertySymbol.isConst -> return ConstantArgumentKind.VALID_CONST + } + + // Ok, because we only look at the structure, not resolution-dependent properties. + @OptIn(SymbolInternals::class) + return when (propertySymbol.fir.initializer) { + is FirConstExpression<*> -> when { + propertySymbol.isVal -> ConstantArgumentKind.NOT_CONST_VAL_IN_CONST_EXPRESSION + else -> ConstantArgumentKind.NOT_CONST + } + is FirGetClassCall -> ConstantArgumentKind.NOT_KCLASS_LITERAL + else -> ConstantArgumentKind.NOT_CONST } } is FirFieldSymbol -> { @@ -271,28 +288,7 @@ private class FirConstCheckVisitor(private val session: FirSession) : FirVisitor return qualifiedAccessExpression.dispatchReceiver?.accept(this, data) ?: ConstantArgumentKind.VALID_CONST } - val expressionSymbol = qualifiedAccessExpression.toReference()?.toResolvedCallableSymbol(discardErrorReference = true) - val propertySymbol = expressionSymbol as? FirPropertySymbol ?: return ConstantArgumentKind.NOT_CONST - - when { - propertySymbol.unwrapFakeOverrides().canBeEvaluated() || propertySymbol.isCompileTimeBuiltinProperty() -> { - val receiver = listOf(qualifiedAccessExpression.dispatchReceiver, qualifiedAccessExpression.extensionReceiver) - .single { it != null } - return receiver?.accept(this, data) ?: ConstantArgumentKind.VALID_CONST - } - propertySymbol.isLocal -> return ConstantArgumentKind.NOT_CONST - expressionType.classId == StandardClassIds.KClass -> return ConstantArgumentKind.NOT_KCLASS_LITERAL - } - // Ok, because we only look at the structure, not resolution-dependent properties. - @OptIn(SymbolInternals::class) - return when (propertySymbol.fir.initializer) { - is FirConstExpression<*> -> when { - propertySymbol.isVal -> ConstantArgumentKind.NOT_CONST_VAL_IN_CONST_EXPRESSION - else -> ConstantArgumentKind.NOT_CONST - } - is FirGetClassCall -> ConstantArgumentKind.NOT_KCLASS_LITERAL - else -> ConstantArgumentKind.NOT_CONST - } + return ConstantArgumentKind.VALID_CONST } // --- Utils ---