Merge remote-tracking branch 'origin/master'
[idea/community.git] / platform / analysis-impl / src / com / intellij / codeInspection / SuppressIntentionActionFromFix.java
1 /*
2  * Copyright 2000-2013 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;
17
18 import com.intellij.codeInsight.daemon.impl.actions.AbstractBatchSuppressByNoInspectionCommentFix;
19 import com.intellij.openapi.editor.Editor;
20 import com.intellij.openapi.project.Project;
21 import com.intellij.psi.PsiElement;
22 import com.intellij.util.Function;
23 import com.intellij.util.IncorrectOperationException;
24 import com.intellij.util.ThreeState;
25 import com.intellij.util.containers.ContainerUtil;
26 import org.jetbrains.annotations.NotNull;
27
28 public class SuppressIntentionActionFromFix extends SuppressIntentionAction {
29   private final SuppressQuickFix myFix;
30
31   private SuppressIntentionActionFromFix(@NotNull SuppressQuickFix fix) {
32     myFix = fix;
33   }
34
35   @NotNull
36   public static SuppressIntentionAction convertBatchToSuppressIntentionAction(@NotNull final SuppressQuickFix fix) {
37     return new SuppressIntentionActionFromFix(fix);
38   }
39
40   @NotNull
41   public static SuppressIntentionAction[] convertBatchToSuppressIntentionActions(@NotNull SuppressQuickFix[] actions) {
42     return ContainerUtil.map2Array(actions, SuppressIntentionAction.class, new Function<SuppressQuickFix, SuppressIntentionAction>() {
43       @Override
44       public SuppressIntentionAction fun(SuppressQuickFix fix) {
45         return convertBatchToSuppressIntentionAction(fix);
46       }
47     });
48   }
49
50   @Override
51   public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement element) throws IncorrectOperationException {
52     PsiElement container = getContainer(element);
53     boolean caretWasBeforeStatement = editor != null && container != null && editor.getCaretModel().getOffset() == container.getTextRange().getStartOffset();
54     InspectionManager inspectionManager = InspectionManager.getInstance(project);
55     ProblemDescriptor descriptor = inspectionManager.createProblemDescriptor(element, element, "", ProblemHighlightType.GENERIC_ERROR_OR_WARNING, false);
56     myFix.applyFix(project, descriptor);
57
58     if (caretWasBeforeStatement) {
59       editor.getCaretModel().moveToOffset(container.getTextRange().getStartOffset());
60     }
61   }
62
63   public ThreeState isShouldBeAppliedToInjectionHost() {
64     return myFix instanceof InjectionAwareSuppressQuickFix
65            ? ((InjectionAwareSuppressQuickFix)myFix).isShouldBeAppliedToInjectionHost()
66            : ThreeState.UNSURE;
67   }
68
69   public PsiElement getContainer(PsiElement element) {
70     return myFix instanceof AbstractBatchSuppressByNoInspectionCommentFix
71            ? ((AbstractBatchSuppressByNoInspectionCommentFix)myFix).getContainer(element) : null;
72   }
73
74   @Override
75   public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiElement element) {
76     return myFix.isAvailable(project, element);
77   }
78
79   @NotNull
80   @Override
81   public String getText() {
82     return myFix.getName() + (isShouldBeAppliedToInjectionHost() == ThreeState.NO ? " in injection" : "");
83   }
84
85   @NotNull
86   @Override
87   public String getFamilyName() {
88     return myFix.getFamilyName();
89   }
90 }