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
){
31 this.parameter
= parameter
;
34 @Override public void visitElement(@NotNull PsiElement element
){
36 super.visitElement(element
);
40 @Override public void visitMethodCallExpression(
41 @NotNull PsiMethodCallExpression expression
){
45 super.visitMethodCallExpression(expression
);
46 final PsiReferenceExpression methodExpression
=
47 expression
.getMethodExpression();
48 final String methodName
= methodExpression
.getReferenceName();
49 if(!HardcodedMethodConstants
.GET_CLASS
.equals(methodName
)){
52 final PsiExpressionList argumentList
= expression
.getArgumentList();
53 final PsiExpression
[] arguments
= argumentList
.getExpressions();
54 if(arguments
.length
!= 0){
57 final PsiExpression qualifier
=
58 methodExpression
.getQualifierExpression();
59 if(isParameterReference(qualifier
)){
64 @Override public void visitInstanceOfExpression(
65 @NotNull PsiInstanceOfExpression expression
){
69 super.visitInstanceOfExpression(expression
);
70 final PsiExpression operand
= expression
.getOperand();
71 if(isParameterReference(operand
)){
76 @Override public void visitTypeCastExpression(
77 PsiTypeCastExpression expression
) {
81 super.visitTypeCastExpression(expression
);
82 final PsiExpression operand
= expression
.getOperand();
83 if(!isParameterReference(operand
)){
86 final PsiTryStatement statement
=
87 PsiTreeUtil
.getParentOfType(expression
, PsiTryStatement
.class);
88 if(statement
== null){
91 final PsiParameter
[] parameters
= statement
.getCatchBlockParameters();
92 if(parameters
.length
< 2){
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
){
104 } else if(type
.equalsToText("java.lang.ClassCastException")){
105 classCastExceptionFound
= true;
106 if(nullPointerExceptionFound
){
111 if(classCastExceptionFound
&& nullPointerExceptionFound
){
116 private boolean isParameterReference(PsiExpression operand
){
120 if(!(operand
instanceof PsiReferenceExpression
)){
123 final PsiReferenceExpression expression
=
124 (PsiReferenceExpression
)operand
;
125 final PsiElement referent
= expression
.resolve();
126 return referent
!= null && referent
.equals(parameter
);
129 public boolean isChecked(){