Override members does not generate qualified super when not needed
This commit is contained in:
+1
-1
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.resolve.OverrideResolver
|
||||
public class ImplementMembersHandler : OverrideImplementMembersHandler(), IntentionAction {
|
||||
override fun collectMembersToGenerate(descriptor: ClassDescriptor, project: Project): Collection<OverrideMemberChooserObject> {
|
||||
return OverrideResolver.getMissingImplementations(descriptor)
|
||||
.map { OverrideMemberChooserObject.create(project, it, it) }
|
||||
.map { OverrideMemberChooserObject.create(project, it, it, OverrideMemberChooserObject.BodyType.EMPTY) }
|
||||
}
|
||||
|
||||
override fun getChooserTitle() = "Implement Members"
|
||||
|
||||
+10
-12
@@ -189,15 +189,15 @@ public abstract class OverrideImplementMembersHandler : LanguageCodeInsightActio
|
||||
for (selectedElement in selectedElements) {
|
||||
val descriptor = selectedElement.immediateSuper
|
||||
when (descriptor) {
|
||||
is SimpleFunctionDescriptor -> overridingMembers.add(overrideFunction(classOrObject, descriptor))
|
||||
is PropertyDescriptor -> overridingMembers.add(overrideProperty(classOrObject, descriptor))
|
||||
is SimpleFunctionDescriptor -> overridingMembers.add(overrideFunction(classOrObject, descriptor, selectedElement.bodyType))
|
||||
is PropertyDescriptor -> overridingMembers.add(overrideProperty(classOrObject, descriptor, selectedElement.bodyType))
|
||||
else -> error("Unknown member to override: $descriptor")
|
||||
}
|
||||
}
|
||||
return overridingMembers
|
||||
}
|
||||
|
||||
private fun overrideProperty(classOrObject: JetClassOrObject, descriptor: PropertyDescriptor): JetElement {
|
||||
private fun overrideProperty(classOrObject: JetClassOrObject, descriptor: PropertyDescriptor, bodyType: OverrideMemberChooserObject.BodyType): JetElement {
|
||||
val newDescriptor = descriptor.copy(descriptor.containingDeclaration, Modality.OPEN, descriptor.visibility,
|
||||
descriptor.kind, /* copyOverrides = */ true) as PropertyDescriptor
|
||||
newDescriptor.addOverriddenDescriptor(descriptor)
|
||||
@@ -205,7 +205,7 @@ public abstract class OverrideImplementMembersHandler : LanguageCodeInsightActio
|
||||
val body = StringBuilder {
|
||||
append("\nget()")
|
||||
append(" = ")
|
||||
append(generateUnsupportedOrSuperCall(classOrObject, descriptor))
|
||||
append(generateUnsupportedOrSuperCall(descriptor, bodyType))
|
||||
if (descriptor.isVar) {
|
||||
append("\nset(value) {}")
|
||||
}
|
||||
@@ -213,31 +213,29 @@ public abstract class OverrideImplementMembersHandler : LanguageCodeInsightActio
|
||||
return JetPsiFactory(classOrObject.project).createProperty(OVERRIDE_RENDERER.render(newDescriptor) + body)
|
||||
}
|
||||
|
||||
private fun overrideFunction(classOrObject: JetClassOrObject, descriptor: FunctionDescriptor): JetNamedFunction {
|
||||
private fun overrideFunction(classOrObject: JetClassOrObject, descriptor: FunctionDescriptor, bodyType: OverrideMemberChooserObject.BodyType): JetNamedFunction {
|
||||
val newDescriptor = descriptor.copy(descriptor.containingDeclaration, Modality.OPEN, descriptor.visibility,
|
||||
descriptor.kind, /* copyOverrides = */ true)
|
||||
newDescriptor.addOverriddenDescriptor(descriptor)
|
||||
|
||||
val returnType = descriptor.returnType
|
||||
val returnsNotUnit = returnType != null && !KotlinBuiltIns.isUnit(returnType)
|
||||
val isAbstract = descriptor.modality == Modality.ABSTRACT
|
||||
|
||||
val delegation = generateUnsupportedOrSuperCall(classOrObject, descriptor)
|
||||
val delegation = generateUnsupportedOrSuperCall(descriptor, bodyType)
|
||||
|
||||
val body = "{" + (if (returnsNotUnit && !isAbstract) "return " else "") + delegation + "}"
|
||||
val body = "{" + (if (returnsNotUnit && bodyType != OverrideMemberChooserObject.BodyType.EMPTY) "return " else "") + delegation + "}"
|
||||
|
||||
return JetPsiFactory(classOrObject.project).createFunction(OVERRIDE_RENDERER.render(newDescriptor) + body)
|
||||
}
|
||||
|
||||
private fun generateUnsupportedOrSuperCall(classOrObject: JetClassOrObject, descriptor: CallableMemberDescriptor): String {
|
||||
val isAbstract = descriptor.modality == Modality.ABSTRACT
|
||||
if (isAbstract) {
|
||||
private fun generateUnsupportedOrSuperCall(descriptor: CallableMemberDescriptor, bodyType: OverrideMemberChooserObject.BodyType): String {
|
||||
if (bodyType == OverrideMemberChooserObject.BodyType.EMPTY) {
|
||||
return "throw UnsupportedOperationException()"
|
||||
}
|
||||
else {
|
||||
return StringBuilder {
|
||||
append("super")
|
||||
if (classOrObject.getDelegationSpecifiers().size() > 1) {
|
||||
if (bodyType == OverrideMemberChooserObject.BodyType.QUALIFIED_SUPER) {
|
||||
val superClassFqName = IdeDescriptorRenderers.SOURCE_CODE.renderClassifierName(descriptor.containingDeclaration as ClassifierDescriptor)
|
||||
append("<").append(superClassFqName).append(">")
|
||||
}
|
||||
|
||||
+14
-5
@@ -27,24 +27,32 @@ import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||
import org.jetbrains.kotlin.idea.core.util.DescriptorMemberChooserObject
|
||||
|
||||
interface OverrideMemberChooserObject : ClassMember {
|
||||
enum class BodyType {
|
||||
EMPTY,
|
||||
SUPER,
|
||||
QUALIFIED_SUPER
|
||||
}
|
||||
|
||||
val descriptor: CallableMemberDescriptor
|
||||
val immediateSuper: CallableMemberDescriptor
|
||||
val bodyType: BodyType
|
||||
|
||||
companion object {
|
||||
fun create(project: Project, descriptor: CallableMemberDescriptor, immediateSuper: CallableMemberDescriptor): OverrideMemberChooserObject {
|
||||
fun create(project: Project, descriptor: CallableMemberDescriptor, immediateSuper: CallableMemberDescriptor, bodyType: BodyType): OverrideMemberChooserObject {
|
||||
val declaration = DescriptorToSourceUtilsIde.getAnyDeclaration(project, descriptor)
|
||||
if (declaration != null) {
|
||||
return WithDeclaration(descriptor, declaration, immediateSuper)
|
||||
return WithDeclaration(descriptor, declaration, immediateSuper, bodyType)
|
||||
}
|
||||
else {
|
||||
return WithoutDeclaration(descriptor, immediateSuper)
|
||||
return WithoutDeclaration(descriptor, immediateSuper, bodyType)
|
||||
}
|
||||
}
|
||||
|
||||
private class WithDeclaration(
|
||||
descriptor: CallableMemberDescriptor,
|
||||
declaration: PsiElement,
|
||||
override val immediateSuper: CallableMemberDescriptor
|
||||
override val immediateSuper: CallableMemberDescriptor,
|
||||
override val bodyType: BodyType
|
||||
) : DescriptorMemberChooserObject(declaration, descriptor), OverrideMemberChooserObject {
|
||||
|
||||
override val descriptor: CallableMemberDescriptor
|
||||
@@ -53,7 +61,8 @@ interface OverrideMemberChooserObject : ClassMember {
|
||||
|
||||
private class WithoutDeclaration(
|
||||
override val descriptor: CallableMemberDescriptor,
|
||||
override val immediateSuper: CallableMemberDescriptor
|
||||
override val immediateSuper: CallableMemberDescriptor,
|
||||
override val bodyType: BodyType
|
||||
) : MemberChooserObjectBase(DescriptorMemberChooserObject.getText(descriptor), DescriptorMemberChooserObject.getIcon(null, descriptor)), OverrideMemberChooserObject {
|
||||
|
||||
override fun getParentNodeDelegate(): MemberChooserObject? {
|
||||
|
||||
+10
-3
@@ -18,8 +18,7 @@ package org.jetbrains.kotlin.idea.core.overrideImplement
|
||||
|
||||
import com.intellij.openapi.project.Project
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import java.util.ArrayList
|
||||
import java.util.LinkedHashMap
|
||||
import java.util.*
|
||||
|
||||
public class OverrideMembersHandler : OverrideImplementMembersHandler() {
|
||||
override fun collectMembersToGenerate(descriptor: ClassDescriptor, project: Project): Collection<OverrideMemberChooserObject> {
|
||||
@@ -56,7 +55,15 @@ public class OverrideMembersHandler : OverrideImplementMembersHandler() {
|
||||
else {
|
||||
immediateSupers.singleOrNull { (it.containingDeclaration as? ClassDescriptor)?.kind == ClassKind.CLASS } ?: immediateSupers.first()
|
||||
}
|
||||
result.add(OverrideMemberChooserObject.create(project, realSuper, immediateSuperToUse))
|
||||
|
||||
val bodyType = if (immediateSuperToUse.modality == Modality.ABSTRACT)
|
||||
OverrideMemberChooserObject.BodyType.EMPTY
|
||||
else if (realSupersToUse.size() == 1)
|
||||
OverrideMemberChooserObject.BodyType.SUPER
|
||||
else
|
||||
OverrideMemberChooserObject.BodyType.QUALIFIED_SUPER
|
||||
|
||||
result.add(OverrideMemberChooserObject.create(project, realSuper, immediateSuperToUse, bodyType))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user