[FIR] Move most property checks in corresponding fun in FirConstCheckVisitor

Basically moved property check code from
`visitQualifiedAccessExpression` into
`visitPropertyAccessExpression`
This commit is contained in:
Ivan Kylchik
2023-12-20 23:54:10 +01:00
committed by Space Team
parent 76268c941a
commit 521306e5e9
@@ -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 ---