/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.intentions;
import com.intellij.codeInsight.CodeInsightUtilBase;
import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import gw.lang.parser.expressions.IVarStatement;
import gw.lang.reflect.gs.IGosuProgram;
import gw.plugin.ij.lang.GosuTokenImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuFieldImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuVariableImpl;
import gw.plugin.ij.util.GosuBundle;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class varInferenceFix extends LocalQuickFixAndIntentionActionOnPsiElement {
public varInferenceFix(PsiElement variable) {
super(variable);
}
@Override
public void invoke(@NotNull Project project, @NotNull PsiFile file, @Nullable("is null when called from inspection") Editor editor, @NotNull PsiElement startElement, @NotNull PsiElement endElement) {
if (!CodeInsightUtilBase.prepareFileForWrite(startElement.getContainingFile())) {
return;
}
PsiElement firstChild = startElement.getFirstChild();
if(firstChild == null) {
return;
}
PsiElement nextSibling = firstChild.getNextSibling();
ASTNode toRemoveStart = null;
ASTNode toRemoveEnd = null;
while (nextSibling != null) {
if (nextSibling instanceof GosuTokenImpl) {
GosuTokenImpl token = (GosuTokenImpl) nextSibling;
if (token.textMatches(":")) {
toRemoveStart = token.getNode();
} else if (token.textMatches("=")) {
toRemoveEnd = nextSibling.getNode();
break;
}
}
nextSibling = nextSibling.getNextSibling();
}
if (toRemoveStart != null && toRemoveEnd != null) {
startElement.getNode().removeRange(toRemoveStart, toRemoveEnd);
}
}
@Override
public boolean isAvailable(@NotNull Project project,
@NotNull PsiFile file,
@NotNull PsiElement startElement,
@NotNull PsiElement endElement) {
if(startElement instanceof GosuVariableImpl) {
return true;
} else if(startElement instanceof GosuFieldImpl) {
GosuFieldImpl field = (GosuFieldImpl) startElement;
IVarStatement parsedElement = field.getParsedElement();
return parsedElement != null && (parsedElement.getGosuClass() instanceof IGosuProgram || parsedElement.isPrivate());
}
return false;
}
@NotNull
@Override
public String getText() {
return GosuBundle.message("inspection.variable.type.inferred");
}
@NotNull
@Override
public String getFamilyName() {
return GosuBundle.message("inspection.group.name.declaration.issues");
}
}