CheckSkipResultRule.java
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 }