lvcs-impl
[idea/community.git] / lang-api / src / com / intellij / codeInspection / ProblemsHolder.java
1 /*
2  * Copyright 2000-2007 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.intellij.codeInspection;
18
19 import com.intellij.codeInsight.daemon.EmptyResolveMessageProvider;
20 import com.intellij.openapi.diagnostic.Logger;
21 import com.intellij.openapi.util.TextRange;
22 import com.intellij.psi.PsiElement;
23 import com.intellij.psi.PsiFile;
24 import com.intellij.psi.PsiReference;
25 import com.intellij.util.ArrayUtil;
26 import org.jetbrains.annotations.NotNull;
27 import org.jetbrains.annotations.Nullable;
28
29 import java.util.ArrayList;
30 import java.util.List;
31
32 /**
33  * @author max
34  */
35 public class ProblemsHolder {
36   private static final Logger LOG = Logger.getInstance("#com.intellij.codeInspection.ProblemsHolder");
37   private final InspectionManager myManager;
38   private final PsiFile myFile;
39   private List<ProblemDescriptor> myProblems = null;
40
41   public ProblemsHolder(@NotNull InspectionManager manager, @NotNull PsiFile file) {
42     myManager = manager;
43     myFile = file;
44   }
45
46   public void registerProblem(PsiElement psiElement, String descriptionTemplate, LocalQuickFix... fixes) {
47     registerProblem(psiElement, descriptionTemplate, ProblemHighlightType.GENERIC_ERROR_OR_WARNING, fixes);
48   }
49
50   public void registerProblem(PsiElement psiElement,
51                               String descriptionTemplate,
52                               ProblemHighlightType highlightType,
53                               LocalQuickFix... fixes) {
54     registerProblem(myManager.createProblemDescriptor(psiElement, descriptionTemplate, fixes, highlightType));
55   }
56
57   public void registerProblem(ProblemDescriptor problemDescriptor) {
58     if (myProblems == null) {
59       myProblems = new ArrayList<ProblemDescriptor>(1);
60     }
61     PsiElement element = problemDescriptor.getPsiElement();
62     if (!isInPsiFile(element)) {
63       LOG.error("Reported element " + element + " is not from the file '" + myFile + "' the inspection was invoked for. Message:" + problemDescriptor.getDescriptionTemplate());
64     }
65     myProblems.add(problemDescriptor);
66   }
67
68   private boolean isInPsiFile(PsiElement element) {
69     PsiFile file = element.getContainingFile();
70     return ArrayUtil.indexOf(myFile.getPsiRoots(), file) != -1;
71   }
72
73   public void registerProblem(PsiReference reference, String descriptionTemplate, ProblemHighlightType highlightType) {
74     LocalQuickFix[] fixes = null;
75     if (reference instanceof LocalQuickFixProvider) {
76       fixes = ((LocalQuickFixProvider)reference).getQuickFixes();
77     }
78
79     registerProblem(myManager.createProblemDescriptor(reference.getElement(), reference.getRangeInElement(), descriptionTemplate, highlightType, fixes));
80   }
81
82   public void registerProblem(PsiReference reference) {
83     assert reference instanceof EmptyResolveMessageProvider;
84     registerProblem(reference, ((EmptyResolveMessageProvider)reference).getUnresolvedMessagePattern(), ProblemHighlightType.LIKE_UNKNOWN_SYMBOL);
85   }
86
87   public void registerProblem(@NotNull final PsiElement psiElement,
88                               @NotNull final String message,
89                               final ProblemHighlightType highlightType,
90                               final TextRange rangeInElement,
91                               final LocalQuickFix... fixes) {
92
93     final ProblemDescriptor descriptor = myManager.createProblemDescriptor(psiElement, rangeInElement, message, highlightType, fixes);
94     registerProblem(descriptor);
95   }
96
97   public void registerProblem(@NotNull final PsiElement psiElement,
98                               final TextRange rangeInElement,
99                               @NotNull final String message,
100                               final LocalQuickFix... fixes) {
101
102     final ProblemDescriptor descriptor = myManager.createProblemDescriptor(psiElement, rangeInElement, message, ProblemHighlightType.GENERIC_ERROR_OR_WARNING, fixes);
103     registerProblem(descriptor);
104   }
105
106   @Nullable
107   public List<ProblemDescriptor> getResults() {
108     final List<ProblemDescriptor> problems = myProblems;
109     myProblems = null;
110     return problems;
111   }
112
113   @Nullable
114   public ProblemDescriptor[] getResultsArray() {
115     final List<ProblemDescriptor> problems = myProblems;
116     myProblems = null;
117     return problems == null ? null : problems.toArray(new ProblemDescriptor[problems.size()]);
118   }
119
120   public final InspectionManager getManager() {
121     return myManager;
122   }
123   public boolean hasResults() {
124     return myProblems != null && !myProblems.isEmpty();
125   }
126 }