[FIR] Report UNSUPPORTED_CONTEXTUAL_DECLARATION_CALL

^KT-59969 Fixed
This commit is contained in:
Nikolay Lunyak
2023-08-03 10:22:32 +03:00
committed by Space Team
parent 906c27736f
commit 7151e6a41c
9 changed files with 19 additions and 44 deletions
@@ -1,37 +0,0 @@
interface Context1
interface Context2<A> {
fun getContextElement(): A
}
class Context2Impl<A>(value: A) : Context2<A> {
override fun getContextElement(): A
val value: A
}
context(Int, String)
class A {
constructor(int: Int)
}
context(Context1, c2@Context2<String>)
class B {
override fun toString(): String
}
context(Context2<A>)
class C<A> {
val a: A
get()
}
context(Context1)
@Deprecated(message = "Use `B` instead.")
class D
context(b@B, `fun`@A)
fun foo()
context(Context2<C<String>>)
fun bar(): ERROR
@@ -1,3 +1,5 @@
// !LANGUAGE: +ContextReceivers
interface Context1
interface Context2<A> {
@@ -1,4 +1,5 @@
// ISSUE: KT-54978
// !LANGUAGE: +ContextReceivers
// Case 1: Parameters and local variables
fun f1(x: Int) {
@@ -627,7 +627,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
parameter<ConeKotlinType>("contextReceiverRepresentation")
}
val AMBIGUOUS_CALL_WITH_IMPLICIT_CONTEXT_RECEIVER by error<KtElement>(PositioningStrategy.REFERENCE_BY_QUALIFIED)
val UNSUPPORTED_CONTEXTUAL_DECLARATION_CALL by error<KtElement>()
val UNSUPPORTED_CONTEXTUAL_DECLARATION_CALL by error<KtElement>(PositioningStrategy.NAME_IDENTIFIER)
}
val TYPES_AND_TYPE_PARAMETERS by object : DiagnosticGroup("Types & type parameters") {
@@ -397,7 +397,7 @@ object FirErrors {
val NO_CONTEXT_RECEIVER by error1<KtElement, ConeKotlinType>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED)
val MULTIPLE_ARGUMENTS_APPLICABLE_FOR_CONTEXT_RECEIVER by error1<KtElement, ConeKotlinType>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED)
val AMBIGUOUS_CALL_WITH_IMPLICIT_CONTEXT_RECEIVER by error0<KtElement>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED)
val UNSUPPORTED_CONTEXTUAL_DECLARATION_CALL by error0<KtElement>()
val UNSUPPORTED_CONTEXTUAL_DECLARATION_CALL by error0<KtElement>(SourceElementPositioningStrategies.NAME_IDENTIFIER)
// Types & type parameters
val RECURSION_IN_IMPLICIT_TYPES by error0<PsiElement>()
@@ -268,6 +268,8 @@ private fun mapInapplicableCandidateError(
rootCause.expectedContextReceiverType.removeTypeVariableTypes(typeContext)
)
is UnsupportedContextualDeclarationCall -> FirErrors.UNSUPPORTED_CONTEXTUAL_DECLARATION_CALL.createOn(source)
is AmbiguousValuesForContextReceiverParameter ->
FirErrors.MULTIPLE_ARGUMENTS_APPLICABLE_FOR_CONTEXT_RECEIVER.createOn(
qualifiedAccessSource ?: source,
@@ -202,6 +202,11 @@ object CheckContextReceivers : ResolutionStage() {
candidate.substitutor.substituteOrSelf(it.typeRef.coneType)
}?.takeUnless { it.isEmpty() } ?: return
if (!context.session.languageVersionSettings.supportsFeature(LanguageFeature.ContextReceivers)) {
sink.reportDiagnostic(UnsupportedContextualDeclarationCall)
return
}
val receiverGroups: List<List<FirExpression>> =
context.bodyResolveContext.towerDataContext.towerDataElements.asReversed().mapNotNull { towerDataElement ->
towerDataElement.implicitReceiver?.receiverExpression?.let(::listOf)
@@ -137,6 +137,8 @@ class NoApplicableValueForContextReceiver(
val expectedContextReceiverType: ConeKotlinType
) : ResolutionDiagnostic(INAPPLICABLE)
object UnsupportedContextualDeclarationCall : ResolutionDiagnostic(INAPPLICABLE)
class AmbiguousValuesForContextReceiverParameter(
val expectedContextReceiverType: ConeKotlinType,
) : ResolutionDiagnostic(INAPPLICABLE)
@@ -29,11 +29,11 @@ fun useWithContextReceivers() {
with(42) {
with("") {
f({}, 42)
sameAsFWithoutNonContextualCounterpart({}, 42)
p
val a = A()
a.p
a.m()
<!UNSUPPORTED_CONTEXTUAL_DECLARATION_CALL!>sameAsFWithoutNonContextualCounterpart<!>({}, 42)
<!UNSUPPORTED_CONTEXTUAL_DECLARATION_CALL!>p<!>
val a = <!UNSUPPORTED_CONTEXTUAL_DECLARATION_CALL!>A<!>()
a.<!UNSUPPORTED_CONTEXTUAL_DECLARATION_CALL!>p<!>
a.<!UNSUPPORTED_CONTEXTUAL_DECLARATION_CALL!>m<!>()
}
}
}