/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.intentions; import com.google.common.base.Preconditions; import com.intellij.codeInsight.CodeInsightUtilBase; import com.intellij.codeInsight.daemon.QuickFixBundle; 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.PsiType; import com.intellij.psi.util.PsiMatcherImpl; import com.intellij.util.IncorrectOperationException; import gw.plugin.ij.completion.GosuClassNameInsertHandler; import gw.plugin.ij.lang.psi.IGosuPsiElement; import gw.plugin.ij.lang.psi.impl.AbstractGosuClassFileImpl; import gw.plugin.ij.lang.psi.impl.expressions.GosuParenthesizedExpressionImpl; import gw.plugin.ij.lang.psi.impl.expressions.GosuTypeAsExpressionImpl; import gw.plugin.ij.lang.psi.util.GosuPsiParseUtil; import org.jetbrains.annotations.NotNull; import static com.intellij.psi.util.PsiMatchers.hasClass; public class GosuAddTypeCastFix extends BaseIntentionAction { private final PsiType type; private final IGosuPsiElement expression; public GosuAddTypeCastFix(PsiType type, IGosuPsiElement expression) { this.type = Preconditions.checkNotNull(type); this.expression = Preconditions.checkNotNull(expression); } @NotNull @Override public String getText() { return QuickFixBundle.message("add.typecast.text", type.getCanonicalText()); } @NotNull @Override public String getFamilyName() { return QuickFixBundle.message("add.typecast.family"); } @Override public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { return type.isValid() && expression.isValid() && expression.getManager().isInProject(expression); } @Override public void invokeImpl(@NotNull Project project, Editor editor, @NotNull PsiFile file) throws IncorrectOperationException { if (!CodeInsightUtilBase.prepareFileForWrite(file)) { return; } final PsiElement realExpression = expression instanceof GosuTypeAsExpressionImpl ? ((GosuTypeAsExpressionImpl) expression).getLhs() : expression; if(realExpression == null) { return; } String realExpressionTxt = realExpression.getText(); final boolean surround = !(realExpression instanceof GosuParenthesizedExpressionImpl) && realExpression.getChildren().length > 0; String typeTxt = type.getPresentableText(); String replacement = surround ? "(" + realExpressionTxt + ") as " + typeTxt : realExpressionTxt + " as " + typeTxt; PsiElement stub = GosuPsiParseUtil.parseProgramm("var a = " + replacement, realExpression, file.getManager(), null); PsiElement newExpr = new PsiMatcherImpl(stub).descendant(hasClass(GosuTypeAsExpressionImpl.class)) .getElement(); if (newExpr != null) { expression.replace(newExpr); GosuClassNameInsertHandler.addImportForItem(file, type.getCanonicalText(), type.getPresentableText()); ((AbstractGosuClassFileImpl) file).reparseGosuFromPsi(); } } }