private IfStatement createLoopTermination(Expression loopCondition) {
   IfStatement newIf = new IfStatement();
   newIf.setExpression(
       new PrefixExpression(
           typeEnv.resolveJavaType("boolean"),
           PrefixExpression.Operator.NOT,
           ParenthesizedExpression.parenthesize(loopCondition.copy())));
   newIf.setThenStatement(new BreakStatement());
   return newIf;
 }
 private void extractConditionalExpression(
     List<Statement> stmtList, ConditionalExpression conditional, List<VariableAccess> toExtract) {
   Expression condition = conditional.getExpression();
   Expression thenExpr = conditional.getThenExpression();
   Expression elseExpr = conditional.getElseExpression();
   List<VariableAccess> conditionAccesses = Lists.newArrayList();
   List<VariableAccess> thenAccesses = Lists.newArrayList();
   List<VariableAccess> elseAccesses = Lists.newArrayList();
   boolean needsExtraction = false;
   for (VariableAccess access : toExtract) {
     TreeNode node = access.expression;
     while (node.getParent() != conditional) {
       node = node.getParent();
     }
     if (node == condition) {
       conditionAccesses.add(access);
     } else if (node == thenExpr) {
       thenAccesses.add(access);
     } else if (node == elseExpr) {
       elseAccesses.add(access);
     } else {
       throw new AssertionError();
     }
     if (node != condition && access.isModification) {
       // We only need to extract an if-statement if there is a modification
       // that executes conditionally.
       needsExtraction = true;
     }
   }
   extractOrderedAccesses(stmtList, condition, conditionAccesses);
   // The recursive call might replace the condition child.
   condition = conditional.getExpression();
   if (needsExtraction) {
     IVariableBinding resultVar =
         new GeneratedVariableBinding(
             "unseq$" + count++,
             0,
             conditional.getTypeBinding(),
             false,
             false,
             null,
             currentMethod);
     conditional.replaceWith(new SimpleName(resultVar));
     stmtList.add(new VariableDeclarationStatement(resultVar, null));
     IfStatement newIf = new IfStatement();
     newIf.setExpression(condition.copy());
     stmtList.add(newIf);
     Block thenBlock = new Block();
     newIf.setThenStatement(thenBlock);
     List<Statement> thenStmts = thenBlock.getStatements();
     extractOrderedAccesses(thenStmts, thenExpr, thenAccesses);
     // The recursive call might replace the then expression child.
     thenExpr = conditional.getThenExpression();
     thenStmts.add(
         new ExpressionStatement(new Assignment(new SimpleName(resultVar), thenExpr.copy())));
     Block elseBlock = new Block();
     newIf.setElseStatement(elseBlock);
     List<Statement> elseStmts = elseBlock.getStatements();
     extractOrderedAccesses(elseStmts, elseExpr, elseAccesses);
     // The recursive call might replace the else expression child.
     elseExpr = conditional.getElseExpression();
     elseStmts.add(
         new ExpressionStatement(new Assignment(new SimpleName(resultVar), elseExpr.copy())));
   } else {
     extractOrderedAccesses(stmtList, thenExpr, thenAccesses);
     extractOrderedAccesses(stmtList, elseExpr, elseAccesses);
   }
 }