[java] Detect while loops wih literal booleans conditions

This commit is contained in:
David Burström
2019-03-03 21:45:58 +01:00
parent 5d86217871
commit 3c32cbb629
3 changed files with 126 additions and 0 deletions

View File

@ -1633,4 +1633,38 @@ public class Foo {
</example>
</rule>
<rule name="WhileLoopWithLiteralBoolean"
class="net.sourceforge.pmd.lang.rule.XPathRule"
language="java"
since="6.13.0"
message="The loop can be simplified."
externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_bestpractices.html#whileloopwithliteralboolean">
<description>
'do {} while (true);' requires reading the end of the statement before it is
apparent that it loops forever, whereas 'while (true) {}' is easier to understand.
'do {} while (false);' is redundant, and if an inner variable scope is required,
a block '{}' is sufficient.
'while (false) {}' will never execute the block and can be removed in its entirety.
</description>
<priority>3</priority>
<properties>
<property name="xpath">
<value>
//DoStatement[Expression/PrimaryExpression/PrimaryPrefix/Literal/BooleanLiteral] |
//WhileStatement[Expression/PrimaryExpression/PrimaryPrefix/Literal/BooleanLiteral[@True = 'false']]
</value>
</property>
</properties>
<example>
public class Example {
{
while (true) { } // allowed
while (false) { } // disallowed
do { } while (true); // disallowed
do { } while (false); // disallowed
</example>
</rule>
</ruleset>

View File

@ -0,0 +1,11 @@
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.java.rule.bestpractices;
import net.sourceforge.pmd.testframework.PmdRuleTst;
public class WhileLoopWithLiteralBoolean extends PmdRuleTst {
// no additional unit tests
}

View File

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<test-data
xmlns="http://pmd.sourceforge.net/rule-tests"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/rule-tests http://pmd.sourceforge.net/rule-tests_1_0_0.xsd">
<test-code>
<description>do while true</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>3</expected-linenumbers>
<code><![CDATA[
class Foo {
{
do {
} while (true);
}
}
]]></code>
</test-code>
<test-code>
<description>do while false</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>3</expected-linenumbers>
<code><![CDATA[
class Foo {
{
do {
} while (false);
}
}
]]></code>
</test-code>
<test-code>
<description>do while call</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
class Foo {
{
do {
} while (call(true));
}
}
]]></code>
</test-code>
<test-code>
<description>while true</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
class Foo {
{
while (true) {
}
}
}
]]></code>
</test-code>
<test-code>
<description>while false</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>3</expected-linenumbers>
<code><![CDATA[
class Foo {
{
while (false) {
}
}
}
]]></code>
</test-code>
<test-code>
<description>while call false</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
class Foo {
{
while (call(false)) {
}
}
}
]]></code>
</test-code>
</test-data>