From a091b345a0480de656c5b0cc18061a4644ca1c27 Mon Sep 17 00:00:00 2001 From: Anastasiya Shadrina Date: Sat, 18 Sep 2021 19:00:37 +0700 Subject: [PATCH] [FE] Provide overloadability for candidates with different CR --- ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++++ ...irOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 ++++++ .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../resolve/calls/results/FlatSignature.kt | 11 ++++++---- .../resolve/calls/model/KotlinCallKind.kt | 7 +++++-- .../contextReceivers/overloading.kt | 21 +++++++++++++++++++ .../contextReceivers/overloading.fir.kt | 17 +++++++++++++++ .../contextReceivers/overloading.kt | 17 +++++++++++++++ .../contextReceivers/overloading.txt | 5 +++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ 12 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/codegen/box/extensionFunctions/contextReceivers/overloading.kt create mode 100644 compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.fir.kt create mode 100644 compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt create mode 100644 compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.txt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 4469cc9f015..d0860cbebb6 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -10648,6 +10648,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloadPriority.kt"); } + @Test + @TestMetadata("overloading.kt") + public void testOverloading() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt"); + } + @Test @TestMetadata("plusMatrix.kt") public void testPlusMatrix() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index eb18b3526a1..97018845a84 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -10648,6 +10648,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloadPriority.kt"); } + @Test + @TestMetadata("overloading.kt") + public void testOverloading() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt"); + } + @Test @TestMetadata("plusMatrix.kt") public void testPlusMatrix() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index c1d60e817dd..0d3508a2a4f 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -10648,6 +10648,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloadPriority.kt"); } + @Test + @TestMetadata("overloading.kt") + public void testOverloading() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt"); + } + @Test @TestMetadata("plusMatrix.kt") public void testPlusMatrix() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 1af784c0fed..184b83bfc1f 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -16181,6 +16181,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/overload.kt"); } + @Test + @TestMetadata("overloading.kt") + public void testOverloading() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/overloading.kt"); + } + @Test @TestMetadata("plusAssign.kt") public void testPlusAssign() throws Exception { diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignature.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignature.kt index 965aec2c395..4430bff65e9 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignature.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignature.kt @@ -66,9 +66,11 @@ private fun SimpleConstraintSystem.isValueParameterTypeNotLessSpecific( ): Boolean { val typeParameters = general.typeParameters val typeSubstitutor = registerTypeVariables(typeParameters) - val valueParameterTypes = specific.valueParameterTypes.map(typeKindSelector).zip(general.valueParameterTypes.map(typeKindSelector)) + val valueParamsWithoutContextReceivers = + specific.valueParameterTypes.drop(specific.contextReceiverCount).map(typeKindSelector) + .zip(general.valueParameterTypes.drop(general.contextReceiverCount).map(typeKindSelector)) - for ((specificType, generalType) in valueParameterTypes) { + for ((specificType, generalType) in valueParamsWithoutContextReceivers) { if (specificType == null || generalType == null) continue if (specificityComparator.isDefinitelyLessSpecific(specificType, generalType)) { @@ -108,8 +110,9 @@ fun SimpleConstraintSystem.isSignatureNotLessSpecific( useOriginalSamTypes: Boolean = false ): Boolean { if (specific.hasExtensionReceiver != general.hasExtensionReceiver) return false - if (specific.contextReceiverCount != general.contextReceiverCount) return false - if (specific.valueParameterTypes.size != general.valueParameterTypes.size) return false + if (specific.contextReceiverCount > general.contextReceiverCount) return false + if (specific.valueParameterTypes.size - specific.contextReceiverCount != general.valueParameterTypes.size - general.contextReceiverCount) + return false if (!isValueParameterTypeNotLessSpecific(specific, general, callbacks, specificityComparator) { it?.resultType }) { return false diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallKind.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallKind.kt index cd72d39868f..51565360b75 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallKind.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallKind.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.resolve.calls.model import org.jetbrains.kotlin.resolve.calls.components.ArgumentsToCandidateParameterDescriptor import org.jetbrains.kotlin.resolve.calls.components.CheckArgumentsInParenthesis import org.jetbrains.kotlin.resolve.calls.components.CheckCallableReference +import org.jetbrains.kotlin.resolve.calls.components.CheckContextReceiversResolutionPart import org.jetbrains.kotlin.resolve.calls.components.CheckExplicitReceiverKindConsistency import org.jetbrains.kotlin.resolve.calls.components.CheckExternalArgument import org.jetbrains.kotlin.resolve.calls.components.CheckInfixResolutionPart @@ -36,7 +37,8 @@ enum class KotlinCallKind(vararg resolutionPart: ResolutionPart) { CollectionTypeVariableUsagesInfo, CheckExplicitReceiverKindConsistency, CheckReceivers, - PostponedVariablesInitializerResolutionPart + PostponedVariablesInitializerResolutionPart, + CheckContextReceiversResolutionPart ), FUNCTION( CheckVisibility, @@ -55,7 +57,8 @@ enum class KotlinCallKind(vararg resolutionPart: ResolutionPart) { EagerResolveOfCallableReferences, CompatibilityOfTypeVariableAsIntersectionTypePart, CompatibilityOfPartiallyApplicableSamConversion, - PostponedVariablesInitializerResolutionPart + PostponedVariablesInitializerResolutionPart, + CheckContextReceiversResolutionPart ), INVOKE(*FUNCTION.resolutionSequence.toTypedArray()), CALLABLE_REFERENCE( diff --git a/compiler/testData/codegen/box/extensionFunctions/contextReceivers/overloading.kt b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/overloading.kt new file mode 100644 index 00000000000..051b3662e76 --- /dev/null +++ b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/overloading.kt @@ -0,0 +1,21 @@ +// !LANGUAGE: +ContextReceivers +// TARGET_BACKEND: JVM_IR +// IGNORE_BACKEND_FIR: JVM_IR + +context(Int, String) +fun foo(): String = "O" + +context(Int) +fun foo(): String = "K" + +fun box(): String { + val o = with ("") { + with(42) { + foo() + } + } + val k = with(42) { + foo() + } + return o + k +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.fir.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.fir.kt new file mode 100644 index 00000000000..d982b1d1ada --- /dev/null +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.fir.kt @@ -0,0 +1,17 @@ +// !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() + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt new file mode 100644 index 00000000000..14390024ee2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt @@ -0,0 +1,17 @@ +// !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() + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.txt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.txt new file mode 100644 index 00000000000..115b3584d23 --- /dev/null +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.txt @@ -0,0 +1,5 @@ +package + +public fun foo(): kotlin.Int +public fun foo(): kotlin.Int +public fun test(): kotlin.Unit diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index a74d1994ae2..9c6c7e00623 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -10654,6 +10654,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloadPriority.kt"); } + @Test + @TestMetadata("overloading.kt") + public void testOverloading() throws Exception { + runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/overloading.kt"); + } + @Test @TestMetadata("plusMatrix.kt") public void testPlusMatrix() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 66e8ef4c4e1..50b628b01f7 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -16181,6 +16181,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/overload.kt"); } + @Test + @TestMetadata("overloading.kt") + public void testOverloading() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/overloading.kt"); + } + @Test @TestMetadata("plusAssign.kt") public void testPlusAssign() throws Exception {