/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.intentions; import com.intellij.codeInsight.CodeInsightUtilBase; import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; import gw.plugin.ij.lang.psi.IGosuPsiElement; import gw.plugin.ij.lang.psi.impl.expressions.GosuParenthesizedExpressionImpl; import gw.plugin.ij.lang.psi.impl.expressions.GosuTypeAsExpressionImpl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class HandleUnnecessaryCoercionFix extends LocalQuickFixAndIntentionActionOnPsiElement { public HandleUnnecessaryCoercionFix(@Nullable PsiElement element) { super(element); } @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 typeAsExpr = getTypeAsExpr(startElement); if(typeAsExpr.getChildren().length == 1) { typeAsExpr = getTypeAsExpr(typeAsExpr.getParent()); } if (typeAsExpr instanceof GosuTypeAsExpressionImpl && editor != null) { PsiElement replaceMe; IGosuPsiElement lhs = ((GosuTypeAsExpressionImpl) typeAsExpr).getLhs(); if(((GosuTypeAsExpressionImpl) typeAsExpr).getRhs() == null) { typeAsExpr = typeAsExpr.getParent(); } if (typeAsExpr.getParent() instanceof GosuParenthesizedExpressionImpl) { typeAsExpr = typeAsExpr.getParent(); } replaceMe = typeAsExpr; replaceMe.replace(lhs); } } private PsiElement getTypeAsExpr(PsiElement startElement) { return PsiTreeUtil.findFirstParent(startElement, new Condition<PsiElement>() { @Override public boolean value(PsiElement psiElement) { return psiElement instanceof GosuTypeAsExpressionImpl; } }); } @NotNull @Override public String getText() { return "Remove unnecessary cast"; } @NotNull @Override public String getFamilyName() { return getText(); } }