01 package net.sourceforge.pmd.lang.java.rule.basic;
02
03 import java.io.InputStream;
04
05 import net.sourceforge.pmd.lang.java.ast.ASTExpression;
06 import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression;
07 import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix;
08 import net.sourceforge.pmd.lang.java.ast.ASTStatementExpression;
09 import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclaratorId;
10 import net.sourceforge.pmd.lang.java.ast.JavaNode;
11 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
12 import net.sourceforge.pmd.lang.java.symboltable.NameOccurrence;
13 import net.sourceforge.pmd.lang.java.typeresolution.TypeHelper;
14
15 public class CheckSkipResultRule extends AbstractJavaRule {
16
17 public Object visit(ASTVariableDeclaratorId node, Object data) {
18 if (!TypeHelper.isA(node.getTypeNode(), InputStream.class)) {
19 return data;
20 }
21 for (NameOccurrence occ: node.getUsages()) {
22 NameOccurrence qualifier = occ.getNameForWhichThisIsAQualifier();
23 if (qualifier != null && "skip".equals(qualifier.getImage())) {
24 JavaNode loc = occ.getLocation();
25 if ( loc != null ) {
26 ASTPrimaryExpression exp = loc.getFirstParentOfType(ASTPrimaryExpression.class);
27 while (exp != null) {
28 if (exp.jjtGetParent() instanceof ASTStatementExpression) {
29 // if exp is in a bare statement,
30 // the returned value is not used
31 addViolation(data, occ.getLocation());
32 break;
33 } else if (exp.jjtGetParent() instanceof ASTExpression &&
34 exp.jjtGetParent().jjtGetParent() instanceof ASTPrimaryPrefix) {
35 // if exp is enclosed in a pair of parenthesis
36 // let's have a look at the enclosing expression
37 // we'll see if it's in a bare statement
38 exp = exp.getFirstParentOfType(ASTPrimaryExpression.class);
39 } else {
40 // if exp is neither in a bare statement
41 // or between a pair of parentheses,
42 // it's in some other kind of statement
43 // or assignement so the returned value is used
44 break;
45 }
46 }
47 }
48 }
49 }
50 return data;
51 }
52
53 }
|