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
@@ -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))
}