use of org.sonar.plugins.java.api.tree.ForStatementTree in project sonar-java by SonarSource.
the class JavaTreeModelTest method for_statement.
/**
* 14.14. The for Statement
*/
@Test
public void for_statement() {
ForStatementTree tree = (ForStatementTree) firstMethodFirstStatement("class T { void m() { for (int i = 0; i < 42; i ++) ; } }");
assertThat(tree.is(Tree.Kind.FOR_STATEMENT)).isTrue();
assertThat(tree.forKeyword().text()).isEqualTo("for");
assertThat(tree.openParenToken().text()).isEqualTo("(");
assertThat(tree.initializer()).hasSize(1);
assertThat(tree.initializer().get(0)).isInstanceOf(VariableTree.class);
assertThatChildrenIteratorHasSize(tree.initializer().get(0), 5);
assertThat(tree.firstSemicolonToken().text()).isEqualTo(";");
assertThat(tree.condition()).isNotNull();
assertThat(tree.secondSemicolonToken().text()).isEqualTo(";");
assertThat(tree.update()).isNotNull();
assertThat(tree.closeParenToken().text()).isEqualTo(")");
assertThat(tree.statement()).isNotNull();
assertThatChildrenIteratorHasSize(tree, 9);
tree = (ForStatementTree) firstMethodFirstStatement("class T { void m() { for (i = 0; i < 42; i ++) ; } }");
assertThat(tree.is(Tree.Kind.FOR_STATEMENT)).isTrue();
assertThat(tree.initializer()).hasSize(1);
assertThat(tree.initializer().get(0)).isInstanceOf(ExpressionStatementTree.class);
assertThat(tree.condition()).isNotNull();
assertThat(tree.update()).isNotNull();
assertThat(tree.statement()).isNotNull();
assertThatChildrenIteratorHasSize(tree, 9);
tree = (ForStatementTree) firstMethodFirstStatement("class T { void m() { for ( ; ; ) ; } }");
assertThat(tree.is(Tree.Kind.FOR_STATEMENT)).isTrue();
assertThat(tree.initializer()).isEmpty();
assertThat(tree.condition()).isNull();
assertThat(tree.update()).isEmpty();
assertThat(tree.statement()).isNotNull();
assertThatChildrenIteratorHasSize(tree, 8);
tree = (ForStatementTree) firstMethodFirstStatement("class T { void m() { for (i = 0, j = 1; i < 42; i++, j--) ; } }");
assertThat(tree.is(Tree.Kind.FOR_STATEMENT)).isTrue();
assertThat(tree.initializer()).hasSize(2);
assertThat(tree.initializer().separators()).hasSize(1);
assertThat(tree.condition()).isNotNull();
assertThat(tree.update()).hasSize(2);
assertThat(tree.update().separators()).hasSize(1);
assertThat(tree.statement()).isNotNull();
assertThatChildrenIteratorHasSize(tree, 9);
tree = (ForStatementTree) firstMethodFirstStatement("class T { void m() { for (int i = 0, j = 1; i < 42; i++, j--) ; } }");
assertThat(tree.is(Tree.Kind.FOR_STATEMENT)).isTrue();
assertThat(tree.initializer()).hasSize(2);
assertThat(tree.initializer().separators()).hasSize(0);
assertThat(tree.condition()).isNotNull();
assertThat(tree.update()).hasSize(2);
assertThat(tree.update().separators()).hasSize(1);
assertThat(tree.statement()).isNotNull();
assertThatChildrenIteratorHasSize(tree, 9);
}
use of org.sonar.plugins.java.api.tree.ForStatementTree in project sonar-java by SonarSource.
the class AbstractForLoopRule method visitNode.
@Override
public void visitNode(Tree tree) {
ForStatementTree forStatement = (ForStatementTree) tree;
visitForStatement(forStatement);
}
use of org.sonar.plugins.java.api.tree.ForStatementTree in project sonar-java by SonarSource.
the class ExplodedGraphWalker method handleBlockExit.
private void handleBlockExit(ProgramPoint programPosition) {
CFG.Block block = (CFG.Block) programPosition.block;
Tree terminator = block.terminator();
cleanUpProgramState(block);
boolean exitPath = node.exitPath;
if (terminator != null) {
switch(terminator.kind()) {
case IF_STATEMENT:
ExpressionTree ifCondition = ((IfStatementTree) terminator).condition();
handleBranch(block, cleanupCondition(ifCondition), verifyCondition(ifCondition));
return;
case CONDITIONAL_OR:
case CONDITIONAL_AND:
handleBranch(block, ((BinaryExpressionTree) terminator).leftOperand());
return;
case CONDITIONAL_EXPRESSION:
handleBranch(block, ((ConditionalExpressionTree) terminator).condition());
return;
case FOR_STATEMENT:
ExpressionTree condition = ((ForStatementTree) terminator).condition();
if (condition != null) {
handleBranch(block, condition, false);
return;
}
break;
case WHILE_STATEMENT:
ExpressionTree whileCondition = ((WhileStatementTree) terminator).condition();
handleBranch(block, cleanupCondition(whileCondition), verifyCondition(whileCondition));
return;
case DO_STATEMENT:
ExpressionTree doCondition = ((DoWhileStatementTree) terminator).condition();
handleBranch(block, cleanupCondition(doCondition), verifyCondition(doCondition));
return;
case SYNCHRONIZED_STATEMENT:
resetFieldValues(false);
break;
case RETURN_STATEMENT:
ExpressionTree returnExpression = ((ReturnStatementTree) terminator).expression();
if (returnExpression != null) {
programState.storeExitValue();
}
break;
case THROW_STATEMENT:
ProgramState.Pop unstack = programState.unstackValue(1);
SymbolicValue sv = unstack.values.get(0);
if (sv instanceof SymbolicValue.CaughtExceptionSymbolicValue) {
// retrowing the exception from a catch block
sv = ((SymbolicValue.CaughtExceptionSymbolicValue) sv).exception();
} else {
sv = constraintManager.createExceptionalSymbolicValue(((ThrowStatementTree) terminator).expression().symbolType());
}
programState = unstack.state.stackValue(sv);
programState.storeExitValue();
break;
default:
}
}
// unconditional jumps, for-statement, switch-statement, synchronized:
if (exitPath) {
if (block.exitBlock() != null) {
enqueue(new ProgramPoint(block.exitBlock()), programState, true);
} else {
for (CFG.Block successor : block.successors()) {
enqueue(new ProgramPoint(successor), programState, true);
}
}
} else {
for (CFG.Block successor : block.successors()) {
if (!block.isFinallyBlock() || isDirectFlowSuccessorOf(successor, block)) {
enqueue(new ProgramPoint(successor), programState, successor == block.exitBlock());
}
}
}
}
use of org.sonar.plugins.java.api.tree.ForStatementTree in project sonar-java by SonarSource.
the class MissingCurlyBracesCheck method visitNode.
@Override
public void visitNode(Tree tree) {
switch(tree.kind()) {
case WHILE_STATEMENT:
WhileStatementTree whileStatementTree = (WhileStatementTree) tree;
checkStatement(whileStatementTree.whileKeyword(), whileStatementTree.statement());
break;
case DO_STATEMENT:
DoWhileStatementTree doWhileStatementTree = (DoWhileStatementTree) tree;
checkStatement(doWhileStatementTree.doKeyword(), doWhileStatementTree.statement());
break;
case FOR_STATEMENT:
ForStatementTree forStatementTree = (ForStatementTree) tree;
checkStatement(forStatementTree.forKeyword(), forStatementTree.statement());
break;
case FOR_EACH_STATEMENT:
ForEachStatement forEachStatement = (ForEachStatement) tree;
checkStatement(forEachStatement.forKeyword(), forEachStatement.statement());
break;
case IF_STATEMENT:
checkIfStatement((IfStatementTree) tree);
break;
default:
break;
}
}
use of org.sonar.plugins.java.api.tree.ForStatementTree in project sonar-java by SonarSource.
the class MultilineBlocksCurlyBracesCheck method check.
private void check(StatementTree current, StatementTree previous) {
StatementTree block = null;
boolean condition = false;
if (previous.is(Tree.Kind.FOR_EACH_STATEMENT)) {
block = ((ForEachStatement) previous).statement();
} else if (previous.is(Tree.Kind.FOR_STATEMENT)) {
block = ((ForStatementTree) previous).statement();
} else if (previous.is(Tree.Kind.WHILE_STATEMENT)) {
block = ((WhileStatementTree) previous).statement();
} else if (previous.is(Tree.Kind.IF_STATEMENT)) {
block = getIfStatementLastBlock(previous);
condition = true;
}
if (block != null && !block.is(Tree.Kind.BLOCK)) {
SyntaxToken previousToken = block.firstToken();
int previousColumn = previousToken.column();
int previousLine = previousToken.line();
SyntaxToken currentToken = current.firstToken();
int currentColumn = currentToken.column();
int currentLine = currentToken.line();
if ((previousColumn == currentColumn && previousLine + 1 == currentLine) || (previousLine == previous.firstToken().line() && previous.firstToken().column() < currentColumn)) {
int lines = 1 + currentLine - previousLine;
context.reportIssue(this, current, getMessage(condition, lines));
}
}
}
Aggregations