Override Members: Allow overriding virtual synthetic members (e.g. equals(), hashCode(), toString(), etc.) in data classes

#KT-15563 Fixed
This commit is contained in:
Alexey Sedunov
2017-01-10 20:26:56 +03:00
parent 862966fd33
commit 8c882f0d27
5 changed files with 15 additions and 3 deletions
+1
View File
@@ -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
@@ -27,8 +27,7 @@ class OverrideMembersHandler(private val preferConstructorParameters: Boolean =
override fun collectMembersToGenerate(descriptor: ClassDescriptor, project: Project): Collection<OverrideMemberChooserObject> {
val result = ArrayList<OverrideMemberChooserObject>()
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) {
@@ -0,0 +1,3 @@
data class Foo(val name: String) {
<caret>
}
@@ -0,0 +1,5 @@
data class Foo(val name: String) {
override fun equals(other: Any?): Boolean {
<selection>return super.equals(other)</selection>
}
}
@@ -271,4 +271,8 @@ class OverrideImplementTest : AbstractOverrideImplementTest() {
fun testTypeAliasNotExpanded() {
doOverrideFileTest("test")
}
fun testDataClassEquals() {
doOverrideFileTest("equals")
}
}