Added automatic implementing all abstract methods.

This commit is contained in:
Evgeny Gerashchenko
2012-02-07 21:15:38 +04:00
parent bc9f67b6e2
commit 36f42e7029
2 changed files with 30 additions and 13 deletions
@@ -153,24 +153,30 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns
return classOrObject != null;
}
@Override
public void invoke(@NotNull final Project project, @NotNull final Editor editor, @NotNull PsiFile file) {
public void invoke(@NotNull final Project project, @NotNull final Editor editor, @NotNull PsiFile file,
boolean implementAll) {
final PsiElement elementAtCaret = file.findElementAt(editor.getCaretModel().getOffset());
final JetClassOrObject classOrObject = PsiTreeUtil.getParentOfType(elementAtCaret, JetClassOrObject.class);
Set<CallableMemberDescriptor> missingImplementations = collectMethodsToGenerate(classOrObject);
if (missingImplementations.isEmpty()) {
if (missingImplementations.isEmpty() && !implementAll) {
HintManager.getInstance().showErrorHint(editor, "No methods to implement have been found");
return;
}
List<DescriptorClassMember> members = membersFromDescriptors(missingImplementations);
final MemberChooser<DescriptorClassMember> chooser = showOverrideImplementChooser(project,
members.toArray(new DescriptorClassMember[members.size()]));
if (chooser == null) {
return;
}
final List<DescriptorClassMember> selectedElements = chooser.getSelectedElements();
if (selectedElements == null || selectedElements.isEmpty()) return;
final List<DescriptorClassMember> selectedElements;
if (implementAll) {
selectedElements = members;
} else {
final MemberChooser<DescriptorClassMember> chooser = showOverrideImplementChooser(project,
members.toArray(new DescriptorClassMember[members.size()]));
if (chooser == null) {
return;
}
selectedElements = chooser.getSelectedElements();
if (selectedElements == null || selectedElements.isEmpty()) return;
}
new WriteCommandAction(project, file) {
protected void run(final Result result) throws Throwable {
@@ -180,6 +186,11 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns
}
@Override
public void invoke(@NotNull final Project project, @NotNull final Editor editor, @NotNull PsiFile file) {
invoke(project, editor, file, false);
}
@Override
public boolean startInWriteAction() {
return false;
@@ -16,6 +16,7 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetReferenceExpression;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.plugin.codeInsight.ImplementMethodsHandler;
import org.jetbrains.jet.plugin.compiler.WholeProjectAnalyzerFacade;
import java.util.HashMap;
@@ -60,9 +61,14 @@ class AnonymousTemplateEditingListener extends TemplateEditingAdapter {
public void templateFinished(Template template, boolean brokenOff) {
ourAddedListeners.remove(editor);
if (classDescriptor != null && classDescriptor.getKind() == ClassKind.CLASS) {
int placeToInsert = classRef.getTextRange().getEndOffset();
PsiDocumentManager.getInstance(psiFile.getProject()).getDocument(psiFile).insertString(placeToInsert, "()");
if (classDescriptor != null) {
if (classDescriptor.getKind() == ClassKind.CLASS) {
int placeToInsert = classRef.getTextRange().getEndOffset();
PsiDocumentManager.getInstance(psiFile.getProject()).getDocument(psiFile).insertString(placeToInsert, "()");
editor.getCaretModel().moveToOffset(placeToInsert + 1);
}
new ImplementMethodsHandler().invoke(psiFile.getProject(), editor, psiFile, true);
}
}