From 4c8ffda004b178f8fd8c1f4baf8852a062caef86 Mon Sep 17 00:00:00 2001 From: Andrey Cherkasov Date: Fri, 1 Mar 2024 11:42:10 +0400 Subject: [PATCH] [kotlin] Introduce `ConvertLambdaToReferenceUtils` to share functions that don't require analysis between K1 and K2 implementations of ConvertLambdaToReferenceIntention. ^KTIJ-27702 GitOrigin-RevId: 2fb69984b9e79766e1a9ce1513291515586da60f --- .../utils/ConvertLambdaToReferenceUtils.kt | 20 +++++++++++++++++++ .../ConvertLambdaToReferenceIntention.kt | 15 ++++---------- 2 files changed, 24 insertions(+), 11 deletions(-) create mode 100644 plugins/kotlin/code-insight/utils/src/org/jetbrains/kotlin/idea/codeinsight/utils/ConvertLambdaToReferenceUtils.kt diff --git a/plugins/kotlin/code-insight/utils/src/org/jetbrains/kotlin/idea/codeinsight/utils/ConvertLambdaToReferenceUtils.kt b/plugins/kotlin/code-insight/utils/src/org/jetbrains/kotlin/idea/codeinsight/utils/ConvertLambdaToReferenceUtils.kt new file mode 100644 index 000000000000..e248f6355ed5 --- /dev/null +++ b/plugins/kotlin/code-insight/utils/src/org/jetbrains/kotlin/idea/codeinsight/utils/ConvertLambdaToReferenceUtils.kt @@ -0,0 +1,20 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.idea.codeinsight.utils + +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType +import org.jetbrains.kotlin.renderer.render + +object ConvertLambdaToReferenceUtils { + + fun KtCallExpression.getCallReferencedName(): String? = + (calleeExpression as? KtNameReferenceExpression)?.getSafeReferencedName() + + fun KtNameReferenceExpression.getSafeReferencedName(): String = getReferencedNameAsName().render() + + fun KtLambdaExpression.singleStatementOrNull(): KtExpression? = bodyExpression?.statements?.singleOrNull() + + fun KtLambdaExpression.isArgument(): Boolean { + return this === getStrictParentOfType()?.getArgumentExpression()?.let(KtPsiUtil::safeDeparenthesize) + } +} \ No newline at end of file diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt index a5fae8c2d1c5..bf8e8ad43f88 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt @@ -16,6 +16,10 @@ import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall import org.jetbrains.kotlin.idea.caches.resolve.safeAnalyzeNonSourceRootCode import org.jetbrains.kotlin.idea.codeinsight.api.classic.inspections.IntentionBasedInspection import org.jetbrains.kotlin.idea.codeinsight.api.classic.intentions.SelfTargetingOffsetIndependentIntention +import org.jetbrains.kotlin.idea.codeinsight.utils.ConvertLambdaToReferenceUtils.getCallReferencedName +import org.jetbrains.kotlin.idea.codeinsight.utils.ConvertLambdaToReferenceUtils.getSafeReferencedName +import org.jetbrains.kotlin.idea.codeinsight.utils.ConvertLambdaToReferenceUtils.isArgument +import org.jetbrains.kotlin.idea.codeinsight.utils.ConvertLambdaToReferenceUtils.singleStatementOrNull import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.core.setType import org.jetbrains.kotlin.idea.imports.importableFqName @@ -33,7 +37,6 @@ import org.jetbrains.kotlin.psi.psiUtil.getPossiblyQualifiedCallExpression import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.psi2ir.deparenthesize -import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext.FUNCTION import org.jetbrains.kotlin.resolve.BindingContext.REFERENCE_TARGET @@ -450,16 +453,6 @@ private fun KtLambdaExpression.parentValueArgument(): KtValueArgument? { } as? KtValueArgument } -private fun KtCallExpression.getCallReferencedName(): String? = - (calleeExpression as? KtNameReferenceExpression)?.getSafeReferencedName() - -private fun KtNameReferenceExpression.getSafeReferencedName(): String = getReferencedNameAsName().render() - -private fun KtLambdaExpression.singleStatementOrNull(): KtExpression? = bodyExpression?.statements?.singleOrNull() - -private fun KtLambdaExpression.isArgument(): Boolean = - this === getStrictParentOfType()?.getArgumentExpression()?.deparenthesize() - private fun KtNameReferenceExpression.renderTargetReceiverType( context: BindingContext, resolvedCall: ResolvedCall? = null