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-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-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-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
|
#### Debugger
|
||||||
|
|
||||||
|
|||||||
+6
-3
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.setSingleOverridden
|
|||||||
|
|
||||||
interface OverrideMemberChooserObject : ClassMember {
|
interface OverrideMemberChooserObject : ClassMember {
|
||||||
enum class BodyType {
|
enum class BodyType {
|
||||||
|
NO_BODY,
|
||||||
EMPTY,
|
EMPTY,
|
||||||
SUPER,
|
SUPER,
|
||||||
QUALIFIED_SUPER
|
QUALIFIED_SUPER
|
||||||
@@ -137,9 +138,11 @@ private fun generateFunction(project: Project, descriptor: FunctionDescriptor, b
|
|||||||
val returnType = descriptor.returnType
|
val returnType = descriptor.returnType
|
||||||
val returnsNotUnit = returnType != null && !KotlinBuiltIns.isUnit(returnType)
|
val returnsNotUnit = returnType != null && !KotlinBuiltIns.isUnit(returnType)
|
||||||
|
|
||||||
val delegation = generateUnsupportedOrSuperCall(descriptor, bodyType)
|
val body = if (bodyType != OverrideMemberChooserObject.BodyType.NO_BODY) {
|
||||||
|
val delegation = generateUnsupportedOrSuperCall(descriptor, bodyType)
|
||||||
val body = "{" + (if (returnsNotUnit && bodyType != OverrideMemberChooserObject.BodyType.EMPTY) "return " else "") + delegation + "}"
|
"{" + (if (returnsNotUnit && bodyType != OverrideMemberChooserObject.BodyType.EMPTY) "return " else "") + delegation + "}"
|
||||||
|
}
|
||||||
|
else ""
|
||||||
|
|
||||||
return KtPsiFactory(project).createFunction(OVERRIDE_RENDERER.render(newDescriptor) + body)
|
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()
|
immediateSupers.singleOrNull { (it.containingDeclaration as? ClassDescriptor)?.kind == ClassKind.CLASS } ?: immediateSupers.first()
|
||||||
}
|
}
|
||||||
|
|
||||||
val bodyType = if (immediateSuperToUse.modality == Modality.ABSTRACT)
|
val bodyType = when {
|
||||||
OverrideMemberChooserObject.BodyType.EMPTY
|
descriptor.kind == ClassKind.INTERFACE && realSuper.builtIns.isMemberOfAny(realSuper) ->
|
||||||
else if (realSupersToUse.size == 1)
|
OverrideMemberChooserObject.BodyType.NO_BODY
|
||||||
OverrideMemberChooserObject.BodyType.SUPER
|
immediateSuperToUse.modality == Modality.ABSTRACT ->
|
||||||
else
|
OverrideMemberChooserObject.BodyType.EMPTY
|
||||||
OverrideMemberChooserObject.BodyType.QUALIFIED_SUPER
|
realSupersToUse.size == 1 ->
|
||||||
|
OverrideMemberChooserObject.BodyType.SUPER
|
||||||
|
else ->
|
||||||
|
OverrideMemberChooserObject.BodyType.QUALIFIED_SUPER
|
||||||
|
}
|
||||||
|
|
||||||
result.add(OverrideMemberChooserObject.create(project, realSuper, immediateSuperToUse, bodyType, preferConstructorParameters))
|
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() {
|
fun testDuplicatedAnyMembersBug() {
|
||||||
doMultiOverrideFileTest()
|
doMultiOverrideFileTest()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun testEqualsInInterface() {
|
||||||
|
doOverrideFileTest("equals")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user