diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinBundle.properties b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinBundle.properties index 102dfa1d392..08ed24b5e66 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinBundle.properties +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinBundle.properties @@ -11,7 +11,6 @@ remove.parts.from.property.family=Remove parts from property remove.useless.nullable=Remove useless '?' replace.operation.in.binary.expression=Replace operation in a binary expression replace.cast.with.static.assert=Replace a cast with a static assert -replace.with.dot.call=Replace with dot call introduce.non.null.assertion=Add non-null asserted (!!) call remove.unnecessary.non.null.assertion=Remove unnecessary non-null assertion (!!) change.to.backing.field=Change reference to backing field diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceCallFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceCallFix.kt index b7bb57678dd..d437de0d7ac 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceCallFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceCallFix.kt @@ -19,64 +19,48 @@ 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.PsiElement import com.intellij.psi.PsiFile -import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.diagnostics.Diagnostic -import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getParentOfType -abstract class ReplaceCallFix protected constructor(val psiElement: PsiElement) : IntentionAction { +abstract class ReplaceCallFix( + expression: KtQualifiedExpression, + private val operation: String +) : KotlinQuickFixAction(expression) { - override fun getFamilyName(): String = text + override fun getFamilyName() = text override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean { - if (file is KtFile) { - return getCallExpression() != null - } - return false + return super.isAvailable(project, editor, file) && element.selectorExpression != null } - override fun invoke(project: Project, editor: Editor?, file: PsiFile) { - val callExpression = getCallExpression() ?: return - - val selector = callExpression.selectorExpression - if (selector != null) { - val newElement = KtPsiFactory(callExpression).createExpression( - callExpression.receiverExpression.text + operation + selector.text) as KtQualifiedExpression - - callExpression.replace(newElement) - } + override fun invoke(project: Project, editor: Editor?, file: KtFile) { + val newExpression = KtPsiFactory(element).createExpressionByPattern("$0$operation$1", + element.receiverExpression, element.selectorExpression!!) + element.replace(newExpression) } - - override fun startInWriteAction(): Boolean = true - - private fun getCallExpression(): KtQualifiedExpression? { - return PsiTreeUtil.getParentOfType(psiElement, classToReplace) - } - - abstract val operation: String - abstract val classToReplace: Class } -class ReplaceWithSafeCallFix(psiElement: PsiElement): ReplaceCallFix(psiElement) { - override fun getText(): String = "Replace with safe (?.) call" - override val operation: String get() = "?." - override val classToReplace: Class get() = KtDotQualifiedExpression::class.java +class ReplaceWithSafeCallFix(expression: KtDotQualifiedExpression): ReplaceCallFix(expression, "?.") { + + override fun getText() = "Replace with safe (?.) call" companion object : KotlinSingleIntentionActionFactory() { - override fun createAction(diagnostic: Diagnostic): IntentionAction - = ReplaceWithSafeCallFix(diagnostic.psiElement) + override fun createAction(diagnostic: Diagnostic): IntentionAction? { + val qualifiedExpression = diagnostic.psiElement.getParentOfType(strict = false) ?: return null + return ReplaceWithSafeCallFix(qualifiedExpression) + } } } -class ReplaceWithDotCallFix(psiElement: PsiElement): ReplaceCallFix(psiElement), CleanupFix { - override fun getText(): String = KotlinBundle.message("replace.with.dot.call") - override val operation: String get() = "." - override val classToReplace: Class get() = KtSafeQualifiedExpression::class.java +class ReplaceWithDotCallFix(expression: KtSafeQualifiedExpression): ReplaceCallFix(expression, "."), CleanupFix { + override fun getText() = "Replace with dot call" companion object : KotlinSingleIntentionActionFactory() { - override fun createAction(diagnostic: Diagnostic): IntentionAction - = ReplaceWithDotCallFix(diagnostic.psiElement) + override fun createAction(diagnostic: Diagnostic): IntentionAction? { + val qualifiedExpression = diagnostic.psiElement.getParentOfType(strict = false) ?: return null + return ReplaceWithDotCallFix(qualifiedExpression) + } } }