9d51c8c1283e8181b6780c72de0ffc018b83f4d0
[idea/community.git] / platform / lang-impl / src / com / intellij / codeInsight / daemon / impl / ExternalToolPassFactory.java
1 /*
2  * Copyright 2000-2014 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.codeInsight.daemon.impl;
18
19 import com.intellij.codeHighlighting.Pass;
20 import com.intellij.codeHighlighting.TextEditorHighlightingPass;
21 import com.intellij.codeHighlighting.TextEditorHighlightingPassFactory;
22 import com.intellij.codeHighlighting.TextEditorHighlightingPassRegistrar;
23 import com.intellij.lang.ExternalLanguageAnnotators;
24 import com.intellij.lang.Language;
25 import com.intellij.lang.annotation.ExternalAnnotator;
26 import com.intellij.openapi.application.ApplicationManager;
27 import com.intellij.openapi.components.AbstractProjectComponent;
28 import com.intellij.openapi.editor.Editor;
29 import com.intellij.openapi.project.Project;
30 import com.intellij.openapi.util.TextRange;
31 import com.intellij.psi.PsiFile;
32 import com.intellij.util.ui.update.MergingUpdateQueue;
33 import com.intellij.util.ui.update.Update;
34 import org.jetbrains.annotations.NonNls;
35 import org.jetbrains.annotations.NotNull;
36 import org.jetbrains.annotations.Nullable;
37
38 import java.util.List;
39
40 /**
41  * @author cdr
42 */
43 public class ExternalToolPassFactory extends AbstractProjectComponent implements TextEditorHighlightingPassFactory {
44   private final MergingUpdateQueue myExternalActivitiesQueue;
45
46   public ExternalToolPassFactory(Project project, TextEditorHighlightingPassRegistrar highlightingPassRegistrar) {
47     super(project);
48     // start after PostHighlightingPass completion since it could report errors that can prevent us to run
49     highlightingPassRegistrar.registerTextEditorHighlightingPass(this, new int[]{Pass.UPDATE_ALL}, null, true, Pass.EXTERNAL_TOOLS);
50
51     myExternalActivitiesQueue = new MergingUpdateQueue("ExternalActivitiesQueue", 300, true, MergingUpdateQueue.ANY_COMPONENT, project,
52                                                        null, false);
53     myExternalActivitiesQueue.setPassThrough(ApplicationManager.getApplication().isUnitTestMode());
54   }
55
56   @Override
57   @NonNls
58   @NotNull
59   public String getComponentName() {
60     return "ExternalToolPassFactory";
61   }
62
63   @Override
64   @Nullable
65   public TextEditorHighlightingPass createHighlightingPass(@NotNull PsiFile file, @NotNull final Editor editor) {
66     TextRange textRange = FileStatusMap.getDirtyTextRange(editor, Pass.EXTERNAL_TOOLS) == null ? null : file.getTextRange();
67     if (textRange == null || !externalAnnotatorsDefined(file)) {
68       return null;
69     }
70     return new ExternalToolPass(this, file, editor, textRange.getStartOffset(), textRange.getEndOffset());
71   }
72
73   private static boolean externalAnnotatorsDefined(@NotNull PsiFile file) {
74     for (Language language : file.getViewProvider().getLanguages()) {
75       final List<ExternalAnnotator> externalAnnotators = ExternalLanguageAnnotators.allForFile(language, file);
76       if (!externalAnnotators.isEmpty()) {
77         return true;
78       }
79     }
80     return false;
81   }
82
83   void scheduleExternalActivity(@NotNull Update update) {
84     myExternalActivitiesQueue.queue(update);
85   }
86 }