From 11a7a242c84bf363a52fca93299863b58b0083b1 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 19 Sep 2016 14:09:47 +0300 Subject: [PATCH] Move to Companion Object: Fix exception when applied to class #KT-13883 Fixed --- ChangeLog.md | 1 + .../MoveMemberToCompanionObjectIntention.kt | 49 ++++++++++--------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 6c9c97e4fc7..1b69d964471 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -113,6 +113,7 @@ These artifacts include extensions for the types available in the latter JDKs, s - [`KT-9490`](https://youtrack.jetbrains.com/issue/KT-9490) Convert receiver to parameter: use template instead of the dialog - [`KT-11483`](https://youtrack.jetbrains.com/issue/KT-11483) Move to Companion: Do not use qualified names as labels - [`KT-13874`](https://youtrack.jetbrains.com/issue/KT-13874) Move to Companion: Fix AssertionError on running refactoring from Conflicts View +- [`KT-13883`](https://youtrack.jetbrains.com/issue/KT-13883) Move to Companion Object: Fix exception when applied to class ##### New features diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberToCompanionObjectIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberToCompanionObjectIntention.kt index 6c1a616c1ca..e9267d0efe3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberToCompanionObjectIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/MoveMemberToCompanionObjectIntention.kt @@ -54,6 +54,7 @@ import org.jetbrains.kotlin.idea.search.declarationsSearch.HierarchySearchReques import org.jetbrains.kotlin.idea.search.declarationsSearch.searchOverriders import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.core.ShortenReferences +import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.lexer.KtTokens @@ -236,6 +237,8 @@ class MoveMemberToCompanionObjectIntention : SelfTargetingRangeIntention - when (ref) { - is PsiReferenceExpression -> JavaUsageInfo(ref) - is KtSimpleNameReference -> { - val refExpr = ref.expression - if (element.isAncestor(refExpr)) return@mapNotNullTo null - val context = refExpr.analyze(BodyResolveMode.PARTIAL) - val resolvedCall = refExpr.getResolvedCall(context) ?: return@mapNotNullTo null + runReadAction { + ReferencesSearch.search(element).mapNotNullTo(externalUsages) { ref -> + when (ref) { + is PsiReferenceExpression -> JavaUsageInfo(ref) + is KtSimpleNameReference -> { + val refExpr = ref.expression + if (element.isAncestor(refExpr)) return@mapNotNullTo null + val context = refExpr.analyze(BodyResolveMode.PARTIAL) + val resolvedCall = refExpr.getResolvedCall(context) ?: return@mapNotNullTo null - val callExpression = resolvedCall.call.callElement as? KtExpression ?: return@mapNotNullTo null + val callExpression = resolvedCall.call.callElement as? KtExpression ?: return@mapNotNullTo null - val extensionReceiver = resolvedCall.extensionReceiver - if (extensionReceiver != null && extensionReceiver !is ImplicitReceiver) { - conflicts.putValue(callExpression, - "Calls with explicit extension receiver won't be processed: ${callExpression.text}") - return@mapNotNullTo null - } + val extensionReceiver = resolvedCall.extensionReceiver + if (extensionReceiver != null && extensionReceiver !is ImplicitReceiver) { + conflicts.putValue(callExpression, + "Calls with explicit extension receiver won't be processed: ${callExpression.text}") + return@mapNotNullTo null + } - val dispatchReceiver = resolvedCall.dispatchReceiver ?: return@mapNotNullTo null - if (dispatchReceiver is ExpressionReceiver) { - ExplicitReceiverUsageInfo(refExpr, dispatchReceiver.expression) - } - else { - ImplicitReceiverUsageInfo(refExpr, callExpression) + val dispatchReceiver = resolvedCall.dispatchReceiver ?: return@mapNotNullTo null + if (dispatchReceiver is ExpressionReceiver) { + ExplicitReceiverUsageInfo(refExpr, dispatchReceiver.expression) + } + else { + ImplicitReceiverUsageInfo(refExpr, callExpression) + } } + else -> null } - else -> null } } }