Rules which enforce a specific coding style.
Edit me

AssignmentInOperand

Since: PMD 5.0

Priority: Medium High (2)

Avoid assignments in operands; this can make code more complicated and harder to read. This is sometime indicative of the bug where the assignment operator ‘=’ was used instead of the equality operator ‘==’.

//IfStatement[$allowIf = "false"]/child::node()[1]/descendant-or-self::node()[self::Assignment or self::UnaryExpression[$allowIncrementDecrement = "false" and (@Image = "--" or @Image = "++")]]
|
    //WhileLoop[$allowWhile = "false"]/child::node()[1]/descendant-or-self::node()[self::Assignment or self::UnaryExpression[$allowIncrementDecrement = "false" and (@Image = "--" or @Image = "++")]]
|
    //DoLoop[$allowWhile = "false"]/child::node()[2]/descendant-or-self::node()[self::Assignment or self::UnaryExpression[$allowIncrementDecrement = "false" and (@Image = "--" or @Image = "++")]]
|
    //ForLoop[$allowFor = "false"]/child::node()[2]/descendant-or-self::node()[self::Assignment or self::UnaryExpression[$allowIncrementDecrement = "false" and (@Image = "--" or @Image = "++")]]
|
   //ConditionalExpression[$allowTernary = "false"]/child::node()[1]/descendant-or-self::node()[self::Assignment or self::UnaryExpression[$allowIncrementDecrement = "false" and (@Image = "--" or @Image = "++")]]
|
   //ConditionalExpression[$allowTernaryResults = "false"]/child::node()[position() = 2 or position() = 3]/descendant-or-self::node()[self::Assignment or self::UnaryExpression[$allowIncrementDecrement = "false" and (@Image = "--" or @Image = "++")]]

Example(s):

var x = 2;
// Bad
if ((x = getX()) == 3) {
    alert('3!');
}

function getX() {
    return 3;
}

This rule has the following properties:

Name Default Value Description
allowIf false Allow assignment within the conditional expression of an if statement
allowFor false Allow assignment within the conditional expression of a for statement
allowWhile false Allow assignment within the conditional expression of a while statement
allowTernary false Allow assignment within the conditional expression of a ternary operator
allowTernaryResults false Allow assignment within the result expressions of a ternary operator
allowIncrementDecrement false Allow increment or decrement operators within the conditional expression of an if, for, or while statement

Use this rule by referencing it:

<rule ref="category/ecmascript/codestyle.xml/AssignmentInOperand" />

ForLoopsMustUseBraces

Since: PMD 5.0

Priority: Medium (3)

Avoid using ‘for’ statements without using curly braces.

//ForLoop[not(child::Scope)]
|
//ForInLoop[not(child::Scope)]

Example(s):

// Ok
for (var i = 0; i < 42; i++) {
    foo();
}

// Bad
for (var i = 0; i < 42; i++)
    foo();

Use this rule by referencing it:

<rule ref="category/ecmascript/codestyle.xml/ForLoopsMustUseBraces" />

IfElseStmtsMustUseBraces

Since: PMD 5.0

Priority: Medium (3)

Avoid using if..else statements without using curly braces.

//ExpressionStatement[parent::IfStatement[@Else = "true"]]
   [not(child::Scope)]
   [not(child::IfStatement)]

Example(s):

// Ok
if (foo) {
    x++;
} else {
    y++;
}

// Bad
if (foo)
    x++;
else
    y++;

Use this rule by referencing it:

<rule ref="category/ecmascript/codestyle.xml/IfElseStmtsMustUseBraces" />

IfStmtsMustUseBraces

Since: PMD 5.0

Priority: Medium (3)

Avoid using if statements without using curly braces.

//IfStatement[@Else = "false" and not(child::Scope)]

Example(s):

// Ok
if (foo) {
    x++;
}

// Bad
if (foo)
    x++;

Use this rule by referencing it:

<rule ref="category/ecmascript/codestyle.xml/IfStmtsMustUseBraces" />

NoElseReturn

Since: PMD 5.5.0

Priority: Medium (3)

The else block in a if-else-construct is unnecessary if the if block contains a return. Then the content of the else block can be put outside.

See also: http://eslint.org/docs/rules/no-else-return

//IfStatement[@Else="true"][Scope[1]/ReturnStatement]

Example(s):

// Bad:
if (x) {
    return y;
} else {
    return z;
}

// Good:
if (x) {
    return y;
}
return z;

Use this rule by referencing it:

<rule ref="category/ecmascript/codestyle.xml/NoElseReturn" />

UnnecessaryBlock

Since: PMD 5.0

Priority: Medium (3)

An unnecessary Block is present. Such Blocks are often used in other languages to introduce a new variable scope. Blocks do not behave like this in ECMAScipt, and using them can be misleading. Considering removing this unnecessary Block.

//Block[not(parent::FunctionNode or parent::IfStatement or parent::ForLoop or parent::ForInLoop
    or parent::WhileLoop or parent::DoLoop or parent::TryStatement or parent::CatchClause)]
|
//Scope[not(parent::FunctionNode or parent::IfStatement or parent::ForLoop or parent::ForInLoop
    or parent::WhileLoop or parent::DoLoop or parent::TryStatement or parent::CatchClause)]

Example(s):

if (foo) {
    // Ok
}
if (bar) {
    {
        // Bad
    }
}

Use this rule by referencing it:

<rule ref="category/ecmascript/codestyle.xml/UnnecessaryBlock" />

UnnecessaryParentheses

Since: PMD 5.0

Priority: Medium Low (4)

Unnecessary parentheses should be removed.

//ParenthesizedExpression/ParenthesizedExpression

Example(s):

var x = 1; // Ok
var y = (1 + 1); // Ok
var z = ((1 + 1)); // Bad

Use this rule by referencing it:

<rule ref="category/ecmascript/codestyle.xml/UnnecessaryParentheses" />

UnreachableCode

Since: PMD 5.0

Priority: High (1)

A ‘return’, ‘break’, ‘continue’, or ‘throw’ statement should be the last in a block. Statements after these will never execute. This is a bug, or extremely poor style.

//ReturnStatement[following-sibling::node()]
|
    //ContinueStatement[following-sibling::node()]
|
    //BreakStatement[following-sibling::node()]
|
    //ThrowStatement[following-sibling::node()]

Example(s):

// Ok
function foo() {
   return 1;
}
// Bad
function bar() {
   var x = 1;
   return x;
   x = 2;
}

Use this rule by referencing it:

<rule ref="category/ecmascript/codestyle.xml/UnreachableCode" />

WhileLoopsMustUseBraces

Since: PMD 5.0

Priority: Medium (3)

Avoid using ‘while’ statements without using curly braces.

//WhileLoop[not(child::Scope)]

Example(s):

// Ok
while (true) {
    x++;
}

// Bad
while (true)
    x++;

Use this rule by referencing it:

<rule ref="category/ecmascript/codestyle.xml/WhileLoopsMustUseBraces" />