diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt b/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt index cd759f4e865..e5a9208678f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt +++ b/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt @@ -199,8 +199,11 @@ class KotlinGenerateEqualsAndHashcodeAction : KotlinGenerateMemberActionBase - "!java.util.Arrays.equals($propName, $paramName.$propName)" + KotlinBuiltIns.isArrayOrPrimitiveArray(it.type) -> { + val isNestedArray = KotlinBuiltIns.isArrayOrPrimitiveArray(classDescriptor.builtIns.getArrayElementType(it.type)) + val methodName = if (isNestedArray) "deepEquals" else "equals" + "!java.util.Arrays.$methodName($propName, $paramName.$propName)" + } else -> "$propName != $paramName.$propName" } @@ -230,8 +233,11 @@ class KotlinGenerateEqualsAndHashcodeAction : KotlinGenerateMemberActionBase ref - KotlinBuiltIns.isArray(type) || KotlinBuiltIns.isPrimitiveArray(type) -> - if (isNullable) "$ref?.let { java.util.Arrays.hashCode(it) }" else "java.util.Arrays.hashCode($ref)" + KotlinBuiltIns.isArrayOrPrimitiveArray(type) -> { + val isNestedArray = KotlinBuiltIns.isArrayOrPrimitiveArray(builtIns.getArrayElementType(type)) + val methodName = if (isNestedArray) "deepHashCode" else "hashCode" + if (isNullable) "$ref?.let { java.util.Arrays.$methodName(it) }" else "java.util.Arrays.$methodName($ref)" + } else -> if (isNullable) "$ref?.hashCode()" else "$ref.hashCode()" } diff --git a/idea/testData/codeInsight/generate/equalsWithHashCode/nestedArray.kt b/idea/testData/codeInsight/generate/equalsWithHashCode/nestedArray.kt new file mode 100644 index 00000000000..d7fff67abc5 --- /dev/null +++ b/idea/testData/codeInsight/generate/equalsWithHashCode/nestedArray.kt @@ -0,0 +1,2 @@ +class EqKotlin(val a: Array>) { +} \ No newline at end of file diff --git a/idea/testData/codeInsight/generate/equalsWithHashCode/nestedArray.kt.after b/idea/testData/codeInsight/generate/equalsWithHashCode/nestedArray.kt.after new file mode 100644 index 00000000000..f94a9542429 --- /dev/null +++ b/idea/testData/codeInsight/generate/equalsWithHashCode/nestedArray.kt.after @@ -0,0 +1,18 @@ +import java.util.Arrays + +class EqKotlin(val a: Array>) { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as EqKotlin + + if (!Arrays.deepEquals(a, other.a)) return false + + return true + } + + override fun hashCode(): Int { + return Arrays.deepHashCode(a) + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/generate/GenerateHashCodeAndEqualsActionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/generate/GenerateHashCodeAndEqualsActionTestGenerated.java index 99a3eccc168..f1c0831e7be 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/generate/GenerateHashCodeAndEqualsActionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/generate/GenerateHashCodeAndEqualsActionTestGenerated.java @@ -114,6 +114,11 @@ public class GenerateHashCodeAndEqualsActionTestGenerated extends AbstractGenera runTest("idea/testData/codeInsight/generate/equalsWithHashCode/nameClash.kt"); } + @TestMetadata("nestedArray.kt") + public void testNestedArray() throws Exception { + runTest("idea/testData/codeInsight/generate/equalsWithHashCode/nestedArray.kt"); + } + @TestMetadata("noVars.kt") public void testNoVars() throws Exception { runTest("idea/testData/codeInsight/generate/equalsWithHashCode/noVars.kt");