KT-1064 Override methods should be separated with line breaks

This commit is contained in:
Nikolay Krasko
2012-01-19 13:35:04 +04:00
parent 560e0ad604
commit 792f2c18ee
5 changed files with 80 additions and 5 deletions
@@ -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<CallableMemberDescriptor> collectMethodsToGenerate(MutableClassDescriptor descriptor) {
Set<CallableMemberDescriptor> missingImplementations = Sets.newLinkedHashSet();
OverrideResolver.collectMissingImplementations(descriptor, missingImplementations, missingImplementations);
@@ -28,7 +28,7 @@ import java.util.Set;
* @author yole
*/
public abstract class OverrideImplementMethodsHandler implements LanguageCodeInsightActionHandler {
public static List<DescriptorClassMember> membersFromDescriptors(Set<CallableMemberDescriptor> missingImplementations) {
public static List<DescriptorClassMember> membersFromDescriptors(Iterable<CallableMemberDescriptor> missingImplementations) {
List<DescriptorClassMember> members = new ArrayList<DescriptorClassMember>();
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);
@@ -0,0 +1,11 @@
package something
trait Some<T> {
fun someFoo()
fun someOtherFoo() : Int
fun someGenericFoo() : T
}
class SomeOther<S> : Some<S> {
<caret>
}
@@ -0,0 +1,20 @@
package something
trait Some<T> {
fun someFoo()
fun someOtherFoo() : Int
fun someGenericFoo() : T
}
class SomeOther<S> : Some<S> {
override fun someFoo() {
throw UnsupportedOperationException()
}
override fun someGenericFoo(): S {
throw UnsupportedOperationException()
}
override fun someOtherFoo(): Int = 0
}
@@ -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<CallableMemberDescriptor> descriptors = new ImplementMethodsHandler().collectMethodsToGenerate(classOrObject);
final ArrayList<CallableMemberDescriptor> descriptorsList = new ArrayList<CallableMemberDescriptor>(descriptors);
Collections.sort(descriptorsList, new Comparator<CallableMemberDescriptor>() {
@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();
}