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 gw.internal.gosu.parser.BeanAccess; import gw.lang.parser.IExpression; import gw.lang.parser.resources.Res; import gw.lang.parser.statements.IForEachStatement; import gw.plugin.ij.intentions.HandleExpectingIterableFix; import gw.plugin.ij.lang.psi.api.expressions.IGosuExpression; import gw.plugin.ij.lang.psi.impl.GosuElementVisitor; import gw.plugin.ij.lang.psi.impl.statements.GosuForEachStatementImpl; import gw.plugin.ij.util.GosuBundle; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; public class GosuIterableInspection extends BaseLocalInspectionTool { @Nls @NotNull @Override public String getGroupDisplayName() { return GosuBundle.message("inspection.group.name.upgrade.issues"); } @Nls @NotNull @Override public String getDisplayName() { return GosuBundle.message( "inspection.expecting.iterable" ); } @Override public boolean isEnabledByDefault() { // Must turn this on explicitly, it's useful just for upgrades return false; } @NotNull @Override public String getShortName() { return "GosuIterableInspection"; } @NotNull @Override public PsiElementVisitor buildVisitor( @NotNull final ProblemsHolder holder, boolean isOnTheFly, @NotNull LocalInspectionToolSession session ) { return new GosuElementVisitor() { @Override public void visitForEachStatement(GosuForEachStatementImpl forEachStatement) { final IForEachStatement pe = forEachStatement.getParsedElement(); if (pe != null && pe.hasParseException(Res.MSG_EXPECTING_ARRAYTYPE_FOREACH)) { final IExpression inExpression = pe.getInExpression(); if (inExpression != null && BeanAccess.isNumericType(inExpression.getType())) { PsiElement elem = null; for(PsiElement x : forEachStatement.getChildren()) { if(x instanceof IGosuExpression) { elem = x; break; } } if(elem != null) { holder.registerProblem( elem, GosuBundle.message( "inspection.expecting.iterable" ), ProblemHighlightType.GENERIC_ERROR_OR_WARNING, new IterableFix( elem ) ); } } } } }; } private class IterableFix implements LocalQuickFix { private final HandleExpectingIterableFix _quickFix; public IterableFix( PsiElement id ) { _quickFix = new HandleExpectingIterableFix( id ); } @NotNull public String getName() { return _quickFix.getText(); } @NotNull public String getFamilyName() { return GosuBundle.message( "inspection.group.name.upgrade.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 ); } } } }