private void maybeAddCast(Expression expr, ITypeBinding expectedType, boolean shouldCastFromId) { if (expr instanceof ConditionalExpression) { ConditionalExpression condExpr = (ConditionalExpression) expr; maybeAddCast(condExpr.getThenExpression(), expectedType, shouldCastFromId); maybeAddCast(condExpr.getElseExpression(), expectedType, shouldCastFromId); return; } if (needsCast(expr, expectedType, shouldCastFromId)) { addCast(expr); } }
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); } }