Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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 }