diff --git a/src/testinputs/com/puppycrawl/tools/checkstyle/coding/InputReturnFromFinallyCheck.java b/src/testinputs/com/puppycrawl/tools/checkstyle/coding/InputReturnFromFinallyCheck.java index 36687534a..27e2b3a49 100644 --- a/src/testinputs/com/puppycrawl/tools/checkstyle/coding/InputReturnFromFinallyCheck.java +++ b/src/testinputs/com/puppycrawl/tools/checkstyle/coding/InputReturnFromFinallyCheck.java @@ -21,5 +21,6 @@ public class InputReturnFromFinallyCheck { public void thisNull() { boolean result = (this == null) || (null == this); boolean result2 = (this != null) && (null != this); + boolean result3 = (this.getClass().getName() == String.valueOf(null == System.getProperty("abc"))); } } diff --git a/src/tests/com/puppycrawl/tools/checkstyle/checks/DescendantTokenCheckTest.java b/src/tests/com/puppycrawl/tools/checkstyle/checks/DescendantTokenCheckTest.java index b68079631..ab8da13fe 100644 --- a/src/tests/com/puppycrawl/tools/checkstyle/checks/DescendantTokenCheckTest.java +++ b/src/tests/com/puppycrawl/tools/checkstyle/checks/DescendantTokenCheckTest.java @@ -263,6 +263,7 @@ public class DescendantTokenCheckTest extends BaseCheckTestSupport checkConfig.addAttribute("tokens", "NOT_EQUAL,EQUAL"); checkConfig.addAttribute("limitedTokens", "LITERAL_THIS,LITERAL_NULL"); checkConfig.addAttribute("maximumNumber", "1"); + checkConfig.addAttribute("maximumDepth", "1"); checkConfig.addAttribute("maximumMessage", "this cannot be null."); checkConfig.addAttribute("sumTokenCounts", "true"); @@ -285,6 +286,7 @@ public class DescendantTokenCheckTest extends BaseCheckTestSupport checkConfig.addAttribute("tokens", "NOT_EQUAL,EQUAL"); checkConfig.addAttribute("limitedTokens", "LITERAL_THIS,LITERAL_NULL"); checkConfig.addAttribute("maximumNumber", "1"); + checkConfig.addAttribute("maximumDepth", "1"); checkConfig.addAttribute("sumTokenCounts", "true"); String[] expected = { diff --git a/src/xdocs/config_misc.xml b/src/xdocs/config_misc.xml index 462a05234..9bdd0b005 100755 --- a/src/xdocs/config_misc.xml +++ b/src/xdocs/config_misc.xml @@ -645,6 +645,15 @@ messages.properties: Key 'ok' missing. Integer java.lang.Integer.MAX_VALUE + + sumTokenCounts + + whether the number of tokens found should be calculated + from the sum of the individual token counts + + Boolean + false + minimumMessage error message when minimum count not reached @@ -661,24 +670,46 @@ messages.properties: Key 'ok' missing. +

+ Comparing this with null (i.e. this == + null and this != null): +

+ +<module name="DescendantToken"> + <property name="tokens" value="EQUAL,NOT_EQUAL"/> + <property name="limitedTokens" value="LITERAL_THIS,LITERAL_NULL"/> + <property name="maximumNumber" value="1"/> + <property name="maximumDepth" value="1"/> + <property name="sumTokenCounts" value="true"/> +</module> + + +

String literal equality check:

-String literal equality check: <module name="DescendantToken"> <property name="tokens" value="EQUAL,NOT_EQUAL"/> <property name="limitedTokens" value="STRING_LITERAL"/> <property name="maximumNumber" value="0"/> <property name="maximumDepth" value="1"/> </module> + -Switch with no default: +

Switch with no default:

+ <module name="DescendantToken"> <property name="tokens" value="LITERAL_SWITCH"/> <property name="maximumDepth" value="2"/> <property name="limitedTokens" value="LITERAL_DEFAULT"/> <property name="minimumNumber" value="1"/> </module> + -Assert statement may have side effects (formatted for browser display): +

+ Assert statement may have side effects (formatted for browser + display): +

+ <module name="DescendantToken"> <property name="tokens" value="LITERAL_ASSERT"/> <property name="limitedTokens" value="ASSIGN,DEC,INC,POST_DEC, @@ -687,89 +718,119 @@ Assert statement may have side effects (formatted for browser display): METHOD_CALL"/> <property name="maximumNumber" value="0"/> </module> + -Initialiser in for performs no setup (use while instead?): +

+ Initialiser in for performs no setup (use while instead?): +

+ <module name="DescendantToken"> <property name="tokens" value="FOR_INIT"/> <property name="limitedTokens" value="EXPR"/> <property name="minimumNumber" value="1"/> </module> + -Condition in for performs no check: +

+ Condition in for performs no check: +

+ <module name="DescendantToken"> <property name="tokens" value="FOR_CONDITION"/> <property name="limitedTokens" value="EXPR"/> <property name="minimumNumber" value="1"/> </module> + -Switch within switch: +

+ Switch within switch: +

+ <module name="DescendantToken"> <property name="tokens" value="LITERAL_SWITCH"/> <property name="limitedTokens" value="LITERAL_SWITCH"/> <property name="maximumNumber" value="0"/> <property name="minimumDepth" value="1"/> </module> + -Return from within a catch or finally block: +

Return from within a catch or finally block:

+ <module name="DescendantToken"> <property name="tokens" value="LITERAL_FINALLY,LITERAL_CATCH"/> <property name="limitedTokens" value="LITERAL_RETURN"/> <property name="maximumNumber" value="0"/> </module> + -Try within catch or finally block: +

Try within catch or finally block:

+ <module name="DescendantToken"> <property name="tokens" value="LITERAL_CATCH,LITERAL_FINALLY"/> <property name="limitedTokens" value="LITERAL_TRY"/> <property name="maximumNumber" value="0"/> </module> + -Too many cases within a switch: +

Too many cases within a switch:

+ <module name="DescendantToken"> <property name="tokens" value="LITERAL_SWITCH"/> <property name="limitedTokens" value="LITERAL_CASE"/> <property name="maximumDepth" value="2"/> <property name="maximumNumber" value="10"/> </module> + -Too many local variables within a method: +

Too many local variables within a method:

+ <module name="DescendantToken"> <property name="tokens" value="METHOD_DEF"/> <property name="limitedTokens" value="VARIABLE_DEF"/> <property name="maximumDepth" value="2"/> <property name="maximumNumber" value="10"/> </module> + -Too many returns from within a method: +

Too many returns from within a method:

+ <module name="DescendantToken"> <property name="tokens" value="METHOD_DEF"/> <property name="limitedTokens" value="LITERAL_RETURN"/> <property name="maximumNumber" value="3"/> </module> + -Too many fields within an interface: +

Too many fields within an interface:

+ <module name="DescendantToken"> <property name="tokens" value="INTERFACE_DEF"/> <property name="limitedTokens" value="VARIABLE_DEF"/> <property name="maximumDepth" value="2"/> <property name="maximumNumber" value="0"/> </module> + -Limit the number of exceptions a method can throw: +

Limit the number of exceptions a method can throw:

+ <module name="DescendantToken"> <property name="tokens" value="LITERAL_THROWS"/> <property name="limitedTokens" value="IDENT"/> <property name="maximumNumber" value="1"/> </module> + -Limit the number of expressions in a method: +

Limit the number of expressions in a method:

+ <module name="DescendantToken"> <property name="tokens" value="METHOD_DEF"/> <property name="limitedTokens" value="EXPR"/> <property name="maximumNumber" value="200"/> </module> + -Disallow empty statements: +

Disallow empty statements:

+ <module name="DescendantToken"> <property name="tokens" value="EMPTY_STAT"/> <property name="limitedTokens" value="EMPTY_STAT"/> @@ -778,8 +839,10 @@ Disallow empty statements: <property name="maximumMessage" value="Empty statement is not allowed."/> </module> + -Too many fields within a class: +

Too many fields within a class:

+ <module name="DescendantToken"> <property name="tokens" value="CLASS_DEF"/> <property name="limitedTokens" value="VARIABLE_DEF"/> diff --git a/src/xdocs/releasenotes.xml b/src/xdocs/releasenotes.xml index 997973a59..ab716cc2a 100755 --- a/src/xdocs/releasenotes.xml +++ b/src/xdocs/releasenotes.xml @@ -18,6 +18,12 @@ for enforcing the maximum number of outer types per file. Inspired by patch #1145023 from Alexander Jesse. +
  • + Added the option sumTokenCounts to the DescendantToken to + allow for even more powerful checks. For example, detect + statements like this == null. +
  • Add new options to the ImportOrderCheck @@ -42,7 +48,10 @@

    Notes: