"Convert lambda to reference": fix false positive for vararg function

#KT-16422 Fixed
This commit is contained in:
Toshiaki Kameyama
2018-08-01 07:01:43 +03:00
committed by Mikhail Glukhikh
parent 28aa0763a9
commit 08cfe1acfd
5 changed files with 31 additions and 2 deletions
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.resolve.BindingContext.FUNCTION
import org.jetbrains.kotlin.resolve.BindingContext.REFERENCE_TARGET
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue
import org.jetbrains.kotlin.resolve.calls.model.VarargValueArgument
import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject
import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver
import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy
@@ -128,8 +129,9 @@ open class ConvertLambdaToReferenceIntention(text: String) :
if (lambdaValueParameterDescriptors.size < explicitReceiverShift + callableExpression.valueArguments.size) return false
val resolvedCall = callableExpression.getResolvedCall(context) ?: return false
resolvedCall.valueArguments.entries.forEach { (valueParameter, resolvedArgument) ->
val argumentExpression =
resolvedArgument.arguments.singleOrNull()?.getArgumentExpression() as? KtNameReferenceExpression ?: return false
val argument = resolvedArgument.arguments.singleOrNull() ?: return false
if (resolvedArgument is VarargValueArgument && argument.getSpreadElement() == null) return false
val argumentExpression = argument.getArgumentExpression() as? KtNameReferenceExpression ?: return false
val argumentTarget = context[REFERENCE_TARGET, argumentExpression] as? ValueParameterDescriptor ?: return false
if (argumentTarget != lambdaValueParameterDescriptors[valueParameter.index + explicitReceiverShift]) return false
}