@DataPoint: check annotated methods to support the contract

This commit is contained in:
anna
2013-07-23 18:38:43 +02:00
parent 92db8e1587
commit 8c91f0d207
5 changed files with 26 additions and 17 deletions
@@ -2029,7 +2029,7 @@ junit.rule.display.name=Malformed @Rule/@ClassRule field
junit.rule.problem.descriptor=Fields annotated with @{0} should be {1}
junit.rule.type.problem.descriptor=Field type should be subtype of org.junit.rules.TestRule
junit.datapoint.display.name=Malformed @DataPoint field
junit.datapoint.problem.descriptor=Fields annotated with @DataPoint should be {0}
junit.datapoint.problem.descriptor={1}s annotated with @DataPoint should be {0}
inner.class.referenced.via.subclass.display.name=Inner class referenced via subclass
inner.class.referenced.via.subclass.problem.descriptor=Inner class <code>#ref</code> declared in class ''{0}'' but referenced via subclass ''{1}'' #loc
inner.class.referenced.via.subclass.quickfix=Rationalize inner class access
@@ -1,13 +1,8 @@
package com.siyeh.ig.junit;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
@@ -46,15 +41,26 @@ public class JUnitDatapointInspection extends BaseInspection {
@Override
public BaseInspectionVisitor buildVisitor() {
return new BaseInspectionVisitor() {
@Override
public void visitMethod(PsiMethod method) {
visitMember(method, "method");
}
@Override
public void visitField(PsiField field) {
final boolean dataPointAnnotated = AnnotationUtil.isAnnotated(field, DATAPOINT_FQN, false);
visitMember(field, "field");
}
private <T extends PsiMember & PsiNameIdentifierOwner> void visitMember(T member,
final String memberDescription) {
final boolean dataPointAnnotated = AnnotationUtil.isAnnotated(member, DATAPOINT_FQN, false);
if (dataPointAnnotated) {
final String errorMessage = JUnitRuleInspection.getPublicStaticErrorMessage(field, false, true);
final String errorMessage = JUnitRuleInspection.getPublicStaticErrorMessage(member, false, true);
if (errorMessage != null) {
registerError(field.getNameIdentifier(),
InspectionGadgetsBundle.message("junit.datapoint.problem.descriptor", errorMessage),
"Make field " + errorMessage, DATAPOINT_FQN);
final PsiElement identifier = member.getNameIdentifier();
registerError(identifier != null ? identifier : member,
InspectionGadgetsBundle.message("junit.datapoint.problem.descriptor", errorMessage, StringUtil.capitalize(memberDescription)),
"Make " + memberDescription + " " + errorMessage, DATAPOINT_FQN);
}
}
}
@@ -19,6 +19,7 @@ import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiModifierListOwner;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiUtil;
import com.siyeh.InspectionGadgetsBundle;
@@ -90,7 +91,7 @@ public class JUnitRuleInspection extends BaseInspection {
};
}
static String getPublicStaticErrorMessage(PsiField field, boolean shouldBeNonStatic, boolean shouldBeStatic) {
static String getPublicStaticErrorMessage(PsiModifierListOwner field, boolean shouldBeNonStatic, boolean shouldBeStatic) {
String errorMessage = null;
final boolean hasStatic = field.hasModifierProperty(PsiModifier.STATIC);
final boolean hasPublic = field.hasModifierProperty(PsiModifier.PUBLIC);
@@ -4,6 +4,7 @@ import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiMember;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.IncorrectOperationException;
@@ -28,9 +29,9 @@ class MakePublicStaticFix extends InspectionGadgetsFix {
final PsiElement element = descriptor.getPsiElement();
if (element != null) {
final PsiElement parent = element.getParent();
if (parent instanceof PsiField) {
PsiUtil.setModifierProperty((PsiField)parent, PsiModifier.PUBLIC, true);
PsiUtil.setModifierProperty((PsiField)parent, PsiModifier.STATIC, myMakeStatic);
if (parent instanceof PsiMember) {
PsiUtil.setModifierProperty((PsiMember)parent, PsiModifier.PUBLIC, true);
PsiUtil.setModifierProperty((PsiMember)parent, PsiModifier.STATIC, myMakeStatic);
}
}
}
@@ -3,4 +3,5 @@ class Test {
@org.junit.experimental.theories.DataPoint public Object <warning descr="Fields annotated with @DataPoint should be static">f2</warning>;
@org.junit.experimental.theories.DataPoint static Object <warning descr="Fields annotated with @DataPoint should be public">f3</warning>;
@org.junit.experimental.theories.DataPoint Object <warning descr="Fields annotated with @DataPoint should be public and static">f4</warning>;
@org.junit.experimental.theories.DataPoint Object <warning descr="Methods annotated with @DataPoint should be public and static">f4</warning>(){return null;}
}