Disallow formatting in KotlinQuickFix.isAvailable()

This commit is contained in:
Dmitry Jemerov
2017-12-18 13:25:29 +01:00
parent 64f01e53af
commit 48021ce5a1
40 changed files with 93 additions and 141 deletions
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.android.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.android.facet.AndroidFacet
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic
@@ -43,9 +42,8 @@ class KotlinAndroidViewConstructorFix(element: KtSuperTypeEntry) : KotlinQuickFi
override fun getText() = "Add Android View constructors using '@JvmOverloads'"
override fun getFamilyName() = text
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
if (AndroidFacet.getInstance(file) == null) return false
return super.isAvailable(project, editor, file)
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
return AndroidFacet.getInstance(file) != null
}
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtFunction
@@ -29,9 +28,9 @@ class AddFunctionBodyFix(element: KtFunction) : KotlinQuickFixAction<KtFunction>
override fun getFamilyName() = "Add function body"
override fun getText() = familyName
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
return super.isAvailable(project, editor, file) && !element.hasBody()
return !element.hasBody()
}
public override fun invoke(project: Project, editor: Editor?, file: KtFile) {
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.search.searches.ReferencesSearch
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
@@ -70,9 +69,8 @@ class AddFunctionParametersFix(
"Add parameter$subjectSuffix to $callableDescription"
}
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val callElement = callElement ?: return false
if (!super.isAvailable(project, editor, file)) return false
// newParametersCnt <= 0: psi for this quickfix is no longer valid
val newParametersCnt = callElement.valueArguments.size - functionDescriptor.valueParameters.size
@@ -19,12 +19,11 @@ 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.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.idea.core.ShortenReferences
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtPsiFactory
import org.jetbrains.kotlin.psi.KtTypeParameter
@@ -45,9 +44,8 @@ class AddGenericUpperBoundFix(
override fun getText() = element?.let { "Add '$renderedUpperBound' as upper bound for ${it.name}" } ?: ""
override fun getFamilyName() = "Add generic upper bound"
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
if (!super.isAvailable(project, editor, file)) return false
// TODO: replacing existing upper bounds
return (element.name != null && element.extendsBound == null)
}
@@ -39,10 +39,6 @@ class AddLoopLabelFix(
override fun getText() = description
override fun getFamilyName() = text
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
return super.isAvailable(project, editor, file)
}
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
val element = element ?: return
val labelName = existingLabelName ?: getUniqueLabelName(collectUsedLabels(element))
@@ -19,7 +19,6 @@ 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 com.intellij.psi.PsiNameIdentifierOwner
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ClassDescriptor
@@ -67,9 +66,9 @@ open class AddModifierFix(
}
}
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
return super.isAvailable(project, editor, file) && element.canRefactor()
return element.canRefactor()
}
companion object {
@@ -23,7 +23,6 @@ import com.intellij.openapi.ui.popup.JBPopupFactory
import com.intellij.openapi.ui.popup.ListPopupStep
import com.intellij.openapi.ui.popup.PopupStep
import com.intellij.openapi.ui.popup.util.BaseListPopupStep
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.KotlinIcons
import org.jetbrains.kotlin.idea.caches.resolve.analyze
@@ -40,9 +39,8 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.types.isError
class AddNameToArgumentFix(argument: KtValueArgument) : KotlinQuickFixAction<KtValueArgument>(argument) {
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
if (!super.isAvailable(project, editor, file)) return false
if (element.getArgumentExpression() == null) return false
return calculatePossibleArgumentNames().isNotEmpty()
}
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.Errors
@@ -61,7 +60,7 @@ class AddTypeAnnotationToValueParameterFix(element: KtParameter) : KotlinQuickFi
typeName = type?.let { IdeDescriptorRenderers.SOURCE_CODE.renderType(it) }
}
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
return element.typeReference == null && typeNameShort != null
}
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.codeInsight.CodeInsightUtilCore
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
@@ -29,9 +28,9 @@ class AddWhenElseBranchFix(element: KtWhenExpression) : KotlinQuickFixAction<KtW
override fun getFamilyName() = "Add else branch"
override fun getText() = familyName
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
return super.isAvailable(project, editor, file) && element.closeBrace != null
return element.closeBrace != null
}
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
@@ -19,7 +19,6 @@ 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.kotlin.cfg.*
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassKind
@@ -40,9 +39,9 @@ class AddWhenRemainingBranchesFix(
override fun getText() = "Add remaining branches" + if (withImport) " with import" else ""
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
return super.isAvailable(project, editor, file) && element.closeBrace != null &&
return element.closeBrace != null &&
with(WhenChecker.getMissingCases(element, element.analyze())) { isNotEmpty() && !hasUnknown }
}
@@ -18,13 +18,12 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.core.ShortenReferences
import org.jetbrains.kotlin.idea.core.replaced
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.idea.core.ShortenReferences
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
@@ -46,8 +45,8 @@ class CastExpressionFix(element: KtExpression, type: KotlinType) : KotlinQuickFi
override fun getFamilyName() = "Cast expression"
override fun getText() = element?.let { "Cast expression '${it.text}' to '$typePresentation'" } ?: ""
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile)
= upOrDownCast && super.isAvailable(project, editor, file)
override fun isAvailable(project: Project, editor: Editor?, file: KtFile)
= upOrDownCast
public override fun invoke(project: Project, editor: Editor?, file: KtFile) {
val element = element ?: return
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
@@ -36,7 +35,7 @@ class ChangeAccessorTypeFix(element: KtPropertyAccessor) : KotlinQuickFixAction<
private fun getType(): KotlinType? =
(element!!.property.resolveToDescriptorIfAny() as? VariableDescriptor)?.type?.takeUnless(KotlinType::isError)
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile) = super.isAvailable(project, editor, file) && getType() != null
override fun isAvailable(project: Project, editor: Editor?, file: KtFile) = getType() != null
override fun getFamilyName() = "Change accessor type"
@@ -20,7 +20,6 @@ import com.intellij.codeInsight.intention.HighPriorityAction
import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
@@ -28,8 +27,8 @@ import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.Errors.COMPONENT_FUNCTION_RETURN_TYPE_MISMATCH
import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor
import org.jetbrains.kotlin.idea.core.ShortenReferences
import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil
import org.jetbrains.kotlin.idea.project.builtIns
@@ -138,9 +137,8 @@ abstract class ChangeCallableReturnTypeFix(
override fun getFamilyName() = KotlinBundle.message("change.type.family")
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
return super.isAvailable(project, editor, file) &&
!typeContainsError &&
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
return !typeContainsError &&
element !is KtConstructor<*>
}
@@ -19,7 +19,6 @@ 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 com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.KotlinBundle
@@ -107,9 +106,8 @@ class ChangeFunctionLiteralReturnTypeFix(
override fun getFamilyName() = KotlinBundle.message("change.type.family")
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
return super.isAvailable(project, editor, file)
&& (functionLiteralReturnTypeRef != null || appropriateQuickFix != null && appropriateQuickFix.isAvailable(project, editor!!, file))
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
return functionLiteralReturnTypeRef != null || appropriateQuickFix != null && appropriateQuickFix.isAvailable(project, editor!!, file)
}
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
@@ -52,9 +51,7 @@ abstract class ChangeFunctionSignatureFix(
override fun startInWriteAction() = false
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
if (!super.isAvailable(project, editor, file)) return false
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val declarations = DescriptorToSourceUtilsIde.getAllDeclarations(project, functionDescriptor)
return declarations.isNotEmpty() && declarations.all { it.isValid && it.canRefactor() }
}
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.idea.KotlinBundle
@@ -49,8 +48,8 @@ class ChangeParameterTypeFix(element: KtParameter, type: KotlinType) : KotlinQui
override fun startInWriteAction(): Boolean = false
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
return super.isAvailable(project, editor, file) && containingDeclarationName != null
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
return containingDeclarationName != null
}
override fun getText(): String {
@@ -19,7 +19,6 @@ 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.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory1
@@ -35,7 +34,7 @@ class ChangeVariableMutabilityFix(element: KtValVarKeywordOwner, private val mak
override fun getFamilyName(): String = text
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
val valOrVar = element.valOrVarKeyword?.node?.elementType ?: return false
return (valOrVar == KtTokens.VAR_KEYWORD) != makeVar
@@ -20,14 +20,13 @@ import com.intellij.codeInsight.intention.HighPriorityAction
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.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor
import org.jetbrains.kotlin.idea.core.ShortenReferences
import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
@@ -84,8 +83,8 @@ open class ChangeVariableTypeFix(element: KtVariableDeclaration, type: KotlinTyp
override fun getFamilyName()
= KotlinBundle.message("change.type.family")
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile)
= !typeContainsError && super.isAvailable(project, editor, file)
override fun isAvailable(project: Project, editor: Editor?, file: KtFile)
= !typeContainsError
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
val element = element ?: return
@@ -20,7 +20,6 @@ import com.intellij.codeInsight.intention.HighPriorityAction
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.kotlin.descriptors.DeclarationDescriptorWithVisibility
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
@@ -52,9 +51,9 @@ open class ChangeVisibilityFix(
protected class ChangeToProtectedFix(element: KtModifierListOwner, elementName: String) :
ChangeVisibilityFix(element, elementName, KtTokens.PROTECTED_KEYWORD) {
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
return super.isAvailable(project, editor, file) && element.canBeProtected()
return element.canBeProtected()
}
}
@@ -64,9 +63,9 @@ open class ChangeVisibilityFix(
protected class ChangeToPrivateFix(element: KtModifierListOwner, elementName: String) :
ChangeVisibilityFix(element, elementName, KtTokens.PRIVATE_KEYWORD), HighPriorityAction {
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
return super.isAvailable(project, editor, file) && element.canBePrivate()
return element.canBePrivate()
}
}
@@ -19,7 +19,6 @@ 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.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic
@@ -59,8 +58,7 @@ class ConvertClassToKClassFix(element: KtDotQualifiedExpression, type: KotlinTyp
override fun getText() = element?.let { "Remove '.${it.children.lastOrNull()?.text}'" } ?: ""
override fun getFamilyName() = "Remove conversion from 'KClass' to 'Class'"
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile)
= isApplicable && super.isAvailable(project, editor, file)
override fun isAvailable(project: Project, editor: Editor?, file: KtFile) = isApplicable
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
val element = element ?: return
@@ -21,7 +21,6 @@ import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.impl.source.tree.LeafPsiElement
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
@@ -50,15 +49,13 @@ abstract class ExclExclCallFix(psiElement: PsiElement) : KotlinQuickFixAction<Ps
override fun getFamilyName(): String = text
override fun startInWriteAction(): Boolean = true
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile) = file is KtFile
}
class RemoveExclExclCallFix(psiElement: PsiElement) : ExclExclCallFix(psiElement), CleanupFix {
override fun getText(): String = KotlinBundle.message("remove.unnecessary.non.null.assertion")
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean
= super.isAvailable(project, editor, file) && getExclExclPostfixExpression() != null
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean =
getExclExclPostfixExpression() != null
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
if (!FileModificationService.getInstance().prepareFileForWrite(file)) return
@@ -87,9 +84,8 @@ class AddExclExclCallFix(psiElement: PsiElement, val checkImplicitReceivers: Boo
override fun getText() = KotlinBundle.message("introduce.non.null.assertion")
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean
= super.isAvailable(project, editor, file) &&
getExpressionForIntroduceCall() != null
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean =
getExpressionForIntroduceCall() != null
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
if (!FileModificationService.getInstance().prepareFileForWrite(file)) return
@@ -115,8 +115,8 @@ internal abstract class ImportFixBase<T : KtExpression> protected constructor(
override fun getFamilyName() = KotlinBundle.message("import.fix")
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile)
= element != null && super.isAvailable(project, editor, file) && suggestions.isNotEmpty()
override fun isAvailable(project: Project, editor: Editor?, file: KtFile)
= element != null && suggestions.isNotEmpty()
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
val element = element ?: return
@@ -19,7 +19,6 @@ 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.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.KotlinBundle
@@ -58,9 +57,9 @@ class InsertDelegationCallQuickfix(val isThis: Boolean, element: KtSecondaryCons
editor?.moveCaret(leftParOffset + 1)
}
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
return super.isAvailable(project, editor, file) && element.hasImplicitDelegationCall()
return element.hasImplicitDelegationCall()
}
object InsertThisDelegationCallFactory : KotlinSingleIntentionActionFactory() {
@@ -18,10 +18,12 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.codeInsight.FileModificationService
import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.psi.CREATEBYPATTERN_MAY_NOT_REFORMAT
import org.jetbrains.kotlin.psi.KtCodeFragment
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer
@@ -32,15 +34,28 @@ abstract class KotlinQuickFixAction<out T : PsiElement>(element: T) : IntentionA
protected val element: T?
get() = elementPointer.element
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
val element = element ?: return false
return element.isValid &&
!element.project.isDisposed &&
(file.manager.isInProject(file) || file is KtCodeFragment) &&
(file is KtFile)
final override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
if (ApplicationManager.getApplication().isUnitTestMode) {
CREATEBYPATTERN_MAY_NOT_REFORMAT = true
}
try {
val element = element ?: return false
return element.isValid &&
!element.project.isDisposed &&
(file.manager.isInProject(file) || file is KtCodeFragment) &&
(file is KtFile) &&
isAvailable(project, editor, file)
}
finally {
CREATEBYPATTERN_MAY_NOT_REFORMAT = false
}
}
override final fun invoke(project: Project, editor: Editor?, file: PsiFile) {
protected open fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
return true
}
final override fun invoke(project: Project, editor: Editor?, file: PsiFile) {
val element = element ?: return
if (file is KtFile && FileModificationService.getInstance().prepareFileForWrite(element.containingFile)) {
invoke(project, editor, file)
@@ -20,7 +20,6 @@ import com.intellij.codeInsight.intention.LowPriorityAction
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.idea.core.ShortenReferences
import org.jetbrains.kotlin.idea.core.overrideImplement.ImplementMembersHandler
import org.jetbrains.kotlin.idea.quickfix.createFromUsage.callableBuilder.containsStarProjections
@@ -68,8 +67,7 @@ class LetImplementInterfaceFix(
override fun getFamilyName() = "Let type implement interface"
override fun getText() = "$prefix interface '$expectedTypeName'"
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile) =
super.isAvailable(project, editor, file) && validExpectedType
override fun isAvailable(project: Project, editor: Editor?, file: KtFile) = validExpectedType
override fun startInWriteAction() = false
@@ -19,7 +19,6 @@ 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.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinValVar
@@ -40,9 +39,9 @@ class MakeConstructorParameterPropertyFix(
override fun getText() =
"Make constructor parameter a property$suffix"
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
return super.isAvailable(project, editor, file) && !element.hasValOrVar()
return !element.hasValOrVar()
}
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
@@ -19,7 +19,6 @@ 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 com.intellij.psi.SmartPsiElementPointer
import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.PsiModificationTracker
@@ -74,12 +73,7 @@ class MakeOverriddenMemberOpenFix(declaration: KtDeclaration) : KotlinQuickFixAc
return QuickFixInfo(overriddenNonOverridableMembers, containingDeclarationsNames)
}
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
if (!super.isAvailable(project, editor, file) || file !is KtFile) {
return false
}
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
return overriddenNonOverridableMembers.isNotEmpty()
}
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.codeInsight.CodeInsightUtilCore
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtPsiUtil
@@ -32,9 +31,9 @@ class MoveWhenElseBranchFix(element: KtWhenExpression) : KotlinQuickFixAction<Kt
override fun getText() = familyName
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
return super.isAvailable(project, editor, file) && KtPsiUtil.checkWhenExpressionHasSingleElse(element)
return KtPsiUtil.checkWhenExpressionHasSingleElse(element)
}
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
@@ -19,7 +19,6 @@ 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.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.core.replaced
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
@@ -43,10 +42,9 @@ class NumberConversionFix(
}
private val typePresentation = IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(type)
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile)
override fun isAvailable(project: Project, editor: Editor?, file: KtFile)
= disableIfAvailable?.isAvailable(project, editor, file) != true
&& isConversionAvailable
&& super.isAvailable(project, editor, file)
override fun getFamilyName() = "Insert number conversion"
override fun getText() = "Convert expression to '$typePresentation'"
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.util.CommentSaver
import org.jetbrains.kotlin.psi.KtFile
@@ -31,9 +30,9 @@ class RemoveFunctionBodyFix(element: KtFunction) : KotlinQuickFixAction<KtFuncti
override fun getText() = familyName
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
return super.isAvailable(project, editor, file) && element.hasBody()
return element.hasBody()
}
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
@@ -52,8 +51,8 @@ class RemoveModifierFix(
override fun getText() = text
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile)
= super.isAvailable(project, editor, file) && (element?.hasModifier(modifier) ?: false)
override fun isAvailable(project: Project, editor: Editor?, file: KtFile) =
(element?.hasModifier(modifier) ?: false)
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
invoke()
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.Errors
@@ -48,8 +47,7 @@ open class RemovePartsFromPropertyFix(
override fun getFamilyName(): String = "Remove parts from property"
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
if (!super.isAvailable(project, editor, file)) return false
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val type = QuickFixUtil.getDeclarationReturnType(element) ?: return false
return !type.isError
}
@@ -20,7 +20,6 @@ import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.ide.DataManager
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiNameIdentifierOwner
import com.intellij.refactoring.rename.RenameHandlerRegistry
import org.jetbrains.kotlin.diagnostics.Diagnostic
@@ -38,8 +37,8 @@ class RenameUnderscoreFix(declaration: KtDeclaration) : KotlinQuickFixAction<KtD
renameHandler?.invoke(project, arrayOf(element), dataContext)
}
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
return super.isAvailable(project, editor, file) && editor != null
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
return editor != null
}
override fun getText(): String = "Rename"
@@ -75,11 +75,9 @@ class RenameUnresolvedReferenceFix(element: KtNameReferenceExpression): KotlinQu
override fun getFamilyName() = QuickFixBundle.message("rename.wrong.reference.family")
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
return super.isAvailable(project, editor, file)
&& editor != null
&& element.getStrictParentOfType<KtTypeReference>() == null
return editor != null && element.getStrictParentOfType<KtTypeReference>() == null
}
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
@@ -19,7 +19,6 @@ 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.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.psi.*
@@ -38,9 +37,9 @@ abstract class ReplaceCallFix(
override fun getFamilyName() = text
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
return super.isAvailable(project, editor, file) && element.selectorExpression != null
return element.selectorExpression != null
}
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.codegen.ExpressionCodegen
import org.jetbrains.kotlin.config.LanguageFeature
@@ -77,8 +76,7 @@ class WrongPrimitiveLiteralFix(element: KtConstantExpression, type: KotlinType)
}
}
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
if (!super.isAvailable(project, editor, file)) return false
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
if (constValue == null) return false
if (expectedTypeIsFloat || expectedTypeIsDouble) return true
@@ -21,7 +21,6 @@ import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
@@ -142,9 +141,7 @@ abstract class CreateCallableFromUsageFixBase<E : KtElement>(
}.toString()
}
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
if (!super.isAvailable(project, editor, file)) return false
if (file !is KtFile) return false
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
val receiverInfo = callableInfos.first().receiverTypeInfo
@@ -23,7 +23,10 @@ import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.openapi.project.Project
import com.intellij.psi.*
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiComment
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiPackage
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils
import org.jetbrains.kotlin.idea.quickfix.IntentionActionPriority
@@ -78,8 +81,7 @@ open class CreateClassFromUsageFix<E : KtElement> protected constructor (
): CreateFromUsageFixBase<E>(element) {
override fun getText() = "Create ${classInfo.kind.description} '${classInfo.name}'"
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
if (!super.isAvailable(project, editor, file)) return false
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
with(classInfo) {
if (kind == DEFAULT) return false
if (applicableParents.isEmpty()) return false
@@ -20,7 +20,6 @@ import com.intellij.codeInsight.hint.HintManager
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.searches.ReferencesSearch
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
@@ -58,9 +57,8 @@ abstract class DeprecatedSymbolUsageFixBase(
val replaceWith: ReplaceWith
) : KotlinQuickFixAction<KtSimpleNameExpression>(element) {
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
val element = element ?: return false
if (!super.isAvailable(project, editor, file)) return false
val strategy = buildUsageReplacementStrategy(element, replaceWith, recheckAnnotation = true)
return strategy?.createReplacer(element) != null
}
@@ -42,8 +42,7 @@ class DeprecatedSymbolUsageInWholeProjectFix(
override fun startInWriteAction() = false
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
if (!super.isAvailable(project, editor, file)) return false
override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean {
return targetPsiElement() != null
}