Move to Companion Object: Fix exception when applied to class
#KT-13883 Fixed
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
+27
-22
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user