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-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
@@ -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<KtNamed
runTemplateForInstanceParam(newDeclaration, nameSuggestions, editor)
}
override fun startInWriteAction() = false
override fun applyTo(element: KtNamedDeclaration, editor: Editor?) {
val project = element.project
@@ -277,33 +280,35 @@ class MoveMemberToCompanionObjectIntention : SelfTargetingRangeIntention<KtNamed
}
project.runSynchronouslyWithProgress("Searching for ${element.name}", true) {
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
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
}
}
}