diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/ImplementMethodsHandler.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/ImplementMethodsHandler.java index 4917fd2642e..ee81622da6b 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/ImplementMethodsHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/ImplementMethodsHandler.java @@ -1,13 +1,13 @@ package org.jetbrains.jet.plugin.codeInsight; import com.google.common.collect.Sets; -import com.intellij.codeInsight.daemon.QuickFixBundle; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; +import org.jetbrains.jet.lang.descriptors.MutableClassDescriptor; import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.plugin.JetBundle; @@ -17,6 +17,7 @@ import java.util.Set; * @author yole */ public class ImplementMethodsHandler extends OverrideImplementMethodsHandler implements IntentionAction { + protected Set collectMethodsToGenerate(MutableClassDescriptor descriptor) { Set missingImplementations = Sets.newLinkedHashSet(); OverrideResolver.collectMissingImplementations(descriptor, missingImplementations, missingImplementations); diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java index 55299ca3379..cbd463a5a41 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java @@ -28,7 +28,7 @@ import java.util.Set; * @author yole */ public abstract class OverrideImplementMethodsHandler implements LanguageCodeInsightActionHandler { - public static List membersFromDescriptors(Set missingImplementations) { + public static List membersFromDescriptors(Iterable missingImplementations) { List members = new ArrayList(); for (CallableMemberDescriptor memberDescriptor : missingImplementations) { members.add(new DescriptorClassMember(memberDescriptor)); @@ -52,7 +52,13 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns if (body == null) { return; } + + String lineSeparator = System.getProperty("line.separator"); + for (DescriptorClassMember selectedElement : selectedElements) { + + body.addBefore(JetPsiFactory.createWhiteSpace(body.getProject(), lineSeparator + lineSeparator), body.getRBrace()); + final DeclarationDescriptor descriptor = selectedElement.getDescriptor(); if (descriptor instanceof NamedFunctionDescriptor) { JetElement target = overrideFunction(project, (NamedFunctionDescriptor) descriptor); diff --git a/idea/testData/codeInsight/overrideImplement/generateMulti.kt b/idea/testData/codeInsight/overrideImplement/generateMulti.kt new file mode 100644 index 00000000000..6386a579032 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/generateMulti.kt @@ -0,0 +1,11 @@ +package something + +trait Some { + fun someFoo() + fun someOtherFoo() : Int + fun someGenericFoo() : T +} + +class SomeOther : Some { + +} \ No newline at end of file diff --git a/idea/testData/codeInsight/overrideImplement/generateMulti.kt.after b/idea/testData/codeInsight/overrideImplement/generateMulti.kt.after new file mode 100644 index 00000000000..4b2a5d489d5 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/generateMulti.kt.after @@ -0,0 +1,20 @@ +package something + +trait Some { + fun someFoo() + fun someOtherFoo() : Int + fun someGenericFoo() : T +} + +class SomeOther : Some { + + override fun someFoo() { + throw UnsupportedOperationException() + } + + override fun someGenericFoo(): S { + throw UnsupportedOperationException() + } + + override fun someOtherFoo(): Int = 0 +} \ 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 42d1948e86e..c468e164ff7 100644 --- a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java @@ -12,6 +12,9 @@ import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.plugin.JetLightProjectDescriptor; import org.jetbrains.jet.plugin.PluginTestCaseBase; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.Set; /** @@ -54,12 +57,22 @@ public class OverrideImplementTest extends LightCodeInsightFixtureTestCase { doFileTest(); } + public void testGenerateMulti() { + doMultiFileTest(); + } + private void doFileTest() { myFixture.configureByFile(getTestName(true) + ".kt"); doImplement(); myFixture.checkResultByFile(getTestName(true) + ".kt.after"); } + private void doMultiFileTest() { + myFixture.configureByFile(getTestName(true) + ".kt"); + doMultiImplement(); + myFixture.checkResultByFile(getTestName(true) + ".kt.after"); + } + private void doDirectoryTest() { myFixture.copyDirectoryToProject(getTestName(true), ""); myFixture.configureFromTempProjectFile("foo/Impl.kt"); @@ -75,8 +88,32 @@ public class OverrideImplementTest extends LightCodeInsightFixtureTestCase { new WriteCommandAction(myFixture.getProject(), myFixture.getFile()) { @Override protected void run(Result result) throws Throwable { - ImplementMethodsHandler.generateMethods(myFixture.getProject(), myFixture.getEditor(), classOrObject, - ImplementMethodsHandler.membersFromDescriptors(descriptors)); + OverrideImplementMethodsHandler.generateMethods( + myFixture.getProject(), myFixture.getEditor(), classOrObject, + OverrideImplementMethodsHandler.membersFromDescriptors(descriptors)); + } + }.execute(); + } + + private void doMultiImplement() { + final PsiElement elementAtCaret = myFixture.getFile().findElementAt(myFixture.getEditor().getCaretModel().getOffset()); + final JetClassOrObject classOrObject = PsiTreeUtil.getParentOfType(elementAtCaret, JetClassOrObject.class); + final Set descriptors = new ImplementMethodsHandler().collectMethodsToGenerate(classOrObject); + + final ArrayList descriptorsList = new ArrayList(descriptors); + Collections.sort(descriptorsList, new Comparator() { + @Override + public int compare(CallableMemberDescriptor desc1, CallableMemberDescriptor desc2) { + return desc1.getName().compareTo(desc2.getName()); + } + }); + + new WriteCommandAction(myFixture.getProject(), myFixture.getFile()) { + @Override + protected void run(Result result) throws Throwable { + OverrideImplementMethodsHandler.generateMethods( + myFixture.getProject(), myFixture.getEditor(), classOrObject, + OverrideImplementMethodsHandler.membersFromDescriptors(descriptorsList)); } }.execute(); }