From ed090c2b2ed15c67bf1869400efa07afcfefa4f3 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 2 Sep 2015 13:43:08 +0300 Subject: [PATCH] Create from Usage: Prefer member declarations over extensions #KT-9012 Fixed --- .../kotlin/idea/quickfix/QuickFixWithDelegateFactory.kt | 9 +++++++-- .../CreateCallableMemberFromUsageFactory.kt | 9 ++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixWithDelegateFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixWithDelegateFactory.kt index 4ecde0f8c4c..e6d0bd179f9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixWithDelegateFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixWithDelegateFactory.kt @@ -17,12 +17,13 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.codeInsight.intention.IntentionAction +import com.intellij.codeInsight.intention.LowPriorityAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiFile import org.jetbrains.annotations.NotNull -public class QuickFixWithDelegateFactory( +public open class QuickFixWithDelegateFactory( private val delegateFactory: () -> IntentionAction ) : IntentionAction { private val familyName: String @@ -48,4 +49,8 @@ public class QuickFixWithDelegateFactory( override fun invoke(NotNull project: Project, editor: Editor?, file: PsiFile?) { delegateFactory().invoke(project, editor, file) } -} \ No newline at end of file +} + +public class LowPriorityQuickFixWithDelegateFactory( + delegateFactory: () -> IntentionAction +): QuickFixWithDelegateFactory(delegateFactory), LowPriorityAction \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableMemberFromUsageFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableMemberFromUsageFactory.kt index 0ad53a42df9..aa4f4c07238 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableMemberFromUsageFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableMemberFromUsageFactory.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.quickfix.createFromUsage.createCallable import com.intellij.psi.SmartPsiElementPointer import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.idea.quickfix.LowPriorityQuickFixWithDelegateFactory import org.jetbrains.kotlin.idea.quickfix.NullQuickFix import org.jetbrains.kotlin.idea.quickfix.QuickFixWithDelegateFactory import org.jetbrains.kotlin.idea.quickfix.createFromUsage.CreateFromUsageFactory @@ -30,14 +31,16 @@ public abstract class CreateCallableMemberFromUsageFactory( ) : CreateFromUsageFactory>() { private fun newCallableQuickFix( originalElementPointer: SmartPsiElementPointer, + lowPriority: Boolean, quickFixDataFactory: (SmartPsiElementPointer) -> List?, quickFixFactory: (E, List) -> CreateCallableFromUsageFixBase ): QuickFixWithDelegateFactory { - return QuickFixWithDelegateFactory { + val delegateFactory = { val data = quickFixDataFactory(originalElementPointer).orEmpty() val originalElement = originalElementPointer.element if (data.isNotEmpty() && originalElement != null) quickFixFactory(originalElement, data) else NullQuickFix } + return if (lowPriority) LowPriorityQuickFixWithDelegateFactory(delegateFactory) else QuickFixWithDelegateFactory(delegateFactory) } protected open fun createCallableInfo(element: E, diagnostic: Diagnostic): CallableInfo? = null @@ -50,12 +53,12 @@ public abstract class CreateCallableMemberFromUsageFactory( diagnostic: Diagnostic, quickFixDataFactory: (SmartPsiElementPointer) -> List? ): List { - val memberFix = newCallableQuickFix(originalElementPointer, quickFixDataFactory) { element, data -> + val memberFix = newCallableQuickFix(originalElementPointer, false, quickFixDataFactory) { element, data -> CreateCallableFromUsageFix(element, data) } if (!extensionsSupported) return listOf(memberFix) - val extensionFix = newCallableQuickFix(originalElementPointer, quickFixDataFactory) { element, data -> + val extensionFix = newCallableQuickFix(originalElementPointer, true, quickFixDataFactory) { element, data -> CreateExtensionCallableFromUsageFix(element, data) } return listOf(memberFix, extensionFix)