Source code: com/puppycrawl/tools/checkstyle/checks/indentation/MethodDefHandler.java
1 ////////////////////////////////////////////////////////////////////////////////
2 // checkstyle: Checks Java source code for adherence to a set of rules.
3 // Copyright (C) 2001-2003 Oliver Burn
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 package com.puppycrawl.tools.checkstyle.checks.indentation;
20
21 import com.puppycrawl.tools.checkstyle.api.DetailAST;
22 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
23
24 /**
25 * Handler for method definitions.
26 *
27 * @author jrichard
28 */
29 public class MethodDefHandler 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 aIndentCheck the indentation check
36 * @param aAst the abstract syntax tree
37 * @param aParent the parent handler
38 */
39 public MethodDefHandler(IndentationCheck aIndentCheck,
40 DetailAST aAst, ExpressionHandler aParent)
41 {
42 super(aIndentCheck, (aAst.getType() == TokenTypes.CTOR_DEF)
43 ? "ctor def" : "method def", aAst, aParent);
44 }
45
46 /**
47 * There is no top level expression for this handler.
48 *
49 * @return null
50 */
51 protected DetailAST getToplevelAST()
52 {
53 // we check this stuff ourselves below
54 return null;
55 }
56
57 /**
58 * Check the indentation of the method name.
59 */
60 private void checkIdent()
61 {
62 DetailAST ident = getMainAst().findFirstToken(TokenTypes.IDENT);
63 int columnNo = expandedTabsColumnNo(ident);
64 if (startsLine(ident) && !getLevel().accept(columnNo)) {
65 logError(ident, "", columnNo);
66 }
67 }
68
69 /**
70 * Check the indentation of the throws clause.
71 */
72 private void checkThrows()
73 {
74 DetailAST throwsAst =
75 getMainAst().findFirstToken(TokenTypes.LITERAL_THROWS);
76 if (throwsAst == null) {
77 return;
78 }
79
80 int columnNo = expandedTabsColumnNo(throwsAst);
81 IndentLevel expectedColumnNo =
82 new IndentLevel(getLevel(), getBasicOffset());
83
84 if (startsLine(throwsAst)
85 && !expectedColumnNo.accept(columnNo))
86 {
87 logError(throwsAst, "throws", columnNo, expectedColumnNo);
88 }
89 }
90
91 /**
92 * Check the indentation of the method type.
93 */
94 private void checkType()
95 {
96 DetailAST ident = getMainAst().findFirstToken(TokenTypes.TYPE);
97 int columnNo = expandedTabsColumnNo(ident);
98 if (startsLine(ident) && !getLevel().accept(columnNo)) {
99 logError(ident, "return type", columnNo);
100 }
101 }
102
103 /**
104 * Check the indentation of the method parameters.
105 */
106 private void checkParameters()
107 {
108 DetailAST params = getMainAst().findFirstToken(TokenTypes.PARAMETERS);
109 checkExpressionSubtree(params, getLevel(), false, false);
110 }
111
112 /**
113 * Check the indentation of the expression we are handling.
114 */
115 public void checkIndentation()
116 {
117 checkModifiers();
118 checkIdent();
119 checkThrows();
120 if (getMainAst().getType() != TokenTypes.CTOR_DEF) {
121 checkType();
122 }
123 checkParameters();
124
125 if (getLCurly() == null) {
126 // asbtract method def -- no body
127 return;
128 }
129 super.checkIndentation();
130 }
131 }