lvcs-impl
[idea/community.git] / lang-api / src / com / intellij / codeInspection / LocalInspectionTool.java
1 /*
2  * @author max
3  */
4 package com.intellij.codeInspection;
5
6 import com.intellij.psi.PsiElement;
7 import com.intellij.psi.PsiElementVisitor;
8 import com.intellij.psi.PsiFile;
9 import com.intellij.psi.PsiNamedElement;
10 import com.intellij.psi.util.PsiTreeUtil;
11 import org.intellij.lang.annotations.Pattern;
12 import org.jetbrains.annotations.NonNls;
13 import org.jetbrains.annotations.NotNull;
14 import org.jetbrains.annotations.Nullable;
15
16 public abstract class LocalInspectionTool extends InspectionProfileEntry {
17   /**
18    * @return descriptive name to be used in "suppress" comments and annotations,
19    *         must consist of [a-zA-Z_0-9]+
20    */
21   @Pattern("[a-zA-Z_0-9.]+")
22   @NonNls
23   @NotNull public String getID() {
24     return getShortName();
25   }
26
27   @NonNls
28   @Nullable
29   public String getAlternativeID() {
30     return null;
31   }
32
33   /**
34    * Override this method and return true if your inspection (unlike almost all others)
35    * must be called for every element in the whole file for each change, whatever small it was.
36    *
37    * For example, 'Field can be local' inspection can report the field declaration when reference to it was added inside method hundreds lines below.
38    * Hence, this inspection must be rerun on every change.
39    *
40    * Please note that re-scanning the whole file can take considerable time and thus seriously impact the responsiveness, so
41    * beg please use this mechanism once in a blue moon.
42    */
43   public boolean runForWholeFile() {
44     return false;
45   }
46
47   /**
48      * Override this to report problems at file level.
49      *
50      * @param file       to check.
51      * @param manager    InspectionManager to ask for ProblemDescriptor's from.
52      * @param isOnTheFly true if called during on the fly editor highlighting. Called from Inspect Code action otherwise.
53      * @return <code>null</code> if no problems found or not applicable at fiel level.
54      */
55   @Nullable
56   public ProblemDescriptor[] checkFile(@NotNull PsiFile file, @NotNull InspectionManager manager, boolean isOnTheFly) {
57     return null;
58   }
59
60   @NotNull
61   public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, final boolean isOnTheFly) {
62     return new PsiElementVisitor() {
63       @Override public void visitFile(PsiFile file) {
64         addDescriptors(checkFile(file, holder.getManager(), isOnTheFly));
65       }
66
67       private void addDescriptors(final ProblemDescriptor[] descriptors) {
68         if (descriptors != null) {
69           for (ProblemDescriptor descriptor : descriptors) {
70             holder.registerProblem(descriptor);
71           }
72         }
73       }
74     };
75   }
76
77   @Nullable
78   public PsiNamedElement getProblemElement(PsiElement psiElement) {
79     return PsiTreeUtil.getNonStrictParentOfType(psiElement, PsiFile.class);
80   }
81
82   public void inspectionStarted(LocalInspectionToolSession session) {}
83
84   public void inspectionFinished(LocalInspectionToolSession session) {}
85 }