1 ///////////////////////////////////////////////////////////////////////////////////////////////
2 // checkstyle: Checks Java source code and other text files for adherence to a set of rules.
3 // Copyright (C) 2001-2025 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.indentation;
21
22 import com.puppycrawl.tools.checkstyle.api.DetailAST;
23 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
24
25 /**
26 * Handler for synchronized statements.
27 *
28 */
29 public class SynchronizedHandler extends BlockParentHandler {
30
31 /**
32 * Determine that "synchronized" token used as modifier of method.
33 */
34 private final boolean methodModifier;
35
36 /**
37 * Construct an instance of this handler with the given indentation check,
38 * name, abstract syntax tree, and parent handler.
39 *
40 * @param indentCheck the indentation check
41 * @param ast the abstract syntax tree
42 * @param parent the parent handler
43 */
44 public SynchronizedHandler(IndentationCheck indentCheck, DetailAST ast,
45 AbstractExpressionHandler parent) {
46 super(indentCheck, "synchronized", ast, parent);
47 methodModifier = isMethodModifier(ast);
48 }
49
50 @Override
51 public void checkIndentation() {
52 if (!methodModifier) {
53 super.checkIndentation();
54 checkSynchronizedExpr();
55 checkWrappingIndentation(getMainAst(),
56 getSynchronizedStatementRightParen(getMainAst()));
57 }
58 }
59
60 /**
61 * Check indentation of expression we synchronized on.
62 */
63 private void checkSynchronizedExpr() {
64 final DetailAST syncAst = getMainAst().findFirstToken(TokenTypes.LPAREN)
65 .getNextSibling();
66 final IndentLevel expected =
67 new IndentLevel(getIndent(), getBasicOffset());
68 checkExpressionSubtree(syncAst, expected, false, false);
69 }
70
71 /**
72 * Checks if given synchronized is modifier of method.
73 *
74 * @param ast synchronized(TokenTypes.LITERAL_SYNCHRONIZED) to check
75 * @return true if synchronized only modifies method
76 */
77 private static boolean isMethodModifier(DetailAST ast) {
78 return ast.getParent().getType() == TokenTypes.MODIFIERS;
79 }
80
81 /**
82 * Returns right parenthesis of synchronized statement.
83 *
84 * @param syncStatementAST ast node(TokenTypes.LITERAL_SYNCHRONIZED)
85 * @return right parenthesis of synchronized statement.
86 */
87 private static DetailAST getSynchronizedStatementRightParen(DetailAST syncStatementAST) {
88 return syncStatementAST.findFirstToken(TokenTypes.RPAREN);
89 }
90
91 }