Merge remote-tracking branch 'origin/master' into develar/is
[idea/community.git] / platform / analysis-impl / src / com / intellij / codeInsight / daemon / RainbowVisitor.java
1 /*
2  * Copyright 2000-2016 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 package com.intellij.codeInsight.daemon;
17
18 import com.intellij.codeHighlighting.RainbowHighlighter;
19 import com.intellij.codeInsight.daemon.impl.HighlightInfo;
20 import com.intellij.codeInsight.daemon.impl.HighlightVisitor;
21 import com.intellij.codeInsight.daemon.impl.analysis.HighlightInfoHolder;
22 import com.intellij.openapi.extensions.Extensions;
23 import com.intellij.psi.PsiFile;
24 import org.jetbrains.annotations.NotNull;
25
26 public abstract class RainbowVisitor implements HighlightVisitor {
27   private HighlightInfoHolder myHolder;
28   private RainbowHighlighter myRainbowHighlighter;
29
30   @NotNull
31   @Override
32   public abstract HighlightVisitor clone();
33
34   @NotNull
35   protected RainbowHighlighter getHighlighter() {
36     return myRainbowHighlighter;
37   }
38
39   @Override
40   public boolean analyze(@NotNull PsiFile file,
41                          boolean updateWholeFile,
42                          @NotNull HighlightInfoHolder holder,
43                          @NotNull Runnable action) {
44     myHolder = holder;
45     myRainbowHighlighter = new RainbowHighlighter(myHolder.getColorsScheme());
46     try {
47       action.run();
48     }
49     finally {
50       myHolder = null;
51       myRainbowHighlighter = null;
52     }
53     return true;
54   }
55
56   @Override
57   public int order() {
58     return 1;
59   }
60
61   protected void addInfo(HighlightInfo highlightInfo) {
62     myHolder.add(highlightInfo);
63   }
64
65   public static boolean existsPassSuitableForFile(@NotNull PsiFile file) {
66     for (HighlightVisitor visitor : Extensions.getExtensions(HighlightVisitor.EP_HIGHLIGHT_VISITOR, file.getProject())) {
67       if (visitor instanceof RainbowVisitor && visitor.suitableForFile(file)) {
68         return true;
69       }
70     }
71     return false;
72   }
73 }