From de53ebe07fce9c71f8d11433789006f01f5a10ff Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 17 Aug 2012 11:35:40 +0200 Subject: [PATCH] quickfix for "'public' constructor" inspection --- .../siyeh/InspectionGadgetsBundle.properties | 1 + .../PublicConstructorInspection.java | 45 +++++++++++++++++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties index 0eaaf5fd279f..e938e1bea904 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties @@ -1980,3 +1980,4 @@ suspicious.array.cast.problem.descriptor=Suspicious cast to #ref public.constructor.display.name='public' constructor public.default.constructor.problem.descriptor=Class #ref has public default constructor public.constructor.problem.descriptor=Public constructor #ref() +public.constructor.quickfix=Replace constructor with factory method diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/PublicConstructorInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/PublicConstructorInspection.java index f0af575ffa72..1a9874338ba1 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/PublicConstructorInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/PublicConstructorInspection.java @@ -16,16 +16,24 @@ package com.siyeh.ig.classlayout; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiMethod; -import com.intellij.psi.PsiModifier; -import com.intellij.psi.PsiParameterList; +import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.ide.DataManager; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.AsyncResult; +import com.intellij.psi.*; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.refactoring.JavaRefactoringActionHandlerFactory; +import com.intellij.refactoring.RefactoringActionHandler; +import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; +import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.psiutils.SerializationUtils; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author Bas Leijdekkers @@ -50,6 +58,35 @@ public class PublicConstructorInspection extends BaseInspection { } } + @Nullable + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new ReplaceConstructorWithFactoryMethodFix(); + } + + private class ReplaceConstructorWithFactoryMethodFix extends InspectionGadgetsFix { + + @NotNull + @Override + public String getName() { + return InspectionGadgetsBundle.message("public.constructor.quickfix"); + } + + @Override + protected void doFix(final Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = PsiTreeUtil.getParentOfType(descriptor.getPsiElement(), PsiClass.class, PsiMethod.class); + final AsyncResult context = DataManager.getInstance().getDataContextFromFocus(); + context.doWhenDone(new AsyncResult.Handler() { + @Override + public void run(DataContext dataContext) { + final JavaRefactoringActionHandlerFactory factory = JavaRefactoringActionHandlerFactory.getInstance(); + final RefactoringActionHandler handler = factory.createReplaceConstructorWithFactoryHandler(); + handler.invoke(project, new PsiElement[]{element}, dataContext); + } + }); + } + } + @Override public BaseInspectionVisitor buildVisitor() { return new PublicConstructorVisitor();