package org.jetbrains.android.inspections; import com.intellij.codeInsight.daemon.impl.quickfix.ConvertSwitchToIfIntention; import com.intellij.codeInspection.LocalInspectionTool; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.siyeh.ipp.switchtoif.ReplaceSwitchWithIfIntention; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.util.AndroidBundle; import org.jetbrains.android.util.AndroidResourceUtil; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; /** * @author Eugene.Kudelevsky */ public class AndroidNonConstantResIdsInSwitchInspection extends LocalInspectionTool { private final ReplaceSwitchWithIfIntention myBaseIntention = new ReplaceSwitchWithIfIntention(); @Nls @NotNull @Override public String getGroupDisplayName() { return AndroidBundle.message("android.inspections.group.name"); } @Nls @NotNull @Override public String getDisplayName() { return AndroidBundle.message("android.inspections.non.constant.res.ids.in.switch.name"); } @NotNull @Override public String getShortName() { return "AndroidNonConstantResIdsInSwitch"; } @NotNull @Override public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) { return new JavaElementVisitor() { @Override public void visitSwitchLabelStatement(PsiSwitchLabelStatement statement) { final AndroidFacet facet = AndroidFacet.getInstance(statement); if (facet == null || !facet.isLibraryProject()) { return; } final PsiExpression caseValue = statement.getCaseValue(); if (!(caseValue instanceof PsiReferenceExpression)) { return; } final PsiSwitchStatement switchStatement = PsiTreeUtil.getParentOfType(statement, PsiSwitchStatement.class); if (switchStatement == null || !ReplaceSwitchWithIfIntention.canProcess(switchStatement)) { return; } final PsiElement resolvedElement = ((PsiReferenceExpression)caseValue).resolve(); if (resolvedElement == null || !(resolvedElement instanceof PsiField)) { return; } final PsiField resolvedField = (PsiField)resolvedElement; if (!AndroidResourceUtil.isResourceField(resolvedField)) { return; } final PsiModifierList modifierList = resolvedField.getModifierList(); if (modifierList == null || !modifierList.hasModifierProperty(PsiModifier.FINAL)) { holder.registerProblem(caseValue, AndroidBundle.message("android.inspections.non.constant.res.ids.in.switch.message"), new MyQuickFix()); } } }; } public String getQuickFixName() { return myBaseIntention.getText(); } private class MyQuickFix implements LocalQuickFix { @NotNull @Override public String getName() { return getQuickFixName(); } @NotNull @Override public String getFamilyName() { return getName(); } @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { final PsiElement element = descriptor.getPsiElement(); if (element == null) { return; } final PsiSwitchStatement switchStatement = PsiTreeUtil.getParentOfType(element, PsiSwitchStatement.class); if (switchStatement == null) { return; } ConvertSwitchToIfIntention.doProcessIntention(switchStatement); } } }