[K2] OPT_IN_USAGE_ERROR is absent when calling the enum primary constructor
^KT-63459
This commit is contained in:
committed by
Space Team
parent
c6d391c632
commit
97ef2de6e3
+26
-19
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+5
@@ -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() {
|
||||
|
||||
+5
@@ -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() {
|
||||
|
||||
+22
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user