RightCurlyCheck.java
| Index Score | ||
|---|---|---|
![]() |
![]() |
com.puppycrawl.tools.checkstyle.checks.blocks |
![]() |
![]() |
Checkstyle |
View: Reasons, Metrics, Source Code
These are the metrics that contribute to the Enerjy Score for this file, ranked by impact. So the metrics listed at the top influence the score to a greater extent that the metrics listed at the bottom.
| Metric | Description | |
|---|---|---|
////////////////////////////////////////////////////////////////////////////////
// checkstyle: Checks Java source code for adherence to a set of rules.
// Copyright (C) 2001-2007 Oliver Burn
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
////////////////////////////////////////////////////////////////////////////////
package com.puppycrawl.tools.checkstyle.checks.blocks;
import com.puppycrawl.tools.checkstyle.api.DetailAST;
import com.puppycrawl.tools.checkstyle.api.TokenTypes;
import com.puppycrawl.tools.checkstyle.api.Utils;
import com.puppycrawl.tools.checkstyle.checks.AbstractOptionCheck;
import com.puppycrawl.tools.checkstyle.checks.CheckUtils;
/**
* <p>
* Checks the placement of right curly braces.
* The policy to verify is specified using the {@link RightCurlyOption} class
* and defaults to {@link RightCurlyOption#SAME}.
* </p>
* <p> By default the check will check the following tokens:
* {@link TokenTypes#LITERAL_TRY LITERAL_TRY}.
* {@link TokenTypes#LITERAL_CATCH LITERAL_CATCH},
* {@link TokenTypes#LITERAL_FINALLY LITERAL_FINALLY}.
* {@link TokenTypes#LITERAL_IF LITERAL_IF},
* {@link TokenTypes#LITERAL_ELSE LITERAL_ELSE},
* </p>
* <p>
* An example of how to configure the check is:
* </p>
* <pre>
* <module name="RightCurly"/>
* </pre>
* <p>
* An example of how to configure the check with policy
* {@link RightCurlyOption#ALONE} for <code>else</code> tokens is:
* </p>
* <pre>
* <module name="RightCurly">
* <property name="tokens" value="LITERAL_ELSE"/>
* <property name="option" value="alone"/>
* </module>
* </pre>
*
* @author Oliver Burn
* @author lkuehne
* @author o_sukhodolsky
* @version 2.0
*/
public class RightCurlyCheck extends AbstractOptionCheck
{
/** Do we need to check if rculry starts line. */
private boolean mShouldStartLine = true;
/**
* Sets the right curly option to same.
*/
public RightCurlyCheck()
{
super(RightCurlyOption.SAME);
}
/**
* Does the check need to check if rcurly starts line.
* @param aFlag new value of this property.
*/
public void setShouldStartLine(boolean aFlag)
{
mShouldStartLine = aFlag;
}
/** {@inheritDoc} */
public int[] getDefaultTokens()
{
return new int[] {
TokenTypes.LITERAL_TRY,
TokenTypes.LITERAL_CATCH,
TokenTypes.LITERAL_FINALLY,
TokenTypes.LITERAL_IF,
TokenTypes.LITERAL_ELSE,
};
}
/** {@inheritDoc} */
public void visitToken(DetailAST aAST)
{
// Attempt to locate the tokens to do the check
DetailAST rcurly;
DetailAST lcurly;
DetailAST nextToken;
boolean shouldCheckLastRcurly = false;
switch (aAST.getType()) {
case TokenTypes.LITERAL_TRY:
lcurly = (DetailAST) aAST.getFirstChild();
nextToken = (DetailAST) lcurly.getNextSibling();
rcurly = lcurly.getLastChild();
break;
case TokenTypes.LITERAL_CATCH:
nextToken = (DetailAST) aAST.getNextSibling();
lcurly = aAST.getLastChild();
rcurly = lcurly.getLastChild();
if (nextToken == null) {
shouldCheckLastRcurly = true;
nextToken = getNextToken(aAST);
}
break;
case TokenTypes.LITERAL_IF:
nextToken = aAST.findFirstToken(TokenTypes.LITERAL_ELSE);
if (nextToken != null) {
lcurly = nextToken.getPreviousSibling();
rcurly = lcurly.getLastChild();
}
else {
shouldCheckLastRcurly = true;
nextToken = getNextToken(aAST);
lcurly = aAST.getLastChild();
rcurly = lcurly.getLastChild();
}
break;
case TokenTypes.LITERAL_ELSE:
shouldCheckLastRcurly = true;
nextToken = getNextToken(aAST);
lcurly = (DetailAST) aAST.getFirstChild();
rcurly = lcurly.getLastChild();
break;
case TokenTypes.LITERAL_FINALLY:
shouldCheckLastRcurly = true;
nextToken = getNextToken(aAST);
lcurly = (DetailAST) aAST.getFirstChild();
rcurly = lcurly.getLastChild();
break;
default:
throw new RuntimeException("Unexpected token type ("
+ TokenTypes.getTokenName(aAST.getType()) + ")");
}
if ((rcurly == null) || (rcurly.getType() != TokenTypes.RCURLY)) {
// we need to have both tokens to perform the check
return;
}
if (shouldCheckLastRcurly) {
if (rcurly.getLineNo() == nextToken.getLineNo()) {
log(rcurly, "line.alone", "}");
}
}
else if ((getAbstractOption() == RightCurlyOption.SAME)
&& (rcurly.getLineNo() != nextToken.getLineNo()))
{
log(rcurly, "line.same", "}");
}
else if ((getAbstractOption() == RightCurlyOption.ALONE)
&& (rcurly.getLineNo() == nextToken.getLineNo()))
{
log(rcurly, "line.alone", "}");
}
if (!mShouldStartLine) {
return;
}
final boolean startsLine =
Utils.whitespaceBefore(rcurly.getColumnNo(),
getLines()[rcurly.getLineNo() - 1]);
if (!startsLine && (lcurly.getLineNo() != rcurly.getLineNo())) {
log(rcurly, "line.new", "}");
}
}
/**
* Finds next token after the given one.
* @param aAST the given node.
* @return the token which represents next lexical item.
*/
private DetailAST getNextToken(DetailAST aAST)
{
DetailAST next = null;
DetailAST parent = aAST;
while ((parent != null) && (next == null)) {
next = (DetailAST) parent.getNextSibling();
parent = parent.getParent();
}
return CheckUtils.getFirstNode(next);
}
}
The table below shows all metrics for RightCurlyCheck.java.
| Metric | Value | Description | |
|---|---|---|---|



