From 8c882f0d27bb5a5480257df32e6d237ad176368c Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 10 Jan 2017 20:26:56 +0300 Subject: [PATCH] Override Members: Allow overriding virtual synthetic members (e.g. equals(), hashCode(), toString(), etc.) in data classes #KT-15563 Fixed --- ChangeLog.md | 1 + .../idea/core/overrideImplement/OverrideMembersHandler.kt | 5 ++--- .../codeInsight/overrideImplement/dataClassEquals.kt | 3 +++ .../codeInsight/overrideImplement/dataClassEquals.kt.after | 5 +++++ .../kotlin/idea/codeInsight/OverrideImplementTest.kt | 4 ++++ 5 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 idea/testData/codeInsight/overrideImplement/dataClassEquals.kt create mode 100644 idea/testData/codeInsight/overrideImplement/dataClassEquals.kt.after diff --git a/ChangeLog.md b/ChangeLog.md index cd74b030830..f7bb7c33c67 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -474,6 +474,7 @@ These artifacts include extensions for the types available in the latter JDKs, s - [`KT-15602`](https://youtrack.jetbrains.com/issue/KT-15602) Extract Interface/Superclass: Disable "Make abstract" for inline/external/lateinit members - Extract Interface: Disable inline/external/lateinit members - [`KT-12704`](https://youtrack.jetbrains.com/issue/KT-12704), [`KT-15583`](https://youtrack.jetbrains.com/issue/KT-15583) Override/Implement Members: Support all nullability annotations respected by the Kotlin compiler +- [`KT-15563`](https://youtrack.jetbrains.com/issue/KT-15563) Override Members: Allow overriding virtual synthetic members (e.g. equals(), hashCode(), toString(), etc.) in data classes #### Intention actions, inspections and quickfixes diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMembersHandler.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMembersHandler.kt index 1a347a999c9..508174140e8 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMembersHandler.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMembersHandler.kt @@ -27,8 +27,7 @@ class OverrideMembersHandler(private val preferConstructorParameters: Boolean = override fun collectMembersToGenerate(descriptor: ClassDescriptor, project: Project): Collection { val result = ArrayList() for (member in descriptor.unsubstitutedMemberScope.getContributedDescriptors()) { - if (member is CallableMemberDescriptor - && (member.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE || member.kind == CallableMemberDescriptor.Kind.DELEGATION)) { + if (member is CallableMemberDescriptor && (member.kind != CallableMemberDescriptor.Kind.DECLARATION)) { val overridden = member.overriddenDescriptors if (overridden.any { it.modality == Modality.FINAL || Visibilities.isPrivate(it.visibility.normalize()) }) continue @@ -52,7 +51,7 @@ class OverrideMembersHandler(private val preferConstructorParameters: Boolean = nonAbstractRealSupers } else { - listOf(realSupers.first()) + listOf(realSupers.firstOrNull() ?: continue) } for (realSuper in realSupersToUse) { diff --git a/idea/testData/codeInsight/overrideImplement/dataClassEquals.kt b/idea/testData/codeInsight/overrideImplement/dataClassEquals.kt new file mode 100644 index 00000000000..4b3abfc295d --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/dataClassEquals.kt @@ -0,0 +1,3 @@ +data class Foo(val name: String) { + +} \ No newline at end of file diff --git a/idea/testData/codeInsight/overrideImplement/dataClassEquals.kt.after b/idea/testData/codeInsight/overrideImplement/dataClassEquals.kt.after new file mode 100644 index 00000000000..cd0d0e17b05 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/dataClassEquals.kt.after @@ -0,0 +1,5 @@ +data class Foo(val name: String) { + override fun equals(other: Any?): Boolean { + return super.equals(other) + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt index f99c995f5b4..ded7d17dfed 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt @@ -271,4 +271,8 @@ class OverrideImplementTest : AbstractOverrideImplementTest() { fun testTypeAliasNotExpanded() { doOverrideFileTest("test") } + + fun testDataClassEquals() { + doOverrideFileTest("equals") + } }