Move to Companion Object: Fix exception when applied to class

#KT-13883 Fixed
This commit is contained in:
Alexey Sedunov
2016-09-19 14:09:47 +03:00
parent 64e5baade3
commit 11a7a242c8
2 changed files with 28 additions and 22 deletions
+1
View File
@@ -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-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-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-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 ##### New features
@@ -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.search.declarationsSearch.searchOverriders
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.idea.core.ShortenReferences 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.idea.util.application.runWriteAction
import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
@@ -236,6 +237,8 @@ class MoveMemberToCompanionObjectIntention : SelfTargetingRangeIntention<KtNamed
runTemplateForInstanceParam(newDeclaration, nameSuggestions, editor) runTemplateForInstanceParam(newDeclaration, nameSuggestions, editor)
} }
override fun startInWriteAction() = false
override fun applyTo(element: KtNamedDeclaration, editor: Editor?) { override fun applyTo(element: KtNamedDeclaration, editor: Editor?) {
val project = element.project val project = element.project
@@ -277,33 +280,35 @@ class MoveMemberToCompanionObjectIntention : SelfTargetingRangeIntention<KtNamed
} }
project.runSynchronouslyWithProgress("Searching for ${element.name}", true) { project.runSynchronouslyWithProgress("Searching for ${element.name}", true) {
ReferencesSearch.search(element).mapNotNullTo(externalUsages) { ref -> runReadAction {
when (ref) { ReferencesSearch.search(element).mapNotNullTo(externalUsages) { ref ->
is PsiReferenceExpression -> JavaUsageInfo(ref) when (ref) {
is KtSimpleNameReference -> { is PsiReferenceExpression -> JavaUsageInfo(ref)
val refExpr = ref.expression is KtSimpleNameReference -> {
if (element.isAncestor(refExpr)) return@mapNotNullTo null val refExpr = ref.expression
val context = refExpr.analyze(BodyResolveMode.PARTIAL) if (element.isAncestor(refExpr)) return@mapNotNullTo null
val resolvedCall = refExpr.getResolvedCall(context) ?: 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 val extensionReceiver = resolvedCall.extensionReceiver
if (extensionReceiver != null && extensionReceiver !is ImplicitReceiver) { if (extensionReceiver != null && extensionReceiver !is ImplicitReceiver) {
conflicts.putValue(callExpression, conflicts.putValue(callExpression,
"Calls with explicit extension receiver won't be processed: ${callExpression.text}") "Calls with explicit extension receiver won't be processed: ${callExpression.text}")
return@mapNotNullTo null return@mapNotNullTo null
} }
val dispatchReceiver = resolvedCall.dispatchReceiver ?: return@mapNotNullTo null val dispatchReceiver = resolvedCall.dispatchReceiver ?: return@mapNotNullTo null
if (dispatchReceiver is ExpressionReceiver) { if (dispatchReceiver is ExpressionReceiver) {
ExplicitReceiverUsageInfo(refExpr, dispatchReceiver.expression) ExplicitReceiverUsageInfo(refExpr, dispatchReceiver.expression)
} }
else { else {
ImplicitReceiverUsageInfo(refExpr, callExpression) ImplicitReceiverUsageInfo(refExpr, callExpression)
}
} }
else -> null
} }
else -> null
} }
} }
} }