public void visitForStatement(GrForStatement forStatement) {
    final GrForClause clause = forStatement.getClause();

    processForLoopInitializer(clause);

    InstructionImpl start = startNode(forStatement);

    addForLoopBreakingEdge(forStatement, clause);

    flushForeachLoopVariable(clause);

    final GrStatement body = forStatement.getBody();
    if (body != null) {
      InstructionImpl bodyInstruction = startNode(body);
      body.accept(this);
      finishNode(bodyInstruction);
    }
    checkPending(start); // check for breaks targeted here

    if (clause instanceof GrTraditionalForClause) {
      acceptNullable(((GrTraditionalForClause) clause).getUpdate());
    }
    if (myHead != null) addEdge(myHead, start); // loop
    interruptFlow();

    finishNode(start);
  }
 private static boolean forInStatementsAreEquivalent(
     @NotNull GrForStatement statement1, @NotNull GrForStatement statement2) {
   final GrForClause clause1 = statement1.getClause();
   final GrForClause clause2 = statement2.getClause();
   if (!forClausesAreEquivalent(clause1, clause2)) {
     return false;
   }
   final GrStatement body1 = statement1.getBody();
   final GrStatement body2 = statement2.getBody();
   return statementsAreEquivalent(body1, body2);
 }