diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ChangeSuperClassFix.java b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ChangeSuperClassFix.java index 057adc218cbb..1f3b2e8a837e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ChangeSuperClassFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ChangeSuperClassFix.java @@ -15,39 +15,38 @@ */ package com.intellij.codeInspection.inheritance; -import com.intellij.codeInsight.FileModificationService; import com.intellij.codeInsight.daemon.GroupNames; import com.intellij.codeInsight.intention.LowPriorityAction; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemDescriptor; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; +import com.intellij.util.ObjectUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.TestOnly; -/** - * @author Dmitry Batkovich - */ public class ChangeSuperClassFix implements LocalQuickFix { @NotNull - private final PsiClass myNewSuperClass; + private final SmartPsiElementPointer myNewSuperClass; @NotNull - private final PsiClass myOldSuperClass; + private final SmartPsiElementPointer myOldSuperClass; private final int myPercent; + @NotNull + private final String myNewSuperName; public ChangeSuperClassFix(@NotNull final PsiClass newSuperClass, final int percent, @NotNull final PsiClass oldSuperClass) { - myNewSuperClass = newSuperClass; - myOldSuperClass = oldSuperClass; + final SmartPointerManager smartPointerManager = SmartPointerManager.getInstance(newSuperClass.getProject()); + myNewSuperName = ObjectUtils.notNull(newSuperClass.getQualifiedName()); + myNewSuperClass = smartPointerManager.createSmartPsiElementPointer(newSuperClass); + myOldSuperClass = smartPointerManager.createSmartPsiElementPointer(oldSuperClass); myPercent = percent; } @NotNull @TestOnly public PsiClass getNewSuperClass() { - return myNewSuperClass; + return ObjectUtils.notNull(myNewSuperClass.getElement()); } @TestOnly @@ -58,7 +57,7 @@ public class ChangeSuperClassFix implements LocalQuickFix { @NotNull @Override public String getName() { - return String.format("Make extends '%s' - %s%%", myNewSuperClass.getQualifiedName(), myPercent); + return String.format("Make extends '%s' - %s%%", myNewSuperName, myPercent); } @NotNull @@ -69,7 +68,10 @@ public class ChangeSuperClassFix implements LocalQuickFix { @Override public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor problemDescriptor) { - changeSuperClass((PsiClass)problemDescriptor.getPsiElement(), myOldSuperClass, myNewSuperClass); + final PsiClass oldSuperClass = myOldSuperClass.getElement(); + final PsiClass newSuperClass = myNewSuperClass.getElement(); + if (oldSuperClass == null || newSuperClass == null) return; + changeSuperClass((PsiClass)problemDescriptor.getPsiElement(), oldSuperClass, newSuperClass); } /** @@ -81,42 +83,37 @@ public class ChangeSuperClassFix implements LocalQuickFix { private static void changeSuperClass(@NotNull final PsiClass aClass, @NotNull final PsiClass oldSuperClass, @NotNull final PsiClass newSuperClass) { - if (!FileModificationService.getInstance().preparePsiElementForWrite(aClass)) return; - - if (!FileModificationService.getInstance().prepareFileForWrite(aClass.getContainingFile())) return; - CommandProcessor.getInstance().executeCommand(newSuperClass.getProject(), () -> ApplicationManager.getApplication().runWriteAction(() -> { - PsiElementFactory factory = JavaPsiFacade.getInstance(aClass.getProject()).getElementFactory(); - if (aClass instanceof PsiAnonymousClass) { - ((PsiAnonymousClass)aClass).getBaseClassReference().replace(factory.createClassReferenceElement(newSuperClass)); - } - else if (oldSuperClass.isInterface()) { - final PsiReferenceList interfaceList = aClass.getImplementsList(); - if (interfaceList != null) { - for (final PsiJavaCodeReferenceElement interfaceRef : interfaceList.getReferenceElements()) { - final PsiElement aInterface = interfaceRef.resolve(); - if (aInterface != null && aInterface.isEquivalentTo(oldSuperClass)) { - interfaceRef.delete(); - } - } - } - - final PsiReferenceList extendsList = aClass.getExtendsList(); - if (extendsList != null) { - final PsiJavaCodeReferenceElement newClassReference = factory.createClassReferenceElement(newSuperClass); - if (extendsList.getReferenceElements().length == 0) { - extendsList.add(newClassReference); + PsiElementFactory factory = JavaPsiFacade.getInstance(aClass.getProject()).getElementFactory(); + if (aClass instanceof PsiAnonymousClass) { + ((PsiAnonymousClass)aClass).getBaseClassReference().replace(factory.createClassReferenceElement(newSuperClass)); + } + else if (oldSuperClass.isInterface()) { + final PsiReferenceList interfaceList = aClass.getImplementsList(); + if (interfaceList != null) { + for (final PsiJavaCodeReferenceElement interfaceRef : interfaceList.getReferenceElements()) { + final PsiElement aInterface = interfaceRef.resolve(); + if (aInterface != null && aInterface.isEquivalentTo(oldSuperClass)) { + interfaceRef.delete(); } } } - else { - final PsiReferenceList extendsList = aClass.getExtendsList(); - if (extendsList != null && extendsList.getReferenceElements().length == 1) { - extendsList.getReferenceElements()[0].delete(); - PsiElement ref = extendsList.add(factory.createClassReferenceElement(newSuperClass)); - JavaCodeStyleManager.getInstance(aClass.getProject()).shortenClassReferences(ref); + + final PsiReferenceList extendsList = aClass.getExtendsList(); + if (extendsList != null) { + final PsiJavaCodeReferenceElement newClassReference = factory.createClassReferenceElement(newSuperClass); + if (extendsList.getReferenceElements().length == 0) { + extendsList.add(newClassReference); } } - }), "Changing inheritance", null); + } + else { + final PsiReferenceList extendsList = aClass.getExtendsList(); + if (extendsList != null && extendsList.getReferenceElements().length == 1) { + extendsList.getReferenceElements()[0].delete(); + PsiElement ref = extendsList.add(factory.createClassReferenceElement(newSuperClass)); + JavaCodeStyleManager.getInstance(aClass.getProject()).shortenClassReferences(ref); + } + } } public static class LowPriority extends ChangeSuperClassFix implements LowPriorityAction { diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/SuperClassHasFrequentlyUsedInheritorsInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/SuperClassHasFrequentlyUsedInheritorsInspection.java index e362cd0122c7..e7b9e3e353a4 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/SuperClassHasFrequentlyUsedInheritorsInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/SuperClassHasFrequentlyUsedInheritorsInspection.java @@ -13,9 +13,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -/** - * @author Dmitry Batkovich - */ public class SuperClassHasFrequentlyUsedInheritorsInspection extends BaseJavaBatchLocalInspectionTool { private static final int MIN_PERCENT_RATIO = 5; public static final int MAX_QUICK_FIX_COUNTS = 4; diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsCountData.java b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsCountData.java index 18f65878eacd..9f4a331e1516 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsCountData.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsCountData.java @@ -3,9 +3,6 @@ package com.intellij.codeInspection.inheritance.search; import com.intellij.psi.PsiClass; import org.jetbrains.annotations.NotNull; -/** - * @author Dmitry Batkovich - */ class InheritorsCountData implements Comparable { @NotNull private final PsiClass myPsiClass; diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsStatisticalDataSearch.java b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsStatisticalDataSearch.java index c738a3114089..567fa8c83b1f 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsStatisticalDataSearch.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsStatisticalDataSearch.java @@ -25,9 +25,6 @@ import org.jetbrains.annotations.NotNull; import java.util.*; -/** - * @author Dmitry Batkovich - */ public class InheritorsStatisticalDataSearch { /** diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsStatisticsSearchResult.java b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsStatisticsSearchResult.java index 2d832bd91c92..8258be7c4de0 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsStatisticsSearchResult.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/search/InheritorsStatisticsSearchResult.java @@ -3,9 +3,6 @@ package com.intellij.codeInspection.inheritance.search; import com.intellij.psi.PsiClass; import org.jetbrains.annotations.NotNull; -/** - * @author Dmitry Batkovich - */ public class InheritorsStatisticsSearchResult { @NotNull diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/SuperClassHasFrequentlyUsedInheritorsInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/SuperClassHasFrequentlyUsedInheritorsInspectionTest.java index 461bb2f65804..08fc148e919f 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/SuperClassHasFrequentlyUsedInheritorsInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/SuperClassHasFrequentlyUsedInheritorsInspectionTest.java @@ -13,10 +13,6 @@ import org.jetbrains.annotations.Nullable; import java.util.Set; -/** - * @author Dmitry Batkovich - */ -@SuppressWarnings("ALL") public class SuperClassHasFrequentlyUsedInheritorsInspectionTest extends JavaCodeInsightFixtureTestCase { @Override @@ -71,7 +67,6 @@ public class SuperClassHasFrequentlyUsedInheritorsInspectionTest extends JavaCod final Set> actualSet = new HashSet>(); for (IntentionAction intentionAction : myFixture.getAvailableIntentions()) { if (intentionAction instanceof QuickFixWrapper) { - LocalQuickFix localQuickFix = ((QuickFixWrapper)intentionAction).getFix(); ChangeSuperClassFix changeSuperClassFix = getQuickFixFromWrapper((QuickFixWrapper)intentionAction); if (changeSuperClassFix != null) { actualSet.add(Pair.create(changeSuperClassFix.getNewSuperClass().getQualifiedName(), changeSuperClassFix.getPercent())); @@ -80,7 +75,7 @@ public class SuperClassHasFrequentlyUsedInheritorsInspectionTest extends JavaCod } final Set> expectedSet = ContainerUtil.newHashSet(expectedResults); - assertEquals(expectedSet, actualSet); + assertEquals(actualSet, expectedSet); } private void doTest(final int expectedSize) { @@ -102,7 +97,7 @@ public class SuperClassHasFrequentlyUsedInheritorsInspectionTest extends JavaCod } @Nullable - private final static ChangeSuperClassFix getQuickFixFromWrapper(final QuickFixWrapper quickFixWrapper) { + private static ChangeSuperClassFix getQuickFixFromWrapper(final QuickFixWrapper quickFixWrapper) { final LocalQuickFix quickFix = quickFixWrapper.getFix(); if (quickFix instanceof ChangeSuperClassFix) { return (ChangeSuperClassFix)quickFix;