View Javadoc

    1   package net.sourceforge.pmd.lang.java.rule.controversial;
    2
    3   import net.sourceforge.pmd.PropertySource;
    4   import net.sourceforge.pmd.lang.ast.Node;
    5   import net.sourceforge.pmd.lang.java.ast.ASTAssignmentOperator;
    6   import net.sourceforge.pmd.lang.java.ast.ASTExpression;
    7   import net.sourceforge.pmd.lang.java.ast.ASTForStatement;
    8   import net.sourceforge.pmd.lang.java.ast.ASTIfStatement;
    9   import net.sourceforge.pmd.lang.java.ast.ASTPostfixExpression;
    10  import net.sourceforge.pmd.lang.java.ast.ASTPreDecrementExpression;
    11  import net.sourceforge.pmd.lang.java.ast.ASTPreIncrementExpression;
    12  import net.sourceforge.pmd.lang.java.ast.ASTWhileStatement;
    13  import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
    14  import net.sourceforge.pmd.lang.rule.properties.BooleanProperty;
    15
    16  /**
    17   *
    18   *
    19   */
    20  public class AssignmentInOperandRule extends AbstractJavaRule {
    21
    22      private static final BooleanProperty ALLOW_IF_DESCRIPTOR = new BooleanProperty("allowIf",
    23  	    "Allow assignment within the conditional expression of an if statement", false, 1.0f);
    24
    25      private static final BooleanProperty ALLOW_FOR_DESCRIPTOR = new BooleanProperty("allowFor",
    26  	    "Allow assignment within the conditional expression of a for statement", false, 2.0f);
    27
    28      private static final BooleanProperty ALLOW_WHILE_DESCRIPTOR = new BooleanProperty("allowWhile",
    29  	    "Allow assignment within the conditional expression of a while statement", false, 3.0f);
    30
    31      private static final BooleanProperty ALLOW_INCREMENT_DECREMENT_DESCRIPTOR = new BooleanProperty(
    32  	    "allowIncrementDecrement",
    33  	    "Allow increment or decrement operators within the conditional expression of an if, for, or while statement",
    34  	    false, 4.0f);
    35
    36      public AssignmentInOperandRule() {
    37  	definePropertyDescriptor(ALLOW_IF_DESCRIPTOR);
    38  	definePropertyDescriptor(ALLOW_FOR_DESCRIPTOR);
    39  	definePropertyDescriptor(ALLOW_WHILE_DESCRIPTOR);
    40  	definePropertyDescriptor(ALLOW_INCREMENT_DECREMENT_DESCRIPTOR);
    41      }
    42
    43      @Override
    44  	public Object visit(ASTExpression node, Object data) {
    45  	Node parent = node.jjtGetParent();
    46  	if (((parent instanceof ASTIfStatement && !getProperty(ALLOW_IF_DESCRIPTOR))
    47  		|| (parent instanceof ASTWhileStatement && !getProperty(ALLOW_WHILE_DESCRIPTOR)) ||
    48  		(parent instanceof ASTForStatement && parent.jjtGetChild(1) == node && !getProperty(ALLOW_FOR_DESCRIPTOR))) &&
    49  		(node.hasDescendantOfType(ASTAssignmentOperator.class) ||
    50  		(!getProperty(ALLOW_INCREMENT_DECREMENT_DESCRIPTOR) &&
    51  		(node.hasDecendantOfAnyType(ASTPreIncrementExpression.class, ASTPreDecrementExpression.class, ASTPostfixExpression.class))))) {
    52
    53  	    addViolation(data, node);
    54  	    return data;
    55  	}
    56  	return super.visit(node, data);
    57      }
    58
    59
    60  	public boolean allowsAllAssignments() {
    61  		return
    62  			getProperty(ALLOW_IF_DESCRIPTOR) &&
    63  			getProperty(ALLOW_FOR_DESCRIPTOR) &&
    64  			getProperty(ALLOW_WHILE_DESCRIPTOR) &&
    65  			getProperty(ALLOW_INCREMENT_DECREMENT_DESCRIPTOR);
    66  	}
    67
    68  	/**
    69  	 * @see PropertySource#dysfunctionReason()
    70  	 */
    71  	@Override
    72  	public String dysfunctionReason() {
    73  		return allowsAllAssignments() ? "All assignment types allowed, no checks performed" : null;
    74  	}
    75  }