Override property calls super when its not abstract
This commit is contained in:
+38
-26
@@ -203,9 +203,9 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns
|
|||||||
newDescriptor.addOverriddenDescriptor(descriptor);
|
newDescriptor.addOverriddenDescriptor(descriptor);
|
||||||
|
|
||||||
StringBuilder body = new StringBuilder();
|
StringBuilder body = new StringBuilder();
|
||||||
String initializer = " = throw UnsupportedOperationException()";
|
|
||||||
body.append("\nget()");
|
body.append("\nget()");
|
||||||
body.append(initializer);
|
body.append(" = ");
|
||||||
|
body.append(generateUnsupportedOrSuperCall(classOrObject, descriptor));
|
||||||
if (descriptor.isVar()) {
|
if (descriptor.isVar()) {
|
||||||
body.append("\nset(value) {}");
|
body.append("\nset(value) {}");
|
||||||
}
|
}
|
||||||
@@ -222,38 +222,50 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns
|
|||||||
/* copyOverrides = */ true);
|
/* copyOverrides = */ true);
|
||||||
newDescriptor.addOverriddenDescriptor(descriptor);
|
newDescriptor.addOverriddenDescriptor(descriptor);
|
||||||
|
|
||||||
boolean isAbstractFun = descriptor.getModality() == Modality.ABSTRACT;
|
|
||||||
StringBuilder delegationBuilder = new StringBuilder();
|
|
||||||
if (isAbstractFun) {
|
|
||||||
delegationBuilder.append("throw UnsupportedOperationException()");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
delegationBuilder.append("super");
|
|
||||||
if (classOrObject.getDelegationSpecifiers().size() > 1) {
|
|
||||||
delegationBuilder.append("<").append(descriptor.getContainingDeclaration().getName()).append(">");
|
|
||||||
}
|
|
||||||
delegationBuilder.append(".").append(descriptor.getName()).append("(");
|
|
||||||
}
|
|
||||||
boolean first = true;
|
|
||||||
if (!isAbstractFun) {
|
|
||||||
for (ValueParameterDescriptor parameterDescriptor : descriptor.getValueParameters()) {
|
|
||||||
if (!first) {
|
|
||||||
delegationBuilder.append(", ");
|
|
||||||
}
|
|
||||||
first = false;
|
|
||||||
delegationBuilder.append(parameterDescriptor.getName());
|
|
||||||
}
|
|
||||||
delegationBuilder.append(")");
|
|
||||||
}
|
|
||||||
JetType returnType = descriptor.getReturnType();
|
JetType returnType = descriptor.getReturnType();
|
||||||
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
|
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
|
||||||
|
|
||||||
boolean returnsNotUnit = returnType != null && !builtIns.getUnitType().equals(returnType);
|
boolean returnsNotUnit = returnType != null && !builtIns.getUnitType().equals(returnType);
|
||||||
String body = "{" + (returnsNotUnit && !isAbstractFun ? "return " : "") + delegationBuilder.toString() + "}";
|
boolean isAbstract = descriptor.getModality() == Modality.ABSTRACT;
|
||||||
|
|
||||||
|
String delegation = generateUnsupportedOrSuperCall(classOrObject, descriptor);
|
||||||
|
|
||||||
|
String body = "{" + (returnsNotUnit && !isAbstract ? "return " : "") + delegation + "}";
|
||||||
|
|
||||||
return JetPsiFactory(classOrObject.getProject()).createFunction(OVERRIDE_RENDERER.render(newDescriptor) + body);
|
return JetPsiFactory(classOrObject.getProject()).createFunction(OVERRIDE_RENDERER.render(newDescriptor) + body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String generateUnsupportedOrSuperCall(@NotNull JetClassOrObject classOrObject, @NotNull CallableMemberDescriptor descriptor) {
|
||||||
|
boolean isAbstract = descriptor.getModality() == Modality.ABSTRACT;
|
||||||
|
if (isAbstract) {
|
||||||
|
return "throw UnsupportedOperationException()";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
builder.append("super");
|
||||||
|
if (classOrObject.getDelegationSpecifiers().size() > 1) {
|
||||||
|
builder.append("<").append(descriptor.getContainingDeclaration().getName()).append(">");
|
||||||
|
}
|
||||||
|
builder.append(".").append(descriptor.getName());
|
||||||
|
|
||||||
|
if (descriptor instanceof FunctionDescriptor) {
|
||||||
|
builder.append("(");
|
||||||
|
boolean first = true;
|
||||||
|
for (ValueParameterDescriptor parameterDescriptor : descriptor.getValueParameters()) {
|
||||||
|
if (!first) {
|
||||||
|
builder.append(", ");
|
||||||
|
}
|
||||||
|
first = false;
|
||||||
|
builder.append(parameterDescriptor.getName());
|
||||||
|
}
|
||||||
|
builder.append(")");
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public Set<CallableMemberDescriptor> collectMethodsToGenerate(@NotNull JetClassOrObject classOrObject) {
|
public Set<CallableMemberDescriptor> collectMethodsToGenerate(@NotNull JetClassOrObject classOrObject) {
|
||||||
DeclarationDescriptor descriptor = ResolvePackage.resolveToDescriptor(classOrObject);
|
DeclarationDescriptor descriptor = ResolvePackage.resolveToDescriptor(classOrObject);
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class C : Base<String, C, Unit>() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override val method: (String?) -> String
|
override val method: (String?) -> String
|
||||||
get() = throw UnsupportedOperationException()
|
get() = super.method
|
||||||
|
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
return super.toString()
|
return super.toString()
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ open class A() {
|
|||||||
fun some() : A {
|
fun some() : A {
|
||||||
return object : A() {
|
return object : A() {
|
||||||
override val method: () -> Unit?
|
override val method: () -> Unit?
|
||||||
get() = <selection><caret>throw UnsupportedOperationException()</selection>
|
get() = <selection><caret>super.method</selection>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ class C : A() {
|
|||||||
val constant = 42
|
val constant = 42
|
||||||
// Some comment
|
// Some comment
|
||||||
override val bar: Int
|
override val bar: Int
|
||||||
get() = <selection><caret>throw UnsupportedOperationException()</selection>
|
get() = <selection><caret>super.bar</selection>
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
return super.equals(other)
|
return super.equals(other)
|
||||||
|
|||||||
Reference in New Issue
Block a user