diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManager.java b/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManager.java index 2bdcd287fa72..ffa8c2f6d725 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManager.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManager.java @@ -23,6 +23,7 @@ import com.intellij.openapi.util.Couple; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.java.generate.exception.TemplateResourceException; import org.jetbrains.java.generate.template.TemplateResource; @@ -51,6 +52,11 @@ public class EqualsHashCodeTemplatesManager extends TemplatesManager { private static final String EQUALS_SUFFIX = "equals"; private static final String HASH_CODE_SUFFIX = "hashCode"; + @NonNls public static final String INTELLI_J_DEFAULT = "IntelliJ Default"; + @NonNls public static final String EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG = "Equals/HashCodeBuilder (Apache commons-lang)"; + @NonNls public static final String EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG_3 = "Equals/HashCodeBuilder (Apache commons-lang 3)"; + @NonNls public static final String OBJECTS_EQUAL_AND_HASH_CODE_GUAVA = "Objects.equal and hashCode (Guava)"; + public static EqualsHashCodeTemplatesManager getInstance() { return ServiceManager.getService(EqualsHashCodeTemplatesManager.class); @@ -60,17 +66,17 @@ public class EqualsHashCodeTemplatesManager extends TemplatesManager { public TemplateResource[] getDefaultTemplates() { try { return new TemplateResource[] { - new TemplateResource("IntelliJ Default equals", readFile(DEFAULT_EQUALS), true), - new TemplateResource("IntelliJ Default hashCode", readFile(DEFAULT_HASH_CODE), true), + new TemplateResource(toEqualsName(INTELLI_J_DEFAULT), readFile(DEFAULT_EQUALS), true), + new TemplateResource(toHashCodeName(INTELLI_J_DEFAULT), readFile(DEFAULT_HASH_CODE), true), - new TemplateResource("Equals/HashCodeBuilder (Apache commons-lang) equals", readFile(APACHE_EQUALS), true), - new TemplateResource("Equals/HashCodeBuilder (Apache commons-lang) hashCode", readFile(APACHE_HASH_CODE), true), + new TemplateResource(toEqualsName(EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG), readFile(APACHE_EQUALS), true), + new TemplateResource(toHashCodeName(EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG), readFile(APACHE_HASH_CODE), true), - new TemplateResource("Equals/HashCodeBuilder (Apache commons-lang 3) equals", readFile(APACHE3_EQUALS), true), - new TemplateResource("Equals/HashCodeBuilder (Apache commons-lang 3) hashCode", readFile(APACHE3_HASH_CODE), true), + new TemplateResource(toEqualsName(EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG_3), readFile(APACHE3_EQUALS), true), + new TemplateResource(toHashCodeName(EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG_3), readFile(APACHE3_HASH_CODE), true), - new TemplateResource("Objects.equal and hashCode (Guava) equals", readFile(GUAVA_EQUALS), true), - new TemplateResource("Objects.equal and hashCode (Guava) hashCode", readFile(GUAVA_HASH_CODE), true), + new TemplateResource(toEqualsName(OBJECTS_EQUAL_AND_HASH_CODE_GUAVA), readFile(GUAVA_EQUALS), true), + new TemplateResource(toHashCodeName(OBJECTS_EQUAL_AND_HASH_CODE_GUAVA), readFile(GUAVA_HASH_CODE), true), }; } catch (IOException e) { @@ -127,7 +133,7 @@ public class EqualsHashCodeTemplatesManager extends TemplatesManager { } public void setDefaultTemplate(String name) { - Set fullNames = ContainerUtil.newHashSet(name + " " + EQUALS_SUFFIX, name + " " + HASH_CODE_SUFFIX); + Set fullNames = ContainerUtil.newHashSet(toEqualsName(name), toHashCodeName(name)); for (TemplateResource resource : getAllTemplates()) { if (fullNames.contains(resource.getFileName())) { setDefaultTemplate(resource); diff --git a/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCodeApache3.java b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCodeApache3.java new file mode 100644 index 000000000000..0cec1ef81118 --- /dev/null +++ b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCodeApache3.java @@ -0,0 +1,78 @@ +class B { + @Override + public boolean equals(Object obj) { + return obj != null; + } + + @Override + public int hashCode() { + return super.hashCode(); + } +} +class A extends B { + Object[] a1; + Object[][] a2; + String[] a3; + String[][] a4; + int[] a5; + int[][] a6; + + byte a7; + short a8; + int a9; + long a10; + float a11; + double a12; + + Object a13; + String a14; + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (o == null || getClass() != o.getClass()) return false; + + final A a = (A) o; + + return new org.apache.commons.lang3.builder.EqualsBuilder() + .appendSuper(super.equals(o)) + .append(a10, a.a10) + .append(a11, a.a11) + .append(a12, a.a12) + .append(a7, a.a7) + .append(a8, a.a8) + .append(a9, a.a9) + .append(a1, a.a1) + .append(a13, a.a13) + .append(a14, a.a14) + .append(a2, a.a2) + .append(a3, a.a3) + .append(a4, a.a4) + .append(a5, a.a5) + .append(a6, a.a6) + .isEquals(); + } + + @Override + public int hashCode() { + return new org.apache.commons.lang3.builder.HashCodeBuilder(17, 37) + .appendSuper(super.hashCode()) + .append(a1) + .append(a2) + .append(a3) + .append(a4) + .append(a5) + .append(a6) + .append(a7) + .append(a8) + .append(a9) + .append(a10) + .append(a11) + .append(a12) + .append(a13) + .append(a14) + .toHashCode(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCodeGuava.java b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCodeGuava.java new file mode 100644 index 000000000000..b55764404950 --- /dev/null +++ b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCodeGuava.java @@ -0,0 +1,59 @@ +import java.util.Arrays; + +class B { + @Override + public boolean equals(Object obj) { + return obj != null; + } + + @Override + public int hashCode() { + return super.hashCode(); + } +} +class A extends B { + Object[] a1; + Object[][] a2; + String[] a3; + String[][] a4; + int[] a5; + int[][] a6; + + byte a7; + short a8; + int a9; + long a10; + float a11; + double a12; + + Object a13; + String a14; + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + final A a = (A) o; + return com.google.common.base.Objects.equal(a10, a.a10) && + com.google.common.base.Objects.equal(a11, a.a11) && + com.google.common.base.Objects.equal(a12, a.a12) && + com.google.common.base.Objects.equal(a7, a.a7) && + com.google.common.base.Objects.equal(a8, a.a8) && + com.google.common.base.Objects.equal(a9, a.a9) && + Arrays.equals(a1, a.a1) && + com.google.common.base.Objects.equal(a13, a.a13) && + com.google.common.base.Objects.equal(a14, a.a14) && + Arrays.deepEquals(a2, a.a2) && + Arrays.equals(a3, a.a3) && + Arrays.deepEquals(a4, a.a4) && + Arrays.equals(a5, a.a5) && + Arrays.deepEquals(a6, a.a6); + } + + @Override + public int hashCode() { + return com.google.common.base.Objects.hashCode(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/generateEquals/beforeDifferentTypesSuperEqualsAndHashCodeApache3.java b/java/java-tests/testData/codeInsight/generateEquals/beforeDifferentTypesSuperEqualsAndHashCodeApache3.java new file mode 100644 index 000000000000..b123e793ba14 --- /dev/null +++ b/java/java-tests/testData/codeInsight/generateEquals/beforeDifferentTypesSuperEqualsAndHashCodeApache3.java @@ -0,0 +1,31 @@ +class B { + @Override + public boolean equals(Object obj) { + return obj != null; + } + + @Override + public int hashCode() { + return super.hashCode(); + } +} +class A extends B { + Object[] a1; + Object[][] a2; + String[] a3; + String[][] a4; + int[] a5; + int[][] a6; + + byte a7; + short a8; + int a9; + long a10; + float a11; + double a12; + + Object a13; + String a14; + + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/generateEquals/beforeDifferentTypesSuperEqualsAndHashCodeGuava.java b/java/java-tests/testData/codeInsight/generateEquals/beforeDifferentTypesSuperEqualsAndHashCodeGuava.java new file mode 100644 index 000000000000..b123e793ba14 --- /dev/null +++ b/java/java-tests/testData/codeInsight/generateEquals/beforeDifferentTypesSuperEqualsAndHashCodeGuava.java @@ -0,0 +1,31 @@ +class B { + @Override + public boolean equals(Object obj) { + return obj != null; + } + + @Override + public int hashCode() { + return super.hashCode(); + } +} +class A extends B { + Object[] a1; + Object[][] a2; + String[] a3; + String[][] a4; + int[] a5; + int[][] a6; + + byte a7; + short a8; + int a9; + long a10; + float a11; + double a12; + + Object a13; + String a14; + + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/GenerateEquals15Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/GenerateEquals15Test.java index 992f237c435e..68cd47604a9a 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/GenerateEquals15Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/GenerateEquals15Test.java @@ -1,5 +1,6 @@ package com.intellij.codeInsight; +import com.intellij.codeInsight.generation.EqualsHashCodeTemplatesManager; import com.intellij.psi.PsiField; import com.intellij.util.Function; @@ -37,4 +38,22 @@ public class GenerateEquals15Test extends GenerateEqualsTestCase { doTest(Function.ID, Function.ID, Function.ID, true); } + public void testDifferentTypesSuperEqualsAndHashCodeApache3() throws Exception { + doTestWithTemplate(EqualsHashCodeTemplatesManager.EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG_3); + } + + public void testDifferentTypesSuperEqualsAndHashCodeGuava() throws Exception { + doTestWithTemplate(EqualsHashCodeTemplatesManager.OBJECTS_EQUAL_AND_HASH_CODE_GUAVA); + } + + private void doTestWithTemplate(String templateName) throws Exception { + try { + EqualsHashCodeTemplatesManager.getInstance().setDefaultTemplate(templateName); + doTest(Function.ID, Function.ID, Function.ID, true); + } + finally { + EqualsHashCodeTemplatesManager.getInstance().setDefaultTemplate(EqualsHashCodeTemplatesManager.INTELLI_J_DEFAULT); + } + } + } \ No newline at end of file