IDEADEV-31824 (Incorrect "manual array copy" warning)
[fedora-idea.git] / plugins / InspectionGadgets / src / com / siyeh / ig / bugs / ParameterClassCheckVisitor.java
blob9dfe2a6ff3d590501c770057db02c32bc694b751
1 /*
2 * Copyright 2003-2008 Dave Griffith, Bas Leijdekkers
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package com.siyeh.ig.bugs;
18 import com.intellij.psi.*;
19 import com.intellij.psi.util.PsiTreeUtil;
20 import com.siyeh.HardcodedMethodConstants;
21 import org.jetbrains.annotations.NotNull;
23 class ParameterClassCheckVisitor extends JavaRecursiveElementVisitor{
25 private final PsiParameter parameter;
27 private boolean checked = false;
29 ParameterClassCheckVisitor(PsiParameter parameter){
30 super();
31 this.parameter = parameter;
34 @Override public void visitElement(@NotNull PsiElement element){
35 if(!checked){
36 super.visitElement(element);
40 @Override public void visitMethodCallExpression(
41 @NotNull PsiMethodCallExpression expression){
42 if(checked){
43 return;
45 super.visitMethodCallExpression(expression);
46 final PsiReferenceExpression methodExpression =
47 expression.getMethodExpression();
48 final String methodName = methodExpression.getReferenceName();
49 if(!HardcodedMethodConstants.GET_CLASS.equals(methodName)){
50 return;
52 final PsiExpressionList argumentList = expression.getArgumentList();
53 final PsiExpression[] arguments = argumentList.getExpressions();
54 if(arguments.length != 0){
55 return;
57 final PsiExpression qualifier =
58 methodExpression.getQualifierExpression();
59 if(isParameterReference(qualifier)){
60 checked = true;
64 @Override public void visitInstanceOfExpression(
65 @NotNull PsiInstanceOfExpression expression){
66 if(checked){
67 return;
69 super.visitInstanceOfExpression(expression);
70 final PsiExpression operand = expression.getOperand();
71 if(isParameterReference(operand)){
72 checked = true;
76 @Override public void visitTypeCastExpression(
77 PsiTypeCastExpression expression) {
78 if(checked){
79 return;
81 super.visitTypeCastExpression(expression);
82 final PsiExpression operand = expression.getOperand();
83 if(!isParameterReference(operand)){
84 return;
86 final PsiTryStatement statement =
87 PsiTreeUtil.getParentOfType(expression, PsiTryStatement.class);
88 if(statement == null){
89 return;
91 final PsiParameter[] parameters = statement.getCatchBlockParameters();
92 if(parameters.length < 2){
93 return;
95 boolean nullPointerExceptionFound = false;
96 boolean classCastExceptionFound = false;
97 for(PsiParameter parameter : parameters){
98 final PsiType type = parameter.getType();
99 if(type.equalsToText("java.lang.NullPointerException")){
100 nullPointerExceptionFound = true;
101 if(classCastExceptionFound){
102 break;
104 } else if(type.equalsToText("java.lang.ClassCastException")){
105 classCastExceptionFound = true;
106 if(nullPointerExceptionFound){
107 break;
111 if(classCastExceptionFound && nullPointerExceptionFound){
112 checked = true;
116 private boolean isParameterReference(PsiExpression operand){
117 if(operand == null){
118 return false;
120 if(!(operand instanceof PsiReferenceExpression)){
121 return false;
123 final PsiReferenceExpression expression =
124 (PsiReferenceExpression)operand;
125 final PsiElement referent = expression.resolve();
126 return referent != null && referent.equals(parameter);
129 public boolean isChecked(){
130 return checked;