View Javadoc
1   ////////////////////////////////////////////////////////////////////////////////
2   // checkstyle: Checks Java source code for adherence to a set of rules.
3   // Copyright (C) 2001-2017 the original author or authors.
4   //
5   // This library is free software; you can redistribute it and/or
6   // modify it under the terms of the GNU Lesser General Public
7   // License as published by the Free Software Foundation; either
8   // version 2.1 of the License, or (at your option) any later version.
9   //
10  // This library is distributed in the hope that it will be useful,
11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  // Lesser General Public License for more details.
14  //
15  // You should have received a copy of the GNU Lesser General Public
16  // License along with this library; if not, write to the Free Software
17  // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  ////////////////////////////////////////////////////////////////////////////////
19  
20  package com.puppycrawl.tools.checkstyle.checks.naming;
21  
22  import com.puppycrawl.tools.checkstyle.api.DetailAST;
23  import com.puppycrawl.tools.checkstyle.api.TokenTypes;
24  import com.puppycrawl.tools.checkstyle.utils.ScopeUtils;
25  
26  /**
27   * <p>
28   * Checks that static, non-final variable names conform to a format specified
29   * by the format property. The format is a
30   * {@link java.util.regex.Pattern regular expression} and defaults to
31   * <strong>^[a-z][a-zA-Z0-9]*$</strong>.
32   * </p>
33   * <p>
34   * An example of how to configure the check is:
35   * </p>
36   * <pre>
37   * &lt;module name="StaticVariableName"/&gt;
38   * </pre>
39   * <p>
40   * An example of how to configure the check for names that begin with
41   * a lower case letter, followed by letters, digits, and underscores is:
42   * </p>
43   * <pre>
44   * &lt;module name="StaticVariableName"&gt;
45   *    &lt;property name="format" value="^[a-z](_?[a-zA-Z0-9]+)*$"/&gt;
46   * &lt;/module&gt;
47   * </pre>
48   * @author Rick Giles
49   */
50  public class StaticVariableNameCheck
51      extends AbstractAccessControlNameCheck {
52      /** Creates a new {@code StaticVariableNameCheck} instance. */
53      public StaticVariableNameCheck() {
54          super("^[a-z][a-zA-Z0-9]*$");
55      }
56  
57      @Override
58      public int[] getDefaultTokens() {
59          return getRequiredTokens();
60      }
61  
62      @Override
63      public int[] getAcceptableTokens() {
64          return getRequiredTokens();
65      }
66  
67      @Override
68      public int[] getRequiredTokens() {
69          return new int[] {TokenTypes.VARIABLE_DEF};
70      }
71  
72      @Override
73      protected final boolean mustCheckName(DetailAST ast) {
74          final DetailAST modifiersAST =
75              ast.findFirstToken(TokenTypes.MODIFIERS);
76          final boolean isStatic = modifiersAST.findFirstToken(TokenTypes.LITERAL_STATIC) != null;
77          final boolean isFinal = modifiersAST.findFirstToken(TokenTypes.FINAL) != null;
78  
79          return isStatic
80                  && !isFinal
81                  && shouldCheckInScope(modifiersAST)
82                  && !ScopeUtils.isInInterfaceOrAnnotationBlock(ast);
83      }
84  }