diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java index 9efae4eab23..6aff8c08b44 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java @@ -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 collectMethodsToGenerate(@NotNull JetClassOrObject classOrObject) { DeclarationDescriptor descriptor = ResolvePackage.resolveToDescriptor(classOrObject); diff --git a/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after b/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after index 19235ee2c7e..248077ae74e 100644 --- a/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after +++ b/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after @@ -22,7 +22,7 @@ class C : Base() { } override val method: (String?) -> String - get() = throw UnsupportedOperationException() + get() = super.method override fun toString(): String { return super.toString() diff --git a/idea/testData/codeInsight/overrideImplement/overrideFunctionProperty.kt.after b/idea/testData/codeInsight/overrideImplement/overrideFunctionProperty.kt.after index ee5bd120c69..0d439333af0 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideFunctionProperty.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideFunctionProperty.kt.after @@ -5,7 +5,7 @@ open class A() { fun some() : A { return object : A() { override val method: () -> Unit? - get() = throw UnsupportedOperationException() + get() = super.method } } diff --git a/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after b/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after index 0f5f0b8d802..62d5cbf3cd7 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after @@ -7,7 +7,7 @@ class C : A() { val constant = 42 // Some comment override val bar: Int - get() = throw UnsupportedOperationException() + get() = super.bar override fun equals(other: Any?): Boolean { return super.equals(other)