diff --git a/ChangeLog.md b/ChangeLog.md index 78ad4f8a99b..dd5b3950bfc 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -16,6 +16,7 @@ Issues fixed: - [KT-11145](https://youtrack.jetbrains.com/issue/KT-11145) Use progress indicator when searching usages in Introduce Parameter - [KT-11155](https://youtrack.jetbrains.com/issue/KT-11155) Allow running multiple Kotlin classes as well as running mixtures of Kotlin and Java classes - [KT-11495](https://youtrack.jetbrains.com/issue/KT-11495) Show recursion line markers for extension function calls with different receiver +- [KT-11659](https://youtrack.jetbrains.com/issue/KT-11659) Generate abstract overrides for Any members inside of Kotlin interfaces #### Debugger diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt index 8d7a237db11..8e6106490f0 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.setSingleOverridden interface OverrideMemberChooserObject : ClassMember { enum class BodyType { + NO_BODY, EMPTY, SUPER, QUALIFIED_SUPER @@ -137,9 +138,11 @@ private fun generateFunction(project: Project, descriptor: FunctionDescriptor, b val returnType = descriptor.returnType val returnsNotUnit = returnType != null && !KotlinBuiltIns.isUnit(returnType) - val delegation = generateUnsupportedOrSuperCall(descriptor, bodyType) - - val body = "{" + (if (returnsNotUnit && bodyType != OverrideMemberChooserObject.BodyType.EMPTY) "return " else "") + delegation + "}" + val body = if (bodyType != OverrideMemberChooserObject.BodyType.NO_BODY) { + val delegation = generateUnsupportedOrSuperCall(descriptor, bodyType) + "{" + (if (returnsNotUnit && bodyType != OverrideMemberChooserObject.BodyType.EMPTY) "return " else "") + delegation + "}" + } + else "" return KtPsiFactory(project).createFunction(OVERRIDE_RENDERER.render(newDescriptor) + body) } 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 1802acaea7d..1a347a999c9 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 @@ -66,12 +66,16 @@ class OverrideMembersHandler(private val preferConstructorParameters: Boolean = immediateSupers.singleOrNull { (it.containingDeclaration as? ClassDescriptor)?.kind == ClassKind.CLASS } ?: immediateSupers.first() } - val bodyType = if (immediateSuperToUse.modality == Modality.ABSTRACT) - OverrideMemberChooserObject.BodyType.EMPTY - else if (realSupersToUse.size == 1) - OverrideMemberChooserObject.BodyType.SUPER - else - OverrideMemberChooserObject.BodyType.QUALIFIED_SUPER + val bodyType = when { + descriptor.kind == ClassKind.INTERFACE && realSuper.builtIns.isMemberOfAny(realSuper) -> + OverrideMemberChooserObject.BodyType.NO_BODY + immediateSuperToUse.modality == Modality.ABSTRACT -> + OverrideMemberChooserObject.BodyType.EMPTY + realSupersToUse.size == 1 -> + OverrideMemberChooserObject.BodyType.SUPER + else -> + OverrideMemberChooserObject.BodyType.QUALIFIED_SUPER + } result.add(OverrideMemberChooserObject.create(project, realSuper, immediateSuperToUse, bodyType, preferConstructorParameters)) } diff --git a/idea/testData/codeInsight/overrideImplement/equalsInInterface.kt b/idea/testData/codeInsight/overrideImplement/equalsInInterface.kt new file mode 100644 index 00000000000..272b2b11e57 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/equalsInInterface.kt @@ -0,0 +1,5 @@ +interface A + +interface B : A { + +} \ No newline at end of file diff --git a/idea/testData/codeInsight/overrideImplement/equalsInInterface.kt.after b/idea/testData/codeInsight/overrideImplement/equalsInInterface.kt.after new file mode 100644 index 00000000000..47d14abb595 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/equalsInInterface.kt.after @@ -0,0 +1,5 @@ +interface A + +interface B : A { + override fun equals(other: Any?): Boolean +} \ 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 192c1a9dd07..69e950cd0b4 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt @@ -231,4 +231,8 @@ class OverrideImplementTest : AbstractOverrideImplementTest() { fun testDuplicatedAnyMembersBug() { doMultiOverrideFileTest() } + + fun testEqualsInInterface() { + doOverrideFileTest("equals") + } }