|
21 | 21 | import consulo.language.editor.WriteCommandAction; |
22 | 22 | import consulo.language.editor.inspection.LocalQuickFix; |
23 | 23 | import consulo.language.editor.inspection.ProblemDescriptor; |
24 | | -import consulo.language.editor.inspection.localize.InspectionLocalize; |
25 | 24 | import consulo.language.editor.intention.LowPriorityAction; |
26 | 25 | import consulo.language.psi.PsiElement; |
| 26 | +import consulo.localize.LocalizeValue; |
27 | 27 | import consulo.project.Project; |
28 | | -import org.jetbrains.annotations.TestOnly; |
29 | | - |
30 | 28 | import jakarta.annotation.Nonnull; |
| 29 | +import org.jetbrains.annotations.TestOnly; |
31 | 30 |
|
32 | 31 | /** |
33 | 32 | * @author Dmitry Batkovich <dmitry.batkovich@jetbrains.com> |
34 | 33 | */ |
35 | 34 | public class ChangeSuperClassFix implements LocalQuickFix { |
36 | | - @Nonnull |
37 | | - private final PsiClass myNewSuperClass; |
38 | | - @Nonnull |
39 | | - private final PsiClass myOldSuperClass; |
40 | | - private final int myPercent; |
| 35 | + @Nonnull |
| 36 | + private final PsiClass myNewSuperClass; |
| 37 | + @Nonnull |
| 38 | + private final PsiClass myOldSuperClass; |
| 39 | + private final int myPercent; |
41 | 40 |
|
42 | | - public ChangeSuperClassFix(@Nonnull final PsiClass newSuperClass, final int percent, @Nonnull final PsiClass oldSuperClass) { |
43 | | - myNewSuperClass = newSuperClass; |
44 | | - myOldSuperClass = oldSuperClass; |
45 | | - myPercent = percent; |
46 | | - } |
| 41 | + public ChangeSuperClassFix(@Nonnull final PsiClass newSuperClass, final int percent, @Nonnull final PsiClass oldSuperClass) { |
| 42 | + myNewSuperClass = newSuperClass; |
| 43 | + myOldSuperClass = oldSuperClass; |
| 44 | + myPercent = percent; |
| 45 | + } |
47 | 46 |
|
48 | | - @Nonnull |
49 | | - @TestOnly |
50 | | - public PsiClass getNewSuperClass() { |
51 | | - return myNewSuperClass; |
52 | | - } |
| 47 | + @Nonnull |
| 48 | + @TestOnly |
| 49 | + public PsiClass getNewSuperClass() { |
| 50 | + return myNewSuperClass; |
| 51 | + } |
53 | 52 |
|
54 | | - @TestOnly |
55 | | - public int getPercent() { |
56 | | - return myPercent; |
57 | | - } |
| 53 | + @TestOnly |
| 54 | + public int getPercent() { |
| 55 | + return myPercent; |
| 56 | + } |
58 | 57 |
|
59 | | - @Nonnull |
60 | | - @Override |
61 | | - public String getName() { |
62 | | - return String.format("Make extends '%s' - %s%%", myNewSuperClass.getQualifiedName(), myPercent); |
63 | | - } |
| 58 | + @Nonnull |
| 59 | + @Override |
| 60 | + public LocalizeValue getName() { |
| 61 | + return LocalizeValue.localizeTODO(String.format("Make extends '%s' - %s%%", myNewSuperClass.getQualifiedName(), myPercent)); |
| 62 | + } |
64 | 63 |
|
65 | | - @Nonnull |
66 | | - @Override |
67 | | - public String getFamilyName() { |
68 | | - return InspectionLocalize.groupNamesInheritanceIssues().get(); |
69 | | - } |
| 64 | + @Override |
| 65 | + public void applyFix(@Nonnull final Project project, @Nonnull final ProblemDescriptor problemDescriptor) { |
| 66 | + changeSuperClass((PsiClass) problemDescriptor.getPsiElement(), myOldSuperClass, myNewSuperClass); |
| 67 | + } |
70 | 68 |
|
71 | | - @Override |
72 | | - public void applyFix(@Nonnull final Project project, @Nonnull final ProblemDescriptor problemDescriptor) { |
73 | | - changeSuperClass((PsiClass)problemDescriptor.getPsiElement(), myOldSuperClass, myNewSuperClass); |
74 | | - } |
| 69 | + /** |
| 70 | + * myOldSuperClass and myNewSuperClass can be interfaces or classes in any combination |
| 71 | + * <p/> |
| 72 | + * 1. not checks that myOldSuperClass is really super of aClass |
| 73 | + * 2. not checks that myNewSuperClass not exists in currently existed supers |
| 74 | + */ |
| 75 | + private static void changeSuperClass( |
| 76 | + @Nonnull final PsiClass aClass, |
| 77 | + @Nonnull final PsiClass oldSuperClass, |
| 78 | + @Nonnull final PsiClass newSuperClass |
| 79 | + ) { |
| 80 | + if (!FileModificationService.getInstance().preparePsiElementForWrite(aClass)) { |
| 81 | + return; |
| 82 | + } |
75 | 83 |
|
76 | | - /** |
77 | | - * myOldSuperClass and myNewSuperClass can be interfaces or classes in any combination |
78 | | - * <p/> |
79 | | - * 1. not checks that myOldSuperClass is really super of aClass |
80 | | - * 2. not checks that myNewSuperClass not exists in currently existed supers |
81 | | - */ |
82 | | - private static void changeSuperClass(@Nonnull final PsiClass aClass, |
83 | | - @Nonnull final PsiClass oldSuperClass, |
84 | | - @Nonnull final PsiClass newSuperClass) { |
85 | | - if (!FileModificationService.getInstance().preparePsiElementForWrite(aClass)) return; |
| 84 | + new WriteCommandAction.Simple(newSuperClass.getProject(), aClass.getContainingFile()) { |
| 85 | + @Override |
| 86 | + protected void run() throws Throwable { |
| 87 | + PsiElementFactory factory = JavaPsiFacade.getInstance(aClass.getProject()).getElementFactory(); |
| 88 | + if (aClass instanceof PsiAnonymousClass) { |
| 89 | + ((PsiAnonymousClass) aClass).getBaseClassReference().replace(factory.createClassReferenceElement(newSuperClass)); |
| 90 | + } |
| 91 | + else if (oldSuperClass.isInterface()) { |
| 92 | + final PsiReferenceList interfaceList = aClass.getImplementsList(); |
| 93 | + if (interfaceList != null) { |
| 94 | + for (final PsiJavaCodeReferenceElement interfaceRef : interfaceList.getReferenceElements()) { |
| 95 | + final PsiElement aInterface = interfaceRef.resolve(); |
| 96 | + if (aInterface != null && aInterface.isEquivalentTo(oldSuperClass)) { |
| 97 | + interfaceRef.delete(); |
| 98 | + } |
| 99 | + } |
| 100 | + } |
86 | 101 |
|
87 | | - new WriteCommandAction.Simple(newSuperClass.getProject(), aClass.getContainingFile()) { |
88 | | - @Override |
89 | | - protected void run() throws Throwable { |
90 | | - PsiElementFactory factory = JavaPsiFacade.getInstance(aClass.getProject()).getElementFactory(); |
91 | | - if (aClass instanceof PsiAnonymousClass) { |
92 | | - ((PsiAnonymousClass)aClass).getBaseClassReference().replace(factory.createClassReferenceElement(newSuperClass)); |
93 | | - } |
94 | | - else if (oldSuperClass.isInterface()) { |
95 | | - final PsiReferenceList interfaceList = aClass.getImplementsList(); |
96 | | - if (interfaceList != null) { |
97 | | - for (final PsiJavaCodeReferenceElement interfaceRef : interfaceList.getReferenceElements()) { |
98 | | - final PsiElement aInterface = interfaceRef.resolve(); |
99 | | - if (aInterface != null && aInterface.isEquivalentTo(oldSuperClass)) { |
100 | | - interfaceRef.delete(); |
101 | | - } |
| 102 | + final PsiReferenceList extendsList = aClass.getExtendsList(); |
| 103 | + if (extendsList != null) { |
| 104 | + final PsiJavaCodeReferenceElement newClassReference = factory.createClassReferenceElement(newSuperClass); |
| 105 | + if (extendsList.getReferenceElements().length == 0) { |
| 106 | + extendsList.add(newClassReference); |
| 107 | + } |
| 108 | + } |
| 109 | + } |
| 110 | + else { |
| 111 | + final PsiReferenceList extendsList = aClass.getExtendsList(); |
| 112 | + if (extendsList != null && extendsList.getReferenceElements().length == 1) { |
| 113 | + extendsList.getReferenceElements()[0].delete(); |
| 114 | + PsiElement ref = extendsList.add(factory.createClassReferenceElement(newSuperClass)); |
| 115 | + JavaCodeStyleManager.getInstance(aClass.getProject()).shortenClassReferences(ref); |
| 116 | + } |
| 117 | + } |
102 | 118 | } |
103 | | - } |
| 119 | + }.execute(); |
| 120 | + } |
104 | 121 |
|
105 | | - final PsiReferenceList extendsList = aClass.getExtendsList(); |
106 | | - if (extendsList != null) { |
107 | | - final PsiJavaCodeReferenceElement newClassReference = factory.createClassReferenceElement(newSuperClass); |
108 | | - if (extendsList.getReferenceElements().length == 0) { |
109 | | - extendsList.add(newClassReference); |
110 | | - } |
111 | | - } |
112 | | - } |
113 | | - else { |
114 | | - final PsiReferenceList extendsList = aClass.getExtendsList(); |
115 | | - if (extendsList != null && extendsList.getReferenceElements().length == 1) { |
116 | | - extendsList.getReferenceElements()[0].delete(); |
117 | | - PsiElement ref = extendsList.add(factory.createClassReferenceElement(newSuperClass)); |
118 | | - JavaCodeStyleManager.getInstance(aClass.getProject()).shortenClassReferences(ref); |
119 | | - } |
| 122 | + public static class LowPriority extends ChangeSuperClassFix implements LowPriorityAction { |
| 123 | + public LowPriority(@Nonnull final PsiClass newSuperClass, final int percent, @Nonnull final PsiClass oldSuperClass) { |
| 124 | + super(newSuperClass, percent, oldSuperClass); |
120 | 125 | } |
121 | | - } |
122 | | - }.execute(); |
123 | | - } |
124 | | - |
125 | | - public static class LowPriority extends ChangeSuperClassFix implements LowPriorityAction { |
126 | | - public LowPriority(@Nonnull final PsiClass newSuperClass, final int percent, @Nonnull final PsiClass oldSuperClass) { |
127 | | - super(newSuperClass, percent, oldSuperClass); |
128 | 126 | } |
129 | | - } |
130 | 127 | } |
0 commit comments