Use recorded into descriptor inferred callable reference input/output types, to prevent leaking raw type parameter's types of reflectionCandidateType into the back-end
This commit is contained in:
+23
-8
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.resolve.calls.tower
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.createFunctionType
|
import org.jetbrains.kotlin.builtins.createFunctionType
|
||||||
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ReceiverParameterDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ReceiverParameterDescriptorImpl
|
||||||
import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl
|
||||||
@@ -14,10 +15,7 @@ import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
|||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
import org.jetbrains.kotlin.diagnostics.reportDiagnosticOnce
|
import org.jetbrains.kotlin.diagnostics.reportDiagnosticOnce
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.*
|
||||||
import org.jetbrains.kotlin.resolve.BindingTrace
|
|
||||||
import org.jetbrains.kotlin.resolve.MissingSupertypesResolver
|
|
||||||
import org.jetbrains.kotlin.resolve.TemporaryBindingTrace
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver
|
import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver
|
||||||
import org.jetbrains.kotlin.resolve.calls.NewCommonSuperTypeCalculator
|
import org.jetbrains.kotlin.resolve.calls.NewCommonSuperTypeCalculator
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.toOldSubstitution
|
import org.jetbrains.kotlin.resolve.calls.callUtil.toOldSubstitution
|
||||||
@@ -403,7 +401,7 @@ class ResolvedAtomCompleter(
|
|||||||
|
|
||||||
private fun extractCallableReferenceResultTypeInfoFromDescriptor(
|
private fun extractCallableReferenceResultTypeInfoFromDescriptor(
|
||||||
callableCandidate: CallableReferenceCandidate,
|
callableCandidate: CallableReferenceCandidate,
|
||||||
recorderDescriptor: CallableDescriptor
|
recordedDescriptor: CallableDescriptor
|
||||||
): CallableReferenceResultTypeInfo {
|
): CallableReferenceResultTypeInfo {
|
||||||
val explicitCallableReceiver = when (callableCandidate.explicitReceiverKind) {
|
val explicitCallableReceiver = when (callableCandidate.explicitReceiverKind) {
|
||||||
ExplicitReceiverKind.DISPATCH_RECEIVER -> callableCandidate.dispatchReceiver
|
ExplicitReceiverKind.DISPATCH_RECEIVER -> callableCandidate.dispatchReceiver
|
||||||
@@ -411,14 +409,31 @@ class ResolvedAtomCompleter(
|
|||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
return CallableReferenceResultTypeInfo(
|
return CallableReferenceResultTypeInfo(
|
||||||
recorderDescriptor.dispatchReceiverParameter?.value,
|
recordedDescriptor.dispatchReceiverParameter?.value,
|
||||||
recorderDescriptor.extensionReceiverParameter?.value,
|
recordedDescriptor.extensionReceiverParameter?.value,
|
||||||
explicitCallableReceiver?.receiver?.receiverValue,
|
explicitCallableReceiver?.receiver?.receiverValue,
|
||||||
TypeSubstitutor.EMPTY,
|
TypeSubstitutor.EMPTY,
|
||||||
callableCandidate.reflectionCandidateType
|
callableCandidate.reflectionCandidateType.replaceFunctionTypeArgumentsByDescriptor(recordedDescriptor)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
|
private fun KotlinType.replaceFunctionTypeArgumentsByDescriptor(descriptor: CallableDescriptor) =
|
||||||
|
when (descriptor) {
|
||||||
|
is CallableMemberDescriptor -> {
|
||||||
|
val newArgumentTypes = buildList {
|
||||||
|
descriptor.extensionReceiverParameter?.let { add(it.type) }
|
||||||
|
addAll(descriptor.valueParameters.map { it.type })
|
||||||
|
add(descriptor.returnType)
|
||||||
|
}
|
||||||
|
if (newArgumentTypes.size == arguments.size) {
|
||||||
|
replace(arguments.mapIndexed { i, type -> newArgumentTypes[i]?.let { type.replaceType(it) } ?: type })
|
||||||
|
} else this
|
||||||
|
}
|
||||||
|
is ValueDescriptor -> replace(descriptor.type.arguments)
|
||||||
|
else -> this
|
||||||
|
}
|
||||||
|
|
||||||
private fun completeCallableReference(resolvedAtom: ResolvedCallableReferenceAtom) {
|
private fun completeCallableReference(resolvedAtom: ResolvedCallableReferenceAtom) {
|
||||||
val psiCallArgument = resolvedAtom.atom.psiCallArgument as CallableReferenceKotlinCallArgumentImpl
|
val psiCallArgument = resolvedAtom.atom.psiCallArgument as CallableReferenceKotlinCallArgumentImpl
|
||||||
val callableReferenceExpression = psiCallArgument.ktCallableReferenceExpression
|
val callableReferenceExpression = psiCallArgument.ktCallableReferenceExpression
|
||||||
|
|||||||
Reference in New Issue
Block a user