moved to analysis
[idea/community.git] / plugins / InspectionGadgets / InspectionGadgetsAnalysis / src / com / siyeh / ig / performance / ToArrayCallWithZeroLengthArrayArgumentInspectionBase.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.siyeh.ig.performance;
17
18 import com.intellij.psi.*;
19 import com.intellij.psi.util.InheritanceUtil;
20 import com.siyeh.InspectionGadgetsBundle;
21 import com.siyeh.ig.BaseInspection;
22 import com.siyeh.ig.BaseInspectionVisitor;
23 import com.siyeh.ig.psiutils.CollectionUtils;
24 import com.siyeh.ig.psiutils.ExpressionUtils;
25 import org.jetbrains.annotations.Nls;
26 import org.jetbrains.annotations.NonNls;
27 import org.jetbrains.annotations.NotNull;
28
29 public class ToArrayCallWithZeroLengthArrayArgumentInspectionBase extends BaseInspection {
30   @Override
31   @Nls
32   @NotNull
33   public String getDisplayName() {
34     return InspectionGadgetsBundle.message(
35       "to.array.call.with.zero.length.array.argument.display.name");
36   }
37
38   @Override
39   @NotNull
40   protected String buildErrorString(Object... infos) {
41     final PsiExpression argument = (PsiExpression)infos[1];
42     return InspectionGadgetsBundle.message(
43       "to.array.call.with.zero.length.array.argument.problem.descriptor",
44       argument.getText());
45   }
46
47   @Override
48   public boolean isEnabledByDefault() {
49     return true;
50   }
51
52   @Override
53   public BaseInspectionVisitor buildVisitor() {
54     return new ToArrayCallWithZeroLengthArrayArgument();
55   }
56
57   private static class ToArrayCallWithZeroLengthArrayArgument extends BaseInspectionVisitor {
58
59     @Override
60     public void visitMethodCallExpression(PsiMethodCallExpression expression) {
61       super.visitMethodCallExpression(expression);
62       final PsiReferenceExpression methodExpression = expression.getMethodExpression();
63       @NonNls final String methodName = methodExpression.getReferenceName();
64       if (!"toArray".equals(methodName)) {
65         return;
66       }
67       final PsiExpressionList argumentList = expression.getArgumentList();
68       final PsiExpression[] arguments = argumentList.getExpressions();
69       if (arguments.length != 1) {
70         return;
71       }
72       final PsiExpression argument = arguments[0];
73       final PsiType type = argument.getType();
74       if (!(type instanceof PsiArrayType)) {
75         return;
76       }
77       if (type.getArrayDimensions() != 1) {
78         return;
79       }
80       if (argument instanceof PsiReferenceExpression) {
81         final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)argument;
82         final PsiElement element = referenceExpression.resolve();
83         if (!(element instanceof PsiField)) {
84           return;
85         }
86         final PsiField field = (PsiField)element;
87         if (!CollectionUtils.isConstantEmptyArray(field)) {
88           return;
89         }
90       }
91       else if (!ExpressionUtils.isZeroLengthArrayConstruction(argument)) {
92         return;
93       }
94       final PsiMethod method = expression.resolveMethod();
95       if (method == null) {
96         return;
97       }
98       final PsiClass containingClass = method.getContainingClass();
99       if (!InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_UTIL_COLLECTION)) {
100         return;
101       }
102       registerMethodCallError(expression, expression, argument);
103     }
104   }
105 }