add additional logging to detect exception EA-81929
[idea/community.git] / platform / lang-impl / src / com / intellij / codeInspection / actions / RunInspectionIntention.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.codeInspection.actions;
18
19 import com.intellij.analysis.AnalysisScope;
20 import com.intellij.analysis.AnalysisScopeBundle;
21 import com.intellij.analysis.AnalysisUIOptions;
22 import com.intellij.analysis.BaseAnalysisActionDialog;
23 import com.intellij.codeInsight.daemon.HighlightDisplayKey;
24 import com.intellij.codeInsight.intention.HighPriorityAction;
25 import com.intellij.codeInsight.intention.IntentionAction;
26 import com.intellij.codeInspection.InspectionManager;
27 import com.intellij.codeInspection.InspectionsBundle;
28 import com.intellij.codeInspection.ex.*;
29 import com.intellij.openapi.diagnostic.Logger;
30 import com.intellij.openapi.editor.Editor;
31 import com.intellij.openapi.module.Module;
32 import com.intellij.openapi.module.ModuleUtilCore;
33 import com.intellij.openapi.project.Project;
34 import com.intellij.openapi.util.InvalidDataException;
35 import com.intellij.openapi.util.WriteExternalException;
36 import com.intellij.openapi.vfs.VirtualFile;
37 import com.intellij.profile.codeInspection.InspectionProfileManager;
38 import com.intellij.psi.PsiElement;
39 import com.intellij.psi.PsiFile;
40 import com.intellij.util.IncorrectOperationException;
41 import org.jdom.Element;
42 import org.jetbrains.annotations.NotNull;
43
44 import java.util.LinkedHashSet;
45
46 /**
47  * User: anna
48  * Date: 21-Feb-2006
49  */
50 public class RunInspectionIntention implements IntentionAction, HighPriorityAction {
51   private final static Logger LOG = Logger.getInstance(RunInspectionIntention.class);
52
53   private final String myShortName;
54
55   public RunInspectionIntention(@NotNull InspectionToolWrapper toolWrapper) {
56     myShortName = toolWrapper.getShortName();
57   }
58
59   public RunInspectionIntention(final HighlightDisplayKey key) {
60     myShortName = key.toString();
61   }
62
63   @Override
64   @NotNull
65   public String getText() {
66     return InspectionsBundle.message("run.inspection.on.file.intention.text");
67   }
68
69   @Override
70   @NotNull
71   public String getFamilyName() {
72     return getText();
73   }
74
75   @Override
76   public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
77     return LocalInspectionToolWrapper.findTool2RunInBatch(project, file, myShortName) != null;
78   }
79
80   @Override
81   public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
82     final InspectionManagerEx managerEx = (InspectionManagerEx)InspectionManager.getInstance(project);
83     final Module module = file != null ? ModuleUtilCore.findModuleForPsiElement(file) : null;
84     AnalysisScope analysisScope = new AnalysisScope(project);
85     if (file != null) {
86       final VirtualFile virtualFile = file.getVirtualFile();
87       if (file.isPhysical() && virtualFile != null && virtualFile.isInLocalFileSystem()) {
88         analysisScope = new AnalysisScope(file);
89       }
90     }
91
92     final BaseAnalysisActionDialog dlg = new BaseAnalysisActionDialog(
93       AnalysisScopeBundle.message("specify.analysis.scope", InspectionsBundle.message("inspection.action.title")),
94       AnalysisScopeBundle.message("analysis.scope.title", InspectionsBundle.message("inspection.action.noun")),
95       project,
96       analysisScope,
97       module != null ? module.getName() : null,
98       true, AnalysisUIOptions.getInstance(project), file);
99     if (!dlg.showAndGet()) {
100       return;
101     }
102     final AnalysisUIOptions uiOptions = AnalysisUIOptions.getInstance(project);
103     analysisScope = dlg.getScope(uiOptions, analysisScope, project, module);
104     final InspectionToolWrapper wrapper = LocalInspectionToolWrapper.findTool2RunInBatch(project, file, myShortName);
105     LOG.assertTrue(wrapper != null, "Can't find tool with name = \"" + myShortName + "\"");
106     rerunInspection(wrapper, managerEx, analysisScope, file);
107   }
108
109   public static void rerunInspection(@NotNull InspectionToolWrapper toolWrapper,
110                                      @NotNull InspectionManagerEx managerEx,
111                                      @NotNull AnalysisScope scope,
112                                      PsiElement psiElement) {
113     GlobalInspectionContextImpl inspectionContext = createContext(toolWrapper, managerEx, psiElement);
114     inspectionContext.doInspections(scope);
115   }
116
117   public static GlobalInspectionContextImpl createContext(@NotNull InspectionToolWrapper toolWrapper,
118                                                           @NotNull InspectionManagerEx managerEx,
119                                                           PsiElement psiElement) {
120     final InspectionProfileImpl rootProfile = (InspectionProfileImpl)InspectionProfileManager.getInstance().getRootProfile();
121     LinkedHashSet<InspectionToolWrapper> allWrappers = new LinkedHashSet<InspectionToolWrapper>();
122     allWrappers.add(toolWrapper);
123     rootProfile.collectDependentInspections(toolWrapper, allWrappers, managerEx.getProject());
124     InspectionToolWrapper[] toolWrappers = allWrappers.toArray(new InspectionToolWrapper[allWrappers.size()]);
125     final InspectionProfileImpl model = InspectionProfileImpl.createSimple(toolWrapper.getDisplayName(), managerEx.getProject(), toolWrappers);
126     try {
127       Element element = new Element("toCopy");
128       for (InspectionToolWrapper wrapper : toolWrappers) {
129         wrapper.getTool().writeSettings(element);
130         InspectionToolWrapper tw = psiElement == null ? model.getInspectionTool(wrapper.getShortName(), managerEx.getProject())
131                                                       : model.getInspectionTool(wrapper.getShortName(), psiElement);
132         tw.getTool().readSettings(element);
133       }
134     }
135     catch (WriteExternalException ignored) {
136     }
137     catch (InvalidDataException ignored) {
138     }
139     model.setEditable(toolWrapper.getDisplayName());
140     final GlobalInspectionContextImpl inspectionContext = managerEx.createNewGlobalContext(false);
141     inspectionContext.setExternalProfile(model);
142     inspectionContext.setSingleInspectionRun(true);
143     return inspectionContext;
144   }
145
146   @Override
147   public boolean startInWriteAction() {
148     return false;
149   }
150 }