diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java index 42ee83b5138..67e4226daf5 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java @@ -2518,6 +2518,11 @@ public class FirDiagnosticsSmokeTestGenerated extends AbstractFirDiagnosticsSmok runTest("compiler/testData/diagnostics/tests/callableReference/resolve/chooseCallableReferenceDependingOnInferredReceiver.kt"); } + @TestMetadata("chooseMostSpecificCandidateUsingCandidateDescriptorNotReflectionType.kt") + public void testChooseMostSpecificCandidateUsingCandidateDescriptorNotReflectionType() throws Exception { + runTest("compiler/testData/diagnostics/tests/callableReference/resolve/chooseMostSpecificCandidateUsingCandidateDescriptorNotReflectionType.kt"); + } + @TestMetadata("chooseOuterCallBySingleCallableReference.kt") public void testChooseOuterCallBySingleCallableReference() throws Exception { runTest("compiler/testData/diagnostics/tests/callableReference/resolve/chooseOuterCallBySingleCallableReference.kt"); diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignature.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignature.kt index ae8f76170ee..31e9887ef82 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignature.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignature.kt @@ -16,7 +16,7 @@ package org.jetbrains.kotlin.resolve.calls.results -import org.jetbrains.kotlin.builtins.getAllParameterProjectionsFromCallableReflectionType +import org.jetbrains.kotlin.builtins.getValueParameterTypesFromCallableReflectionType import org.jetbrains.kotlin.container.DefaultImplementation import org.jetbrains.kotlin.container.PlatformSpecificExtension import org.jetbrains.kotlin.descriptors.CallableDescriptor @@ -24,7 +24,9 @@ import org.jetbrains.kotlin.descriptors.MemberDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.descriptors.synthetic.SyntheticMemberDescriptor import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue -import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.types.AbstractTypeChecker +import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.UnwrappedType import org.jetbrains.kotlin.types.model.* interface SpecificityComparisonCallbacks { @@ -59,11 +61,18 @@ class FlatSignature constructor( numDefaults: Int, reflectionType: UnwrappedType ): FlatSignature { + // Note that receiver is taking over descriptor, not reflection type + // This is correct as extension receiver can't have any defaults/varargs/coercions, so there is no need to use reflection type + // Plus, currently, receiver for reflection type is taking from *candidate*, see buildReflectionType, this candidate can + // have transient receiver which is not the same in its signature + val receiver = descriptor.extensionReceiverParameter?.type + val parameters = reflectionType.getValueParameterTypesFromCallableReflectionType(receiver == null).map { it.type } + return FlatSignature( origin, descriptor.typeParameters, - reflectionType.getAllParameterProjectionsFromCallableReflectionType().map { it.type }, - hasExtensionReceiver = false, + listOfNotNull(receiver) + parameters, + hasExtensionReceiver = receiver != null, hasVarargs = descriptor.valueParameters.any { it.varargElementType != null }, numDefaults = numDefaults, isExpect = descriptor is MemberDescriptor && descriptor.isExpect, diff --git a/compiler/testData/diagnostics/tests/callableReference/resolve/chooseMostSpecificCandidateUsingCandidateDescriptorNotReflectionType.kt b/compiler/testData/diagnostics/tests/callableReference/resolve/chooseMostSpecificCandidateUsingCandidateDescriptorNotReflectionType.kt new file mode 100644 index 00000000000..0af36281c6b --- /dev/null +++ b/compiler/testData/diagnostics/tests/callableReference/resolve/chooseMostSpecificCandidateUsingCandidateDescriptorNotReflectionType.kt @@ -0,0 +1,14 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER + +fun test() { + foo(String::extensionReceiver) + foo(::valueParameter) +} + +fun CharSequence.extensionReceiver(): CharSequence = TODO() +fun String.extensionReceiver(): String = TODO() + +fun valueParameter(c: CharSequence): CharSequence = TODO() +fun valueParameter(s: String): CharSequence = TODO() + +fun foo(f: (String) -> R) {} diff --git a/compiler/testData/diagnostics/tests/callableReference/resolve/chooseMostSpecificCandidateUsingCandidateDescriptorNotReflectionType.txt b/compiler/testData/diagnostics/tests/callableReference/resolve/chooseMostSpecificCandidateUsingCandidateDescriptorNotReflectionType.txt new file mode 100644 index 00000000000..e6faedee3c8 --- /dev/null +++ b/compiler/testData/diagnostics/tests/callableReference/resolve/chooseMostSpecificCandidateUsingCandidateDescriptorNotReflectionType.txt @@ -0,0 +1,8 @@ +package + +public fun foo(/*0*/ f: (kotlin.String) -> R): kotlin.Unit +public fun test(): kotlin.Unit +public fun valueParameter(/*0*/ c: kotlin.CharSequence): kotlin.CharSequence +public fun valueParameter(/*0*/ s: kotlin.String): kotlin.CharSequence +public fun kotlin.CharSequence.extensionReceiver(): kotlin.CharSequence +public fun kotlin.String.extensionReceiver(): kotlin.String diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 276122fcf03..e0adfdd8632 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -2525,6 +2525,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { runTest("compiler/testData/diagnostics/tests/callableReference/resolve/chooseCallableReferenceDependingOnInferredReceiver.kt"); } + @TestMetadata("chooseMostSpecificCandidateUsingCandidateDescriptorNotReflectionType.kt") + public void testChooseMostSpecificCandidateUsingCandidateDescriptorNotReflectionType() throws Exception { + runTest("compiler/testData/diagnostics/tests/callableReference/resolve/chooseMostSpecificCandidateUsingCandidateDescriptorNotReflectionType.kt"); + } + @TestMetadata("chooseOuterCallBySingleCallableReference.kt") public void testChooseOuterCallBySingleCallableReference() throws Exception { runTest("compiler/testData/diagnostics/tests/callableReference/resolve/chooseOuterCallBySingleCallableReference.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 694899e0ecc..34d1cf0e3dc 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -2520,6 +2520,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/callableReference/resolve/chooseCallableReferenceDependingOnInferredReceiver.kt"); } + @TestMetadata("chooseMostSpecificCandidateUsingCandidateDescriptorNotReflectionType.kt") + public void testChooseMostSpecificCandidateUsingCandidateDescriptorNotReflectionType() throws Exception { + runTest("compiler/testData/diagnostics/tests/callableReference/resolve/chooseMostSpecificCandidateUsingCandidateDescriptorNotReflectionType.kt"); + } + @TestMetadata("chooseOuterCallBySingleCallableReference.kt") public void testChooseOuterCallBySingleCallableReference() throws Exception { runTest("compiler/testData/diagnostics/tests/callableReference/resolve/chooseOuterCallBySingleCallableReference.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/functionTypes.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/functionTypes.kt index 5f99db4edd3..534ef21b06e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/functionTypes.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/functionTypes.kt @@ -140,12 +140,13 @@ fun KotlinType.getValueParameterTypesFromFunctionType(): List { return arguments.subList(first, last) } -fun KotlinType.getAllParameterProjectionsFromCallableReflectionType(): List { +fun KotlinType.getValueParameterTypesFromCallableReflectionType(withReceiver: Boolean): List { assert(ReflectionTypes.isKCallableType(this)) { "Not a callable reflection type: $this" } val arguments = arguments + val first = if (withReceiver) 0 else 1 val last = arguments.size - 1 - assert(last >= 0) { "Unexpected number of type arguments in type: $this" } - return arguments.subList(0, last) + assert(first <= last) { "Not an exact function type: $this" } + return arguments.subList(first, last) } fun KotlinType.extractParameterNameFromFunctionTypeArgument(): Name? {