Skip to content

Commit 9681f5c

Browse files
committed
Generate equals/hashCode(): Enable for classes without properties
Also: - forbid for enum classes - use javaClass.hashCode() instead of 0 if class has no properties #KT-18418 Fixed
1 parent 895407f commit 9681f5c

File tree

9 files changed

+10
-30
lines changed

9 files changed

+10
-30
lines changed

idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,12 @@ class KotlinGenerateEqualsAndHashcodeAction : KotlinGenerateMemberActionBase<Kot
7474
override fun isValidForClass(targetClass: KtClassOrObject): Boolean {
7575
return targetClass is KtClass
7676
&& targetClass !is KtEnumEntry
77+
&& !targetClass.isEnum()
7778
&& !targetClass.isAnnotation()
7879
&& !targetClass.isInterface()
7980
&& (!targetClass.isData() || isValidForDataClass(targetClass))
80-
&& getPropertiesToUseInGeneratedMember(targetClass).isNotEmpty()
8181
}
82-
82+
8383
private fun isValidForDataClass(targetClass: KtClass): Boolean {
8484
val constructor = targetClass.primaryConstructor ?: return false
8585
val context = constructor.analyze(BodyResolveMode.PARTIAL)
@@ -226,7 +226,7 @@ class KotlinGenerateEqualsAndHashcodeAction : KotlinGenerateMemberActionBase<Kot
226226
val initialValue = when {
227227
!builtins.isMemberOfAny(superHashCode) -> "super.hashCode()"
228228
propertyIterator.hasNext() -> propertyIterator.next().genVariableHashCode(false)
229-
else -> "0"
229+
else -> "javaClass.hashCode()"
230230
}
231231

232232
val bodyText = if (propertyIterator.hasNext()) {

idea/testData/codeInsight/generate/equalsWithHashCode/explicitDefaultAccessors.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,4 @@ class Test {
55
var name: String = ""
66
get
77
<caret>
8-
}
9-
10-
// FORCED
8+
}

idea/testData/codeInsight/generate/equalsWithHashCode/explicitDefaultAccessors.kt.after

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ class Test {
1212
}
1313

1414
override fun hashCode(): Int {
15-
return 0
15+
return javaClass.hashCode()
1616
}
1717

18-
}
19-
20-
// FORCED
18+
}

idea/testData/codeInsight/generate/equalsWithHashCode/noVars.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// NOT_APPLICABLE
21
class A {<caret>
32
fun foo() {
43

idea/testData/codeInsight/generate/equalsWithHashCode/noVarsForced.kt.after renamed to idea/testData/codeInsight/generate/equalsWithHashCode/noVars.kt.after

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// FORCED
21
class A {
32
fun foo() {
43

@@ -11,6 +10,6 @@ class A {
1110
}
1211

1312
override fun hashCode(): Int {
14-
return 0
13+
return javaClass.hashCode()
1514
}
1615
}

idea/testData/codeInsight/generate/equalsWithHashCode/noVarsForced.kt

Lines changed: 0 additions & 6 deletions
This file was deleted.

idea/testData/codeInsight/generate/equalsWithHashCode/noVarsForcedWithSuperClass.kt renamed to idea/testData/codeInsight/generate/equalsWithHashCode/noVarsWithSuperClass.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// FORCED
21
open class X {
32
override fun equals(other: Any?) = super.equals(other)
43
override fun hashCode() = super.hashCode()

idea/testData/codeInsight/generate/equalsWithHashCode/noVarsForcedWithSuperClass.kt.after renamed to idea/testData/codeInsight/generate/equalsWithHashCode/noVarsWithSuperClass.kt.after

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// FORCED
21
open class X {
32
override fun equals(other: Any?) = super.equals(other)
43
override fun hashCode() = super.hashCode()

idea/tests/org/jetbrains/kotlin/idea/codeInsight/generate/GenerateHashCodeAndEqualsActionTestGenerated.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,9 @@ public void testNoVars() throws Exception {
132132
doTest(fileName);
133133
}
134134

135-
@TestMetadata("noVarsForced.kt")
136-
public void testNoVarsForced() throws Exception {
137-
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/generate/equalsWithHashCode/noVarsForced.kt");
138-
doTest(fileName);
139-
}
140-
141-
@TestMetadata("noVarsForcedWithSuperClass.kt")
142-
public void testNoVarsForcedWithSuperClass() throws Exception {
143-
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/generate/equalsWithHashCode/noVarsForcedWithSuperClass.kt");
135+
@TestMetadata("noVarsWithSuperClass.kt")
136+
public void testNoVarsWithSuperClass() throws Exception {
137+
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/generate/equalsWithHashCode/noVarsWithSuperClass.kt");
144138
doTest(fileName);
145139
}
146140

0 commit comments

Comments
 (0)