Class DescendantTokenCheck

  • All Implemented Interfaces:
    Configurable, Contextualizable

    public class DescendantTokenCheck
    extends AbstractCheck

    Checks for restricted tokens beneath other tokens.

    WARNING: This is a very powerful and flexible check, but, at the same time, it is low-level and very implementation-dependent because its results depend on the grammar we use to build abstract syntax trees. Thus we recommend using other checks when they provide the desired functionality. Essentially, this check just works on the level of an abstract syntax tree and knows nothing about language structures.

    • Property limitedTokens - Specify set of tokens with limited occurrences as descendants. Type is java.lang.String[]. Validation type is tokenTypesSet. Default value is "".
    • Property minimumDepth - Specify the minimum depth for descendant counts. Type is int. Default value is 0.
    • Property maximumDepth - Specify the maximum depth for descendant counts. Type is int. Default value is 2147483647.
    • Property minimumNumber - Specify a minimum count for descendants. Type is int. Default value is 0.
    • Property maximumNumber - Specify a maximum count for descendants. Type is int. Default value is 2147483647.
    • Property sumTokenCounts - Control whether the number of tokens found should be calculated from the sum of the individual token counts. Type is boolean. Default value is false.
    • Property minimumMessage - Define the violation message when the minimum count is not reached. Type is java.lang.String. Default value is null.
    • Property maximumMessage - Define the violation message when the maximum count is exceeded. Type is java.lang.String. Default value is null.
    • Property tokens - tokens to check Type is anyTokenTypesSet. Default value is "".

    To configure the check to produce a violation on a switch statement with no default case:

     <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>
     

    To configure the check to produce a violation on a condition in for which performs no check:

     <module name="DescendantToken">
       <property name="tokens" value="FOR_CONDITION"/>
       <property name="limitedTokens" value="EXPR"/>
       <property name="minimumNumber" value="1"/>
     </module>
     

    To configure the check to produce a violation on 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>
     

    To configure the check to produce a violation on a 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>
     

    To configure the check to produce a violation on an assert statement that 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,
         POST_INC,PLUS_ASSIGN,MINUS_ASSIGN,STAR_ASSIGN,DIV_ASSIGN,MOD_ASSIGN,
         BSR_ASSIGN,SR_ASSIGN,SL_ASSIGN,BAND_ASSIGN,BXOR_ASSIGN,BOR_ASSIGN,
         METHOD_CALL"/>
       <property name="maximumNumber" value="0"/>
     </module>
     

    To configure the check to produce a violation on an initializer in for performs no setup (where a while statement could be used instead):

     <module name="DescendantToken">
       <property name="tokens" value="FOR_INIT"/>
       <property name="limitedTokens" value="EXPR"/>
       <property name="minimumNumber" value="1"/>
     </module>
     

    To configure the check to produce a violation on a switch that is nested in another 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>
     

    To configure the check to produce a violation on a return statement 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>
     

    To configure the check to produce a violation on a try statement within a 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>
     

    To configure the check to produce a violation on a switch with too many cases:

     <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>
     

    To configure the check to produce a violation on a method with too many local variables:

     <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>
     

    To configure the check to produce a violation on a method with too many returns:

     <module name="DescendantToken">
       <property name="tokens" value="METHOD_DEF"/>
       <property name="limitedTokens" value="LITERAL_RETURN"/>
       <property name="maximumNumber" value="3"/>
     </module>
     

    To configure the check to produce a violation on an interface with too many fields:

     <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>
     

    To configure the check to produce a violation on a method which throws too many exceptions:

     <module name="DescendantToken">
       <property name="tokens" value="LITERAL_THROWS"/>
       <property name="limitedTokens" value="IDENT"/>
       <property name="maximumNumber" value="1"/>
     </module>
     

    To configure the check to produce a violation on a method with too many expressions:

     <module name="DescendantToken">
       <property name="tokens" value="METHOD_DEF"/>
       <property name="limitedTokens" value="EXPR"/>
       <property name="maximumNumber" value="200"/>
     </module>
     

    To configure the check to produce a violation on an empty statement:

     <module name="DescendantToken">
       <property name="tokens" value="EMPTY_STAT"/>
       <property name="limitedTokens" value="EMPTY_STAT"/>
       <property name="maximumNumber" value="0"/>
       <property name="maximumDepth" value="0"/>
       <property name="maximumMessage"
         value="Empty statement is not allowed."/>
     </module>
     

    To configure the check to produce a violation on a class with too many fields:

     <module name="DescendantToken">
       <property name="tokens" value="CLASS_DEF"/>
       <property name="limitedTokens" value="VARIABLE_DEF"/>
       <property name="maximumDepth" value="2"/>
       <property name="maximumNumber" value="10"/>
     </module>
     

    Parent is com.puppycrawl.tools.checkstyle.TreeWalker

    Violation Message Keys:

    • descendant.token.max
    • descendant.token.min
    • descendant.token.sum.max
    • descendant.token.sum.min
    Since:
    3.2
    • Field Detail

      • minimumDepth

        private int minimumDepth
        Specify the minimum depth for descendant counts.
      • maximumDepth

        private int maximumDepth
        Specify the maximum depth for descendant counts.
      • minimumNumber

        private int minimumNumber
        Specify a minimum count for descendants.
      • maximumNumber

        private int maximumNumber
        Specify a maximum count for descendants.
      • sumTokenCounts

        private boolean sumTokenCounts
        Control whether the number of tokens found should be calculated from the sum of the individual token counts.
      • limitedTokens

        private int[] limitedTokens
        Specify set of tokens with limited occurrences as descendants.
      • minimumMessage

        private String minimumMessage
        Define the violation message when the minimum count is not reached.
      • maximumMessage

        private String maximumMessage
        Define the violation message when the maximum count is exceeded.
      • counts

        private int[] counts
        Counts of descendant tokens. Indexed by (token ID - 1) for performance.
    • Method Detail

      • getAcceptableTokens

        public int[] getAcceptableTokens()
        Description copied from class: AbstractCheck
        The configurable token set. Used to protect Checks against malicious users who specify an unacceptable token set in the configuration file. The default implementation returns the check's default tokens.
        Specified by:
        getAcceptableTokens in class AbstractCheck
        Returns:
        the token set this check is designed for.
        See Also:
        TokenTypes
      • logAsSeparated

        private void logAsSeparated​(DetailAST ast)
        Log violations for each Token.
        Parameters:
        ast - token
      • logAsTotal

        private void logAsTotal​(DetailAST ast)
        Log validation as one violation.
        Parameters:
        ast - current token
      • countTokens

        private void countTokens​(DetailAST ast,
                                 int depth)
        Counts the number of occurrences of descendant tokens.
        Parameters:
        ast - the root token for descendants.
        depth - the maximum depth of the counted descendants.
      • setLimitedTokens

        public void setLimitedTokens​(String... limitedTokensParam)
        Setter to specify set of tokens with limited occurrences as descendants.
        Parameters:
        limitedTokensParam - - list of tokens to ignore.
      • setMinimumDepth

        public void setMinimumDepth​(int minimumDepth)
        Setter to specify the minimum depth for descendant counts.
        Parameters:
        minimumDepth - the minimum depth for descendant counts.
      • setMaximumDepth

        public void setMaximumDepth​(int maximumDepth)
        Setter to specify the maximum depth for descendant counts.
        Parameters:
        maximumDepth - the maximum depth for descendant counts.
      • setMinimumNumber

        public void setMinimumNumber​(int minimumNumber)
        Setter to specify a minimum count for descendants.
        Parameters:
        minimumNumber - the minimum count for descendants.
      • setMaximumNumber

        public void setMaximumNumber​(int maximumNumber)
        Setter to specify a maximum count for descendants.
        Parameters:
        maximumNumber - the maximum count for descendants.
      • setMinimumMessage

        public void setMinimumMessage​(String message)
        Setter to define the violation message when the minimum count is not reached.
        Parameters:
        message - the violation message for minimum count not reached. Used as a MessageFormat pattern with arguments
        • {0} - token count
        • {1} - minimum number
        • {2} - name of token
        • {3} - name of limited token
      • setMaximumMessage

        public void setMaximumMessage​(String message)
        Setter to define the violation message when the maximum count is exceeded.
        Parameters:
        message - the violation message for maximum count exceeded. Used as a MessageFormat pattern with arguments
        • {0} - token count
        • {1} - maximum number
        • {2} - name of token
        • {3} - name of limited token
      • setSumTokenCounts

        public void setSumTokenCounts​(boolean sum)
        Setter to control whether the number of tokens found should be calculated from the sum of the individual token counts.
        Parameters:
        sum - whether to use the sum.