From a38fcecefe8db6b977b9e13076beac26bc582b94 Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Thu, 4 May 2017 19:13:42 +0300 Subject: [PATCH] IDEA-85507: `JavaCommonIntentionActionsFactory#createAddMethodAction` implementation --- .../JvmCommonIntentionActionsFactory.kt | 9 +++-- .../impl/JavaCommonIntentionActionsFactory.kt | 33 ++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/java/java-analysis-api/src/com/intellij/codeInsight/intention/JvmCommonIntentionActionsFactory.kt b/java/java-analysis-api/src/com/intellij/codeInsight/intention/JvmCommonIntentionActionsFactory.kt index 16eff2dc90e7..4719f2b3dfdd 100644 --- a/java/java-analysis-api/src/com/intellij/codeInsight/intention/JvmCommonIntentionActionsFactory.kt +++ b/java/java-analysis-api/src/com/intellij/codeInsight/intention/JvmCommonIntentionActionsFactory.kt @@ -38,8 +38,13 @@ abstract class JvmCommonIntentionActionsFactory { open fun createChangeModifierAction(declaration: UDeclaration, @PsiModifier.ModifierConstant @NonNls modifier: String, shouldPresent: Boolean): IntentionAction? = null - open fun createAddMethodAction(u: UClass, methodName: String, returnType: PsiType, vararg parameters: PsiType): IntentionAction? = null + open fun createAddMethodAction(u: UClass, + methodName: String, + @PsiModifier.ModifierConstant visibilityModifier: String, + returnType: PsiType, + vararg parameters: PsiType): IntentionAction? = null - companion object : LanguageExtension("com.intellij.codeInsight.intention.jvmCommonIntentionActionsFactory") + companion object : LanguageExtension( + "com.intellij.codeInsight.intention.jvmCommonIntentionActionsFactory") {} } diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/JavaCommonIntentionActionsFactory.kt b/java/java-impl/src/com/intellij/codeInsight/intention/impl/JavaCommonIntentionActionsFactory.kt index 90e56ec96303..04ea271d60ea 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/JavaCommonIntentionActionsFactory.kt +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/JavaCommonIntentionActionsFactory.kt @@ -15,10 +15,18 @@ */ package com.intellij.codeInsight.intention.impl +import com.intellij.codeInsight.daemon.QuickFixBundle import com.intellij.codeInsight.daemon.impl.quickfix.ModifierFix +import com.intellij.codeInsight.intention.AbstractIntentionAction import com.intellij.codeInsight.intention.IntentionAction -import org.jetbrains.uast.UDeclaration import com.intellij.codeInsight.intention.JvmCommonIntentionActionsFactory +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import com.intellij.psi.* +import com.intellij.util.VisibilityUtil +import org.jetbrains.annotations.NotNull +import org.jetbrains.uast.UClass +import org.jetbrains.uast.UDeclaration class JavaCommonIntentionActionsFactory : JvmCommonIntentionActionsFactory() { @@ -27,4 +35,27 @@ class JavaCommonIntentionActionsFactory : JvmCommonIntentionActionsFactory() { return ModifierFix(declaration.modifierList, modifier, shouldPresent, false) } + override fun createAddMethodAction(u: UClass, + methodName: String, + @PsiModifier.ModifierConstant @NotNull visibilityModifier: String, + returnType: PsiType, + vararg parameters: PsiType): IntentionAction? { + val paramsString = parameters.mapIndexed { i, t -> "${t.presentableText} arg$i" }.joinToString() + val signatureString = + "${VisibilityUtil.getVisibilityString(visibilityModifier)} ${returnType.presentableText} $methodName($paramsString){}" + val smartPsi = SmartPointerManager.getInstance(u.project).createSmartPsiElementPointer(u.psi) + return object : AbstractIntentionAction() { + + private val text = QuickFixBundle.message("add.method.text", methodName, u.name) + + override fun getText(): String = text + + override fun invoke(project: Project, editor: Editor?, file: PsiFile) { + val psi = smartPsi.element ?: return + val createMethodFromText = PsiElementFactory.SERVICE.getInstance(u.project) + .createMethodFromText(signatureString, psi) + psi.add(createMethodFromText) + } + } + } } \ No newline at end of file