Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -41,115 +41,127 @@
* @author dsl
*/
public class GenerateEqualsHandler extends GenerateMembersHandlerBase {
private static final Logger LOG = Logger.getInstance(GenerateEqualsHandler.class);
private PsiField[] myEqualsFields = null;
private PsiField[] myHashCodeFields = null;
private PsiField[] myNonNullFields = null;
private static final PsiElementClassMember[] DUMMY_RESULT = new PsiElementClassMember[1]; //cannot return empty array, but this result won't be used anyway

public GenerateEqualsHandler() {
super("");
}

@Override
@RequiredUIAccess
protected ClassMember[] chooseOriginalMembers(PsiClass aClass, Project project, Editor editor) {
myEqualsFields = null;
myHashCodeFields = null;
myNonNullFields = PsiField.EMPTY_ARRAY;

GlobalSearchScope scope = aClass.getResolveScope();
final PsiMethod equalsMethod = GenerateEqualsHelper.findMethod(aClass, GenerateEqualsHelper.getEqualsSignature(project, scope));
final PsiMethod hashCodeMethod = GenerateEqualsHelper.findMethod(aClass, GenerateEqualsHelper.getHashCodeSignature());

boolean needEquals = equalsMethod == null;
boolean needHashCode = hashCodeMethod == null;
if (!needEquals && !needHashCode) {
LocalizeValue text = aClass instanceof PsiAnonymousClass
? CodeInsightLocalize.generateEqualsAndHashcodeAlreadyDefinedWarningAnonymous()
: CodeInsightLocalize.generateEqualsAndHashcodeAlreadyDefinedWarning(aClass.getQualifiedName());

if (Messages.showYesNoDialog(
project,
text.get(),
CodeInsightLocalize.generateEqualsAndHashcodeAlreadyDefinedTitle().get(),
UIUtil.getQuestionIcon()
) == Messages.YES) {
if (!project.getApplication().runWriteAction((Computable<Boolean>)() -> {
try {
equalsMethod.delete();
hashCodeMethod.delete();
return Boolean.TRUE;
}
catch (IncorrectOperationException e) {
LOG.error(e);
return Boolean.FALSE;
}
})) {
return null;
} else {
needEquals = needHashCode = true;
private static final Logger LOG = Logger.getInstance(GenerateEqualsHandler.class);
private PsiField[] myEqualsFields = null;
private PsiField[] myHashCodeFields = null;
private PsiField[] myNonNullFields = null;
//cannot return empty array, but this result won't be used anyway
private static final PsiElementClassMember[] DUMMY_RESULT = new PsiElementClassMember[1];

public GenerateEqualsHandler() {
super(LocalizeValue.empty());
}

@Override
@RequiredUIAccess
protected ClassMember[] chooseOriginalMembers(PsiClass aClass, Project project, Editor editor) {
myEqualsFields = null;
myHashCodeFields = null;
myNonNullFields = PsiField.EMPTY_ARRAY;

GlobalSearchScope scope = aClass.getResolveScope();
PsiMethod equalsMethod = GenerateEqualsHelper.findMethod(aClass, GenerateEqualsHelper.getEqualsSignature(project, scope));
PsiMethod hashCodeMethod = GenerateEqualsHelper.findMethod(aClass, GenerateEqualsHelper.getHashCodeSignature());

boolean needEquals = equalsMethod == null;
boolean needHashCode = hashCodeMethod == null;
if (!needEquals && !needHashCode) {
LocalizeValue text = aClass instanceof PsiAnonymousClass
? CodeInsightLocalize.generateEqualsAndHashcodeAlreadyDefinedWarningAnonymous()
: CodeInsightLocalize.generateEqualsAndHashcodeAlreadyDefinedWarning(aClass.getQualifiedName());

if (Messages.showYesNoDialog(
project,
text.get(),
CodeInsightLocalize.generateEqualsAndHashcodeAlreadyDefinedTitle().get(),
UIUtil.getQuestionIcon()
) == Messages.YES) {
if (!project.getApplication().runWriteAction((Computable<Boolean>) () -> {
try {
equalsMethod.delete();
hashCodeMethod.delete();
return Boolean.TRUE;
}
catch (IncorrectOperationException e) {
LOG.error(e);
return Boolean.FALSE;
}
})) {
return null;
}
else {
needEquals = needHashCode = true;
}
}
else {
return null;
}
}
} else {
return null;
}
boolean hasNonStaticFields = hasNonStaticFields(aClass);
if (!hasNonStaticFields) {
HintManager.getInstance().showErrorHint(editor, "No fields to include in equals/hashCode have been found");
return null;
}

GenerateEqualsWizard wizard = new GenerateEqualsWizard(project, aClass, needEquals, needHashCode);
if (!wizard.showAndGet()) {
return null;
}
myEqualsFields = wizard.getEqualsFields();
myHashCodeFields = wizard.getHashCodeFields();
myNonNullFields = wizard.getNonNullFields();
return DUMMY_RESULT;
}
boolean hasNonStaticFields = hasNonStaticFields(aClass);
if (!hasNonStaticFields) {
HintManager.getInstance().showErrorHint(editor, "No fields to include in equals/hashCode have been found");
return null;

private static boolean hasNonStaticFields(PsiClass aClass) {
for (PsiField field : aClass.getFields()) {
if (!field.isStatic()) {
return true;
}
}
return false;
}

GenerateEqualsWizard wizard = new GenerateEqualsWizard(project, aClass, needEquals, needHashCode);
if (!wizard.showAndGet()) {
return null;
@Override
protected boolean hasMembers(@Nonnull PsiClass aClass) {
return hasNonStaticFields(aClass);
}
myEqualsFields = wizard.getEqualsFields();
myHashCodeFields = wizard.getHashCodeFields();
myNonNullFields = wizard.getNonNullFields();
return DUMMY_RESULT;
}

private static boolean hasNonStaticFields(PsiClass aClass) {
for (PsiField field : aClass.getFields()) {
if (!field.hasModifierProperty(PsiModifier.STATIC)) {
return true;
}

@Nonnull
@Override
protected List<? extends GenerationInfo> generateMemberPrototypes(PsiClass aClass, ClassMember[] originalMembers)
throws IncorrectOperationException {
Project project = aClass.getProject();
boolean useInstanceOfToCheckParameterType = JavaCodeInsightSettings.getInstance().USE_INSTANCEOF_ON_EQUALS_PARAMETER;
boolean useAccessors = JavaCodeInsightSettings.getInstance().USE_ACCESSORS_IN_EQUALS_HASHCODE;

GenerateEqualsHelper helper = new GenerateEqualsHelper(
project,
aClass,
myEqualsFields,
myHashCodeFields,
myNonNullFields,
useInstanceOfToCheckParameterType,
useAccessors
);
return OverrideImplementUtil.convert2GenerationInfos(helper.generateMembers());
}

@Override
protected ClassMember[] getAllOriginalMembers(PsiClass aClass) {
return null;
}

@Override
protected GenerationInfo[] generateMemberPrototypes(PsiClass aClass, ClassMember originalMember) {
return null;
}

@Override
protected void cleanup() {
super.cleanup();
myEqualsFields = null;
myHashCodeFields = null;
myNonNullFields = null;
}
return false;
}

@Override
protected boolean hasMembers(@Nonnull PsiClass aClass) {
return hasNonStaticFields(aClass);
}

@Override
@Nonnull
protected List<? extends GenerationInfo> generateMemberPrototypes(PsiClass aClass, ClassMember[] originalMembers) throws IncorrectOperationException {
Project project = aClass.getProject();
final boolean useInstanceofToCheckParameterType = JavaCodeInsightSettings.getInstance().USE_INSTANCEOF_ON_EQUALS_PARAMETER;
final boolean useAccessors = JavaCodeInsightSettings.getInstance().USE_ACCESSORS_IN_EQUALS_HASHCODE;

GenerateEqualsHelper helper = new GenerateEqualsHelper(project, aClass, myEqualsFields, myHashCodeFields, myNonNullFields, useInstanceofToCheckParameterType, useAccessors);
return OverrideImplementUtil.convert2GenerationInfos(helper.generateMembers());
}

@Override
protected ClassMember[] getAllOriginalMembers(PsiClass aClass) {
return null;
}

@Override
protected GenerationInfo[] generateMemberPrototypes(PsiClass aClass, ClassMember originalMember) {
return null;
}

@Override
protected void cleanup() {
super.cleanup();
myEqualsFields = null;
myHashCodeFields = null;
myNonNullFields = null;
}
}
Loading
Loading