Add Function Body Quick-Fix: Convert to Kotlin & refactor

This commit is contained in:
Alexey Sedunov
2015-12-25 14:31:25 +03:00
parent 50497e8013
commit f8be2f23a1
3 changed files with 25 additions and 62 deletions
@@ -1,5 +1,4 @@
#quick fix messages #quick fix messages
add.function.body=Add function body
add.return.type=Add return type declaration add.return.type=Add return type declaration
change.accessor.type=Change accessor type change.accessor.type=Change accessor type
change.getter.type=Change getter type to {0} change.getter.type=Change getter type to {0}
@@ -14,69 +14,34 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.kotlin.idea.quickfix; 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.PsiFile
import com.intellij.psi.PsiFile; import org.jetbrains.kotlin.diagnostics.Diagnostic
import com.intellij.psi.PsiWhiteSpace; import org.jetbrains.kotlin.psi.KtFile
import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.kotlin.psi.KtFunction
import com.intellij.util.IncorrectOperationException; import org.jetbrains.kotlin.psi.KtPsiFactory
import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.diagnostics.Diagnostic;
import org.jetbrains.kotlin.idea.KotlinBundle;
import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.psi.KtFunction;
import org.jetbrains.kotlin.psi.KtPsiFactory;
import org.jetbrains.kotlin.psi.KtPsiFactoryKt;
public class AddFunctionBodyFix extends KotlinQuickFixAction<KtFunction> { class AddFunctionBodyFix(element: KtFunction) : KotlinQuickFixAction<KtFunction>(element) {
public AddFunctionBodyFix(@NotNull KtFunction element) { override fun getFamilyName() = "Add function body"
super(element); override fun getText() = familyName
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
return super.isAvailable(project, editor, file) && !element.hasBody()
} }
@NotNull public override fun invoke(project: Project, editor: Editor?, file: KtFile) {
@Override if (!element.hasBody()) {
public String getText() { element.add(KtPsiFactory(project).createEmptyBody())
return KotlinBundle.message("add.function.body");
}
@NotNull
@Override
public String getFamilyName() {
return KotlinBundle.message("add.function.body");
}
@Override
public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiFile file) {
return super.isAvailable(project, editor, file) && !getElement().hasBody();
}
@Override
public void invoke(@NotNull Project project, Editor editor, @NotNull KtFile file) throws IncorrectOperationException {
KtFunction newElement = (KtFunction) getElement().copy();
KtPsiFactory psiFactory = KtPsiFactoryKt.KtPsiFactory(file);
if (!(newElement.getLastChild() instanceof PsiWhiteSpace)) {
newElement.add(psiFactory.createWhiteSpace());
} }
if (!newElement.hasBody()) {
newElement.add(psiFactory.createEmptyBody());
}
getElement().replace(newElement);
} }
public static KotlinSingleIntentionActionFactory createFactory() { companion object : KotlinSingleIntentionActionFactory() {
return new KotlinSingleIntentionActionFactory() { public override fun createAction(diagnostic: Diagnostic): AddFunctionBodyFix? {
@Nullable return diagnostic.psiElement.getNonStrictParentOfType<KtFunction>()?.let { AddFunctionBodyFix(it) }
@Override }
public KotlinQuickFixAction createAction(@NotNull Diagnostic diagnostic) {
PsiElement element = diagnostic.getPsiElement();
KtFunction function = PsiTreeUtil.getParentOfType(element, KtFunction.class, false);
if (function == null) return null;
return new AddFunctionBodyFix(function);
}
};
} }
} }
@@ -81,14 +81,13 @@ class QuickFixRegistrar : QuickFixContributor {
val removeFunctionBodyFactory = RemoveFunctionBodyFix.createFactory() val removeFunctionBodyFactory = RemoveFunctionBodyFix.createFactory()
ABSTRACT_FUNCTION_WITH_BODY.registerFactory(removeAbstractModifierFactory, removeFunctionBodyFactory) ABSTRACT_FUNCTION_WITH_BODY.registerFactory(removeAbstractModifierFactory, removeFunctionBodyFactory)
val addFunctionBodyFactory = AddFunctionBodyFix.createFactory() NON_ABSTRACT_FUNCTION_WITH_NO_BODY.registerFactory(addAbstractModifierFactory, AddFunctionBodyFix)
NON_ABSTRACT_FUNCTION_WITH_NO_BODY.registerFactory(addAbstractModifierFactory, addFunctionBodyFactory)
NON_VARARG_SPREAD.registerFactory(RemovePsiElementSimpleFix.createRemoveSpreadFactory()) NON_VARARG_SPREAD.registerFactory(RemovePsiElementSimpleFix.createRemoveSpreadFactory())
MIXING_NAMED_AND_POSITIONED_ARGUMENTS.registerFactory(AddNameToArgumentFix) MIXING_NAMED_AND_POSITIONED_ARGUMENTS.registerFactory(AddNameToArgumentFix)
NON_MEMBER_FUNCTION_NO_BODY.registerFactory(addFunctionBodyFactory) NON_MEMBER_FUNCTION_NO_BODY.registerFactory(AddFunctionBodyFix)
NOTHING_TO_OVERRIDE.registerFactory( RemoveModifierFix.createRemoveModifierFromListOwnerFactory(OVERRIDE_KEYWORD), NOTHING_TO_OVERRIDE.registerFactory( RemoveModifierFix.createRemoveModifierFromListOwnerFactory(OVERRIDE_KEYWORD),
ChangeMemberFunctionSignatureFix, ChangeMemberFunctionSignatureFix,