use of com.google.devtools.j2objc.ast.ExpressionStatement in project j2objc by google.
the class UnsequencedExpressionRewriter method extractInfixConditional.
private void extractInfixConditional(List<Statement> stmtList, InfixExpression conditional, List<VariableAccess> toExtract) {
InfixExpression.Operator op = conditional.getOperator();
List<Expression> branches = conditional.getOperands();
int lastIfExtractIdx = 0;
VariableElement conditionalVar = null;
int lastExtracted = 0;
Expression lastBranch = null;
for (int i = 0; i < toExtract.size(); i++) {
VariableAccess access = toExtract.get(i);
TreeNode node = access.expression;
while (node.getParent() != conditional) {
node = node.getParent();
}
assert node instanceof Expression;
Expression branch = (Expression) node;
// Extract all accesses from the previous branch.
if (lastBranch != null && branch != lastBranch) {
extractOrderedAccesses(stmtList, lastBranch, toExtract.subList(lastExtracted, i));
lastExtracted = i;
}
lastBranch = branch;
// If there's a new access in a new branch, then we extract an if-statement.
if (branch != branches.get(lastIfExtractIdx)) {
TypeMirror boolType = typeUtil.getBoolean();
if (conditionalVar == null) {
conditionalVar = GeneratedVariableElement.newLocalVar("unseq$" + count++, boolType, currentMethod);
conditional.replaceWith(new SimpleName(conditionalVar));
stmtList.add(new VariableDeclarationStatement(conditionalVar, null));
}
List<Expression> subBranches = branches.subList(lastIfExtractIdx, branches.indexOf(branch));
IfStatement newIf = new IfStatement();
Expression ifExpr = new Assignment(new SimpleName(conditionalVar), conditionalFromSubBranches(subBranches, op));
if (op == InfixExpression.Operator.CONDITIONAL_OR) {
ifExpr = new PrefixExpression(boolType, PrefixExpression.Operator.NOT, ParenthesizedExpression.parenthesize(ifExpr));
}
newIf.setExpression(ifExpr);
stmtList.add(newIf);
Block thenBlock = new Block();
stmtList = thenBlock.getStatements();
newIf.setThenStatement(thenBlock);
lastIfExtractIdx = branches.indexOf(branch);
}
}
extractOrderedAccesses(stmtList, lastBranch, toExtract.subList(lastExtracted, toExtract.size()));
if (conditionalVar != null) {
List<Expression> remainingBranches = Lists.newArrayList();
remainingBranches.add(new SimpleName(conditionalVar));
remainingBranches.addAll(branches.subList(lastIfExtractIdx, branches.size()));
stmtList.add(new ExpressionStatement(new Assignment(new SimpleName(conditionalVar), conditionalFromSubBranches(remainingBranches, op))));
}
}
use of com.google.devtools.j2objc.ast.ExpressionStatement in project j2objc by google.
the class UnsequencedExpressionRewriter method extractExpressionList.
private void extractExpressionList(List<Expression> expressions, List<Statement> stmtList, boolean extractModifiedExpression) {
for (int i = 0; i < expressions.size(); i++) {
Expression expr = expressions.get(i);
newExpression(expr);
expr.accept(this);
List<VariableAccess> unsequencedAccesses = getUnsequencedAccesses();
if (!unsequencedAccesses.isEmpty()) {
for (int j = 0; j < i; j++) {
stmtList.add(new ExpressionStatement(expressions.get(j).copy()));
}
expressions.subList(0, i).clear();
extractOrderedAccesses(stmtList, currentTopNode, unsequencedAccesses);
i = 0;
if (extractModifiedExpression) {
stmtList.add(new ExpressionStatement(expressions.get(0).copy()));
expressions.remove(0);
i = -1;
}
}
}
}
use of com.google.devtools.j2objc.ast.ExpressionStatement in project j2objc by google.
the class JavaCloneWriter method createReleaseStatement.
private Statement createReleaseStatement(VariableElement var) {
if (options.useARC()) {
TypeMirror voidType = typeUtil.getVoid();
FunctionElement element = new FunctionElement("JreRelease", voidType, null).addParameters(TypeUtil.ID_TYPE);
FunctionInvocation invocation = new FunctionInvocation(element, voidType);
invocation.addArgument(new SimpleName(var));
return new ExpressionStatement(invocation);
} else {
return new ExpressionStatement(new MethodInvocation(new ExecutablePair(releaseMethod), new SimpleName(var)));
}
}
use of com.google.devtools.j2objc.ast.ExpressionStatement in project j2objc by google.
the class JavaCloneWriter method endVisit.
@Override
public void endVisit(TypeDeclaration node) {
TypeElement type = node.getTypeElement();
VariableElement originalVar = GeneratedVariableElement.newParameter("original", type.asType(), null);
List<Statement> adjustments = getFieldAdjustments(node, originalVar);
if (adjustments.isEmpty()) {
return;
}
TypeMirror voidType = typeUtil.getVoid();
ExecutableElement javaCloneElement = GeneratedExecutableElement.newMethodWithSelector(JAVA_CLONE_METHOD, voidType, type).addParameter(originalVar);
MethodDeclaration declaration = new MethodDeclaration(javaCloneElement);
declaration.setHasDeclaration(false);
node.addBodyDeclaration(declaration);
declaration.addParameter(new SingleVariableDeclaration(originalVar));
Block body = new Block();
declaration.setBody(body);
List<Statement> statements = body.getStatements();
ExecutableElement javaCloneSuperElement = GeneratedExecutableElement.newMethodWithSelector(JAVA_CLONE_METHOD, voidType, typeUtil.getJavaObject());
SuperMethodInvocation superCall = new SuperMethodInvocation(new ExecutablePair(javaCloneSuperElement));
superCall.addArgument(new SimpleName(originalVar));
statements.add(new ExpressionStatement(superCall));
statements.addAll(adjustments);
}
use of com.google.devtools.j2objc.ast.ExpressionStatement in project j2objc by google.
the class CastResolver method endVisit.
/**
* Adds a cast check to compareTo methods. This helps Comparable types behave
* well in sorted collections which rely on Java's runtime type checking.
*/
@Override
public void endVisit(MethodDeclaration node) {
ExecutableElement element = node.getExecutableElement();
if (!ElementUtil.getName(element).equals("compareTo") || node.getBody() == null) {
return;
}
DeclaredType comparableType = typeUtil.findSupertype(ElementUtil.getDeclaringClass(element).asType(), "java.lang.Comparable");
if (comparableType == null) {
return;
}
List<? extends TypeMirror> typeArguments = comparableType.getTypeArguments();
List<? extends VariableElement> parameters = element.getParameters();
if (typeArguments.size() != 1 || parameters.size() != 1 || !typeArguments.get(0).equals(parameters.get(0).asType())) {
return;
}
VariableElement param = node.getParameter(0).getVariableElement();
FunctionInvocation castCheck = createCastCheck(typeArguments.get(0), new SimpleName(param));
if (castCheck != null) {
node.getBody().addStatement(0, new ExpressionStatement(castCheck));
}
}
Aggregations