KT-1064 Override methods should be separated with line breaks
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user