diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirDeclarationInspector.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirDeclarationInspector.kt index fe48d26c90e..51f7df8b52c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirDeclarationInspector.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirDeclarationInspector.kt @@ -161,6 +161,10 @@ interface FirDeclarationPresenter { } fun represent(it: FirSimpleFunction) = buildString { + it.contextReceivers.forEach { + appendRepresentation(it) + append(',') + } append('<') it.typeParameters.forEach { appendRepresentation(it) @@ -195,6 +199,10 @@ interface FirDeclarationPresenter { } fun represent(it: FirConstructor, owner: FirRegularClass) = buildString { + it.contextReceivers.forEach { + appendRepresentation(it) + append(',') + } append('<') it.typeParameters.forEach { appendRepresentation(it) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt index 20e2ca2b343..9a99ef8ae99 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt @@ -41,6 +41,9 @@ abstract class AbstractConeCallConflictResolver( if (!call1.isExpect && call2.isExpect) return true if (call1.isExpect && !call2.isExpect) return false + if (call1.contextReceiverCount > call2.contextReceiverCount) return true + if (call1.contextReceiverCount < call2.contextReceiverCount) return false + return createEmptyConstraintSystem().isSignatureNotLessSpecific( call1, call2, @@ -114,7 +117,7 @@ abstract class AbstractConeCallConflictResolver( (variable as? FirProperty)?.typeParameters?.map { it.symbol.toLookupTag() }.orEmpty(), computeSignatureTypes(call, variable), variable.receiverTypeRef != null, - 0, // TODO + variable.contextReceivers.size, false, 0, (variable as? FirProperty)?.isExpect == true, @@ -129,7 +132,7 @@ abstract class AbstractConeCallConflictResolver( computeSignatureTypes(call, constructor), //constructor.receiverTypeRef != null, false, - 0, // TODO + constructor.contextReceivers.size, constructor.valueParameters.any { it.isVararg }, call.numDefaults, constructor.isExpect, @@ -143,7 +146,7 @@ abstract class AbstractConeCallConflictResolver( function.typeParameters.map { it.symbol.toLookupTag() }, computeSignatureTypes(call, function), function.receiverTypeRef != null, - 0, // TODO + function.contextReceivers.size, function.valueParameters.any { it.isVararg }, call.numDefaults, function.isExpect, @@ -171,6 +174,7 @@ abstract class AbstractConeCallConflictResolver( (it as ConeKotlinType).removeTypeVariableTypes(inferenceComponents.session.typeContext) } } else { + called.contextReceivers.mapTo(this) { it.typeRef.coneType } call.argumentMapping?.mapTo(this) { it.value.argumentType() } } } diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/conflictingWithDifferentOrder.fir.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/conflictingWithDifferentOrder.fir.kt index e8ff6f7d8dd..510b8dab927 100644 --- a/compiler/testData/diagnostics/tests/extensions/contextReceivers/conflictingWithDifferentOrder.fir.kt +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/conflictingWithDifferentOrder.fir.kt @@ -10,9 +10,9 @@ fun f(): Unit = TODO() fun f(): Unit = TODO() fun test(a: A, b: B) { - with(a) { + with(a) { with(b) { - f() + f() } } } diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloadPriority.fir.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloadPriority.fir.kt deleted file mode 100644 index 1e3df6e6802..00000000000 --- a/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloadPriority.fir.kt +++ /dev/null @@ -1,14 +0,0 @@ -// !LANGUAGE: +ContextReceivers - -class Context - -context(Context) -fun f(): String = TODO() - -fun f(): Any = TODO() - -fun test() { - with(Context()) { - f().length - } -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloadPriority.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloadPriority.kt index a531659ec46..7c76aa7bcff 100644 --- a/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloadPriority.kt +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloadPriority.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE: +ContextReceivers class Context diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.fir.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.fir.kt deleted file mode 100644 index ffc46fdf3c5..00000000000 --- a/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.fir.kt +++ /dev/null @@ -1,17 +0,0 @@ -// !LANGUAGE: +ContextReceivers - -context(Int, String) -fun foo(): Int { - return this@Int + 42 -} - -context(Int) -fun foo(): Int { - return this@Int + 42 -} - -fun test() { - with(42) { - foo() - } -} diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt index 14390024ee2..add8db71b05 100644 --- a/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE: +ContextReceivers context(Int, String) diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/thisWithReceiverLabelsFunctions.fir.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/thisWithReceiverLabelsFunctions.fir.kt index 1d019f9c5a8..48a91e53357 100644 --- a/compiler/testData/diagnostics/tests/extensions/contextReceivers/thisWithReceiverLabelsFunctions.fir.kt +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/thisWithReceiverLabelsFunctions.fir.kt @@ -5,16 +5,16 @@ class B(val b: Any) class C(val c: Any) context(A) fun A.f() { - this@A.a.length + this@A.a.length } -context(A, B) fun f() { +context(A, B) fun f() { this@A.a.length this@B.b this } -context(A, A, B) fun f() { +context(A, A, B) fun f() { this@A.a.length this@B.b this diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/unsupported.fir.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/unsupported.fir.kt index bb560acc564..d8e2bd1bdaa 100644 --- a/compiler/testData/diagnostics/tests/extensions/contextReceivers/unsupported.fir.kt +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/unsupported.fir.kt @@ -28,7 +28,7 @@ class A { fun useWithContextReceivers() { with(42) { with("") { - f({}, 42) + f({}, 42) sameAsFWithoutNonContextualCounterpart({}, 42) p val a = A()