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
This commit is contained in:
Alexey Sedunov
2017-06-15 17:32:20 +03:00
parent 895407f5e3
commit 9681f5ca42
9 changed files with 10 additions and 30 deletions
@@ -74,12 +74,12 @@ class KotlinGenerateEqualsAndHashcodeAction : KotlinGenerateMemberActionBase<Kot
override fun isValidForClass(targetClass: KtClassOrObject): Boolean {
return targetClass is KtClass
&& targetClass !is KtEnumEntry
&& !targetClass.isEnum()
&& !targetClass.isAnnotation()
&& !targetClass.isInterface()
&& (!targetClass.isData() || isValidForDataClass(targetClass))
&& getPropertiesToUseInGeneratedMember(targetClass).isNotEmpty()
}
private fun isValidForDataClass(targetClass: KtClass): Boolean {
val constructor = targetClass.primaryConstructor ?: return false
val context = constructor.analyze(BodyResolveMode.PARTIAL)
@@ -226,7 +226,7 @@ class KotlinGenerateEqualsAndHashcodeAction : KotlinGenerateMemberActionBase<Kot
val initialValue = when {
!builtins.isMemberOfAny(superHashCode) -> "super.hashCode()"
propertyIterator.hasNext() -> propertyIterator.next().genVariableHashCode(false)
else -> "0"
else -> "javaClass.hashCode()"
}
val bodyText = if (propertyIterator.hasNext()) {
@@ -5,6 +5,4 @@ class Test {
var name: String = ""
get
<caret>
}
// FORCED
}
@@ -12,9 +12,7 @@ class Test {
}
override fun hashCode(): Int {
return 0
return javaClass.hashCode()
}
}
// FORCED
}
@@ -1,4 +1,3 @@
// NOT_APPLICABLE
class A {<caret>
fun foo() {
@@ -1,4 +1,3 @@
// FORCED
class A {
fun foo() {
@@ -11,6 +10,6 @@ class A {
}
override fun hashCode(): Int {
return 0
return javaClass.hashCode()
}
}
@@ -1,6 +0,0 @@
// FORCED
class A {<caret>
fun foo() {
}
}
@@ -1,4 +1,3 @@
// FORCED
open class X {
override fun equals(other: Any?) = super.equals(other)
override fun hashCode() = super.hashCode()
@@ -1,4 +1,3 @@
// FORCED
open class X {
override fun equals(other: Any?) = super.equals(other)
override fun hashCode() = super.hashCode()
@@ -132,15 +132,9 @@ public class GenerateHashCodeAndEqualsActionTestGenerated extends AbstractGenera
doTest(fileName);
}
@TestMetadata("noVarsForced.kt")
public void testNoVarsForced() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/generate/equalsWithHashCode/noVarsForced.kt");
doTest(fileName);
}
@TestMetadata("noVarsForcedWithSuperClass.kt")
public void testNoVarsForcedWithSuperClass() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/generate/equalsWithHashCode/noVarsForcedWithSuperClass.kt");
@TestMetadata("noVarsWithSuperClass.kt")
public void testNoVarsWithSuperClass() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/generate/equalsWithHashCode/noVarsWithSuperClass.kt");
doTest(fileName);
}