Code refactorings in QuickFixWithDelegateFactory
This commit is contained in:
+4
-8
@@ -30,17 +30,13 @@ import org.jetbrains.kotlin.utils.singletonOrEmptyList
|
|||||||
public abstract class KotlinIntentionActionFactoryWithDelegate<E : JetElement, D : Any> : JetIntentionActionsFactory() {
|
public abstract class KotlinIntentionActionFactoryWithDelegate<E : JetElement, D : Any> : JetIntentionActionsFactory() {
|
||||||
protected abstract fun getElementOfInterest(diagnostic: Diagnostic): E?
|
protected abstract fun getElementOfInterest(diagnostic: Diagnostic): E?
|
||||||
|
|
||||||
protected open fun createQuickFix(
|
protected open fun createQuickFix(diagnostic: Diagnostic, quickFixDataFactory: () -> D?): QuickFixWithDelegateFactory? = null
|
||||||
originalElementPointer: SmartPsiElementPointer<E>,
|
|
||||||
diagnostic: Diagnostic,
|
|
||||||
quickFixDataFactory: (SmartPsiElementPointer<E>) -> D?
|
|
||||||
): QuickFixWithDelegateFactory? = null
|
|
||||||
|
|
||||||
protected open fun createQuickFixes(
|
protected open fun createQuickFixes(
|
||||||
originalElementPointer: SmartPsiElementPointer<E>,
|
originalElementPointer: SmartPsiElementPointer<E>,
|
||||||
diagnostic: Diagnostic,
|
diagnostic: Diagnostic,
|
||||||
quickFixDataFactory: (SmartPsiElementPointer<E>) -> D?
|
quickFixDataFactory: () -> D?
|
||||||
): List<QuickFixWithDelegateFactory> = createQuickFix(originalElementPointer, diagnostic, quickFixDataFactory).singletonOrEmptyList()
|
): List<QuickFixWithDelegateFactory> = createQuickFix(diagnostic, quickFixDataFactory).singletonOrEmptyList()
|
||||||
|
|
||||||
protected abstract fun createQuickFixData(element: E, diagnostic: Diagnostic): D?
|
protected abstract fun createQuickFixData(element: E, diagnostic: Diagnostic): D?
|
||||||
|
|
||||||
@@ -59,7 +55,7 @@ public abstract class KotlinIntentionActionFactoryWithDelegate<E : JetElement, D
|
|||||||
val actions: List<QuickFixWithDelegateFactory>
|
val actions: List<QuickFixWithDelegateFactory>
|
||||||
try {
|
try {
|
||||||
actions = createQuickFixes(originalElementPointer, diagnostic) factory@ {
|
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
|
val diagnosticElement = diagnosticElementPointer.element ?: return@factory null
|
||||||
if (!diagnosticElement.isValid || !element.isValid) return@factory null
|
if (!diagnosticElement.isValid || !element.isValid) return@factory 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")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -21,10 +21,9 @@ import com.intellij.codeInsight.intention.LowPriorityAction
|
|||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
import org.jetbrains.annotations.NotNull
|
|
||||||
|
|
||||||
public open class QuickFixWithDelegateFactory(
|
public open class QuickFixWithDelegateFactory(
|
||||||
private val delegateFactory: () -> IntentionAction
|
private val delegateFactory: () -> IntentionAction?
|
||||||
) : IntentionAction {
|
) : IntentionAction {
|
||||||
private val familyName: String
|
private val familyName: String
|
||||||
private val text: String
|
private val text: String
|
||||||
@@ -32,25 +31,28 @@ public open class QuickFixWithDelegateFactory(
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
val delegate = delegateFactory()
|
val delegate = delegateFactory()
|
||||||
familyName = delegate.familyName
|
familyName = delegate?.familyName ?: ""
|
||||||
text = delegate.text
|
text = delegate?.text ?: ""
|
||||||
startInWriteAction = delegate.startInWriteAction()
|
startInWriteAction = delegate != null && delegate.startInWriteAction()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getFamilyName() = familyName
|
override fun getFamilyName() = familyName
|
||||||
|
|
||||||
override fun getText() = text
|
override fun getText() = text
|
||||||
|
|
||||||
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile) =
|
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
|
||||||
delegateFactory().isAvailable(project, editor, file)
|
val action = delegateFactory() ?: return false
|
||||||
|
return action.isAvailable(project, editor, file)
|
||||||
|
}
|
||||||
|
|
||||||
override fun startInWriteAction() = startInWriteAction
|
override fun startInWriteAction() = startInWriteAction
|
||||||
|
|
||||||
override fun invoke(@NotNull project: Project, editor: Editor?, file: PsiFile?) {
|
override fun invoke(project: Project, editor: Editor?, file: PsiFile?) {
|
||||||
delegateFactory().invoke(project, editor, file)
|
val action = delegateFactory() ?: return
|
||||||
|
action.invoke(project, editor, file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class LowPriorityQuickFixWithDelegateFactory(
|
public class LowPriorityQuickFixWithDelegateFactory(
|
||||||
delegateFactory: () -> IntentionAction
|
delegateFactory: () -> IntentionAction?
|
||||||
): QuickFixWithDelegateFactory(delegateFactory), LowPriorityAction
|
): QuickFixWithDelegateFactory(delegateFactory), LowPriorityAction
|
||||||
+6
-7
@@ -18,10 +18,9 @@ package org.jetbrains.kotlin.idea.quickfix.createFromUsage.createCallable
|
|||||||
|
|
||||||
import com.intellij.psi.SmartPsiElementPointer
|
import com.intellij.psi.SmartPsiElementPointer
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
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.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.idea.quickfix.createFromUsage.callableBuilder.CallableInfo
|
||||||
import org.jetbrains.kotlin.psi.JetElement
|
import org.jetbrains.kotlin.psi.JetElement
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList
|
import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList
|
||||||
@@ -32,13 +31,13 @@ public abstract class CreateCallableMemberFromUsageFactory<E : JetElement>(
|
|||||||
private fun newCallableQuickFix(
|
private fun newCallableQuickFix(
|
||||||
originalElementPointer: SmartPsiElementPointer<E>,
|
originalElementPointer: SmartPsiElementPointer<E>,
|
||||||
lowPriority: Boolean,
|
lowPriority: Boolean,
|
||||||
quickFixDataFactory: (SmartPsiElementPointer<E>) -> List<CallableInfo>?,
|
quickFixDataFactory: () -> List<CallableInfo>?,
|
||||||
quickFixFactory: (E, List<CallableInfo>) -> CreateCallableFromUsageFixBase<E>
|
quickFixFactory: (E, List<CallableInfo>) -> CreateCallableFromUsageFixBase<E>
|
||||||
): QuickFixWithDelegateFactory {
|
): QuickFixWithDelegateFactory {
|
||||||
val delegateFactory = {
|
val delegateFactory = {
|
||||||
val data = quickFixDataFactory(originalElementPointer).orEmpty()
|
val data = quickFixDataFactory().orEmpty()
|
||||||
val originalElement = originalElementPointer.element
|
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)
|
return if (lowPriority) LowPriorityQuickFixWithDelegateFactory(delegateFactory) else QuickFixWithDelegateFactory(delegateFactory)
|
||||||
}
|
}
|
||||||
@@ -51,7 +50,7 @@ public abstract class CreateCallableMemberFromUsageFactory<E : JetElement>(
|
|||||||
override fun createQuickFixes(
|
override fun createQuickFixes(
|
||||||
originalElementPointer: SmartPsiElementPointer<E>,
|
originalElementPointer: SmartPsiElementPointer<E>,
|
||||||
diagnostic: Diagnostic,
|
diagnostic: Diagnostic,
|
||||||
quickFixDataFactory: (SmartPsiElementPointer<E>) -> List<CallableInfo>?
|
quickFixDataFactory: () -> List<CallableInfo>?
|
||||||
): List<QuickFixWithDelegateFactory> {
|
): List<QuickFixWithDelegateFactory> {
|
||||||
val memberFix = newCallableQuickFix(originalElementPointer, false, quickFixDataFactory) { element, data ->
|
val memberFix = newCallableQuickFix(originalElementPointer, false, quickFixDataFactory) { element, data ->
|
||||||
CreateCallableFromUsageFix(element, data)
|
CreateCallableFromUsageFix(element, data)
|
||||||
|
|||||||
+7
-10
@@ -18,9 +18,8 @@ package org.jetbrains.kotlin.idea.quickfix.createFromUsage.createClass
|
|||||||
|
|
||||||
import com.intellij.psi.SmartPsiElementPointer
|
import com.intellij.psi.SmartPsiElementPointer
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
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.KotlinIntentionActionFactoryWithDelegate
|
||||||
|
import org.jetbrains.kotlin.idea.quickfix.QuickFixWithDelegateFactory
|
||||||
import org.jetbrains.kotlin.psi.JetElement
|
import org.jetbrains.kotlin.psi.JetElement
|
||||||
|
|
||||||
abstract class CreateClassFromUsageFactory<E : JetElement> : KotlinIntentionActionFactoryWithDelegate<E, ClassInfo>() {
|
abstract class CreateClassFromUsageFactory<E : JetElement> : KotlinIntentionActionFactoryWithDelegate<E, ClassInfo>() {
|
||||||
@@ -29,17 +28,15 @@ abstract class CreateClassFromUsageFactory<E : JetElement> : KotlinIntentionActi
|
|||||||
override fun createQuickFixes(
|
override fun createQuickFixes(
|
||||||
originalElementPointer: SmartPsiElementPointer<E>,
|
originalElementPointer: SmartPsiElementPointer<E>,
|
||||||
diagnostic: Diagnostic,
|
diagnostic: Diagnostic,
|
||||||
quickFixDataFactory: (SmartPsiElementPointer<E>) -> ClassInfo?
|
quickFixDataFactory: () -> ClassInfo?
|
||||||
): List<QuickFixWithDelegateFactory> {
|
): List<QuickFixWithDelegateFactory> {
|
||||||
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 {
|
QuickFixWithDelegateFactory {
|
||||||
val currentElement = originalElementPointer.element
|
val currentElement = originalElementPointer.element ?: return@QuickFixWithDelegateFactory null
|
||||||
val data = quickFixDataFactory(originalElementPointer)
|
val data = quickFixDataFactory() ?: return@QuickFixWithDelegateFactory null
|
||||||
if (currentElement != null && data != null) {
|
CreateClassFromUsageFix(currentElement, data.copy(kind = classKind))
|
||||||
CreateClassFromUsageFix(originalElement, data.copy(kind = classKind))
|
|
||||||
} else NullQuickFix
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+7
-9
@@ -16,12 +16,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.quickfix.createFromUsage.createVariable
|
package org.jetbrains.kotlin.idea.quickfix.createFromUsage.createVariable
|
||||||
|
|
||||||
import com.intellij.psi.SmartPsiElementPointer
|
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
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.KotlinIntentionActionFactoryWithDelegate
|
||||||
|
import org.jetbrains.kotlin.idea.quickfix.QuickFixWithDelegateFactory
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetParameterInfo
|
import org.jetbrains.kotlin.idea.refactoring.changeSignature.JetParameterInfo
|
||||||
import org.jetbrains.kotlin.psi.JetElement
|
import org.jetbrains.kotlin.psi.JetElement
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
@@ -34,16 +32,16 @@ data class CreateParameterData<E : JetElement>(
|
|||||||
|
|
||||||
abstract class CreateParameterFromUsageFactory<E : JetElement>: KotlinIntentionActionFactoryWithDelegate<E, CreateParameterData<E>>() {
|
abstract class CreateParameterFromUsageFactory<E : JetElement>: KotlinIntentionActionFactoryWithDelegate<E, CreateParameterData<E>>() {
|
||||||
override fun createQuickFix(
|
override fun createQuickFix(
|
||||||
originalElementPointer: SmartPsiElementPointer<E>,
|
|
||||||
diagnostic: Diagnostic,
|
diagnostic: Diagnostic,
|
||||||
quickFixDataFactory: (SmartPsiElementPointer<E>) -> CreateParameterData<E>?
|
quickFixDataFactory: () -> CreateParameterData<E>?
|
||||||
): QuickFixWithDelegateFactory? {
|
): QuickFixWithDelegateFactory? {
|
||||||
return QuickFixWithDelegateFactory {
|
return QuickFixWithDelegateFactory {
|
||||||
quickFixDataFactory(originalElementPointer)?.let { data ->
|
quickFixDataFactory()?.let { data ->
|
||||||
CreateParameterFromUsageFix(data.parameterInfo.callableDescriptor as FunctionDescriptor,
|
CreateParameterFromUsageFix(
|
||||||
|
data.parameterInfo.callableDescriptor as FunctionDescriptor,
|
||||||
data.parameterInfo,
|
data.parameterInfo,
|
||||||
data.originalExpression)
|
data.originalExpression)
|
||||||
} ?: NullQuickFix
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user