Convert reference to lambda: reformat

This commit is contained in:
Mikhail Glukhikh
2018-01-18 17:25:11 +03:00
parent 9d9b2b2a58
commit 3c19af3645
@@ -43,7 +43,7 @@ import org.jetbrains.kotlin.types.expressions.DoubleColonLHS
class ConvertReferenceToLambdaInspection : IntentionBasedInspection<KtCallableReferenceExpression>(ConvertReferenceToLambdaIntention::class) class ConvertReferenceToLambdaInspection : IntentionBasedInspection<KtCallableReferenceExpression>(ConvertReferenceToLambdaIntention::class)
class ConvertReferenceToLambdaIntention : SelfTargetingOffsetIndependentIntention<KtCallableReferenceExpression>( class ConvertReferenceToLambdaIntention : SelfTargetingOffsetIndependentIntention<KtCallableReferenceExpression>(
KtCallableReferenceExpression::class.java, "Convert reference to lambda" KtCallableReferenceExpression::class.java, "Convert reference to lambda"
) { ) {
override fun applyTo(element: KtCallableReferenceExpression, editor: Editor?) { override fun applyTo(element: KtCallableReferenceExpression, editor: Editor?) {
@@ -55,9 +55,11 @@ class ConvertReferenceToLambdaIntention : SelfTargetingOffsetIndependentIntentio
val receiverType = receiverExpression?.let { val receiverType = receiverExpression?.let {
(context[DOUBLE_COLON_LHS, it] as? DoubleColonLHS.Type)?.type (context[DOUBLE_COLON_LHS, it] as? DoubleColonLHS.Type)?.type
} }
val receiverNameAndType = receiverType?.let { KotlinNameSuggester.suggestNamesByType(it, validator = { val receiverNameAndType = receiverType?.let {
name -> name !in parameterNamesAndTypes.map { it.first } KotlinNameSuggester.suggestNamesByType(it, validator = { name ->
}, defaultName = "receiver").first() to it } name !in parameterNamesAndTypes.map { it.first }
}, defaultName = "receiver").first() to it
}
val valueArgumentParent = element.parent as? KtValueArgument val valueArgumentParent = element.parent as? KtValueArgument
val callGrandParent = valueArgumentParent?.parent?.parent as? KtCallExpression val callGrandParent = valueArgumentParent?.parent?.parent as? KtCallExpression
@@ -66,14 +68,14 @@ class ConvertReferenceToLambdaIntention : SelfTargetingOffsetIndependentIntentio
val matchingParameterIsExtension = matchingParameterType?.isExtensionFunctionType ?: false val matchingParameterIsExtension = matchingParameterType?.isExtensionFunctionType ?: false
val acceptsReceiverAsParameter = receiverNameAndType != null && !matchingParameterIsExtension && val acceptsReceiverAsParameter = receiverNameAndType != null && !matchingParameterIsExtension &&
(targetDescriptor.dispatchReceiverParameter != null || (targetDescriptor.dispatchReceiverParameter != null ||
targetDescriptor.extensionReceiverParameter != null) targetDescriptor.extensionReceiverParameter != null)
val factory = KtPsiFactory(element) val factory = KtPsiFactory(element)
val targetName = reference.text val targetName = reference.text
val lambdaParameterNamesAndTypes = val lambdaParameterNamesAndTypes =
if (acceptsReceiverAsParameter) listOf(receiverNameAndType!!) + parameterNamesAndTypes if (acceptsReceiverAsParameter) listOf(receiverNameAndType!!) + parameterNamesAndTypes
else parameterNamesAndTypes else parameterNamesAndTypes
val receiverPrefix = when { val receiverPrefix = when {
acceptsReceiverAsParameter -> receiverNameAndType!!.first + "." acceptsReceiverAsParameter -> receiverNameAndType!!.first + "."
@@ -82,35 +84,33 @@ class ConvertReferenceToLambdaIntention : SelfTargetingOffsetIndependentIntentio
} }
val lambdaExpression = if (valueArgumentParent != null && val lambdaExpression = if (valueArgumentParent != null &&
lambdaParameterNamesAndTypes.size == 1 && lambdaParameterNamesAndTypes.size == 1 &&
receiverExpression?.text != "it") { receiverExpression?.text != "it") {
factory.createLambdaExpression( factory.createLambdaExpression(
parameters = "", parameters = "",
body = when { body = when {
acceptsReceiverAsParameter -> acceptsReceiverAsParameter ->
if (targetDescriptor is PropertyDescriptor) "it.$targetName" if (targetDescriptor is PropertyDescriptor) "it.$targetName"
else "it.$targetName()" else "it.$targetName()"
else -> else ->
"$receiverPrefix$targetName(it)" "$receiverPrefix$targetName(it)"
} }
) )
} } else {
else {
factory.createLambdaExpression( factory.createLambdaExpression(
parameters = lambdaParameterNamesAndTypes.joinToString(separator = ", ") { parameters = lambdaParameterNamesAndTypes.joinToString(separator = ", ") {
if (valueArgumentParent != null) it.first if (valueArgumentParent != null) it.first
else it.first + ": " + SOURCE_RENDERER.renderType(it.second) else it.first + ": " + SOURCE_RENDERER.renderType(it.second)
}, },
body = if (targetDescriptor is PropertyDescriptor) { body = if (targetDescriptor is PropertyDescriptor) {
"$receiverPrefix$targetName" "$receiverPrefix$targetName"
} } else {
else { parameterNamesAndTypes.joinToString(
parameterNamesAndTypes.joinToString( prefix = "$receiverPrefix$targetName(",
prefix = "$receiverPrefix$targetName(", separator = ", ",
separator = ", ", postfix = ")"
postfix = ")" ) { it.first }
) { it.first } }
}
) )
} }
@@ -119,7 +119,7 @@ class ConvertReferenceToLambdaIntention : SelfTargetingOffsetIndependentIntentio
else -> false else -> false
} }
val wrappedExpression = val wrappedExpression =
if (needParentheses) factory.createExpressionByPattern("($0)", lambdaExpression) else lambdaExpression if (needParentheses) factory.createExpressionByPattern("($0)", lambdaExpression) else lambdaExpression
ShortenReferences.DEFAULT.process(element.replaced(wrappedExpression)) ShortenReferences.DEFAULT.process(element.replaced(wrappedExpression))
if (valueArgumentParent != null && callGrandParent != null) { if (valueArgumentParent != null && callGrandParent != null) {