1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
27
28
29 public class ArrayInitHandler extends BlockParentHandler {
30
31
32
33
34
35
36
37
38
39 public ArrayInitHandler(IndentationCheck indentCheck,
40 DetailAST ast, AbstractExpressionHandler parent) {
41 super(indentCheck, "array initialization", ast, parent);
42 }
43
44 @Override
45 protected IndentLevel getIndentImpl() {
46 final DetailAST parentAST = getMainAst().getParent();
47 final int type = parentAST.getType();
48 final IndentLevel indentLevel;
49 if (type == TokenTypes.LITERAL_NEW || type == TokenTypes.ASSIGN) {
50
51 indentLevel = new IndentLevel(getLineStart(parentAST));
52 }
53 else {
54
55 indentLevel = ((BlockParentHandler) getParent()).getChildrenExpectedIndent();
56 }
57 return indentLevel;
58 }
59
60 @Override
61 protected DetailAST getTopLevelAst() {
62 return null;
63 }
64
65 @Override
66 protected DetailAST getLeftCurly() {
67 return getMainAst();
68 }
69
70 @Override
71 protected IndentLevel curlyIndent() {
72 final IndentLevel level = new IndentLevel(getIndent(), getBraceAdjustment());
73 return IndentLevel.addAcceptable(level, level.getLastIndentLevel()
74 + getLineWrappingIndentation());
75 }
76
77 @Override
78 protected DetailAST getRightCurly() {
79 return getMainAst().findFirstToken(TokenTypes.RCURLY);
80 }
81
82 @Override
83 protected boolean canChildrenBeNested() {
84 return true;
85 }
86
87 @Override
88 protected DetailAST getListChild() {
89 return getMainAst();
90 }
91
92 @Override
93 protected IndentLevel getChildrenExpectedIndent() {
94 IndentLevel expectedIndent =
95 new IndentLevel(getIndent(), getIndentCheck().getArrayInitIndent(),
96 getIndentCheck().getLineWrappingIndentation());
97
98 final int firstLine = getFirstLine(Integer.MAX_VALUE, getListChild());
99 final int lcurlyPos = expandedTabsColumnNo(getLeftCurly());
100 final int firstChildPos =
101 getNextFirstNonBlankOnLineAfter(firstLine, lcurlyPos);
102 if (firstChildPos >= 0) {
103 expectedIndent = IndentLevel.addAcceptable(expectedIndent, firstChildPos, lcurlyPos
104 + getLineWrappingIndentation());
105 }
106 return expectedIndent;
107 }
108
109
110
111
112
113
114
115
116
117
118
119
120
121 private int getNextFirstNonBlankOnLineAfter(int lineNo, int columnNo) {
122 int realColumnNo = columnNo + 1;
123 final String line = getIndentCheck().getLines()[lineNo - 1];
124 final int lineLength = line.length();
125 while (realColumnNo < lineLength
126 && Character.isWhitespace(line.charAt(realColumnNo))) {
127 realColumnNo++;
128 }
129
130 if (realColumnNo == lineLength) {
131 realColumnNo = -1;
132 }
133 return realColumnNo;
134 }
135
136
137
138
139
140
141 private int getLineWrappingIndentation() {
142 return getIndentCheck().getLineWrappingIndentation();
143 }
144
145 }