Create from usage: Implemented CreateClassObjectFromUsageFix.
This commit is contained in:
@@ -277,4 +277,9 @@ public class JetPsiFactory {
|
|||||||
JetFunction func = createFunction(project, "fun foo() {\n" + bodyText + "\n}");
|
JetFunction func = createFunction(project, "fun foo() {\n" + bodyText + "\n}");
|
||||||
return func.getBodyExpression();
|
return func.getBodyExpression();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static JetClassObject createEmptyClassObject(Project project) {
|
||||||
|
JetClass klass = createClass(project, "class foo { class object { } }");
|
||||||
|
return klass.getClassObject();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,18 +18,25 @@ package org.jetbrains.jet.plugin.quickfix;
|
|||||||
|
|
||||||
import com.intellij.codeInsight.intention.IntentionAction;
|
import com.intellij.codeInsight.intention.IntentionAction;
|
||||||
import com.intellij.openapi.editor.Editor;
|
import com.intellij.openapi.editor.Editor;
|
||||||
|
import com.intellij.openapi.fileEditor.FileEditorManager;
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
|
import com.intellij.openapi.vfs.VirtualFile;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import com.intellij.psi.PsiFile;
|
import com.intellij.psi.PsiFile;
|
||||||
|
import com.intellij.psi.PsiReference;
|
||||||
import com.intellij.util.IncorrectOperationException;
|
import com.intellij.util.IncorrectOperationException;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lang.diagnostics.Diagnostic;
|
import org.jetbrains.jet.lang.diagnostics.Diagnostic;
|
||||||
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
import org.jetbrains.jet.plugin.JetBundle;
|
import org.jetbrains.jet.plugin.JetBundle;
|
||||||
|
|
||||||
public class CreateClassObjectFromUsageFix extends CreateFromUsageFixBase {
|
public class CreateClassObjectFromUsageFix extends CreateFromUsageFixBase {
|
||||||
public CreateClassObjectFromUsageFix(@NotNull PsiElement element) {
|
private final JetClass klass;
|
||||||
|
|
||||||
|
public CreateClassObjectFromUsageFix(@NotNull PsiElement element, @NotNull JetClass klass) {
|
||||||
super(element);
|
super(element);
|
||||||
|
this.klass = klass;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -40,7 +47,20 @@ public class CreateClassObjectFromUsageFix extends CreateFromUsageFixBase {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
|
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
|
||||||
// TODO
|
PsiFile containingFile = klass.getContainingFile();
|
||||||
|
VirtualFile virtualFile = containingFile.getVirtualFile();
|
||||||
|
assert virtualFile != null;
|
||||||
|
FileEditorManager fileEditorManager = FileEditorManager.getInstance(project);
|
||||||
|
fileEditorManager.openFile(virtualFile, true);
|
||||||
|
|
||||||
|
JetClassBody classBody = klass.getBody();
|
||||||
|
if (classBody == null) {
|
||||||
|
classBody = (JetClassBody) klass.add(JetPsiFactory.createEmptyClassBody(project));
|
||||||
|
klass.addBefore(JetPsiFactory.createWhiteSpace(project), classBody);
|
||||||
|
}
|
||||||
|
PsiElement lBrace = classBody.getLBrace();
|
||||||
|
JetClassObject classObject = (JetClassObject) classBody.addAfter(JetPsiFactory.createEmptyClassObject(project), lBrace);
|
||||||
|
classBody.addBefore(JetPsiFactory.createNewLine(project), classObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -49,7 +69,15 @@ public class CreateClassObjectFromUsageFix extends CreateFromUsageFixBase {
|
|||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public IntentionAction createAction(Diagnostic diagnostic) {
|
public IntentionAction createAction(Diagnostic diagnostic) {
|
||||||
return null; // TODO
|
JetReferenceExpression refExpr = QuickFixUtil.getParentElementOfType(diagnostic, JetReferenceExpression.class);
|
||||||
|
if (refExpr == null) return null;
|
||||||
|
PsiReference reference = refExpr.getReference();
|
||||||
|
if (reference == null) return null;
|
||||||
|
PsiElement resolvedReference = reference.resolve();
|
||||||
|
if (resolvedReference == null || !(resolvedReference instanceof JetClass)) return null;
|
||||||
|
JetClass klass = (JetClass) resolvedReference;
|
||||||
|
if (!klass.isWritable()) return null;
|
||||||
|
return new CreateClassObjectFromUsageFix(refExpr, (JetClass) resolvedReference);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user