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 - [`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 - 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-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 #### Intention actions, inspections and quickfixes
@@ -27,8 +27,7 @@ class OverrideMembersHandler(private val preferConstructorParameters: Boolean =
override fun collectMembersToGenerate(descriptor: ClassDescriptor, project: Project): Collection<OverrideMemberChooserObject> { override fun collectMembersToGenerate(descriptor: ClassDescriptor, project: Project): Collection<OverrideMemberChooserObject> {
val result = ArrayList<OverrideMemberChooserObject>() val result = ArrayList<OverrideMemberChooserObject>()
for (member in descriptor.unsubstitutedMemberScope.getContributedDescriptors()) { for (member in descriptor.unsubstitutedMemberScope.getContributedDescriptors()) {
if (member is CallableMemberDescriptor if (member is CallableMemberDescriptor && (member.kind != CallableMemberDescriptor.Kind.DECLARATION)) {
&& (member.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE || member.kind == CallableMemberDescriptor.Kind.DELEGATION)) {
val overridden = member.overriddenDescriptors val overridden = member.overriddenDescriptors
if (overridden.any { it.modality == Modality.FINAL || Visibilities.isPrivate(it.visibility.normalize()) }) continue if (overridden.any { it.modality == Modality.FINAL || Visibilities.isPrivate(it.visibility.normalize()) }) continue
@@ -52,7 +51,7 @@ class OverrideMembersHandler(private val preferConstructorParameters: Boolean =
nonAbstractRealSupers nonAbstractRealSupers
} }
else { else {
listOf(realSupers.first()) listOf(realSupers.firstOrNull() ?: continue)
} }
for (realSuper in realSupersToUse) { 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() { fun testTypeAliasNotExpanded() {
doOverrideFileTest("test") doOverrideFileTest("test")
} }
fun testDataClassEquals() {
doOverrideFileTest("equals")
}
} }