/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.codeInspection.expression; import com.intellij.codeInspection.LocalInspectionToolSession; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.codeInspection.ex.BaseLocalInspectionTool; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.tree.LeafPsiElement; import gw.lang.parser.IExpression; import gw.lang.parser.IParsedElement; import gw.lang.parser.expressions.IEqualityExpression; import gw.plugin.ij.intentions.EqualityQuickFix; import gw.plugin.ij.lang.parser.GosuElementTypes; import gw.plugin.ij.lang.psi.api.expressions.IGosuExpression; import gw.plugin.ij.lang.psi.impl.GosuElementVisitor; import gw.plugin.ij.util.GosuBundle; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; public class GosuEqualityInspection extends BaseLocalInspectionTool { @Nls @NotNull @Override public String getGroupDisplayName() { return GosuBundle.message( "inspection.group.name.equality.issues" ); } @Nls @NotNull @Override public String getDisplayName() { return GosuBundle.message( "inspection.equality.obsolete.operator" ); } @Override public boolean isEnabledByDefault() { // Must turn this on explicitly, too much of an impact on performance for regular use return false; } @NotNull @Override public String getShortName() { return "GosuEqualityInspection"; } @NotNull @Override public PsiElementVisitor buildVisitor( @NotNull final ProblemsHolder holder, boolean isOnTheFly, @NotNull LocalInspectionToolSession session ) { return new GosuElementVisitor() { @Override public void visitElement( PsiElement elem ) { if( elem instanceof IGosuExpression ) { IGosuExpression expr = (IGosuExpression)elem; IParsedElement parsedElement = expr.getParsedElement(); if( parsedElement instanceof IExpression ) { IExpression pe = (IExpression) parsedElement; if( pe instanceof IEqualityExpression ) { LeafPsiElement notEqualsOp = (LeafPsiElement)expr.getNode().findChildByType( GosuElementTypes.TT_OP_not_equals_for_losers ); if( notEqualsOp != null ) { holder.registerProblem( notEqualsOp, GosuBundle.message( "inspection.equality.obsolete.operator" ), ProblemHighlightType.GENERIC_ERROR_OR_WARNING, new EqualityFix( notEqualsOp ) ); } } } } } }; } private class EqualityFix implements LocalQuickFix { private final EqualityQuickFix _quickFix; public EqualityFix( PsiElement id ) { _quickFix = new EqualityQuickFix( id ); } @NotNull public String getName() { return _quickFix.getText(); } @NotNull public String getFamilyName() { return GosuBundle.message( "inspection.group.name.equality.issues" ); } public void applyFix( @NotNull Project project, @NotNull ProblemDescriptor descriptor ) { PsiElement element = descriptor.getPsiElement(); if( element == null ) { return; } final PsiFile psiFile = element.getContainingFile(); if( _quickFix.isAvailable( project, null, psiFile ) ) { _quickFix.invoke( project, null, psiFile ); } } } }