Java: generate final equals() method when using instanceof (IDEA-339226)

GitOrigin-RevId: b024aa3775268895bd9cbeecea5a6947a93415f7
This commit is contained in:
Bas Leijdekkers
2023-12-04 16:35:38 +01:00
committed by intellij-monorepo-bot
parent 200ae17131
commit da39c01311
4 changed files with 61 additions and 28 deletions

View File

@@ -1,5 +1,9 @@
#parse("equalsHelper.vm")
public boolean equals(##
public ##
#if ($checkParameterWithInstanceof)
final ##
#end
boolean equals(##
#if ($settings.generateFinalParameters)
final ##
#end

View File

@@ -0,0 +1,29 @@
import java.util.Arrays;
class A {
int value;
int[] values;
int[][] valueses;
@Override
public final boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof A)) return false;
final A a = (A) o;
if (value != a.value) return false;
if (!Arrays.equals(values, a.values)) return false;
if (!Arrays.deepEquals(valueses, a.valueses)) return false;
return true;
}
@Override
public int hashCode() {
int result = value;
result = 31 * result + Arrays.hashCode(values);
result = 31 * result + Arrays.deepHashCode(valueses);
return result;
}
}

View File

@@ -0,0 +1,5 @@
class A {
int value;
int[] values;
int[][] valueses;
}

View File

@@ -15,11 +15,15 @@ import com.intellij.testFramework.LightJavaCodeInsightTestCase;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.function.Function;
public class GenerateEqualsTest extends LightJavaCodeInsightTestCase {
public void testInstanceof() {
doTest(Function.identity(), Function.identity(), x -> PsiField.EMPTY_ARRAY, true, false, true);
}
public void testNoBaseEquals() {
doTest(new int[0], new int[0], new int[0], false);
}
@@ -98,7 +102,7 @@ public class GenerateEqualsTest extends LightJavaCodeInsightTestCase {
}
public void testDifferentTypesGetters() {
doTest(Function.identity(), Function.identity(), fields -> PsiField.EMPTY_ARRAY, true, true);
doTest(Function.identity(), Function.identity(), fields -> PsiField.EMPTY_ARRAY, true, true, false);
}
public void testDifferentTypesAllNotNull() {
@@ -190,44 +194,35 @@ public class GenerateEqualsTest extends LightJavaCodeInsightTestCase {
doTest(fields -> getIndexed(fields, equals), fields -> getIndexed(fields, hashCode), fields -> getIndexed(fields, nonNull), insertOverride);
}
protected void doTest(Function<PsiField[], PsiField[]> eqFunction,
Function<PsiField[], PsiField[]> hFunction,
Function<PsiField[], PsiField[]> nnFunction,
protected void doTest(Function<PsiField[], PsiField[]> equals,
Function<PsiField[], PsiField[]> hashCode,
Function<PsiField[], PsiField[]> nonNull,
boolean insertOverride) {
doTest(eqFunction, hFunction, nnFunction, insertOverride, false);
doTest(equals, hashCode, nonNull, insertOverride, false, false);
}
protected void doTest(Function<PsiField[], PsiField[]> eqFunction,
Function<PsiField[], PsiField[]> hFunction,
Function<PsiField[], PsiField[]> nnFunction,
boolean insertOverride, boolean useAccessors) {
protected void doTest(Function<PsiField[], PsiField[]> equals,
Function<PsiField[], PsiField[]> hashCode,
Function<PsiField[], PsiField[]> nonNull,
boolean insertOverride,
boolean useAccessors,
boolean useInstanceofToCheckParameterType) {
configureByFile("/codeInsight/generateEquals/before" + getTestName(false) + ".java");
performTest(eqFunction, hFunction, nnFunction, insertOverride, useAccessors);
checkResultByFile("/codeInsight/generateEquals/after" + getTestName(false) + ".java");
}
private void performTest(Function<PsiField[], PsiField[]> equals,
Function<PsiField[], PsiField[]> hashCode,
Function<PsiField[], PsiField[]> nonNull,
boolean insertOverride,
boolean useAccessors) {
JavaCodeStyleSettings.getInstance(getProject()).GENERATE_FINAL_LOCALS = true;
JavaCodeStyleSettings.getInstance(getProject()).INSERT_OVERRIDE_ANNOTATION = insertOverride;
PsiElement element = getFile().findElementAt(getEditor().getCaretModel().getOffset());
if (element == null) return;
assert element != null;
PsiClass aClass = PsiTreeUtil.getParentOfType(element, PsiClass.class);
if (aClass == null) return;
assert aClass != null;
PsiField[] fields = aClass.getFields();
new GenerateEqualsHelper(getProject(), aClass, equals.apply(fields), hashCode.apply(fields), nonNull.apply(fields), false, useAccessors).invoke();
new GenerateEqualsHelper(getProject(), aClass, equals.apply(fields), hashCode.apply(fields), nonNull.apply(fields),
useInstanceofToCheckParameterType, useAccessors).invoke();
FileDocumentManager.getInstance().saveAllDocuments();
checkResultByFile("/codeInsight/generateEquals/after" + getTestName(false) + ".java");
}
private static PsiField[] getIndexed(PsiField[] fields, int[] indices) {
ArrayList<PsiField> result = new ArrayList<>();
for (int index : indices) {
result.add(fields[index]);
}
return result.toArray(PsiField.EMPTY_ARRAY);
return Arrays.stream(indices).mapToObj(index -> fields[index]).toArray(PsiField[]::new);
}
@Override