diff --git a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/flowcontrol/SwitchStatementRule.java b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/flowcontrol/SwitchStatementRule.java index 514db23..c6decb5 100644 --- a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/flowcontrol/SwitchStatementRule.java +++ b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/flowcontrol/SwitchStatementRule.java @@ -46,7 +46,7 @@ public class SwitchStatementRule extends AbstractAliRule { * @param data */ private void checkDefault(ASTSwitchStatement node, Object data) { - final String switchCheckXpath = "SwitchLabel[@Default='true']"; + final String switchCheckXpath = "SwitchLabel[@Default = 'true']"; if (!node.hasDescendantMatchingXPath(switchCheckXpath)) { addViolationWithMessage(data, node, MESSAGE_KEY_PREFIX + ".nodefault"); } @@ -60,16 +60,20 @@ public class SwitchStatementRule extends AbstractAliRule { */ private void checkFallThrough(ASTSwitchStatement node, Object data) { // refer the rule MissingBreakInSwitch of PMD - final String xpath = "../SwitchStatement[(count(.//BreakStatement)" + - " + count(BlockStatement//Statement/ReturnStatement)" + - " + count(BlockStatement//Statement/ThrowStatement)" + - " + count(BlockStatement//Statement/IfStatement[@Else='true' and " - + "Statement[2][ReturnStatement|ThrowStatement]]" - + - "/Statement[1][ReturnStatement|ThrowStatement])" + - " + count(SwitchLabel[name(following-sibling::node()) = 'SwitchLabel'])" + - " + count(SwitchLabel[count(following-sibling::node()) = 0])" + - " < count (SwitchLabel[@Default != 'true']))]"; + final String xpath = "../SwitchStatement[(count(.//BreakStatement)" + + " + count(BlockStatement//Statement/ReturnStatement)" + + " + count(BlockStatement//Statement/ContinueStatement)" + + " + count(BlockStatement//Statement/ThrowStatement)" + + " + count(BlockStatement//Statement/IfStatement[@Else='true'" + + " and Statement[2][ReturnStatement|ContinueStatement|ThrowStatement]]" + + "/Statement[1][ReturnStatement|ContinueStatement|ThrowStatement])" + + " + count(SwitchLabel[name(following-sibling::node()) = 'SwitchLabel'])" + + " + count(SwitchLabel[count(following-sibling::node()) = 0])" + + " < count (SwitchLabel[@Default != 'true'])" + + " + count(SwitchLabel[@Default = 'true']/following-sibling::BlockStatement//Statement/ReturnStatement)" + + " + count(SwitchLabel[@Default = 'true']/following-sibling::BlockStatement//Statement/ContinueStatement)" + + " + count(SwitchLabel[@Default = 'true']/following-sibling::BlockStatement//Statement/ThrowStatement)" + + ")]"; if (node.hasDescendantMatchingXPath(xpath)) { addViolationWithMessage(data, node, MESSAGE_KEY_PREFIX + ".notermination"); diff --git a/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/flowcontrol/xml/SwitchStatementRule.xml b/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/flowcontrol/xml/SwitchStatementRule.xml index 6fb9e9c..2b7e9f6 100644 --- a/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/flowcontrol/xml/SwitchStatementRule.xml +++ b/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/flowcontrol/xml/SwitchStatementRule.xml @@ -1,146 +1,147 @@ - - - - - switch statement in outer class has no default block - 1 - 4 - - + + + + + switch statement in outer class has no default block + 1 + 4 + + - - - - - nested switch has no default block - 1 - 9 - - + + + + + nested switch has no default block + 1 + 9 + + - - - - - case statement without break - 1 - 4 - - + + + + + case statement without break + 1 + 4 + + - - - - - default statement has no break - 0 - - + + + + + default statement has no break + 0 + + - + + public class Foo { + public void bar() { + int i; + switch (i) { + case 0: + case 1: + case 2: + // do something + break; + } + } + } + ]]> multiple continuous blank case 1 - 4 + 4 \ No newline at end of file