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);
|
||||
|
||||
StringBuilder body = new StringBuilder();
|
||||
String initializer = " = throw UnsupportedOperationException()";
|
||||
body.append("\nget()");
|
||||
body.append(initializer);
|
||||
body.append(" = ");
|
||||
body.append(generateUnsupportedOrSuperCall(classOrObject, descriptor));
|
||||
if (descriptor.isVar()) {
|
||||
body.append("\nset(value) {}");
|
||||
}
|
||||
@@ -222,38 +222,50 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns
|
||||
/* copyOverrides = */ true);
|
||||
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();
|
||||
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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
|
||||
public Set<CallableMemberDescriptor> collectMethodsToGenerate(@NotNull JetClassOrObject classOrObject) {
|
||||
DeclarationDescriptor descriptor = ResolvePackage.resolveToDescriptor(classOrObject);
|
||||
|
||||
@@ -22,7 +22,7 @@ class C : Base<String, C, Unit>() {
|
||||
}
|
||||
|
||||
override val method: (String?) -> String
|
||||
get() = throw UnsupportedOperationException()
|
||||
get() = super.method
|
||||
|
||||
override fun toString(): String {
|
||||
return super.toString()
|
||||
|
||||
@@ -5,7 +5,7 @@ open class A() {
|
||||
fun some() : A {
|
||||
return object : A() {
|
||||
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
|
||||
// Some comment
|
||||
override val bar: Int
|
||||
get() = <selection><caret>throw UnsupportedOperationException()</selection>
|
||||
get() = <selection><caret>super.bar</selection>
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
return super.equals(other)
|
||||
|
||||
Reference in New Issue
Block a user