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 MemberDefHandler extends AbstractExpressionHandler {
30
31
32
33
34
35
36
37
38
39 public MemberDefHandler(IndentationCheck indentCheck,
40 DetailAST ast, AbstractExpressionHandler parent) {
41 super(indentCheck, "member def", ast, parent);
42 }
43
44 @Override
45 public void checkIndentation() {
46 final DetailAST modifiersNode = getMainAst().findFirstToken(TokenTypes.MODIFIERS);
47 if (modifiersNode.getChildCount() == 0) {
48 checkType();
49 }
50 else {
51 checkModifiers();
52 }
53 final DetailAST firstNode = getMainAst();
54 final DetailAST lastNode = getVarDefStatementSemicolon(firstNode);
55
56 if (lastNode != null && !isArrayDeclaration(firstNode)) {
57 checkWrappingIndentation(firstNode, lastNode);
58 }
59 }
60
61 @Override
62 public IndentLevel getSuggestedChildIndent(AbstractExpressionHandler child) {
63 return getIndent();
64 }
65
66 @Override
67 protected void checkModifiers() {
68 final DetailAST modifier = getMainAst().findFirstToken(TokenTypes.MODIFIERS);
69 if (isOnStartOfLine(modifier)
70 && !getIndent().isAcceptable(expandedTabsColumnNo(modifier))) {
71 logError(modifier, "modifier", expandedTabsColumnNo(modifier));
72 }
73 }
74
75
76
77
78 private void checkType() {
79 final DetailAST type = getMainAst().findFirstToken(TokenTypes.TYPE);
80 final DetailAST ident = AbstractExpressionHandler.getFirstToken(type);
81 final int columnNo = expandedTabsColumnNo(ident);
82 if (isOnStartOfLine(ident) && !getIndent().isAcceptable(columnNo)) {
83 logError(ident, "type", columnNo);
84 }
85 }
86
87
88
89
90
91
92 private static boolean isArrayDeclaration(DetailAST variableDef) {
93 return variableDef.findFirstToken(TokenTypes.TYPE)
94 .findFirstToken(TokenTypes.ARRAY_DECLARATOR) != null;
95 }
96
97
98
99
100
101
102
103 private static DetailAST getVarDefStatementSemicolon(DetailAST variableDef) {
104 DetailAST lastNode = variableDef.getLastChild();
105 if (lastNode.getType() != TokenTypes.SEMI) {
106 lastNode = variableDef.getNextSibling();
107 }
108 return lastNode;
109 }
110
111 }