public class FallThroughCheck extends AbstractCheck
Checks for fall-through in switch statements.
Finds locations where a case contains Java code but lacks a
break, return, throw or continue statement.
The check honors special comments to suppress the warning.
By default the texts
"fallthru", "fall thru", "fall-thru",
"fallthrough", "fall through", "fall-through"
"fallsthrough", "falls through", "falls-through" (case sensitive).
The comment containing these words must be all on one line,
and must be on the last non-empty line before the case triggering
the warning or on the same line before the case(ugly, but possible).
Note: The check assumes that there is no unreachable code in the case.
checkLastCaseGroup - Control whether the last case group must be checked.
Type is boolean.
Default value is false.
reliefPattern - Define the RegExp to match the relief comment that suppresses
the warning about a fall through.
Type is java.util.regex.Pattern.
Default value is "falls?[ -]?thr(u|ough)".
To configure the check:
<module name="FallThrough"/>
Example:
public void foo() throws Exception {
int i = 0;
while (i >= 0) {
switch (i) {
case 1:
i++;
case 2: // violation, previous case contains code but lacks
// break, return, throw or continue statement
i++;
break;
case 3: // OK
i++;
return;
case 4: // OK
i++;
throw new Exception();
case 5: // OK
i++;
continue;
case 6: // OK
case 7: // Previous case: OK, case does not contain code
// This case: OK, by default the last case might not have statement
// that transfer control
i++;
}
}
}
Example how to suppress violations by comment:
switch (i) {
case 1:
i++; // fall through
case 2: // OK
i++;
// fallthru
case 3: { // OK
i++;
}
/* fall-thru */
case 4: // OK
i++;
// Fallthru
case 5: // violation, "Fallthru" in case 4 should be "fallthru"
i++;
// fall through
i++;
case 6: // violation, the comment must be on the last non-empty line before 'case'
i++;
/* fall through */case 7: // OK, comment can appear on the same line but before 'case'
i++;
}
To configure the check to enable check for last case group:
<module name="FallThrough">
<property name="checkLastCaseGroup" value="true"/>
</module>
Example:
switch (i) {
case 1:
break;
case 2: // Previous case: OK
// This case: violation, last case must have statement that transfer control
i++;
}
To configure the check with custom relief pattern:
<module name="FallThrough">
<property name="reliefPattern" value="FALL?[ -]?THROUGH"/>
</module>
Example:
switch (i) {
case 1:
i++;
// FALL-THROUGH
case 2: // OK, "FALL-THROUGH" matches the regular expression "FALL?[ -]?THROUGH"
i++;
// fall-through
case 3: // violation, "fall-through" doesn't match
break;
}
Parent is com.puppycrawl.tools.checkstyle.TreeWalker
Violation Message Keys:
fall.through
fall.through.last
AutomaticBean.OutputStreamOptions| Modifier and Type | Field and Description |
|---|---|
private boolean |
checkLastCaseGroup
Control whether the last case group must be checked.
|
static java.lang.String |
MSG_FALL_THROUGH
A key is pointing to the warning message text in "messages.properties"
file.
|
static java.lang.String |
MSG_FALL_THROUGH_LAST
A key is pointing to the warning message text in "messages.properties"
file.
|
private java.util.regex.Pattern |
reliefPattern
Define the RegExp to match the relief comment that suppresses
the warning about a fall through.
|
| Constructor and Description |
|---|
FallThroughCheck() |
| Modifier and Type | Method and Description |
|---|---|
private boolean |
checkIf(DetailAST ast,
boolean useBreak,
boolean useContinue)
Checks if a given IF terminated by return, throw or,
if allowed break, continue.
|
private boolean |
checkLoop(DetailAST ast)
Checks if a given loop terminated by return, throw or,
if allowed break, continue.
|
private boolean |
checkSlist(DetailAST slistAst,
boolean useBreak,
boolean useContinue)
Checks if a given SLIST terminated by return, throw or,
if allowed break, continue.
|
private boolean |
checkSwitch(DetailAST literalSwitchAst,
boolean useContinue)
Checks if a given switch terminated by return, throw or,
if allowed break, continue.
|
private boolean |
checkSynchronized(DetailAST synchronizedAst,
boolean useBreak,
boolean useContinue)
Checks if a given synchronized block terminated by return, throw or,
if allowed break, continue.
|
private boolean |
checkTry(DetailAST ast,
boolean useBreak,
boolean useContinue)
Checks if a given try/catch/finally block terminated by return, throw or,
if allowed break, continue.
|
int[] |
getAcceptableTokens()
The configurable token set.
|
int[] |
getDefaultTokens()
Returns the default token a check is interested in.
|
int[] |
getRequiredTokens()
The tokens that this check must be registered for.
|
private boolean |
hasFallThroughComment(DetailAST currentCase,
DetailAST nextCase)
Determines if the fall through case between
currentCase and
nextCase is relieved by a appropriate comment. |
private boolean |
isTerminated(DetailAST ast,
boolean useBreak,
boolean useContinue)
Checks if a given subtree terminated by return, throw or,
if allowed break, continue.
|
private boolean |
matchesComment(java.util.regex.Pattern pattern,
java.lang.String line,
int lineNo)
Does a regular expression match on the given line and checks that a
possible match is within a comment.
|
void |
setCheckLastCaseGroup(boolean value)
Setter to control whether the last case group must be checked.
|
void |
setReliefPattern(java.util.regex.Pattern pattern)
Setter to define the RegExp to match the relief comment that suppresses
the warning about a fall through.
|
void |
visitToken(DetailAST ast)
Called to process a token.
|
beginTree, clearViolations, destroy, finishTree, getFileContents, getLine, getLineCodePoints, getLines, getTabWidth, getTokenNames, getViolations, init, isCommentNodesRequired, leaveToken, log, log, log, setFileContents, setTabWidth, setTokensfinishLocalSetup, getCustomMessages, getId, getMessageBundle, getSeverity, getSeverityLevel, setId, setSeverityconfigure, contextualize, getConfiguration, setupChildpublic static final java.lang.String MSG_FALL_THROUGH
public static final java.lang.String MSG_FALL_THROUGH_LAST
private boolean checkLastCaseGroup
private java.util.regex.Pattern reliefPattern
public FallThroughCheck()
public int[] getDefaultTokens()
AbstractCheckgetDefaultTokens in class AbstractCheckTokenTypespublic int[] getRequiredTokens()
AbstractCheckgetRequiredTokens in class AbstractCheckTokenTypespublic int[] getAcceptableTokens()
AbstractCheckgetAcceptableTokens in class AbstractCheckTokenTypespublic void setReliefPattern(java.util.regex.Pattern pattern)
pattern - The regular expression pattern.public void setCheckLastCaseGroup(boolean value)
value - new value of the property.public void visitToken(DetailAST ast)
AbstractCheckvisitToken in class AbstractCheckast - the token to processprivate boolean isTerminated(DetailAST ast, boolean useBreak, boolean useContinue)
ast - root of given subtreeuseBreak - should we consider break as terminator.useContinue - should we consider continue as terminator.private boolean checkSlist(DetailAST slistAst, boolean useBreak, boolean useContinue)
slistAst - SLIST to checkuseBreak - should we consider break as terminator.useContinue - should we consider continue as terminator.private boolean checkIf(DetailAST ast, boolean useBreak, boolean useContinue)
ast - IF to checkuseBreak - should we consider break as terminator.useContinue - should we consider continue as terminator.private boolean checkLoop(DetailAST ast)
ast - loop to checkprivate boolean checkTry(DetailAST ast, boolean useBreak, boolean useContinue)
ast - loop to checkuseBreak - should we consider break as terminator.useContinue - should we consider continue as terminator.private boolean checkSwitch(DetailAST literalSwitchAst, boolean useContinue)
literalSwitchAst - loop to checkuseContinue - should we consider continue as terminator.private boolean checkSynchronized(DetailAST synchronizedAst, boolean useBreak, boolean useContinue)
synchronizedAst - synchronized block to check.useBreak - should we consider break as terminator.useContinue - should we consider continue as terminator.private boolean hasFallThroughComment(DetailAST currentCase, DetailAST nextCase)
currentCase and
nextCase is relieved by a appropriate comment.currentCase - AST of the case that falls through to the next case.nextCase - AST of the next case.private boolean matchesComment(java.util.regex.Pattern pattern, java.lang.String line, int lineNo)
pattern - The regular expression pattern to use.line - The line of test to do the match on.lineNo - The line number in the file.Copyright © 2001-2022. All Rights Reserved.