use of com.google.devtools.j2objc.ast.SimpleName in project j2objc by google.
the class UnsequencedExpressionRewriter method visit.
@Override
public boolean visit(AssertStatement node) {
Expression expr = node.getExpression();
visitAndExtract(expr, node);
Expression msg = node.getMessage();
if (msg != null) {
newExpression(msg);
msg.accept(this);
List<VariableAccess> toExtract = getUnsequencedAccesses();
if (!toExtract.isEmpty()) {
// If the message expression needs any extraction, then we first extract
// the entire boolean expression to preserve ordering between the two.
VariableElement exprVar = GeneratedVariableElement.newLocalVar("unseq$" + count++, expr.getTypeMirror(), currentMethod);
TreeUtil.insertBefore(node, new VariableDeclarationStatement(exprVar, node.getExpression().copy()));
node.setExpression(new SimpleName(exprVar));
extractOrderedAccesses(TreeUtil.asStatementList(node).subList(0, 0), currentTopNode, toExtract);
}
}
return false;
}
use of com.google.devtools.j2objc.ast.SimpleName in project j2objc by google.
the class UnsequencedExpressionRewriter method extractConditionalExpression.
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) {
// We need to extract an if-statement if there is an access that
// executes conditionally.
needsExtraction = true;
}
}
extractOrderedAccesses(stmtList, condition, conditionAccesses);
// The recursive call might replace the condition child.
condition = conditional.getExpression();
if (needsExtraction) {
VariableElement resultVar = GeneratedVariableElement.newLocalVar("unseq$" + count++, conditional.getTypeMirror(), 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);
}
}
use of com.google.devtools.j2objc.ast.SimpleName in project j2objc by google.
the class GwtConverter method visit.
@Override
public boolean visit(MethodInvocation node) {
ExecutableElement method = node.getExecutableElement();
List<Expression> args = node.getArguments();
if (ElementUtil.getName(method).equals("create") && ElementUtil.getQualifiedName(ElementUtil.getDeclaringClass(method)).equals(GWT_CLASS) && args.size() == 1) {
// Convert GWT.create(Foo.class) to Foo.class.newInstance().
ExecutableElement newMethod = ElementUtil.findMethod(typeUtil.getJavaClass(), "newInstance");
node.setName(new SimpleName(newMethod));
Expression clazz = args.remove(0);
node.setExpression(clazz);
node.setExecutablePair(new ExecutablePair(newMethod));
} else if (isGwtTest(node)) {
node.replaceWith(new BooleanLiteral(false, typeUtil));
}
return true;
}
use of com.google.devtools.j2objc.ast.SimpleName in project j2objc by google.
the class JavaCloneWriter method createVolatileCloneStatement.
private Statement createVolatileCloneStatement(VariableElement var, VariableElement originalVar, boolean isWeak) {
TypeMirror voidType = typeUtil.getVoid();
TypeMirror pointerType = new PointerType(var.asType());
String funcName = "JreCloneVolatile" + (isWeak ? "" : "Strong");
FunctionElement element = new FunctionElement(funcName, voidType, null).addParameters(pointerType, pointerType);
FunctionInvocation invocation = new FunctionInvocation(element, voidType);
invocation.addArgument(new PrefixExpression(pointerType, PrefixExpression.Operator.ADDRESS_OF, new SimpleName(var)));
invocation.addArgument(new PrefixExpression(pointerType, PrefixExpression.Operator.ADDRESS_OF, new FieldAccess(var, new SimpleName(originalVar))));
return new ExpressionStatement(invocation);
}
use of com.google.devtools.j2objc.ast.SimpleName in project j2objc by google.
the class LabelRewriter method endVisit.
@Override
public void endVisit(LabeledStatement node) {
Statement loopBody = getLoopBody(node.getBody());
final String labelIdentifier = node.getLabel().getIdentifier();
final boolean[] hasContinue = new boolean[1];
final boolean[] hasBreak = new boolean[1];
node.accept(new TreeVisitor() {
@Override
public void endVisit(ContinueStatement node) {
if (node.getLabel() != null && node.getLabel().getIdentifier().equals(labelIdentifier)) {
hasContinue[0] = true;
node.setLabel(new SimpleName("continue_" + labelIdentifier));
}
}
@Override
public void endVisit(BreakStatement node) {
if (node.getLabel() != null && node.getLabel().getIdentifier().equals(labelIdentifier)) {
hasBreak[0] = true;
node.setLabel(new SimpleName("break_" + labelIdentifier));
}
}
});
if (hasContinue[0]) {
assert loopBody != null : "Continue statements must be inside a loop.";
LabeledStatement newLabelStmt = new LabeledStatement("continue_" + labelIdentifier);
newLabelStmt.setBody(new EmptyStatement());
// Put the loop body into an inner block so the continue label is outside
// the scope of any variable initializations.
Block newBlock = new Block();
loopBody.replaceWith(newBlock);
newBlock.addStatement(loopBody);
newBlock.addStatement(newLabelStmt);
}
if (hasBreak[0]) {
LabeledStatement newLabelStmt = new LabeledStatement("break_" + labelIdentifier);
newLabelStmt.setBody(new EmptyStatement());
TreeUtil.insertAfter(node, newLabelStmt);
}
if (hasContinue[0] || hasBreak[0]) {
// Replace this node with its statement, thus deleting the label.
node.replaceWith(TreeUtil.remove(node.getBody()));
}
}
Aggregations