/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.intentions;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiWhiteSpace;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
import gw.plugin.ij.lang.parser.GosuElementTypes;
import gw.plugin.ij.lang.psi.impl.expressions.GosuParenthesizedExpressionImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuTypeAsExpressionImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuTypeLiteralImpl;
import gw.plugin.ij.lang.psi.util.GosuPsiParseUtil;
import org.jetbrains.annotations.NotNull;
import static com.intellij.patterns.PlatformPatterns.psiElement;
import static com.intellij.patterns.StandardPatterns.or;
public class GosuChangeTypeCastFix extends BaseIntentionAction {
private final GosuTypeAsExpressionImpl expression;
public GosuChangeTypeCastFix(GosuTypeAsExpressionImpl expression) {
this.expression = expression;
}
@NotNull
@Override
public String getText() {
return "Change Java-style cast to Gosu-style cast";
}
@NotNull
@Override
public String getFamilyName() {
return getText();
}
@Override
public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
return expression.isValid() && expression.getManager().isInProject(expression);
}
@Override
public void invokeImpl(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
final GosuParenthesizedExpressionImpl originalTypeExpr = PsiTreeUtil.getChildOfType(expression, GosuParenthesizedExpressionImpl.class);
final GosuTypeLiteralImpl originalType = PsiTreeUtil.getChildOfType(originalTypeExpr, GosuTypeLiteralImpl.class);
final PsiElement originalExpr = PsiTreeUtil.skipSiblingsForward(originalTypeExpr, PsiWhiteSpace.class);
final PsiElement parent = expression.getParent();
final boolean surround = or(
psiElement(GosuElementTypes.ELEM_TYPE_TypeAsExpression),
psiElement(GosuElementTypes.ELEM_TYPE_TypeOfExpression)).accepts(parent);
final String template = surround ? "(1 as String)" : "1 as String";
final PsiElement fakeExpression = GosuPsiParseUtil.parseExpression(template, expression.getManager());
final PsiElement[] fakeExpressionChildren= surround ? fakeExpression.getChildren()[0].getChildren() : fakeExpression.getChildren();
fakeExpressionChildren[0].replace(originalExpr);
fakeExpressionChildren[1].replace(originalType);
expression.replace(fakeExpression);
}
}