[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.context.CheckerContext
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.isLhsOfAssignment
|
import org.jetbrains.kotlin.fir.analysis.checkers.isLhsOfAssignment
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
import org.jetbrains.kotlin.fir.declarations.utils.isFromEnumClass
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment
|
|
||||||
import org.jetbrains.kotlin.fir.expressions.calleeReference
|
|
||||||
import org.jetbrains.kotlin.fir.references.toResolvedBaseSymbol
|
import org.jetbrains.kotlin.fir.references.toResolvedBaseSymbol
|
||||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.resolvedType
|
import org.jetbrains.kotlin.fir.types.resolvedType
|
||||||
|
|
||||||
object FirOptInUsageAccessChecker : FirBasicExpressionChecker() {
|
object FirOptInUsageAccessChecker : FirBasicExpressionChecker() {
|
||||||
@@ -31,22 +30,30 @@ object FirOptInUsageAccessChecker : FirBasicExpressionChecker() {
|
|||||||
val resolvedSymbol = expression.calleeReference?.toResolvedBaseSymbol() ?: return
|
val resolvedSymbol = expression.calleeReference?.toResolvedBaseSymbol() ?: return
|
||||||
|
|
||||||
with(FirOptInUsageBaseChecker) {
|
with(FirOptInUsageBaseChecker) {
|
||||||
if (expression is FirVariableAssignment) {
|
when {
|
||||||
val experimentalities = resolvedSymbol.loadExperimentalities(context, fromSetter = true, null) +
|
expression is FirVariableAssignment -> {
|
||||||
loadExperimentalitiesFromTypeArguments(context, emptyList())
|
val experimentalities = resolvedSymbol.loadExperimentalities(context, fromSetter = true, null) +
|
||||||
reportNotAcceptedExperimentalities(experimentalities, expression.lValue, context, reporter)
|
loadExperimentalitiesFromTypeArguments(context, emptyList())
|
||||||
} else if (expression is FirQualifiedAccessExpression) {
|
reportNotAcceptedExperimentalities(experimentalities, expression.lValue, context, reporter)
|
||||||
val dispatchReceiverType = expression.dispatchReceiver?.resolvedType?.fullyExpandedType(context.session)
|
}
|
||||||
|
|
||||||
val experimentalities = resolvedSymbol.loadExperimentalities(context, fromSetter = false, dispatchReceiverType) +
|
expression is FirQualifiedAccessExpression -> {
|
||||||
loadExperimentalitiesFromTypeArguments(context, expression.typeArguments)
|
val dispatchReceiverType = expression.dispatchReceiver?.resolvedType?.fullyExpandedType(context.session)
|
||||||
val source = if (expression.source?.kind == KtFakeSourceElementKind.DelegatedPropertyAccessor) {
|
|
||||||
val property = context.containingDeclarations.lastOrNull { it is FirProperty } as? FirProperty ?: return
|
val experimentalities = resolvedSymbol.loadExperimentalities(context, fromSetter = false, dispatchReceiverType) +
|
||||||
property.delegate?.source?.fakeElement(KtFakeSourceElementKind.DelegatedPropertyAccessor) ?: return
|
loadExperimentalitiesFromTypeArguments(context, expression.typeArguments)
|
||||||
} else {
|
val source = if (expression.source?.kind == KtFakeSourceElementKind.DelegatedPropertyAccessor) {
|
||||||
expression.source
|
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())
|
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 foo(some: <!OPT_IN_USAGE_ERROR!>Some<!>? = null) {}
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
|
|||||||
+5
@@ -15,6 +15,11 @@ class Other(val x: Int) {
|
|||||||
constructor(y: Long, some: Some? = null): this(some?.x ?: y.toInt())
|
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 foo(some: <!OPT_IN_USAGE_ERROR!>Some<!>? = null) {}
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
|
|||||||
+22
@@ -3,6 +3,28 @@ package
|
|||||||
public fun foo(/*0*/ some: Some? = ...): kotlin.Unit
|
public fun foo(/*0*/ some: Some? = ...): kotlin.Unit
|
||||||
public fun test(): 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 {
|
@kotlin.RequiresOptIn public final annotation class Marker : kotlin.Annotation {
|
||||||
public constructor Marker()
|
public constructor Marker()
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
|||||||
Reference in New Issue
Block a user