/* * 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.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import gw.internal.gosu.parser.Expression; import gw.internal.gosu.parser.expressions.ConditionalAndExpression; import gw.internal.gosu.parser.expressions.EqualityExpression; import gw.internal.gosu.parser.expressions.UnaryNotPlusMinusExpression; import gw.lang.parser.IExpression; import gw.lang.parser.IParsedElement; import gw.lang.parser.expressions.IBeanMethodCallExpression; import gw.plugin.ij.lang.psi.impl.AbstractGosuClassFileImpl; import gw.plugin.ij.lang.psi.impl.expressions.GosuBeanMethodCallExpressionImpl; import gw.plugin.ij.util.GosuBundle; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class ObjectEqualsAsOpFix extends LocalQuickFixAndIntentionActionOnPsiElement { public ObjectEqualsAsOpFix(GosuBeanMethodCallExpressionImpl callExpression) { super(callExpression); } @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; } if (!(startElement instanceof GosuBeanMethodCallExpressionImpl)) { return; } IBeanMethodCallExpression parsedElement = ((GosuBeanMethodCallExpressionImpl) startElement).getParsedElement(); if (parsedElement == null) { return; } IExpression[] args = parsedElement.getArgs(); String root = parsedElement.getRootExpression().getLocation().getTextFromTokens(); if (args != null && args.length == 1) { PsiElement toRemove = startElement; String op = " == "; IParsedElement expr = parsedElement.getParent(); if (expr instanceof UnaryNotPlusMinusExpression) { UnaryNotPlusMinusExpression unaryExpr = (UnaryNotPlusMinusExpression) expr; if(unaryExpr.isNot()) { toRemove = startElement.getParent(); op = " != "; } } if (expr instanceof ConditionalAndExpression) { ConditionalAndExpression condExpr = (ConditionalAndExpression) expr; Expression lhs = condExpr.getLHS(); if (lhs instanceof EqualityExpression) { EqualityExpression eq = (EqualityExpression) lhs; if (eq.getLHS().getLocation().getTextFromTokens().equals(root) && eq.getRHS().getLocation().getTextFromTokens().equals("null") && !eq.isEquals()) { toRemove = startElement.getParent(); } } } String src = root + op + args[0].getLocation().getTextFromTokens(); Document document = toRemove.getContainingFile().getViewProvider().getDocument(); if(document != null) { int i = toRemove.getTextOffset(); String text = document.getText(); String newText = text.substring( 0, i ) + src + text.substring( i+toRemove.getTextLength()); PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(document); document.setText( newText ); } if (file instanceof AbstractGosuClassFileImpl) { ((AbstractGosuClassFileImpl) file).reparsePsiFromContent(); } } } @Override public boolean isAvailable(@NotNull Project project, @NotNull PsiFile file, @NotNull PsiElement startElement, @NotNull PsiElement endElement) { return startElement instanceof GosuBeanMethodCallExpressionImpl; } @NotNull @Override public String getText() { return GosuBundle.message("inspection.object.equals.as.op"); } @NotNull @Override public String getFamilyName() { return GosuBundle.message("inspection.group.name.expression.issues"); } }