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 java.util.Optional;
23
24 import com.puppycrawl.tools.checkstyle.api.DetailAST;
25 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
26
27
28
29
30
31 public class MemberDefHandler extends AbstractExpressionHandler {
32
33
34
35
36
37
38
39
40
41 public MemberDefHandler(IndentationCheck indentCheck,
42 DetailAST ast, AbstractExpressionHandler parent) {
43 super(indentCheck, "member def", ast, parent);
44 }
45
46 @Override
47 public void checkIndentation() {
48 final DetailAST modifiersNode = getMainAst().findFirstToken(TokenTypes.MODIFIERS);
49 if (modifiersNode.hasChildren()) {
50 checkModifiers();
51 }
52 else {
53 checkType();
54 }
55 final DetailAST firstNode = getMainAst();
56 final DetailAST lastNode = getArrayInitNode(firstNode)
57 .orElseGet(() -> getVarDefStatementSemicolon(firstNode));
58
59 if (lastNode != null) {
60 checkWrappingIndentation(firstNode, lastNode);
61 }
62 }
63
64
65
66
67
68
69
70 private static Optional<DetailAST> getArrayInitNode(DetailAST firstNode) {
71 return Optional.ofNullable(firstNode.findFirstToken(TokenTypes.ASSIGN))
72 .map(assign -> {
73 return Optional.ofNullable(assign.findFirstToken(TokenTypes.EXPR))
74 .map(expr -> expr.findFirstToken(TokenTypes.LITERAL_NEW))
75 .orElse(assign);
76 })
77 .map(node -> node.findFirstToken(TokenTypes.ARRAY_INIT));
78 }
79
80 @Override
81 public IndentLevel getSuggestedChildIndent(AbstractExpressionHandler child) {
82 return getIndent();
83 }
84
85
86
87
88 private void checkModifiers() {
89 final DetailAST modifier = getMainAst().findFirstToken(TokenTypes.MODIFIERS);
90 if (isOnStartOfLine(modifier)
91 && !getIndent().isAcceptable(expandedTabsColumnNo(modifier))) {
92 logError(modifier, "modifier", expandedTabsColumnNo(modifier));
93 }
94 }
95
96
97
98
99 private void checkType() {
100 final DetailAST type = getMainAst().findFirstToken(TokenTypes.TYPE);
101 final DetailAST ident = getFirstToken(type);
102 final int columnNo = expandedTabsColumnNo(ident);
103 if (isOnStartOfLine(ident) && !getIndent().isAcceptable(columnNo)) {
104 logError(ident, "type", columnNo);
105 }
106 }
107
108
109
110
111
112
113
114
115 private static DetailAST getVarDefStatementSemicolon(DetailAST variableDef) {
116 DetailAST lastNode = variableDef.getLastChild();
117 if (lastNode.getType() != TokenTypes.SEMI) {
118 lastNode = variableDef.getNextSibling();
119 }
120 return lastNode;
121 }
122
123 }