diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java index 22e9379fe97..1f87396ee2d 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.plugin.codeInsight; import com.intellij.codeInsight.hint.HintManager; import com.intellij.ide.util.MemberChooser; +import com.intellij.lang.ASTNode; import com.intellij.lang.LanguageCodeInsightActionHandler; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; @@ -25,9 +26,11 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiWhiteSpace; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -35,9 +38,9 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; +import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage; import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.renderer.DescriptorRendererBuilder; -import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage; import java.util.ArrayList; import java.util.Collections; @@ -75,9 +78,9 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns } public static void generateMethods( - Editor editor, - JetClassOrObject classOrObject, - List selectedElements + @NotNull Editor editor, + @NotNull JetClassOrObject classOrObject, + @NotNull List selectedElements ) { JetClassBody body = classOrObject.getBody(); if (body == null) { @@ -106,26 +109,52 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns @Nullable private static PsiElement findInsertAfterAnchor(Editor editor, final JetClassBody body) { PsiElement afterAnchor = body.getLBrace(); - if (afterAnchor == null) { - return null; - } + if (afterAnchor == null) return null; int offset = editor.getCaretModel().getOffset(); - PsiElement offsetCursorElement = PsiTreeUtil.findFirstParent(body.getContainingFile().findElementAt(offset), - new Condition() { - @Override - public boolean value(PsiElement element) { - return element.getParent() == body; - } - }); + PsiElement offsetCursorElement = PsiTreeUtil.findFirstParent( + body.getContainingFile().findElementAt(offset), + new Condition() { + @Override + public boolean value(PsiElement element) { + return element.getParent() == body; + } + }); + + if (offsetCursorElement instanceof PsiWhiteSpace) { + return removeAfterOffset(offset, (PsiWhiteSpace) offsetCursorElement); + } if (offsetCursorElement != null && offsetCursorElement != body.getRBrace()) { - afterAnchor = offsetCursorElement; + return offsetCursorElement; } return afterAnchor; } + private static PsiElement removeAfterOffset(int offset, PsiWhiteSpace whiteSpace) { + ASTNode spaceNode = whiteSpace.getNode(); + if (spaceNode.getTextRange().contains(offset)) { + String beforeWhiteSpaceText = spaceNode.getText().substring(0, offset - spaceNode.getStartOffset()); + if (!StringUtil.containsLineBreak(beforeWhiteSpaceText)) { + // Prevent insertion on same line + beforeWhiteSpaceText += "\n"; + } + + JetPsiFactory factory = JetPsiFactory(whiteSpace.getProject()); + + PsiElement insertAfter = whiteSpace.getPrevSibling(); + whiteSpace.delete(); + + PsiElement beforeSpace = factory.createWhiteSpace(beforeWhiteSpaceText); + insertAfter.getParent().addAfter(beforeSpace, insertAfter); + + return insertAfter.getNextSibling(); + } + + return whiteSpace; + } + private static List generateOverridingMembers(List selectedElements, JetFile file) { List overridingMembers = new ArrayList(); for (DescriptorClassMember selectedElement : selectedElements) { diff --git a/idea/testData/codeInsight/overrideImplement/checkNotImportedTypesFromJava/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/checkNotImportedTypesFromJava/foo/Impl.kt.after index d97d2fb4a0f..677355b47d5 100644 --- a/idea/testData/codeInsight/overrideImplement/checkNotImportedTypesFromJava/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/checkNotImportedTypesFromJava/foo/Impl.kt.after @@ -5,7 +5,6 @@ import bar.Other import bar.Bar class Impl: Foo() { - override fun foo(list: ArrayList?, other: Other?): Bar? { throw UnsupportedOperationException() } diff --git a/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after b/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after index 399577ad647..78100104238 100644 --- a/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after +++ b/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after @@ -5,7 +5,6 @@ open class Base() { } class C : Base() { - override fun bar(value: () -> Unit): (String) -> Unit { return super.bar(value) } diff --git a/idea/testData/codeInsight/overrideImplement/delegatedMembers.kt.after b/idea/testData/codeInsight/overrideImplement/delegatedMembers.kt.after index 78e4b805562..97133cf12fa 100644 --- a/idea/testData/codeInsight/overrideImplement/delegatedMembers.kt.after +++ b/idea/testData/codeInsight/overrideImplement/delegatedMembers.kt.after @@ -4,7 +4,6 @@ trait T { } class C(t :T) : T by t { - override fun bar() { throw UnsupportedOperationException() } diff --git a/idea/testData/codeInsight/overrideImplement/functionMethod.kt.after b/idea/testData/codeInsight/overrideImplement/functionMethod.kt.after index c4d719b8cf6..a45b0a7ee27 100644 --- a/idea/testData/codeInsight/overrideImplement/functionMethod.kt.after +++ b/idea/testData/codeInsight/overrideImplement/functionMethod.kt.after @@ -4,7 +4,6 @@ trait T { } class C : T { - override fun Foo(): (String) -> Unit { throw UnsupportedOperationException() } diff --git a/idea/testData/codeInsight/overrideImplement/functionWithTypeParameters.kt.after b/idea/testData/codeInsight/overrideImplement/functionWithTypeParameters.kt.after index 676ed95b529..de1bfc6d25a 100644 --- a/idea/testData/codeInsight/overrideImplement/functionWithTypeParameters.kt.after +++ b/idea/testData/codeInsight/overrideImplement/functionWithTypeParameters.kt.after @@ -3,7 +3,6 @@ trait Trait { } class TraitImpl : Trait { - override fun > foo() where B : Cloneable, B : Comparable { throw UnsupportedOperationException() } diff --git a/idea/testData/codeInsight/overrideImplement/generateMulti.kt.after b/idea/testData/codeInsight/overrideImplement/generateMulti.kt.after index 2fee4d5fe4e..096c168630f 100644 --- a/idea/testData/codeInsight/overrideImplement/generateMulti.kt.after +++ b/idea/testData/codeInsight/overrideImplement/generateMulti.kt.after @@ -7,7 +7,6 @@ trait Some { } class SomeOther : Some { - override fun someFoo() { throw UnsupportedOperationException() } diff --git a/idea/testData/codeInsight/overrideImplement/genericMethod.kt.after b/idea/testData/codeInsight/overrideImplement/genericMethod.kt.after index 1ccd7a1510d..59c0b9523ac 100644 --- a/idea/testData/codeInsight/overrideImplement/genericMethod.kt.after +++ b/idea/testData/codeInsight/overrideImplement/genericMethod.kt.after @@ -3,7 +3,6 @@ trait G { } class GC() : G { - override fun foo(t: Int): Int { throw UnsupportedOperationException() } diff --git a/idea/testData/codeInsight/overrideImplement/genericTypesSeveralMethods.kt.after b/idea/testData/codeInsight/overrideImplement/genericTypesSeveralMethods.kt.after index 878a88641a4..4f60a4c3443 100644 --- a/idea/testData/codeInsight/overrideImplement/genericTypesSeveralMethods.kt.after +++ b/idea/testData/codeInsight/overrideImplement/genericTypesSeveralMethods.kt.after @@ -1,7 +1,6 @@ // from KT-488 class MyClass> : Iterable { - override fun iterator(): Iterator { throw UnsupportedOperationException() } diff --git a/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/Impl.kt.after index a72cf84c898..2705112bc26 100644 --- a/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/implementSamAdapters/foo/Impl.kt.after @@ -1,7 +1,6 @@ package foo class Impl: B { - override fun foo(r: Runnable?) { throw UnsupportedOperationException() } diff --git a/idea/testData/codeInsight/overrideImplement/inheritVisibilities.kt.after b/idea/testData/codeInsight/overrideImplement/inheritVisibilities.kt.after index cc572703c12..09ecb6ed74a 100644 --- a/idea/testData/codeInsight/overrideImplement/inheritVisibilities.kt.after +++ b/idea/testData/codeInsight/overrideImplement/inheritVisibilities.kt.after @@ -11,7 +11,6 @@ trait B { } class C : A(), B { - override fun equals(other: Any?): Boolean { return super.equals(other) } diff --git a/idea/testData/codeInsight/overrideImplement/javaInterfaceMethod/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/javaInterfaceMethod/foo/Impl.kt.after index a8d4e037f35..49405a888ac 100644 --- a/idea/testData/codeInsight/overrideImplement/javaInterfaceMethod/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/javaInterfaceMethod/foo/Impl.kt.after @@ -1,7 +1,6 @@ import foo.Intf class Impl(): Intf { - override fun getFooBar(): String? { throw UnsupportedOperationException() } diff --git a/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageProtectedVisibility/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageProtectedVisibility/foo/Impl.kt.after index b38f8ab0226..58f1610e019 100644 --- a/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageProtectedVisibility/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageProtectedVisibility/foo/Impl.kt.after @@ -3,7 +3,6 @@ package foo import foo.Intf class Impl(): Intf() { - override fun getFooBar(): String? { 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 b38f8ab0226..58f1610e019 100644 --- a/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageVisibility/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageVisibility/foo/Impl.kt.after @@ -3,7 +3,6 @@ package foo import foo.Intf class Impl(): Intf() { - override fun getFooBar(): String? { return super.getFooBar() } diff --git a/idea/testData/codeInsight/overrideImplement/javaParameters/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/javaParameters/foo/Impl.kt.after index 887a6acaea9..d6467330ed4 100644 --- a/idea/testData/codeInsight/overrideImplement/javaParameters/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/javaParameters/foo/Impl.kt.after @@ -1,7 +1,6 @@ import foo.Intf class Impl(): Intf { - override fun fooBar(i: Int, s: Array?, foo: Any?) { throw UnsupportedOperationException() } diff --git a/idea/testData/codeInsight/overrideImplement/multiOverride.kt.after b/idea/testData/codeInsight/overrideImplement/multiOverride.kt.after index 6b2bf1a20eb..0d933975b3f 100644 --- a/idea/testData/codeInsight/overrideImplement/multiOverride.kt.after +++ b/idea/testData/codeInsight/overrideImplement/multiOverride.kt.after @@ -4,7 +4,6 @@ trait A { } class C : A { - override fun bar(): String { return super.bar() } diff --git a/idea/testData/codeInsight/overrideImplement/overrideExplicitFunction.kt.after b/idea/testData/codeInsight/overrideImplement/overrideExplicitFunction.kt.after index 38fbdc4e1b2..ddcb13ead82 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideExplicitFunction.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideExplicitFunction.kt.after @@ -3,7 +3,6 @@ trait A { } class B : A { - override fun String.foo() { throw UnsupportedOperationException() } diff --git a/idea/testData/codeInsight/overrideImplement/overrideExtensionProperty.kt.after b/idea/testData/codeInsight/overrideImplement/overrideExtensionProperty.kt.after index 9053c594f93..23df20fd587 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideExtensionProperty.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideExtensionProperty.kt.after @@ -3,7 +3,6 @@ trait A { } class B : A { - override val String.prop: Int get() = 0 } diff --git a/idea/testData/codeInsight/overrideImplement/overrideGenericFunction.kt.after b/idea/testData/codeInsight/overrideImplement/overrideGenericFunction.kt.after index 57251459957..d75e59e5bba 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideGenericFunction.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideGenericFunction.kt.after @@ -3,7 +3,6 @@ trait A { } class C : A { - override fun foo(value: C) { 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 fd713244d25..f93d94f496d 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt.after @@ -1,7 +1,6 @@ import foo.A class C : A() { - override fun getAnswer(array: Array?, number: Int, value: Any?): Int { return super.getAnswer(array, number, value) } diff --git a/idea/testData/codeInsight/overrideImplement/overrideMutableExtensionProperty.kt.after b/idea/testData/codeInsight/overrideImplement/overrideMutableExtensionProperty.kt.after index b485df0483e..0cca4020029 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideMutableExtensionProperty.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideMutableExtensionProperty.kt.after @@ -3,7 +3,6 @@ trait A { } class B : A { - override var Int.foo: Double get() = 0.0 set(value) { diff --git a/idea/testData/codeInsight/overrideImplement/overrideNonUnitFunction.kt.after b/idea/testData/codeInsight/overrideImplement/overrideNonUnitFunction.kt.after index a2e664957c2..0cfbb5a681f 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideNonUnitFunction.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideNonUnitFunction.kt.after @@ -3,7 +3,6 @@ trait A { } class C : A { - override fun foo(value: String): Int { return super.foo(value) } diff --git a/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after b/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after index 4282725f741..01098b8c902 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after @@ -19,7 +19,6 @@ class C : A() { override fun toString(): String { return super.toString() } - /* Some another comment */ diff --git a/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/Impl.kt.after index a6e0ebef908..8d16dccda51 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideSamAdapters/foo/Impl.kt.after @@ -1,7 +1,6 @@ package foo class Impl: B() { - override fun foo(r: Runnable?) { super.foo(r) } diff --git a/idea/testData/codeInsight/overrideImplement/overrideUnitFunction.kt.after b/idea/testData/codeInsight/overrideImplement/overrideUnitFunction.kt.after index 9f63cfabaf6..15f0a985336 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideUnitFunction.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideUnitFunction.kt.after @@ -3,7 +3,6 @@ trait A { } class C : A { - override fun foo(value: String) { 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 4e582dca078..4ae8497a8c1 100644 --- a/idea/testData/codeInsight/overrideImplement/propagationKJK/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/propagationKJK/foo/Impl.kt.after @@ -1,7 +1,6 @@ package foo class Impl : Bar() { - override fun f(): Any { return super.f() } diff --git a/idea/testData/codeInsight/overrideImplement/property.kt.after b/idea/testData/codeInsight/overrideImplement/property.kt.after index bfff67330db..b5f14fd36bd 100644 --- a/idea/testData/codeInsight/overrideImplement/property.kt.after +++ b/idea/testData/codeInsight/overrideImplement/property.kt.after @@ -3,6 +3,5 @@ trait T { } class GC() : T { - override val v: Int = 0 } diff --git a/idea/testData/codeInsight/overrideImplement/respectCaretPosition.kt.after b/idea/testData/codeInsight/overrideImplement/respectCaretPosition.kt.after index eca1ae1ca4b..1df50d610ef 100644 --- a/idea/testData/codeInsight/overrideImplement/respectCaretPosition.kt.after +++ b/idea/testData/codeInsight/overrideImplement/respectCaretPosition.kt.after @@ -9,7 +9,6 @@ class SomeTest : Test { throw UnsupportedOperationException() } override val testProp: Int = 0 - /** * test */ diff --git a/idea/testData/codeInsight/overrideImplement/sameTypeName/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/sameTypeName/foo/Impl.kt.after index cced8972a02..33e3d6466ca 100644 --- a/idea/testData/codeInsight/overrideImplement/sameTypeName/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/sameTypeName/foo/Impl.kt.after @@ -2,7 +2,6 @@ import lib.ArrayFactory public class Impl : ArrayFactory { - override fun create(): lib.Array { throw UnsupportedOperationException() } diff --git a/idea/testData/codeInsight/overrideImplement/traitGenericImplement.kt.after b/idea/testData/codeInsight/overrideImplement/traitGenericImplement.kt.after index 4ef321e0344..d97c5b146c6 100644 --- a/idea/testData/codeInsight/overrideImplement/traitGenericImplement.kt.after +++ b/idea/testData/codeInsight/overrideImplement/traitGenericImplement.kt.after @@ -3,7 +3,6 @@ trait G { } class GC() : G { - override fun foo(t: T): T { throw UnsupportedOperationException() } diff --git a/idea/testData/codeInsight/overrideImplement/traitNullableFunction.kt.after b/idea/testData/codeInsight/overrideImplement/traitNullableFunction.kt.after index 85e528cce48..ee25a192514 100644 --- a/idea/testData/codeInsight/overrideImplement/traitNullableFunction.kt.after +++ b/idea/testData/codeInsight/overrideImplement/traitNullableFunction.kt.after @@ -3,7 +3,6 @@ trait Some { } class SomeOther : Some { - override fun foo(some: Int?): Int { throw UnsupportedOperationException() } diff --git a/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.kt.after b/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.kt.after index 6f252b469c0..466d1d5605a 100644 --- a/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.kt.after +++ b/idea/testData/codeInsight/overrideImplement/withLib/fakeOverride.kt.after @@ -7,7 +7,6 @@ public open class B() : A() { } public open class C() : B() { - override fun foo() { super.foo() } diff --git a/idea/testData/templates/anonymous_1.exp.kt b/idea/testData/templates/anonymous_1.exp.kt index e319b8a07f9..4a7c30f5d47 100644 --- a/idea/testData/templates/anonymous_1.exp.kt +++ b/idea/testData/templates/anonymous_1.exp.kt @@ -2,8 +2,7 @@ import javax.swing.SwingUtilities fun main(args : Array) { SwingUtilities.invokeLater(object : Runnable { - - override fun run() { + override fun run() { throw UnsupportedOperationException() } })