/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.intentions;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.source.codeStyle.CodeEditUtil;
import com.intellij.psi.impl.source.tree.TreeElement;
import com.intellij.util.IncorrectOperationException;
import gw.lang.reflect.module.IModule;
import gw.plugin.ij.lang.psi.impl.AbstractGosuClassFileImpl;
import gw.plugin.ij.lang.psi.impl.statements.typedef.members.GosuMethodBaseImpl;
import gw.plugin.ij.lang.psi.util.GosuPsiParseUtil;
import gw.plugin.ij.util.GosuModuleUtil;
import org.jetbrains.annotations.NotNull;
public class GosuAddMissingOverrideFix extends BaseIntentionAction {
private final GosuMethodBaseImpl _method;
public GosuAddMissingOverrideFix(GosuMethodBaseImpl methodBase) {
_method = methodBase;
}
@NotNull
@Override
public String getText() {
return "Add 'override' keyword";
}
@NotNull
@Override
public String getFamilyName() {
return getText();
}
@Override
public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
return _method.isValid() && _method.getManager().isInProject(_method);
}
@Override
public void invokeImpl(@NotNull Project project, Editor editor, @NotNull PsiFile file) throws IncorrectOperationException {
addOverride();
((AbstractGosuClassFileImpl) file).reparseGosuFromPsi();
}
private void addOverride() throws IncorrectOperationException {
IModule module = GosuModuleUtil.findModuleForPsiElement(_method);
GosuMethodBaseImpl methodDecl = (GosuMethodBaseImpl) GosuPsiParseUtil.parseDeclaration("override function test() {}", _method.getManager(), module);
ASTNode[] children = _method.getNode().getChildren(null);
ASTNode overrideKeyword = methodDecl.getNode().getChildren(null)[0];
CodeEditUtil.setOldIndentation((TreeElement) overrideKeyword, 0); // this is to avoid a stupid exception
_method.getNode().addChildren(overrideKeyword, overrideKeyword.getTreeNext().getTreeNext(), children[0]);
}
}