IDEADEV-40882 add static imports when needed
[idea/community.git] / plugins / IntentionPowerPak / src / com / siyeh / ipp / junit / FlipAssertLiteralIntention.java
1 /*
2  * Copyright 2003-2009 Dave Griffith, Bas Leijdekkers
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.siyeh.ipp.junit;
17
18 import com.intellij.codeInsight.AnnotationUtil;
19 import com.intellij.psi.*;
20 import com.intellij.psi.util.PsiTreeUtil;
21 import com.intellij.util.IncorrectOperationException;
22 import com.siyeh.IntentionPowerPackBundle;
23 import com.siyeh.ipp.base.MutablyNamedIntention;
24 import com.siyeh.ipp.base.PsiElementPredicate;
25 import com.siyeh.ipp.psiutils.BoolUtils;
26 import com.siyeh.ipp.psiutils.ImportUtils;
27 import org.jetbrains.annotations.NonNls;
28 import org.jetbrains.annotations.NotNull;
29
30 public class FlipAssertLiteralIntention extends MutablyNamedIntention {
31
32     @Override
33     protected String getTextForElement(PsiElement element) {
34         final PsiMethodCallExpression call = (PsiMethodCallExpression)element;
35         final PsiReferenceExpression methodExpression =
36                 call.getMethodExpression();
37         @NonNls final String fromMethodName = methodExpression.getReferenceName();
38         @NonNls final String toMethodName;
39         if ("assertTrue".equals(fromMethodName)) {
40             toMethodName = "assertFalse";
41         } else {
42             toMethodName = "assertTrue";
43         }
44         return IntentionPowerPackBundle.message(
45                 "flip.assert.literal.intention.name",
46                 fromMethodName, toMethodName);
47     }
48
49     @Override @NotNull
50     public PsiElementPredicate getElementPredicate() {
51         return new AssertTrueOrFalsePredicate();
52     }
53
54     @Override
55     public void processIntention(PsiElement element)
56             throws IncorrectOperationException {
57         final PsiMethodCallExpression call = (PsiMethodCallExpression)element;
58         final PsiReferenceExpression methodExpression =
59                 call.getMethodExpression();
60         @NonNls final String fromMethodName =
61                 methodExpression.getReferenceName();
62         @NonNls final String toMethodName;
63         if ("assertTrue".equals(fromMethodName)) {
64             toMethodName = "assertFalse";
65         } else {
66             toMethodName = "assertTrue";
67         }
68         final PsiElement qualifier =
69                 methodExpression.getQualifier();
70         final String qualifierText;
71         if (qualifier == null) {
72             qualifierText = "";
73         } else {
74             qualifierText = qualifier.getText() + '.';
75         }
76         final PsiExpressionList argumentList = call.getArgumentList();
77         final PsiExpression[] args = argumentList.getExpressions();
78         final String callString;
79         if (args.length == 1) {
80             final PsiExpression arg = args[0];
81             callString = qualifierText + toMethodName + '(' +
82                     BoolUtils.getNegatedExpressionText(arg) + ')';
83         } else {
84             final PsiExpression arg = args[1];
85             callString = qualifierText + toMethodName + '(' +
86                     args[0].getText() + ',' +
87                     BoolUtils.getNegatedExpressionText(arg) + ')';
88         }
89         if (qualifier == null) {
90             final PsiMethod containingMethod =
91                     PsiTreeUtil.getParentOfType(call, PsiMethod.class);
92             if (containingMethod != null &&
93                 AnnotationUtil.isAnnotated(containingMethod, "org.junit.Test", true)) {
94                 ImportUtils.addStaticImport(element, "org.junit.Assert", toMethodName);
95             }
96         }
97         replaceExpression(callString, call);
98     }
99 }