diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/equalsHelper.vm b/java/java-impl/src/com/intellij/codeInsight/generation/equalsHelper.vm index 905d1e40dfa8..2345a8be84eb 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/equalsHelper.vm +++ b/java/java-impl/src/com/intellij/codeInsight/generation/equalsHelper.vm @@ -4,7 +4,22 @@ #if ($settings.generateFinalLocals) final ## #end - $classname $classInstanceName = ($classname)$paramName; + #set($wildcards = "#generateWildcards()") + $classname$wildcards $classInstanceName = ($classname$wildcards)$paramName; +#end +## +#macro(generateWildcards) + #if ($class.typeParams > 0) + <## + #set( $arr = [1..$class.typeParams] ) + #foreach( $i in $arr ) + #if ($i > 1) + , ## + #end + ?## + #end + >## + #end #end ## #macro(addEqualsPrologue) diff --git a/java/java-tests/testData/codeInsight/generateEquals/afterClassWithTypeParams.java b/java/java-tests/testData/codeInsight/generateEquals/afterClassWithTypeParams.java new file mode 100644 index 000000000000..3086f8792ea3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/generateEquals/afterClassWithTypeParams.java @@ -0,0 +1,23 @@ +import java.util.Arrays; + +class A { + Object[] a1; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + final A a = (A) o; + + // Probably incorrect - comparing Object[] arrays with Arrays.equals + if (!Arrays.equals(a1, a.a1)) return false; + + return true; + } + + @Override + public int hashCode() { + return Arrays.hashCode(a1); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/generateEquals/beforeClassWithTypeParams.java b/java/java-tests/testData/codeInsight/generateEquals/beforeClassWithTypeParams.java new file mode 100644 index 000000000000..33b08536e6a6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/generateEquals/beforeClassWithTypeParams.java @@ -0,0 +1,5 @@ + +class A { + Object[] a1; + +} \ 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 9eae9fd23a9a..9728955c79fa 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/GenerateEquals15Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/GenerateEquals15Test.java @@ -24,11 +24,11 @@ public class GenerateEquals15Test extends GenerateEqualsTestCase { public void testDifferentTypesGetters() throws Exception { doTest(Function.ID, Function.ID, new Function() { - @Override - public PsiField[] fun(PsiField[] fields) { - return new PsiField[0]; - } - }, true, true); + @Override + public PsiField[] fun(PsiField[] fields) { + return new PsiField[0]; + } + }, true, true); } public void testDifferentTypesAllNotNull() throws Exception { @@ -47,6 +47,10 @@ public class GenerateEquals15Test extends GenerateEqualsTestCase { doTest(Function.ID, Function.ID, Function.ID, true); } + public void testClassWithTypeParams() throws Exception { + doTest(Function.ID, Function.ID, Function.ID, true); + } + public void testDifferentTypesSuperEqualsAndHashCodeApache3() throws Exception { doTestWithTemplate(EqualsHashCodeTemplatesManager.EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG_3); } diff --git a/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ClassElement.java b/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ClassElement.java index 17eb57d9eb6b..a926935359cc 100644 --- a/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ClassElement.java +++ b/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ClassElement.java @@ -36,8 +36,9 @@ public class ClassElement { private boolean _enum; private boolean exception; private boolean _abstract; + private int myTypeParams; - /** + /** * Does the class implement the given interface? *

* The name should not be the qualified name. @@ -169,4 +170,12 @@ public class ClassElement { ", abstract=" + _abstract + "}"; } + + public void setTypeParams(int typeParams) { + myTypeParams = typeParams; + } + + public int getTypeParams() { + return myTypeParams; + } } diff --git a/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ElementFactory.java b/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ElementFactory.java index 8a88e8502eb5..bffd927b072d 100644 --- a/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ElementFactory.java +++ b/plugins/generate-tostring/src/org/jetbrains/java/generate/element/ElementFactory.java @@ -57,6 +57,7 @@ public class ElementFactory { ce.setDeprecated(clazz.isDeprecated()); ce.setException(PsiAdapter.isExceptionClass(clazz)); ce.setAbstract(clazz.hasModifierProperty(PsiModifier.ABSTRACT)); + ce.setTypeParams(clazz.getTypeParameters().length); return ce; }