public class IndentationCheck extends AbstractCheck
Checks correct indentation of Java code.
The idea behind this is that while pretty printers are sometimes convenient for bulk reformats of legacy code, they often either aren't configurable enough or just can't anticipate how format should be done. Sometimes this is personal preference, other times it is practical experience. In any case, this check should just ensure that a minimal set of indentation rules is followed.
Basic offset indentation is used for indentation inside code blocks. For any lines that span more than 1, line wrapping indentation is used for those lines after the first. Brace adjustment, case, and throws indentations are all used only if those specific identifiers start the line. If, for example, a brace is used in the middle of the line, its indentation will not take effect. All indentations have an accumulative/recursive effect when they are triggered. If during a line wrapping, another code block is found and it doesn't end on that same line, then the subsequent lines afterwards, in that new code block, are increased on top of the line wrap and any indentations above it.
Example:
if ((condition1 && condition2) || (condition3 && condition4) // line wrap with bigger indentation ||!(condition5 && condition6)) { // line wrap with bigger indentation field.doSomething() // basic offset .doSomething() // line wrap .doSomething( c -> { // line wrap return c.doSome(); // basic offset }); }
basicOffset
- Specify how far new indentation level should be
indented when on the next line.
Type is int
.
Default value is 4
.
braceAdjustment
- Specify how far a braces should be indented
when on the next line.
Type is int
.
Default value is 0
.
caseIndent
- Specify how far a case label should be indented
when on next line.
Type is int
.
Default value is 4
.
throwsIndent
- Specify how far a throws clause should be
indented when on next line.
Type is int
.
Default value is 4
.
arrayInitIndent
- Specify how far an array initialisation
should be indented when on next line.
Type is int
.
Default value is 4
.
lineWrappingIndentation
- Specify how far continuation line
should be indented when line-wrapping is present.
Type is int
.
Default value is 4
.
forceStrictCondition
- Force strict indent level in line
wrapping case. If value is true, line wrap indent have to be same as
lineWrappingIndentation parameter. If value is false, line wrap indent
could be bigger on any value user would like.
Type is boolean
.
Default value is false
.
To configure the check for default behavior:
<module name="Indentation"/>
Example of Compliant code for default configuration (in comment name of property that controls indentations):
class Test { String field; // basicOffset int[] arr = { // basicOffset 5, // arrayInitIndent 6 }; // arrayInitIndent void bar() throws Exception // basicOffset { // braceAdjustment foo(); // basicOffset } // braceAdjustment void foo() { // basicOffset if ((cond1 && cond2) // basicOffset || (cond3 && cond4) // lineWrappingIndentation, forceStrictCondition ||!(cond5 && cond6)) { // lineWrappingIndentation, forceStrictCondition field.doSomething() // basicOffset .doSomething() // lineWrappingIndentation and forceStrictCondition .doSomething( c -> { // lineWrappingIndentation and forceStrictCondition return c.doSome(); // basicOffset }); } } void fooCase() // basicOffset throws Exception { // throwsIndent switch (field) { // basicOffset case "value" : bar(); // caseIndent } } }
To configure the check to enforce the indentation style recommended by Oracle:
<module name="Indentation"> <property name="caseIndent" value="0"/> </module>
Example of Compliant code for default configuration (in comment name of property that controls indentation):
void fooCase() { // basicOffset switch (field) { // basicOffset case "value" : bar(); // caseIndent } }
To configure the Check to enforce strict condition in line-wrapping validation.
<module name="Indentation"> <property name="forceStrictCondition" value="true"/> </module>
Such config doesn't allow next cases even code is aligned further to the right for better reading:
void foo(String aFooString, int aFooInt) { // indent:8 ; expected: 4; violation, because 8 != 4 if (cond1 || cond2) { field.doSomething() .doSomething(); } if ((cond1 && cond2) || (cond3 && cond4) // violation ||!(cond5 && cond6)) { // violation field.doSomething() .doSomething() // violation .doSomething( c -> { // violation return c.doSome(); }); } }
But if forceStrictCondition = false, this code is valid:
void foo(String aFooString, int aFooInt) { // indent:8 ; expected: > 4; ok, because 8 > 4 if (cond1 || cond2) { field.doSomething() .doSomething(); } if ((cond1 && cond2) || (cond3 && cond4) ||!(cond5 && cond6)) { field.doSomething() .doSomething() .doSomething( c -> { return c.doSome(); }); } }
Parent is com.puppycrawl.tools.checkstyle.TreeWalker
Violation Message Keys:
indentation.child.error
indentation.child.error.multi
indentation.error
indentation.error.multi
AutomaticBean.OutputStreamOptions
Modifier and Type | Field and Description |
---|---|
static String |
MSG_CHILD_ERROR
A key is pointing to the warning message text in "messages.properties"
file.
|
static String |
MSG_CHILD_ERROR_MULTI
A key is pointing to the warning message text in "messages.properties"
file.
|
static String |
MSG_ERROR
A key is pointing to the warning message text in "messages.properties"
file.
|
static String |
MSG_ERROR_MULTI
A key is pointing to the warning message text in "messages.properties"
file.
|
Constructor and Description |
---|
IndentationCheck() |
Modifier and Type | Method and Description |
---|---|
void |
beginTree(DetailAST ast)
Called before the starting to process a tree.
|
int[] |
getAcceptableTokens()
The configurable token set.
|
int |
getArrayInitIndent()
Getter to query how far an array initialisation should be indented when on next line.
|
int |
getBasicOffset()
Getter to query how far new indentation level should be indented when on the next line.
|
int |
getBraceAdjustment()
Getter to query how far a braces should be indented when on the next line.
|
int |
getCaseIndent()
Getter to query how far a case label should be indented when on next line.
|
int[] |
getDefaultTokens()
Returns the default token a check is interested in.
|
HandlerFactory |
getHandlerFactory()
Accessor for the handler factory.
|
int |
getIndentationTabWidth()
Get the width of a tab.
|
LineWrappingHandler |
getLineWrappingHandler()
Accessor for the line wrapping handler.
|
int |
getLineWrappingIndentation()
Getter to query how far continuation line should be indented when line-wrapping is present.
|
int[] |
getRequiredTokens()
The tokens that this check must be registered for.
|
int |
getThrowsIndent()
Getter to query how far a throws clause should be indented when on next line.
|
void |
indentationLog(DetailAST ast,
String key,
Object... args)
Log a violation message.
|
boolean |
isForceStrictCondition()
Getter to query strict indent level in line wrapping case.
|
void |
leaveToken(DetailAST ast)
Called after all the child nodes have been process.
|
void |
setArrayInitIndent(int arrayInitIndent)
Setter to specify how far an array initialisation should be indented when on next line.
|
void |
setBasicOffset(int basicOffset)
Setter to specify how far new indentation level should be indented when on the next line.
|
void |
setBraceAdjustment(int adjustmentAmount)
Setter to specify how far a braces should be indented when on the next line.
|
void |
setCaseIndent(int amount)
Setter to specify how far a case label should be indented when on next line.
|
void |
setForceStrictCondition(boolean value)
Setter to force strict indent level in line wrapping case.
|
void |
setLineWrappingIndentation(int lineWrappingIndentation)
Setter to specify how far continuation line should be indented when line-wrapping is present.
|
void |
setThrowsIndent(int throwsIndent)
Setter to specify how far a throws clause should be indented when on next line.
|
void |
visitToken(DetailAST ast)
Called to process a token.
|
clearMessages, destroy, finishTree, getFileContents, getLine, getLines, getMessages, getTabWidth, getTokenNames, init, isCommentNodesRequired, log, log, log, setFileContents, setTabWidth, setTokens
finishLocalSetup, getCustomMessages, getId, getMessageBundle, getSeverity, getSeverityLevel, setId, setSeverity
configure, contextualize, getConfiguration, setupChild
public static final String MSG_ERROR
public static final String MSG_ERROR_MULTI
public static final String MSG_CHILD_ERROR
public static final String MSG_CHILD_ERROR_MULTI
public IndentationCheck()
public boolean isForceStrictCondition()
public void setForceStrictCondition(boolean value)
value
- user's value of forceStrictCondition.public void setBasicOffset(int basicOffset)
basicOffset
- the number of tabs or spaces to indentpublic int getBasicOffset()
public void setBraceAdjustment(int adjustmentAmount)
adjustmentAmount
- the brace offsetpublic int getBraceAdjustment()
public void setCaseIndent(int amount)
amount
- the case indentation levelpublic int getCaseIndent()
public void setThrowsIndent(int throwsIndent)
throwsIndent
- the throws indentation levelpublic int getThrowsIndent()
public void setArrayInitIndent(int arrayInitIndent)
arrayInitIndent
- the array initialisation indentation levelpublic int getArrayInitIndent()
public int getLineWrappingIndentation()
public void setLineWrappingIndentation(int lineWrappingIndentation)
lineWrappingIndentation
- the line-wrapping indentation levelpublic void indentationLog(DetailAST ast, String key, Object... args)
ast
- the ast for which error to be loggedkey
- the message that describes the violationargs
- the details of the messageMessageFormat
public int getIndentationTabWidth()
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 beginTree(DetailAST ast)
AbstractCheck
beginTree
in class AbstractCheck
ast
- the root of the treepublic void visitToken(DetailAST ast)
AbstractCheck
visitToken
in class AbstractCheck
ast
- the token to processpublic void leaveToken(DetailAST ast)
AbstractCheck
leaveToken
in class AbstractCheck
ast
- the token leavingpublic LineWrappingHandler getLineWrappingHandler()
public final HandlerFactory getHandlerFactory()
Copyright © 2001–2020. All rights reserved.