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 ffa8c2f6d725..0f25e54cfa1c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManager.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManager.java @@ -48,6 +48,8 @@ public class EqualsHashCodeTemplatesManager extends TemplatesManager { private static final String APACHE_HASH_CODE = "/com/intellij/codeInsight/generation/apacheHashCodeBuilder.vm"; private static final String GUAVA_EQUALS = "/com/intellij/codeInsight/generation/guavaEquals.vm"; private static final String GUAVA_HASH_CODE = "/com/intellij/codeInsight/generation/guavaHashCode.vm"; + private static final String OBJECTS_EQUALS = "/com/intellij/codeInsight/generation/objectsEquals.vm"; + private static final String OBJECTS_HASH_CODE = "/com/intellij/codeInsight/generation/objectsHashCode.vm"; private static final String EQUALS_SUFFIX = "equals"; private static final String HASH_CODE_SUFFIX = "hashCode"; @@ -56,6 +58,7 @@ public class EqualsHashCodeTemplatesManager extends TemplatesManager { @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)"; + @NonNls public static final String JAVA_UTIL_OBJECTS_EQUALS_AND_HASH_CODE = "java.util.Objects.equals and hashCode (java 7+)"; public static EqualsHashCodeTemplatesManager getInstance() { @@ -77,6 +80,9 @@ public class EqualsHashCodeTemplatesManager extends TemplatesManager { 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), + + new TemplateResource(toEqualsName(JAVA_UTIL_OBJECTS_EQUALS_AND_HASH_CODE), readFile(OBJECTS_EQUALS), true), + new TemplateResource(toHashCodeName(JAVA_UTIL_OBJECTS_EQUALS_AND_HASH_CODE), readFile(OBJECTS_HASH_CODE), true) }; } catch (IOException e) { diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/guavaHashCode.vm b/java/java-impl/src/com/intellij/codeInsight/generation/guavaHashCode.vm index 6f381f0c6b02..ff5bfcec7fb0 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/guavaHashCode.vm +++ b/java/java-impl/src/com/intellij/codeInsight/generation/guavaHashCode.vm @@ -1,6 +1,10 @@ public int hashCode() { return com.google.common.base.Objects.hashCode(## #set($i = 0) + #if($superHasHashCode) + super.hashCode() ## + #set($i = 1) + #end #foreach($member in $members) #if (!$member.static) #if ($i > 0) diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/objectsEquals.vm b/java/java-impl/src/com/intellij/codeInsight/generation/objectsEquals.vm new file mode 100644 index 000000000000..08b7723c9d17 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/generation/objectsEquals.vm @@ -0,0 +1,29 @@ +#parse("com/intellij/codeInsight/generation/commonEqualsMacros.vm") +public boolean equals(## +#if ($settings.generateFinalParameters) + final ## +#end +Object $paramName){ + #addEqualsPrologue() + #addClassInstance() + return ## + #set($i = 0) + #foreach($field in $members) + #if (!$field.static) + #if ($i > 0) + && + #end + #set($i = $i + 1) + #if ($field.array) + #if ($field.nestedArray) +java.util.Arrays.deepEquals($field.name, ${classInstanceName}.$field.name)## + #else +java.util.Arrays.equals($field.name, ${classInstanceName}.$field.name)## + #end + #else +java.util.Objects.equals($field.name, ${classInstanceName}.$field.name)## + #end + #end + #end + ; +} \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/objectsHashCode.vm b/java/java-impl/src/com/intellij/codeInsight/generation/objectsHashCode.vm new file mode 100644 index 000000000000..dfe06020b040 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/generation/objectsHashCode.vm @@ -0,0 +1,18 @@ +public int hashCode() { + return java.util.Objects.hash(## + #set($i = 0) + #if($superHasHashCode) + super.hashCode() ## + #set($i = 1) + #end + #foreach($member in $members) + #if (!$member.static) + #if ($i > 0) + , ## + #end + $member.name ## + #set($i = $i + 1) + #end + #end + ); +} \ 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 index b55764404950..1c500e9da141 100644 --- a/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCodeGuava.java +++ b/java/java-tests/testData/codeInsight/generateEquals/afterDifferentTypesSuperEqualsAndHashCodeGuava.java @@ -54,6 +54,6 @@ class A extends B { @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); + return com.google.common.base.Objects.hashCode(super.hashCode(), a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); } } \ No newline at end of file