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