public class WhitespaceAroundCheck extends AbstractCheck
By default the check will check the following operators:
ASSERT
,
ASSIGN
,
BAND
,
BAND_ASSIGN
,
BOR
,
BOR_ASSIGN
,
BSR
,
BSR_ASSIGN
,
BXOR
,
BXOR_ASSIGN
,
COLON
,
DIV
,
DIV_ASSIGN
,
DO_WHILE
,
EQUAL
,
GE
,
GT
,
LAND
,
LCURLY
,
LE
,
LITERAL_CATCH
,
LITERAL_DO
,
LITERAL_ELSE
,
LITERAL_FINALLY
,
LITERAL_FOR
,
LITERAL_IF
,
LITERAL_RETURN
,
LITERAL_SWITCH
,
LITERAL_SYNCHRONIZED
,
LITERAL_TRY
,
LITERAL_WHILE
,
LOR
,
LT
,
MINUS
,
MINUS_ASSIGN
,
MOD
,
MOD_ASSIGN
,
NOT_EQUAL
,
PLUS
,
PLUS_ASSIGN
,
QUESTION
,
RCURLY
,
SL
,
SLIST
,
SL_ASSIGN
,
SR
,
SR_ASSIGN
,
STAR
,
STAR_ASSIGN
,
LITERAL_ASSERT
,
TYPE_EXTENSION_AND
.
An example of how to configure the check is:
<module name="WhitespaceAround"/>
An example of how to configure the check for whitespace only around assignment operators is:
<module name="WhitespaceAround"> <property name="tokens" value="ASSIGN,DIV_ASSIGN,PLUS_ASSIGN,MINUS_ASSIGN,STAR_ASSIGN, MOD_ASSIGN,SR_ASSIGN,BSR_ASSIGN,SL_ASSIGN,BXOR_ASSIGN, BOR_ASSIGN,BAND_ASSIGN"/> </module>
An example of how to configure the check for whitespace only around curly braces is:
<module name="WhitespaceAround"> <property name="tokens" value="LCURLY,RCURLY"/> </module>
In addition, this check can be configured to allow empty methods, types, for, while, do-while loops, lambdas and constructor bodies. For example:
public MyClass() {} // empty constructor
public void func() {} // empty method
public interface Foo {} // empty interface
public class Foo {} // empty class
public enum Foo {} // empty enum
MyClass c = new MyClass() {}; // empty anonymous class
while (i = 1) {} // empty while loop
for (int i = 1; i > 1; i++) {} // empty for loop
do {} while (i = 1); // empty do-while loop
Runnable noop = () -> {}; // empty lambda
public @interface Beta {} // empty annotation type
This check does not flag as violation double brace initialization like:
new Properties() {{ setProperty("key", "value"); }};
To configure the check to allow empty method blocks use
<property name="allowEmptyMethods" value="true" />
To configure the check to allow empty constructor blocks use
<property name="allowEmptyConstructors" value="true" />
To configure the check to allow empty type blocks use
<property name="allowEmptyTypes" value="true" />
To configure the check to allow empty loop blocks use
<property name="allowEmptyLoops" value="true" />
To configure the check to allow empty lambdas blocks use
<property name="allowEmptyLambdas" value="true" />
Also, this check can be configured to ignore the colon in an enhanced for loop. The colon in an enhanced for loop is ignored by default
To configure the check to ignore the colon
<property name="ignoreEnhancedForColon" value="true" />
Modifier and Type | Field and Description |
---|---|
private boolean |
allowEmptyCatches
Whether or not empty catch blocks are allowed.
|
private boolean |
allowEmptyConstructors
Whether or not empty constructor bodies are allowed.
|
private boolean |
allowEmptyLambdas
Whether or not empty lambda blocks are allowed.
|
private boolean |
allowEmptyLoops
Whether or not empty loops are allowed.
|
private boolean |
allowEmptyMethods
Whether or not empty method bodies are allowed.
|
private boolean |
allowEmptyTypes
Whether or not empty classes, enums and interfaces are allowed.
|
private boolean |
ignoreEnhancedForColon
Whether or not to ignore a colon in a enhanced for loop.
|
static java.lang.String |
MSG_WS_NOT_FOLLOWED
A key is pointing to the warning message text in "messages.properties"
file.
|
static java.lang.String |
MSG_WS_NOT_PRECEDED
A key is pointing to the warning message text in "messages.properties"
file.
|
Constructor and Description |
---|
WhitespaceAroundCheck() |
Modifier and Type | Method and Description |
---|---|
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 static boolean |
isAnonymousInnerClassEnd(int currentType,
char nextChar)
Check for "})" or "};" or "},".
|
private static boolean |
isArrayInitialization(int currentType,
int parentType)
Is array initialization.
|
private static boolean |
isColonOfCaseOrDefault(int currentType,
int parentType)
Whether colon belongs to cases or defaults.
|
private boolean |
isColonOfForEach(int currentType,
int parentType)
Whether colon belongs to for-each.
|
private boolean |
isEmptyBlock(DetailAST ast,
int parentType)
Is empty block.
|
private static boolean |
isEmptyBlock(DetailAST ast,
int parentType,
int match)
Tests if a given
DetailAST is part of an empty block. |
private boolean |
isEmptyCatch(DetailAST ast,
int parentType)
Tests if the given
DetailAst is part of an allowed empty
catch block. |
private boolean |
isEmptyCtorBlock(DetailAST ast,
int parentType)
Test if the given
DetailAST is part of an allowed empty
constructor (ctor) block. |
private boolean |
isEmptyLambda(DetailAST ast,
int parentType)
Test if the given
DetailAST is part of an allowed empty
lambda block. |
private boolean |
isEmptyLoop(DetailAST ast,
int parentType)
Checks if loop is empty.
|
private boolean |
isEmptyMethodBlock(DetailAST ast,
int parentType)
Test if the given
DetailAST is part of an allowed empty
method block. |
private static boolean |
isEmptyType(DetailAST ast)
Test if the given
DetailAST is part of an empty block. |
private boolean |
isNotRelevantSituation(DetailAST ast,
int currentType)
Is ast not a target of Check.
|
private static boolean |
isPartOfDoubleBraceInitializerForNextToken(DetailAST ast)
Check if given ast is part of double brace initializer and if it
should omit checking if next token is separated by whitespace.
|
private static boolean |
isPartOfDoubleBraceInitializerForPreviousToken(DetailAST ast)
Check if given ast is part of double brace initializer and if it
should omit checking if previous token is separated by whitespace.
|
void |
setAllowEmptyCatches(boolean allow)
Sets whether or not empty catch blocks are allowed.
|
void |
setAllowEmptyConstructors(boolean allow)
Sets whether or not empty constructor bodies are allowed.
|
void |
setAllowEmptyLambdas(boolean allow)
Sets whether or not empty lambdas bodies are allowed.
|
void |
setAllowEmptyLoops(boolean allow)
Sets whether or not empty loop bodies are allowed.
|
void |
setAllowEmptyMethods(boolean allow)
Sets whether or not empty method bodies are allowed.
|
void |
setAllowEmptyTypes(boolean allow)
Sets whether or not empty type bodies are allowed.
|
void |
setIgnoreEnhancedForColon(boolean ignore)
Sets whether or not to ignore the whitespace around the
colon in an enhanced for loop.
|
private static boolean |
shouldCheckSeparationFromNextToken(DetailAST ast,
char nextChar)
Check if it should be checked if next token is separated from current by
whitespace.
|
private static boolean |
shouldCheckSeparationFromPreviousToken(DetailAST ast)
Check if it should be checked if previous token is separated from current by
whitespace.
|
void |
visitToken(DetailAST ast)
Called to process a token.
|
beginTree, destroy, finishTree, getClassLoader, getFileContents, getLine, getLines, getTabWidth, getTokenNames, init, isCommentNodesRequired, leaveToken, log, log, setClassLoader, setFileContents, setMessages, setTabWidth, setTokens
getCustomMessages, getId, getMessageBundle, getSeverity, getSeverityLevel, log, setId, setSeverity
configure, contextualize, finishLocalSetup, getConfiguration, setupChild
public static final java.lang.String MSG_WS_NOT_PRECEDED
public static final java.lang.String MSG_WS_NOT_FOLLOWED
private boolean allowEmptyConstructors
private boolean allowEmptyMethods
private boolean allowEmptyTypes
private boolean allowEmptyLoops
private boolean allowEmptyLambdas
private boolean allowEmptyCatches
private boolean ignoreEnhancedForColon
public int[] getDefaultTokens()
AbstractCheck
getDefaultTokens
in class AbstractCheck
TokenTypes
public int[] getAcceptableTokens()
AbstractCheck
getAcceptableTokens
in class AbstractCheck
TokenTypes
public int[] getRequiredTokens()
AbstractCheck
getRequiredTokens
in class AbstractCheck
TokenTypes
public void setAllowEmptyMethods(boolean allow)
allow
- true
to allow empty method bodies.public void setAllowEmptyConstructors(boolean allow)
allow
- true
to allow empty constructor bodies.public void setIgnoreEnhancedForColon(boolean ignore)
ignore
- true
to ignore enhanced for colon.public void setAllowEmptyTypes(boolean allow)
allow
- true
to allow empty type bodies.public void setAllowEmptyLoops(boolean allow)
allow
- true
to allow empty loops bodies.public void setAllowEmptyLambdas(boolean allow)
allow
- true
to allow empty lambda expressions.public void setAllowEmptyCatches(boolean allow)
allow
- true
to allow empty catch blocks.public void visitToken(DetailAST ast)
AbstractCheck
visitToken
in class AbstractCheck
ast
- the token to processprivate boolean isNotRelevantSituation(DetailAST ast, int currentType)
ast
- astcurrentType
- type of astprivate static boolean shouldCheckSeparationFromPreviousToken(DetailAST ast)
ast
- current AST.private static boolean shouldCheckSeparationFromNextToken(DetailAST ast, char nextChar)
ast
- current AST.nextChar
- next character.private static boolean isAnonymousInnerClassEnd(int currentType, char nextChar)
currentType
- tokennextChar
- next symbolprivate boolean isEmptyBlock(DetailAST ast, int parentType)
ast
- astparentType
- parentprivate static boolean isEmptyBlock(DetailAST ast, int parentType, int match)
DetailAST
is part of an empty block.
An example empty block might look like the following
public void myMethod(int val) {}In the above, the method body is an empty block ("{}").
ast
- the DetailAST
to test.parentType
- the token type of ast
's parent.match
- the parent token type we're looking to match.true
if ast
makes up part of an
empty block contained under a match
token type
node.private static boolean isColonOfCaseOrDefault(int currentType, int parentType)
currentType
- currentparentType
- parentprivate boolean isColonOfForEach(int currentType, int parentType)
currentType
- currentparentType
- parentprivate static boolean isArrayInitialization(int currentType, int parentType)
currentType
- current tokenparentType
- parent tokenprivate boolean isEmptyMethodBlock(DetailAST ast, int parentType)
DetailAST
is part of an allowed empty
method block.ast
- the DetailAST
to test.parentType
- the token type of ast
's parent.true
if ast
makes up part of an
allowed empty method block.private boolean isEmptyCtorBlock(DetailAST ast, int parentType)
DetailAST
is part of an allowed empty
constructor (ctor) block.ast
- the DetailAST
to test.parentType
- the token type of ast
's parent.true
if ast
makes up part of an
allowed empty constructor block.private boolean isEmptyLoop(DetailAST ast, int parentType)
ast
- ast the DetailAST
to test.parentType
- the token type of ast
's parent.true
if ast
makes up part of an
allowed empty loop block.private boolean isEmptyLambda(DetailAST ast, int parentType)
DetailAST
is part of an allowed empty
lambda block.ast
- the DetailAST
to test.parentType
- the token type of ast
's parent.true
if ast
makes up part of an
allowed empty lambda block.private boolean isEmptyCatch(DetailAST ast, int parentType)
DetailAst
is part of an allowed empty
catch block.ast
- the DetailAst
to test.parentType
- the token type of ast
's parenttrue
if ast
makes up part of an
allowed empty catch block.private static boolean isEmptyType(DetailAST ast)
DetailAST
is part of an empty block.
An example empty block might look like the following
class Foo {}
ast
- ast the DetailAST
to test.true
if ast
makes up part of an
empty block contained under a match
token type
node.private static boolean isPartOfDoubleBraceInitializerForPreviousToken(DetailAST ast)
ast
- ast to checkprivate static boolean isPartOfDoubleBraceInitializerForNextToken(DetailAST ast)
ast
- ast to check