diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinIntentionActionFactoryWithDelegate.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinIntentionActionFactoryWithDelegate.kt index 9c912b01149..13a6e3461d8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinIntentionActionFactoryWithDelegate.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinIntentionActionFactoryWithDelegate.kt @@ -30,17 +30,13 @@ import org.jetbrains.kotlin.utils.singletonOrEmptyList public abstract class KotlinIntentionActionFactoryWithDelegate : JetIntentionActionsFactory() { protected abstract fun getElementOfInterest(diagnostic: Diagnostic): E? - protected open fun createQuickFix( - originalElementPointer: SmartPsiElementPointer, - diagnostic: Diagnostic, - quickFixDataFactory: (SmartPsiElementPointer) -> D? - ): QuickFixWithDelegateFactory? = null + protected open fun createQuickFix(diagnostic: Diagnostic, quickFixDataFactory: () -> D?): QuickFixWithDelegateFactory? = null protected open fun createQuickFixes( originalElementPointer: SmartPsiElementPointer, diagnostic: Diagnostic, - quickFixDataFactory: (SmartPsiElementPointer) -> D? - ): List = createQuickFix(originalElementPointer, diagnostic, quickFixDataFactory).singletonOrEmptyList() + quickFixDataFactory: () -> D? + ): List = createQuickFix(diagnostic, quickFixDataFactory).singletonOrEmptyList() protected abstract fun createQuickFixData(element: E, diagnostic: Diagnostic): D? @@ -59,7 +55,7 @@ public abstract class KotlinIntentionActionFactoryWithDelegate try { actions = createQuickFixes(originalElementPointer, diagnostic) factory@ { - val element = it.element ?: return@factory null + val element = originalElementPointer.element ?: return@factory null val diagnosticElement = diagnosticElementPointer.element ?: return@factory null if (!diagnosticElement.isValid || !element.isValid) return@factory null diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/NullQuickFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/NullQuickFix.kt deleted file mode 100644 index 97bddc49bf9..00000000000 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/NullQuickFix.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.idea.quickfix - -import com.intellij.codeInsight.intention.IntentionAction -import com.intellij.openapi.editor.Editor -import com.intellij.openapi.project.Project -import com.intellij.psi.PsiFile -import org.jetbrains.annotations.NotNull - -public object NullQuickFix : IntentionAction { - override fun getText() = "" - - override fun getFamilyName() = "" - - override fun isAvailable(project: Project, editor: Editor?, file: PsiFile) = false - - override fun startInWriteAction() = false - - override fun invoke(@NotNull project: Project, editor: Editor?, file: PsiFile?) { - throw UnsupportedOperationException("invoke() shouldn't be called") - } -} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixWithDelegateFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixWithDelegateFactory.kt index e093124e3cf..a2c49c08807 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixWithDelegateFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixWithDelegateFactory.kt @@ -21,10 +21,9 @@ 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 open class QuickFixWithDelegateFactory( - private val delegateFactory: () -> IntentionAction + private val delegateFactory: () -> IntentionAction? ) : IntentionAction { private val familyName: String private val text: String @@ -32,25 +31,28 @@ public open class QuickFixWithDelegateFactory( init { val delegate = delegateFactory() - familyName = delegate.familyName - text = delegate.text - startInWriteAction = delegate.startInWriteAction() + familyName = delegate?.familyName ?: "" + text = delegate?.text ?: "" + startInWriteAction = delegate != null && delegate.startInWriteAction() } override fun getFamilyName() = familyName override fun getText() = text - override fun isAvailable(project: Project, editor: Editor?, file: PsiFile) = - delegateFactory().isAvailable(project, editor, file) + override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean { + val action = delegateFactory() ?: return false + return action.isAvailable(project, editor, file) + } override fun startInWriteAction() = startInWriteAction - override fun invoke(@NotNull project: Project, editor: Editor?, file: PsiFile?) { - delegateFactory().invoke(project, editor, file) + override fun invoke(project: Project, editor: Editor?, file: PsiFile?) { + val action = delegateFactory() ?: return + action.invoke(project, editor, file) } } public class LowPriorityQuickFixWithDelegateFactory( - delegateFactory: () -> IntentionAction + 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 92464246a93..2cdd4d17423 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,10 +18,9 @@ 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.KotlinIntentionActionFactoryWithDelegate +import org.jetbrains.kotlin.idea.quickfix.LowPriorityQuickFixWithDelegateFactory +import org.jetbrains.kotlin.idea.quickfix.QuickFixWithDelegateFactory import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.CallableInfo import org.jetbrains.kotlin.psi.JetElement import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList @@ -32,13 +31,13 @@ public abstract class CreateCallableMemberFromUsageFactory( private fun newCallableQuickFix( originalElementPointer: SmartPsiElementPointer, lowPriority: Boolean, - quickFixDataFactory: (SmartPsiElementPointer) -> List?, + quickFixDataFactory: () -> List?, quickFixFactory: (E, List) -> CreateCallableFromUsageFixBase ): QuickFixWithDelegateFactory { val delegateFactory = { - val data = quickFixDataFactory(originalElementPointer).orEmpty() + val data = quickFixDataFactory().orEmpty() val originalElement = originalElementPointer.element - if (data.isNotEmpty() && originalElement != null) quickFixFactory(originalElement, data) else NullQuickFix + if (data.isNotEmpty() && originalElement != null) quickFixFactory(originalElement, data) else null } return if (lowPriority) LowPriorityQuickFixWithDelegateFactory(delegateFactory) else QuickFixWithDelegateFactory(delegateFactory) } @@ -51,7 +50,7 @@ public abstract class CreateCallableMemberFromUsageFactory( override fun createQuickFixes( originalElementPointer: SmartPsiElementPointer, diagnostic: Diagnostic, - quickFixDataFactory: (SmartPsiElementPointer) -> List? + quickFixDataFactory: () -> List? ): List { val memberFix = newCallableQuickFix(originalElementPointer, false, quickFixDataFactory) { element, data -> CreateCallableFromUsageFix(element, data) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFactory.kt index 9f23a8e85b4..2b60fe0e816 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFactory.kt @@ -18,9 +18,8 @@ package org.jetbrains.kotlin.idea.quickfix.createFromUsage.createClass import com.intellij.psi.SmartPsiElementPointer import org.jetbrains.kotlin.diagnostics.Diagnostic -import org.jetbrains.kotlin.idea.quickfix.NullQuickFix -import org.jetbrains.kotlin.idea.quickfix.QuickFixWithDelegateFactory import org.jetbrains.kotlin.idea.quickfix.KotlinIntentionActionFactoryWithDelegate +import org.jetbrains.kotlin.idea.quickfix.QuickFixWithDelegateFactory import org.jetbrains.kotlin.psi.JetElement abstract class CreateClassFromUsageFactory : KotlinIntentionActionFactoryWithDelegate() { @@ -29,17 +28,15 @@ abstract class CreateClassFromUsageFactory : KotlinIntentionActi override fun createQuickFixes( originalElementPointer: SmartPsiElementPointer, diagnostic: Diagnostic, - quickFixDataFactory: (SmartPsiElementPointer) -> ClassInfo? + quickFixDataFactory: () -> ClassInfo? ): List { - val originalElement = originalElementPointer.element ?: return emptyList() + val possibleClassKinds = getPossibleClassKinds(originalElementPointer.element ?: return emptyList(), diagnostic) - val classFixes = getPossibleClassKinds(originalElement, diagnostic).map { classKind -> + val classFixes = possibleClassKinds.map { classKind -> QuickFixWithDelegateFactory { - val currentElement = originalElementPointer.element - val data = quickFixDataFactory(originalElementPointer) - if (currentElement != null && data != null) { - CreateClassFromUsageFix(originalElement, data.copy(kind = classKind)) - } else NullQuickFix + val currentElement = originalElementPointer.element ?: return@QuickFixWithDelegateFactory null + val data = quickFixDataFactory() ?: return@QuickFixWithDelegateFactory null + CreateClassFromUsageFix(currentElement, data.copy(kind = classKind)) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterFromUsageFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterFromUsageFactory.kt index afa4d4c1d5d..55587426072 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterFromUsageFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createVariable/CreateParameterFromUsageFactory.kt @@ -16,12 +16,10 @@ package org.jetbrains.kotlin.idea.quickfix.createFromUsage.createVariable -import com.intellij.psi.SmartPsiElementPointer import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic -import org.jetbrains.kotlin.idea.quickfix.NullQuickFix -import org.jetbrains.kotlin.idea.quickfix.QuickFixWithDelegateFactory import org.jetbrains.kotlin.idea.quickfix.KotlinIntentionActionFactoryWithDelegate +import org.jetbrains.kotlin.idea.quickfix.QuickFixWithDelegateFactory import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetParameterInfo import org.jetbrains.kotlin.psi.JetElement import org.jetbrains.kotlin.resolve.BindingContext @@ -34,16 +32,16 @@ data class CreateParameterData( abstract class CreateParameterFromUsageFactory: KotlinIntentionActionFactoryWithDelegate>() { override fun createQuickFix( - originalElementPointer: SmartPsiElementPointer, diagnostic: Diagnostic, - quickFixDataFactory: (SmartPsiElementPointer) -> CreateParameterData? + quickFixDataFactory: () -> CreateParameterData? ): QuickFixWithDelegateFactory? { return QuickFixWithDelegateFactory { - quickFixDataFactory(originalElementPointer)?.let { data -> - CreateParameterFromUsageFix(data.parameterInfo.callableDescriptor as FunctionDescriptor, + quickFixDataFactory()?.let { data -> + CreateParameterFromUsageFix( + data.parameterInfo.callableDescriptor as FunctionDescriptor, data.parameterInfo, - data.originalExpression) - } ?: NullQuickFix + data.originalExpression) + } } } } \ No newline at end of file