Convert reference to lambda: reformat
This commit is contained in:
+35
-35
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user