[K2] OPT_IN_USAGE_ERROR is absent when calling the enum primary constructor

^KT-63459
This commit is contained in:
Anastasia.Nekrasova
2023-11-22 19:41:22 +02:00
committed by Space Team
parent c6d391c632
commit 97ef2de6e3
4 changed files with 58 additions and 19 deletions
@@ -11,12 +11,11 @@ import org.jetbrains.kotlin.fakeElement
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.isLhsOfAssignment
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
import org.jetbrains.kotlin.fir.expressions.calleeReference
import org.jetbrains.kotlin.fir.declarations.utils.isFromEnumClass
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.references.toResolvedBaseSymbol
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.types.resolvedType
object FirOptInUsageAccessChecker : FirBasicExpressionChecker() {
@@ -31,22 +30,30 @@ object FirOptInUsageAccessChecker : FirBasicExpressionChecker() {
val resolvedSymbol = expression.calleeReference?.toResolvedBaseSymbol() ?: return
with(FirOptInUsageBaseChecker) {
if (expression is FirVariableAssignment) {
val experimentalities = resolvedSymbol.loadExperimentalities(context, fromSetter = true, null) +
loadExperimentalitiesFromTypeArguments(context, emptyList())
reportNotAcceptedExperimentalities(experimentalities, expression.lValue, context, reporter)
} else if (expression is FirQualifiedAccessExpression) {
val dispatchReceiverType = expression.dispatchReceiver?.resolvedType?.fullyExpandedType(context.session)
val experimentalities = resolvedSymbol.loadExperimentalities(context, fromSetter = false, dispatchReceiverType) +
loadExperimentalitiesFromTypeArguments(context, expression.typeArguments)
val source = if (expression.source?.kind == KtFakeSourceElementKind.DelegatedPropertyAccessor) {
val property = context.containingDeclarations.lastOrNull { it is FirProperty } as? FirProperty ?: return
property.delegate?.source?.fakeElement(KtFakeSourceElementKind.DelegatedPropertyAccessor) ?: return
} else {
expression.source
when {
expression is FirVariableAssignment -> {
val experimentalities = resolvedSymbol.loadExperimentalities(context, fromSetter = true, null) +
loadExperimentalitiesFromTypeArguments(context, emptyList())
reportNotAcceptedExperimentalities(experimentalities, expression.lValue, context, reporter)
}
expression is FirQualifiedAccessExpression -> {
val dispatchReceiverType = expression.dispatchReceiver?.resolvedType?.fullyExpandedType(context.session)
val experimentalities = resolvedSymbol.loadExperimentalities(context, fromSetter = false, dispatchReceiverType) +
loadExperimentalitiesFromTypeArguments(context, expression.typeArguments)
val source = if (expression.source?.kind == KtFakeSourceElementKind.DelegatedPropertyAccessor) {
val property = context.containingDeclarations.lastOrNull { it is FirProperty } as? FirProperty ?: return
property.delegate?.source?.fakeElement(KtFakeSourceElementKind.DelegatedPropertyAccessor) ?: return
} else {
expression.source
}
reportNotAcceptedExperimentalities(experimentalities, expression, context, reporter, source)
}
expression is FirDelegatedConstructorCall && resolvedSymbol is FirConstructorSymbol && resolvedSymbol.isFromEnumClass -> {
val experimentalities = resolvedSymbol.loadExperimentalities(context, fromSetter = false, null)
reportNotAcceptedExperimentalities(experimentalities, expression.calleeReference, context, reporter)
}
reportNotAcceptedExperimentalities(experimentalities, expression, context, reporter, source)
}
}
}