Override/Implement Action: Generate abstract overrides for Any members inside of Kotlin interfaces

#KT-11659 Fixed
This commit is contained in:
Alexey Sedunov
2016-04-13 16:16:20 +03:00
parent 3c79eab2fd
commit d75edb9876
6 changed files with 31 additions and 9 deletions
+1
View File
@@ -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
@@ -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)
}
@@ -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")
}
}