1 ///////////////////////////////////////////////////////////////////////////////////////////////
2 // checkstyle: Checks Java source code and other text files for adherence to a set of rules.
3 // Copyright (C) 2001-2026 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.ScopeUtil;
25
26 /**
27 * Abstract class for checking a class member (field/method)'s name conforms to
28 * a specified pattern.
29 *
30 * <p>
31 * This class extends {@link AbstractNameCheck} with support for access level
32 * restrictions. This allows the check to be configured to be applied to one of
33 * the four Java access levels: {@code public}, {@code protected},
34 * {@code "package"}, and {@code private}.
35 * </p>
36 *
37 * <p>Level is configured using the following properties:
38 * <ol>
39 * <li>applyToPublic, default true;</li>
40 * <li>applyToProtected, default true;</li>
41 * <li>applyToPackage, default true;</li>
42 * <li>applyToPrivate, default true;</li>
43 * </ol>
44 *
45 */
46 public abstract class AbstractAccessControlNameCheck
47 extends AbstractNameCheck {
48
49 /** If true, applies the check be public members. */
50 private boolean applyToPublic = true;
51
52 /** If true, applies the check be protected members. */
53 private boolean applyToProtected = true;
54
55 /** If true, applies the check be "package" members. */
56 private boolean applyToPackage = true;
57
58 /** If true, applies the check be private members. */
59 private boolean applyToPrivate = true;
60
61 /**
62 * Creates a new {@code AbstractAccessControlNameCheck} instance.
63 *
64 * @param format
65 * format to check with
66 * @param messageKey
67 * the key for the message
68 */
69 protected AbstractAccessControlNameCheck(String format, String messageKey) {
70 super(format, messageKey);
71 }
72
73 @Override
74 protected boolean mustCheckName(DetailAST ast) {
75 return shouldCheckInScope(ast.findFirstToken(TokenTypes.MODIFIERS));
76 }
77
78 /**
79 * Should we check member with given modifiers.
80 *
81 * @param modifiers
82 * modifiers of member to check.
83 * @return true if we should check such member.
84 */
85 protected boolean shouldCheckInScope(DetailAST modifiers) {
86 final boolean isProtected = modifiers
87 .findFirstToken(TokenTypes.LITERAL_PROTECTED) != null;
88 final boolean isPrivate = modifiers
89 .findFirstToken(TokenTypes.LITERAL_PRIVATE) != null;
90 final boolean isPublic = isPublic(modifiers);
91
92 final boolean isPackage = !(isPublic || isProtected || isPrivate);
93
94 return applyToPublic && isPublic
95 || applyToProtected && isProtected
96 || applyToPackage && isPackage
97 || applyToPrivate && isPrivate;
98 }
99
100 /**
101 * Checks if given modifiers has public access.
102 * There are 2 cases - it is either has explicit modifier, or it is
103 * in annotation or interface.
104 *
105 * @param modifiers - modifiers to check
106 * @return true if public
107 */
108 private static boolean isPublic(DetailAST modifiers) {
109 return modifiers.findFirstToken(TokenTypes.LITERAL_PUBLIC) != null
110 || ScopeUtil.isInAnnotationBlock(modifiers)
111 || ScopeUtil.isInInterfaceBlock(modifiers)
112 // interface methods can be private
113 && modifiers.findFirstToken(TokenTypes.LITERAL_PRIVATE) == null;
114 }
115
116 /**
117 * Setter to control if check should apply to public members.
118 *
119 * @param applyTo new value of the property.
120 */
121 public void setApplyToPublic(boolean applyTo) {
122 applyToPublic = applyTo;
123 }
124
125 /**
126 * Setter to control if check should apply to protected members.
127 *
128 * @param applyTo new value of the property.
129 */
130 public void setApplyToProtected(boolean applyTo) {
131 applyToProtected = applyTo;
132 }
133
134 /**
135 * Setter to control if check should apply to package-private members.
136 *
137 * @param applyTo new value of the property.
138 */
139 public void setApplyToPackage(boolean applyTo) {
140 applyToPackage = applyTo;
141 }
142
143 /**
144 * Setter to control if check should apply to private members.
145 *
146 * @param applyTo new value of the property.
147 */
148 public void setApplyToPrivate(boolean applyTo) {
149 applyToPrivate = applyTo;
150 }
151
152 }