|
41 | 41 | * @author dsl |
42 | 42 | */ |
43 | 43 | public class GenerateEqualsHandler extends GenerateMembersHandlerBase { |
44 | | - private static final Logger LOG = Logger.getInstance(GenerateEqualsHandler.class); |
45 | | - private PsiField[] myEqualsFields = null; |
46 | | - private PsiField[] myHashCodeFields = null; |
47 | | - private PsiField[] myNonNullFields = null; |
48 | | - private static final PsiElementClassMember[] DUMMY_RESULT = new PsiElementClassMember[1]; //cannot return empty array, but this result won't be used anyway |
49 | | - |
50 | | - public GenerateEqualsHandler() { |
51 | | - super(""); |
52 | | - } |
53 | | - |
54 | | - @Override |
55 | | - @RequiredUIAccess |
56 | | - protected ClassMember[] chooseOriginalMembers(PsiClass aClass, Project project, Editor editor) { |
57 | | - myEqualsFields = null; |
58 | | - myHashCodeFields = null; |
59 | | - myNonNullFields = PsiField.EMPTY_ARRAY; |
60 | | - |
61 | | - GlobalSearchScope scope = aClass.getResolveScope(); |
62 | | - final PsiMethod equalsMethod = GenerateEqualsHelper.findMethod(aClass, GenerateEqualsHelper.getEqualsSignature(project, scope)); |
63 | | - final PsiMethod hashCodeMethod = GenerateEqualsHelper.findMethod(aClass, GenerateEqualsHelper.getHashCodeSignature()); |
64 | | - |
65 | | - boolean needEquals = equalsMethod == null; |
66 | | - boolean needHashCode = hashCodeMethod == null; |
67 | | - if (!needEquals && !needHashCode) { |
68 | | - LocalizeValue text = aClass instanceof PsiAnonymousClass |
69 | | - ? CodeInsightLocalize.generateEqualsAndHashcodeAlreadyDefinedWarningAnonymous() |
70 | | - : CodeInsightLocalize.generateEqualsAndHashcodeAlreadyDefinedWarning(aClass.getQualifiedName()); |
71 | | - |
72 | | - if (Messages.showYesNoDialog( |
73 | | - project, |
74 | | - text.get(), |
75 | | - CodeInsightLocalize.generateEqualsAndHashcodeAlreadyDefinedTitle().get(), |
76 | | - UIUtil.getQuestionIcon() |
77 | | - ) == Messages.YES) { |
78 | | - if (!project.getApplication().runWriteAction((Computable<Boolean>)() -> { |
79 | | - try { |
80 | | - equalsMethod.delete(); |
81 | | - hashCodeMethod.delete(); |
82 | | - return Boolean.TRUE; |
83 | | - } |
84 | | - catch (IncorrectOperationException e) { |
85 | | - LOG.error(e); |
86 | | - return Boolean.FALSE; |
87 | | - } |
88 | | - })) { |
89 | | - return null; |
90 | | - } else { |
91 | | - needEquals = needHashCode = true; |
| 44 | + private static final Logger LOG = Logger.getInstance(GenerateEqualsHandler.class); |
| 45 | + private PsiField[] myEqualsFields = null; |
| 46 | + private PsiField[] myHashCodeFields = null; |
| 47 | + private PsiField[] myNonNullFields = null; |
| 48 | + //cannot return empty array, but this result won't be used anyway |
| 49 | + private static final PsiElementClassMember[] DUMMY_RESULT = new PsiElementClassMember[1]; |
| 50 | + |
| 51 | + public GenerateEqualsHandler() { |
| 52 | + super(LocalizeValue.empty()); |
| 53 | + } |
| 54 | + |
| 55 | + @Override |
| 56 | + @RequiredUIAccess |
| 57 | + protected ClassMember[] chooseOriginalMembers(PsiClass aClass, Project project, Editor editor) { |
| 58 | + myEqualsFields = null; |
| 59 | + myHashCodeFields = null; |
| 60 | + myNonNullFields = PsiField.EMPTY_ARRAY; |
| 61 | + |
| 62 | + GlobalSearchScope scope = aClass.getResolveScope(); |
| 63 | + PsiMethod equalsMethod = GenerateEqualsHelper.findMethod(aClass, GenerateEqualsHelper.getEqualsSignature(project, scope)); |
| 64 | + PsiMethod hashCodeMethod = GenerateEqualsHelper.findMethod(aClass, GenerateEqualsHelper.getHashCodeSignature()); |
| 65 | + |
| 66 | + boolean needEquals = equalsMethod == null; |
| 67 | + boolean needHashCode = hashCodeMethod == null; |
| 68 | + if (!needEquals && !needHashCode) { |
| 69 | + LocalizeValue text = aClass instanceof PsiAnonymousClass |
| 70 | + ? CodeInsightLocalize.generateEqualsAndHashcodeAlreadyDefinedWarningAnonymous() |
| 71 | + : CodeInsightLocalize.generateEqualsAndHashcodeAlreadyDefinedWarning(aClass.getQualifiedName()); |
| 72 | + |
| 73 | + if (Messages.showYesNoDialog( |
| 74 | + project, |
| 75 | + text.get(), |
| 76 | + CodeInsightLocalize.generateEqualsAndHashcodeAlreadyDefinedTitle().get(), |
| 77 | + UIUtil.getQuestionIcon() |
| 78 | + ) == Messages.YES) { |
| 79 | + if (!project.getApplication().runWriteAction((Computable<Boolean>) () -> { |
| 80 | + try { |
| 81 | + equalsMethod.delete(); |
| 82 | + hashCodeMethod.delete(); |
| 83 | + return Boolean.TRUE; |
| 84 | + } |
| 85 | + catch (IncorrectOperationException e) { |
| 86 | + LOG.error(e); |
| 87 | + return Boolean.FALSE; |
| 88 | + } |
| 89 | + })) { |
| 90 | + return null; |
| 91 | + } |
| 92 | + else { |
| 93 | + needEquals = needHashCode = true; |
| 94 | + } |
| 95 | + } |
| 96 | + else { |
| 97 | + return null; |
| 98 | + } |
92 | 99 | } |
93 | | - } else { |
94 | | - return null; |
95 | | - } |
| 100 | + boolean hasNonStaticFields = hasNonStaticFields(aClass); |
| 101 | + if (!hasNonStaticFields) { |
| 102 | + HintManager.getInstance().showErrorHint(editor, "No fields to include in equals/hashCode have been found"); |
| 103 | + return null; |
| 104 | + } |
| 105 | + |
| 106 | + GenerateEqualsWizard wizard = new GenerateEqualsWizard(project, aClass, needEquals, needHashCode); |
| 107 | + if (!wizard.showAndGet()) { |
| 108 | + return null; |
| 109 | + } |
| 110 | + myEqualsFields = wizard.getEqualsFields(); |
| 111 | + myHashCodeFields = wizard.getHashCodeFields(); |
| 112 | + myNonNullFields = wizard.getNonNullFields(); |
| 113 | + return DUMMY_RESULT; |
96 | 114 | } |
97 | | - boolean hasNonStaticFields = hasNonStaticFields(aClass); |
98 | | - if (!hasNonStaticFields) { |
99 | | - HintManager.getInstance().showErrorHint(editor, "No fields to include in equals/hashCode have been found"); |
100 | | - return null; |
| 115 | + |
| 116 | + private static boolean hasNonStaticFields(PsiClass aClass) { |
| 117 | + for (PsiField field : aClass.getFields()) { |
| 118 | + if (!field.isStatic()) { |
| 119 | + return true; |
| 120 | + } |
| 121 | + } |
| 122 | + return false; |
101 | 123 | } |
102 | 124 |
|
103 | | - GenerateEqualsWizard wizard = new GenerateEqualsWizard(project, aClass, needEquals, needHashCode); |
104 | | - if (!wizard.showAndGet()) { |
105 | | - return null; |
| 125 | + @Override |
| 126 | + protected boolean hasMembers(@Nonnull PsiClass aClass) { |
| 127 | + return hasNonStaticFields(aClass); |
106 | 128 | } |
107 | | - myEqualsFields = wizard.getEqualsFields(); |
108 | | - myHashCodeFields = wizard.getHashCodeFields(); |
109 | | - myNonNullFields = wizard.getNonNullFields(); |
110 | | - return DUMMY_RESULT; |
111 | | - } |
112 | | - |
113 | | - private static boolean hasNonStaticFields(PsiClass aClass) { |
114 | | - for (PsiField field : aClass.getFields()) { |
115 | | - if (!field.hasModifierProperty(PsiModifier.STATIC)) { |
116 | | - return true; |
117 | | - } |
| 129 | + |
| 130 | + @Nonnull |
| 131 | + @Override |
| 132 | + protected List<? extends GenerationInfo> generateMemberPrototypes(PsiClass aClass, ClassMember[] originalMembers) |
| 133 | + throws IncorrectOperationException { |
| 134 | + Project project = aClass.getProject(); |
| 135 | + boolean useInstanceOfToCheckParameterType = JavaCodeInsightSettings.getInstance().USE_INSTANCEOF_ON_EQUALS_PARAMETER; |
| 136 | + boolean useAccessors = JavaCodeInsightSettings.getInstance().USE_ACCESSORS_IN_EQUALS_HASHCODE; |
| 137 | + |
| 138 | + GenerateEqualsHelper helper = new GenerateEqualsHelper( |
| 139 | + project, |
| 140 | + aClass, |
| 141 | + myEqualsFields, |
| 142 | + myHashCodeFields, |
| 143 | + myNonNullFields, |
| 144 | + useInstanceOfToCheckParameterType, |
| 145 | + useAccessors |
| 146 | + ); |
| 147 | + return OverrideImplementUtil.convert2GenerationInfos(helper.generateMembers()); |
| 148 | + } |
| 149 | + |
| 150 | + @Override |
| 151 | + protected ClassMember[] getAllOriginalMembers(PsiClass aClass) { |
| 152 | + return null; |
| 153 | + } |
| 154 | + |
| 155 | + @Override |
| 156 | + protected GenerationInfo[] generateMemberPrototypes(PsiClass aClass, ClassMember originalMember) { |
| 157 | + return null; |
| 158 | + } |
| 159 | + |
| 160 | + @Override |
| 161 | + protected void cleanup() { |
| 162 | + super.cleanup(); |
| 163 | + myEqualsFields = null; |
| 164 | + myHashCodeFields = null; |
| 165 | + myNonNullFields = null; |
118 | 166 | } |
119 | | - return false; |
120 | | - } |
121 | | - |
122 | | - @Override |
123 | | - protected boolean hasMembers(@Nonnull PsiClass aClass) { |
124 | | - return hasNonStaticFields(aClass); |
125 | | - } |
126 | | - |
127 | | - @Override |
128 | | - @Nonnull |
129 | | - protected List<? extends GenerationInfo> generateMemberPrototypes(PsiClass aClass, ClassMember[] originalMembers) throws IncorrectOperationException { |
130 | | - Project project = aClass.getProject(); |
131 | | - final boolean useInstanceofToCheckParameterType = JavaCodeInsightSettings.getInstance().USE_INSTANCEOF_ON_EQUALS_PARAMETER; |
132 | | - final boolean useAccessors = JavaCodeInsightSettings.getInstance().USE_ACCESSORS_IN_EQUALS_HASHCODE; |
133 | | - |
134 | | - GenerateEqualsHelper helper = new GenerateEqualsHelper(project, aClass, myEqualsFields, myHashCodeFields, myNonNullFields, useInstanceofToCheckParameterType, useAccessors); |
135 | | - return OverrideImplementUtil.convert2GenerationInfos(helper.generateMembers()); |
136 | | - } |
137 | | - |
138 | | - @Override |
139 | | - protected ClassMember[] getAllOriginalMembers(PsiClass aClass) { |
140 | | - return null; |
141 | | - } |
142 | | - |
143 | | - @Override |
144 | | - protected GenerationInfo[] generateMemberPrototypes(PsiClass aClass, ClassMember originalMember) { |
145 | | - return null; |
146 | | - } |
147 | | - |
148 | | - @Override |
149 | | - protected void cleanup() { |
150 | | - super.cleanup(); |
151 | | - myEqualsFields = null; |
152 | | - myHashCodeFields = null; |
153 | | - myNonNullFields = null; |
154 | | - } |
155 | 167 | } |
0 commit comments