Merge remote-tracking branch 'origin/master' into develar/is
[idea/community.git] / platform / analysis-impl / src / com / intellij / codeInspection / ex / InspectionProfileWrapper.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.codeInspection.ex;
17
18 import com.intellij.codeHighlighting.HighlightDisplayLevel;
19 import com.intellij.codeInsight.daemon.HighlightDisplayKey;
20 import com.intellij.codeInspection.InspectionProfile;
21 import com.intellij.codeInspection.InspectionProfileEntry;
22 import com.intellij.openapi.diagnostic.Logger;
23 import com.intellij.openapi.progress.ProgressManager;
24 import com.intellij.openapi.project.Project;
25 import com.intellij.openapi.util.Key;
26 import com.intellij.psi.PsiElement;
27 import gnu.trove.THashSet;
28 import org.jetbrains.annotations.NotNull;
29
30 import java.util.Set;
31 import java.util.function.Function;
32
33 /**
34  * User: anna
35  * Date: 15-Feb-2006
36  */
37 public class InspectionProfileWrapper {
38   private static final Logger LOG = Logger.getInstance("#com.intellij.codeInspection.ex.InspectionProfileWrapper");
39
40   /**
41    * Key that is assumed to hold strategy that customizes {@link InspectionProfileWrapper} object to use.
42    * <p/>
43    * I.e. given strategy (if any) receives {@link InspectionProfileWrapper} object that is going to be used so far and returns
44    * {@link InspectionProfileWrapper} object that should be used later.
45    */
46   public static final Key<Function<InspectionProfile, InspectionProfileWrapper>> CUSTOMIZATION_KEY = Key.create("Inspection Profile Wrapper Customization");
47
48   // check whether some inspection got registered twice by accident. 've bit once.
49   private static boolean alreadyChecked;
50
51   protected final InspectionProfile myProfile;
52
53   public InspectionProfileWrapper(@NotNull InspectionProfile profile) {
54     myProfile = profile;
55   }
56
57   public static void checkInspectionsDuplicates(@NotNull InspectionToolWrapper[] toolWrappers) {
58     if (alreadyChecked) {
59       return;
60     }
61
62     alreadyChecked = true;
63     Set<InspectionProfileEntry> uniqueTools = new THashSet<>(toolWrappers.length);
64     for (InspectionToolWrapper toolWrapper : toolWrappers) {
65       ProgressManager.checkCanceled();
66       if (!uniqueTools.add(toolWrapper.getTool())) {
67         LOG.error("Inspection " + toolWrapper.getDisplayName() + " (" + toolWrapper.getTool().getClass() + ") already registered");
68       }
69     }
70   }
71
72   public boolean isToolEnabled(final HighlightDisplayKey key, PsiElement element) {
73     return myProfile.isToolEnabled(key, element);
74   }
75
76   public HighlightDisplayLevel getErrorLevel(@NotNull HighlightDisplayKey inspectionToolKey,
77                                              PsiElement element) {
78     return myProfile.getErrorLevel(inspectionToolKey, element);
79   }
80
81   public InspectionToolWrapper getInspectionTool(final String shortName, PsiElement element) {
82     return myProfile.getInspectionTool(shortName, element);
83   }
84
85   public void cleanup(@NotNull Project project) {
86     myProfile.cleanup(project);
87   }
88
89   @NotNull
90   public InspectionProfile getInspectionProfile() {
91     return myProfile;
92   }
93 }