diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java index eb4aca3017e..149d4708beb 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java @@ -101,8 +101,7 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns PsiElement firstGenerated = null; List elementsToCompact = new ArrayList(); - JetFile file = classOrObject.getContainingJetFile(); - for (JetElement element : generateOverridingMembers(selectedElements, file)) { + for (JetElement element : generateOverridingMembers(selectedElements, classOrObject)) { PsiElement added = body.addAfter(element, afterAnchor); if (firstGenerated == null) { @@ -179,22 +178,22 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns return whiteSpace; } - private static List generateOverridingMembers(List selectedElements, JetFile file) { + private static List generateOverridingMembers(List selectedElements, JetClassOrObject classOrObject) { List overridingMembers = new ArrayList(); for (DescriptorClassMember selectedElement : selectedElements) { DeclarationDescriptor descriptor = selectedElement.getDescriptor(); if (descriptor instanceof SimpleFunctionDescriptor) { - overridingMembers.add(overrideFunction(file.getProject(), (SimpleFunctionDescriptor) descriptor)); + overridingMembers.add(overrideFunction(classOrObject, (SimpleFunctionDescriptor) descriptor)); } else if (descriptor instanceof PropertyDescriptor) { - overridingMembers.add(overrideProperty(file.getProject(), (PropertyDescriptor) descriptor)); + overridingMembers.add(overrideProperty(classOrObject, (PropertyDescriptor) descriptor)); } } return overridingMembers; } @NotNull - private static JetElement overrideProperty(@NotNull Project project, @NotNull PropertyDescriptor descriptor) { + private static JetElement overrideProperty(@NotNull JetClassOrObject classOrObject, @NotNull PropertyDescriptor descriptor) { PropertyDescriptor newDescriptor = (PropertyDescriptor) descriptor.copy( descriptor.getContainingDeclaration(), Modality.OPEN, @@ -211,11 +210,11 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns if (descriptor.isVar()) { body.append("\nset(value) {}"); } - return JetPsiFactory(project).createProperty(OVERRIDE_RENDERER.render(newDescriptor) + body); + return JetPsiFactory(classOrObject.getProject()).createProperty(OVERRIDE_RENDERER.render(newDescriptor) + body); } @NotNull - private static JetNamedFunction overrideFunction(@NotNull Project project, @NotNull FunctionDescriptor descriptor) { + private static JetNamedFunction overrideFunction(@NotNull JetClassOrObject classOrObject, @NotNull FunctionDescriptor descriptor) { FunctionDescriptor newDescriptor = descriptor.copy( descriptor.getContainingDeclaration(), Modality.OPEN, @@ -230,8 +229,11 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns delegationBuilder.append("throw UnsupportedOperationException()"); } else { - delegationBuilder.append("super<").append(descriptor.getContainingDeclaration().getName()); - delegationBuilder.append(">.").append(descriptor.getName()).append("("); + 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) { @@ -250,7 +252,7 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns boolean returnsNotUnit = returnType != null && !builtIns.getUnitType().equals(returnType); String body = "{" + (returnsNotUnit && !isAbstractFun ? "return " : "") + delegationBuilder.toString() + "}"; - return JetPsiFactory(project).createFunction(OVERRIDE_RENDERER.render(newDescriptor) + body); + return JetPsiFactory(classOrObject.getProject()).createFunction(OVERRIDE_RENDERER.render(newDescriptor) + body); } @NotNull diff --git a/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after b/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after index 368deeadb1d..99052c50bbc 100644 --- a/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after +++ b/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after @@ -6,25 +6,25 @@ open class Base() { class C : Base() { override fun bar(value: () -> Unit): (String) -> Unit { - return super.bar(value) + return super.bar(value) } override fun equals(other: Any?): Boolean { - return super.equals(other) + return super.equals(other) } override fun foo(value: C): C { - return super.foo(value) + return super.foo(value) } override fun hashCode(): Int { - return super.hashCode() + return super.hashCode() } override val method: (String?) -> String get() = ? override fun toString(): String { - return super.toString() + return super.toString() } } diff --git a/idea/testData/codeInsight/overrideImplement/delegatedMembers.kt.after b/idea/testData/codeInsight/overrideImplement/delegatedMembers.kt.after index 5102f8c454f..ac1fbfc7c87 100644 --- a/idea/testData/codeInsight/overrideImplement/delegatedMembers.kt.after +++ b/idea/testData/codeInsight/overrideImplement/delegatedMembers.kt.after @@ -9,7 +9,7 @@ class C(t :T) : T by t { } override fun equals(other: Any?): Boolean { - return super.equals(other) + return super.equals(other) } override fun foo() { @@ -17,11 +17,11 @@ class C(t :T) : T by t { } override fun hashCode(): Int { - return super.hashCode() + return super.hashCode() } override fun toString(): String { - return super.toString() + return super.toString() } } diff --git a/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageProtectedVisibility/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageProtectedVisibility/foo/Impl.kt.after index 2e785dfaacf..93d18984e63 100644 --- a/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageProtectedVisibility/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageProtectedVisibility/foo/Impl.kt.after @@ -4,6 +4,6 @@ import foo.Intf class Impl(): Intf() { override fun getFooBar(): String? { - return super.getFooBar() + return super.getFooBar() } } diff --git a/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageVisibility/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageVisibility/foo/Impl.kt.after index 2e785dfaacf..93d18984e63 100644 --- a/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageVisibility/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageVisibility/foo/Impl.kt.after @@ -4,6 +4,6 @@ import foo.Intf class Impl(): Intf() { override fun getFooBar(): String? { - return super.getFooBar() + return super.getFooBar() } } diff --git a/idea/testData/codeInsight/overrideImplement/multiOverride.kt.after b/idea/testData/codeInsight/overrideImplement/multiOverride.kt.after index 587d30415c7..f27ffb755c3 100644 --- a/idea/testData/codeInsight/overrideImplement/multiOverride.kt.after +++ b/idea/testData/codeInsight/overrideImplement/multiOverride.kt.after @@ -5,22 +5,22 @@ trait A { class C : A { override fun bar(): String { - return super.bar() + return super.bar() } override fun equals(other: Any?): Boolean { - return super.equals(other) + return super.equals(other) } override fun foo(value: String): Int { - return super.foo(value) + return super.foo(value) } override fun hashCode(): Int { - return super.hashCode() + return super.hashCode() } override fun toString(): String { - return super.toString() + return super.toString() } } diff --git a/idea/testData/codeInsight/overrideImplement/multipleSupers.kt b/idea/testData/codeInsight/overrideImplement/multipleSupers.kt new file mode 100644 index 00000000000..d9d5c03fe17 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/multipleSupers.kt @@ -0,0 +1,11 @@ +open class A { + open fun foo() {} +} + +trait B { + fun bar() +} + +class C : A(), B { + +} diff --git a/idea/testData/codeInsight/overrideImplement/multipleSupers.kt.after b/idea/testData/codeInsight/overrideImplement/multipleSupers.kt.after new file mode 100644 index 00000000000..63d29ae522f --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/multipleSupers.kt.after @@ -0,0 +1,29 @@ +open class A { + open fun foo() {} +} + +trait B { + fun bar() +} + +class C : A(), B { + override fun bar() { + throw UnsupportedOperationException() + } + + override fun equals(other: Any?): Boolean { + return super.equals(other) + } + + override fun foo() { + super.foo() + } + + override fun hashCode(): Int { + return super.hashCode() + } + + override fun toString(): String { + return super.toString() + } +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideFromClassName.kt.after b/idea/testData/codeInsight/overrideImplement/overrideFromClassName.kt.after index d0d7cbd6e2d..379c2f435b7 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideFromClassName.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideFromClassName.kt.after @@ -4,15 +4,15 @@ trait Some { class Other { override fun equals(other: Any?): Boolean { - return super.equals(other) + return super.equals(other) } override fun hashCode(): Int { - return super.hashCode() + return super.hashCode() } override fun toString(): String { - return super.toString() + return super.toString() } fun test() { diff --git a/idea/testData/codeInsight/overrideImplement/overrideFromFunctionPosition.kt.after b/idea/testData/codeInsight/overrideImplement/overrideFromFunctionPosition.kt.after index 0fe55f404c7..67d5b0c67fe 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideFromFunctionPosition.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideFromFunctionPosition.kt.after @@ -8,15 +8,15 @@ class Other { } override fun equals(other: Any?): Boolean { - return super.equals(other) + return super.equals(other) } override fun hashCode(): Int { - return super.hashCode() + return super.hashCode() } override fun toString(): String { - return super.toString() + return super.toString() } fun otherTest() { diff --git a/idea/testData/codeInsight/overrideImplement/overrideFromLBrace.kt.after b/idea/testData/codeInsight/overrideImplement/overrideFromLBrace.kt.after index d0d7cbd6e2d..379c2f435b7 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideFromLBrace.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideFromLBrace.kt.after @@ -4,15 +4,15 @@ trait Some { class Other { override fun equals(other: Any?): Boolean { - return super.equals(other) + return super.equals(other) } override fun hashCode(): Int { - return super.hashCode() + return super.hashCode() } override fun toString(): String { - return super.toString() + return super.toString() } fun test() { diff --git a/idea/testData/codeInsight/overrideImplement/overrideGenericFunction.kt.after b/idea/testData/codeInsight/overrideImplement/overrideGenericFunction.kt.after index b2642a1af87..d90e8bf52d4 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideGenericFunction.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideGenericFunction.kt.after @@ -4,6 +4,6 @@ trait A { class C : A { override fun foo(value: C) { - super.foo(value) + super.foo(value) } } diff --git a/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt.after index 51626db22a1..3663e4133de 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt.after @@ -2,6 +2,6 @@ import foo.A class C : A() { override fun getAnswer(array: Array?, number: Int, value: Any?): Int { - return super.getAnswer(array, number, value) + return super.getAnswer(array, number, value) } } diff --git a/idea/testData/codeInsight/overrideImplement/overrideNonUnitFunction.kt.after b/idea/testData/codeInsight/overrideImplement/overrideNonUnitFunction.kt.after index c0f920ab107..1d5b6d79774 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideNonUnitFunction.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideNonUnitFunction.kt.after @@ -4,6 +4,6 @@ trait A { class C : A { override fun foo(value: String): Int { - return super.foo(value) + return super.foo(value) } } diff --git a/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after b/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after index 87a4649f692..03b73c6ec79 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after @@ -10,19 +10,19 @@ class C : A() { get() = 0 override fun equals(other: Any?): Boolean { - return super.equals(other) + return super.equals(other) } override fun foo(value: Int) { - super.foo(value) + super.foo(value) } override fun hashCode(): Int { - return super.hashCode() + return super.hashCode() } override fun toString(): String { - return super.toString() + return super.toString() } /* diff --git a/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/Impl.kt.after index f3e27752c97..04294e94a81 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/Impl.kt.after @@ -2,6 +2,6 @@ package foo class Impl: B() { override fun foo(r: Runnable?) { - super.foo(r) + super.foo(r) } } diff --git a/idea/testData/codeInsight/overrideImplement/overrideUnitFunction.kt.after b/idea/testData/codeInsight/overrideImplement/overrideUnitFunction.kt.after index 0c07ec2f1a2..70065100f1a 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideUnitFunction.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideUnitFunction.kt.after @@ -4,6 +4,6 @@ trait A { class C : A { override fun foo(value: String) { - super.foo(value) + super.foo(value) } } diff --git a/idea/testData/codeInsight/overrideImplement/propagationKJK/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/propagationKJK/foo/Impl.kt.after index 6aff244c8b2..dc7fc6eda69 100644 --- a/idea/testData/codeInsight/overrideImplement/propagationKJK/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/propagationKJK/foo/Impl.kt.after @@ -2,6 +2,6 @@ package foo class Impl : Bar() { override fun f(): Any? { - return super.f() + return super.f() } } diff --git a/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.kt.after b/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.kt.after index 29988a051f3..005beac569d 100644 --- a/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.kt.after +++ b/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.kt.after @@ -8,6 +8,6 @@ public open class B() : A() { public open class C() : B() { override fun foo() { - super.foo() + super.foo() } } \ No newline at end of file diff --git a/idea/testData/codeInsight/overrideImplement/withLib/genericSubstituted.kt.after b/idea/testData/codeInsight/overrideImplement/withLib/genericSubstituted.kt.after index 2b60bc0bbad..c02396fc5cc 100644 --- a/idea/testData/codeInsight/overrideImplement/withLib/genericSubstituted.kt.after +++ b/idea/testData/codeInsight/overrideImplement/withLib/genericSubstituted.kt.after @@ -4,6 +4,6 @@ import dependency.D class C: D() { override fun id(t: Int): Int { - return super.id(t) + return super.id(t) } } \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java index 7f7165cab51..9e09302f789 100644 --- a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java @@ -189,4 +189,8 @@ public final class OverrideImplementTest extends AbstractOverrideImplementTest { public void testPropagationKJK() { doDirectoryTest(new OverrideMethodsHandler()); } + + public void testMultipleSupers() { + doMultiOverrideFileTest(); + } }