Skip to content

Commit

Permalink
Issue checkstyle#6308: made IndentLevel immutable
Browse files Browse the repository at this point in the history
  • Loading branch information
rnveach committed Dec 22, 2018
1 parent 4974cf9 commit fd560ad
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ protected DetailAST getLeftCurly() {
@Override
protected IndentLevel curlyIndent() {
final IndentLevel level = new IndentLevel(getIndent(), getBraceAdjustment());
level.addAcceptedIndent(level.getLastIndentLevel() + getLineWrappingIndentation());
return level;
return IndentLevel.addAcceptable(level, level.getLastIndentLevel()
+ getLineWrappingIndentation());
}

@Override
Expand All @@ -91,7 +91,7 @@ protected DetailAST getListChild() {

@Override
protected IndentLevel getChildrenExpectedIndent() {
final IndentLevel expectedIndent =
IndentLevel expectedIndent =
new IndentLevel(getIndent(), getIndentCheck().getArrayInitIndent(),
getIndentCheck().getLineWrappingIndentation());

Expand All @@ -100,8 +100,8 @@ protected IndentLevel getChildrenExpectedIndent() {
final int firstChildPos =
getNextFirstNonBlankOnLineAfter(firstLine, lcurlyPos);
if (firstChildPos >= 0) {
expectedIndent.addAcceptedIndent(firstChildPos);
expectedIndent.addAcceptedIndent(lcurlyPos + getLineWrappingIndentation());
expectedIndent = IndentLevel.addAcceptable(expectedIndent, firstChildPos, lcurlyPos
+ getLineWrappingIndentation());
}
return expectedIndent;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -264,8 +264,8 @@ protected IndentLevel getChildrenExpectedIndent() {
}
else if (isOnStartOfLine(getRightCurly())) {
final IndentLevel level = new IndentLevel(curlyIndent(), getBasicOffset());
level.addAcceptedIndent(level.getFirstIndentLevel() + getLineWrappingIndent());
indentLevel = level;
indentLevel = IndentLevel.addAcceptable(level, level.getFirstIndentLevel()
+ getLineWrappingIndent());
}
}
return indentLevel;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,20 @@
/**
* Encapsulates representation of notion of expected indentation levels.
* Provide a way to have multiple acceptable levels.
*
* This class is immutable.
*/
public class IndentLevel {

/** Set of acceptable indentation levels. */
private final BitSet levels = new BitSet();

/**
* Creates new instance with no acceptable indentation level.
* This is only used internally to combine multiple levels.
*/
private IndentLevel() {
}

/**
* Creates new instance with one acceptable indentation level.
* @param indent acceptable indentation level.
Expand Down Expand Up @@ -83,19 +90,29 @@ public boolean isGreaterThan(int indent) {
}

/**
* Adds one more acceptable indentation level.
* @param indent new acceptable indentation.
* Adds one or more acceptable indentation level.
* @param base class to add new indentations to.
* @param additions new acceptable indentation.
*/
public void addAcceptedIndent(int indent) {
levels.set(indent);
public static IndentLevel addAcceptable(IndentLevel base, int... additions) {
final IndentLevel result = new IndentLevel();
result.levels.or(base.levels);
for (int addition : additions) {
result.levels.set(addition);
}
return result;
}

/**
* Adds one more acceptable indentation level.
* @param indent new acceptable indentation.
* Combines 2 acceptable indentation level classes.
* @param base class to add new indentations to.
* @param addition new acceptable indentation.
*/
public void addAcceptedIndent(IndentLevel indent) {
levels.or(indent.levels);
public static IndentLevel addAcceptable(IndentLevel base, IndentLevel addition) {
final IndentLevel result = new IndentLevel();
result.levels.or(base.levels);
result.levels.or(addition.levels);
return result;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,7 @@ public LabelHandler(IndentationCheck indentCheck,
@Override
protected IndentLevel getIndentImpl() {
final IndentLevel level = new IndentLevel(super.getIndentImpl(), -getBasicOffset());
level.addAcceptedIndent(super.getIndentImpl());
return level;
return IndentLevel.addAcceptable(level, super.getIndentImpl());
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,22 +166,22 @@ public IndentLevel getSuggestedChildIndent(AbstractExpressionHandler child) {
// will not have the right line num, so just get the child name

final DetailAST ident = getMethodIdentAst();
final DetailAST rparen = getMainAst().findFirstToken(TokenTypes.RPAREN);
IndentLevel suggestedLevel = new IndentLevel(getLineStart(ident));
if (!areOnSameLine(child.getMainAst().getFirstChild(), ident)) {
suggestedLevel = new IndentLevel(suggestedLevel,
getBasicOffset(),
getIndentCheck().getLineWrappingIndentation());
}

// If the right parenthesis is at the start of a line;
// include line wrapping in suggested indent level.
final DetailAST rparen = getMainAst().findFirstToken(TokenTypes.RPAREN);
if (getLineStart(rparen) == rparen.getColumnNo()) {
suggestedLevel.addAcceptedIndent(new IndentLevel(
suggestedLevel = IndentLevel.addAcceptable(suggestedLevel, new IndentLevel(
getParent().getSuggestedChildIndent(this),
getIndentCheck().getLineWrappingIndentation()
));
}
else if (!areOnSameLine(child.getMainAst().getFirstChild(), ident)) {
suggestedLevel = new IndentLevel(suggestedLevel,
getBasicOffset(),
getIndentCheck().getLineWrappingIndentation());
}

return suggestedLevel;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ protected IndentLevel getIndentImpl() {
final DetailAST parentAST = getMainAst().getParent();
IndentLevel indent = getParent().getIndent();
if (parentAST.getType() == TokenTypes.LITERAL_NEW) {
indent.addAcceptedIndent(super.getIndentImpl());
indent = IndentLevel.addAcceptable(indent, super.getIndentImpl());
}
else if (parentAST.getType() == TokenTypes.ENUM_CONSTANT_DEF) {
indent = super.getIndentImpl();
Expand All @@ -89,8 +89,8 @@ public void checkIndentation() {
@Override
protected IndentLevel curlyIndent() {
final IndentLevel indent = super.curlyIndent();
indent.addAcceptedIndent(indent.getFirstIndentLevel() + getLineWrappingIndentation());
return indent;
return IndentLevel.addAcceptable(indent, indent.getFirstIndentLevel()
+ getLineWrappingIndentation());
}

/**
Expand Down

0 comments on commit fd560ad

Please sign in to comment.