Override/Implement Action: Generate abstract overrides for Any members inside of Kotlin interfaces
#KT-11659 Fixed
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
+6
-3
@@ -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)
|
||||
}
|
||||
|
||||
+10
-6
@@ -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))
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
interface A
|
||||
|
||||
interface B : A {
|
||||
<caret>
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
interface A
|
||||
|
||||
interface B : A {
|
||||
override fun equals(other: Any?): Boolean
|
||||
}
|
||||
@@ -231,4 +231,8 @@ class OverrideImplementTest : AbstractOverrideImplementTest() {
|
||||
fun testDuplicatedAnyMembersBug() {
|
||||
doMultiOverrideFileTest()
|
||||
}
|
||||
|
||||
fun testEqualsInInterface() {
|
||||
doOverrideFileTest("equals")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user