[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)
}
}
}
@@ -15,6 +15,11 @@ class Other(val x: Int) {
constructor(y: Long, some: Some? = null): this(some?.x ?: y.toInt())
}
enum class Enumeration @Marker constructor() {
ENTRY<!OPT_IN_USAGE_ERROR!><!>(),
ENTRY2;
}
fun foo(some: <!OPT_IN_USAGE_ERROR!>Some<!>? = null) {}
fun test() {
@@ -15,6 +15,11 @@ class Other(val x: Int) {
constructor(y: Long, some: Some? = null): this(some?.x ?: y.toInt())
}
enum class Enumeration @Marker constructor() {
ENTRY<!OPT_IN_USAGE_ERROR!><!>(),
ENTRY2;
}
fun foo(some: <!OPT_IN_USAGE_ERROR!>Some<!>? = null) {}
fun test() {
@@ -3,6 +3,28 @@ package
public fun foo(/*0*/ some: Some? = ...): kotlin.Unit
public fun test(): kotlin.Unit
public final enum class Enumeration : kotlin.Enum<Enumeration> {
enum entry ENTRY
enum entry ENTRY2
@Marker private constructor Enumeration()
@kotlin.internal.IntrinsicConstEvaluation public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: Enumeration): kotlin.Int
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<Enumeration!>!
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public final /*synthesized*/ val entries: kotlin.enums.EnumEntries<Enumeration>
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): Enumeration
public final /*synthesized*/ fun values(): kotlin.Array<Enumeration>
}
@kotlin.RequiresOptIn public final annotation class Marker : kotlin.Annotation {
public constructor Marker()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean