/* * Copyright 2010-2013 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.siyeh.ig.junit; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.ExceptionUtil; import com.intellij.psi.*; import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import java.util.List; public class ExpectedExceptionNeverThrownInspection extends BaseInspection { @Nls @NotNull @Override public String getDisplayName() { return InspectionGadgetsBundle.message("expected.exception.never.thrown.display.name"); } @NotNull @Override protected String buildErrorString(Object... infos) { final PsiMethod method = (PsiMethod)infos[0]; return InspectionGadgetsBundle.message("expected.exception.never.thrown.problem.descriptor", method.getName()); } @Override public BaseInspectionVisitor buildVisitor() { return new ExpectedExceptionNeverThrownVisitor(); } private static class ExpectedExceptionNeverThrownVisitor extends BaseInspectionVisitor { @Override public void visitMethod(PsiMethod method) { super.visitMethod(method); final PsiAnnotation annotation = AnnotationUtil.findAnnotation(method, "org.junit.Test"); if (annotation == null) { return; } final PsiAnnotationParameterList parameterList = annotation.getParameterList(); final PsiNameValuePair[] attributes = parameterList.getAttributes(); PsiAnnotationMemberValue value = null; for (PsiNameValuePair attribute : attributes) { if ("expected".equals(attribute.getName())) { value = attribute.getValue(); break; } } if (!(value instanceof PsiClassObjectAccessExpression)) { return; } final PsiCodeBlock body = method.getBody(); if (body == null) { return; } final PsiClassObjectAccessExpression classObjectAccessExpression = (PsiClassObjectAccessExpression)value; final PsiTypeElement operand = classObjectAccessExpression.getOperand(); final PsiType type = operand.getType(); if (!(type instanceof PsiClassType)) { return; } final PsiClassType classType = (PsiClassType)type; final PsiClass aClass = classType.resolve(); if (InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION) || InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_ERROR)) { return; } final List<PsiClassType> exceptionsThrown = ExceptionUtil.getThrownExceptions(body); for (PsiClassType psiClassType : exceptionsThrown) { if (psiClassType.isAssignableFrom(classType)) { return; } } registerError(operand, method); } } }