1 ///////////////////////////////////////////////////////////////////////////////////////////////
2 // checkstyle: Checks Java source code and other text files for adherence to a set of rules.
3 // Copyright (C) 2001-2024 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 inner classes.
27 *
28 */
29 public class ObjectBlockHandler extends BlockParentHandler {
30
31 /**
32 * Construct an instance of this handler with the given indentation check,
33 * abstract syntax tree, and parent handler.
34 *
35 * @param indentCheck the indentation check
36 * @param ast the abstract syntax tree
37 * @param parent the parent handler
38 */
39 public ObjectBlockHandler(IndentationCheck indentCheck,
40 DetailAST ast, AbstractExpressionHandler parent) {
41 super(indentCheck, "object def", ast, parent);
42 }
43
44 @Override
45 protected DetailAST getTopLevelAst() {
46 return null;
47 }
48
49 @Override
50 protected DetailAST getLeftCurly() {
51 return getMainAst().findFirstToken(TokenTypes.LCURLY);
52 }
53
54 @Override
55 protected DetailAST getRightCurly() {
56 return getMainAst().findFirstToken(TokenTypes.RCURLY);
57 }
58
59 @Override
60 protected DetailAST getListChild() {
61 return getMainAst();
62 }
63
64 @Override
65 protected IndentLevel getIndentImpl() {
66 final DetailAST parentAST = getMainAst().getParent();
67 IndentLevel indent = getParent().getIndent();
68 if (parentAST.getType() == TokenTypes.LITERAL_NEW) {
69 indent = IndentLevel.addAcceptable(indent, super.getIndentImpl());
70 }
71 else if (parentAST.getType() == TokenTypes.ENUM_CONSTANT_DEF) {
72 indent = super.getIndentImpl();
73 }
74 return indent;
75 }
76
77 @Override
78 public void checkIndentation() {
79 // if we have a class or interface as a parent, don't do anything,
80 // as this is checked by class def; so
81 // only do this if we have a new for a parent (anonymous inner
82 // class)
83 final DetailAST parentAST = getMainAst().getParent();
84 if (parentAST.getType() == TokenTypes.LITERAL_NEW) {
85 super.checkIndentation();
86 }
87 }
88
89 @Override
90 protected IndentLevel curlyIndent() {
91 final IndentLevel indent = super.curlyIndent();
92 return IndentLevel.addAcceptable(indent, indent.getFirstIndentLevel()
93 + getLineWrappingIndentation());
94 }
95
96 /**
97 * A shortcut for {@code IndentationCheck} property.
98 *
99 * @return value of lineWrappingIndentation property
100 * of {@code IndentationCheck}
101 */
102 private int getLineWrappingIndentation() {
103 return getIndentCheck().getLineWrappingIndentation();
104 }
105
106 }