use of com.google.devtools.j2objc.ast.VariableDeclarationExpression in project j2objc by google.
the class TreeConverter method convertVariableExpression.
private VariableDeclarationExpression convertVariableExpression(VariableTree node, TreePath parent) {
TreePath path = getTreePath(parent, node);
VariableElement element = (VariableElement) getElement(path);
boolean isVarargs = (((JCVariableDecl) node).sym.flags() & Flags.VARARGS) > 0;
Type newType = convertType(getTypeMirror(path), getPosition(node), isVarargs);
VariableDeclarationFragment fragment = new VariableDeclarationFragment();
fragment.setVariableElement(element).setInitializer((Expression) convert(node.getInitializer(), path));
return new VariableDeclarationExpression().setType(newType).addFragment(fragment);
}
use of com.google.devtools.j2objc.ast.VariableDeclarationExpression in project j2objc by google.
the class TreeConverter method convertForLoop.
private TreeNode convertForLoop(JCTree.JCForLoop node) {
ForStatement newNode = new ForStatement().setExpression((Expression) convert(node.getCondition())).setBody((Statement) convert(node.getStatement()));
VariableDeclarationExpression lastVar = null;
for (JCTree.JCStatement initializer : node.getInitializer()) {
if (initializer.getKind() == Kind.VARIABLE) {
JCTree.JCVariableDecl var = (JCTree.JCVariableDecl) initializer;
VariableDeclarationExpression newVar = convertVariableExpression(var);
if (lastVar == null) {
newNode.addInitializer(newVar);
lastVar = newVar;
} else {
lastVar.addFragment(TreeUtil.remove(newVar.getFragment(0)));
}
} else {
assert initializer.getKind() == Kind.EXPRESSION_STATEMENT;
newNode.addInitializer((Expression) convert(((JCTree.JCExpressionStatement) initializer).getExpression()));
}
}
for (JCTree.JCExpressionStatement updater : node.getUpdate()) {
newNode.addUpdater((Expression) convert(updater.getExpression()));
}
return newNode;
}
use of com.google.devtools.j2objc.ast.VariableDeclarationExpression in project j2objc by google.
the class MethodTranslator method visitForStatement.
@Override
public TreeNode visitForStatement(com.strobel.decompiler.languages.java.ast.ForStatement node, Void data) {
ForStatement forStatement = new ForStatement();
for (com.strobel.decompiler.languages.java.ast.Statement init : node.getInitializers()) {
TreeNode stmt = init.acceptVisitor(this, null);
if (stmt instanceof VariableDeclarationStatement) {
VariableDeclarationStatement varDeclStmt = (VariableDeclarationStatement) stmt;
VariableDeclarationExpression varDeclExpr = new VariableDeclarationExpression().setType(Type.newType(varDeclStmt.getTypeMirror()));
for (VariableDeclarationFragment varFrag : varDeclStmt.getFragments()) {
varDeclExpr.addFragment(varFrag.copy());
}
forStatement.addInitializer(varDeclExpr);
} else {
forStatement.addInitializer(((ExpressionStatement) stmt).getExpression().copy());
}
}
forStatement.setExpression((Expression) node.getCondition().acceptVisitor(this, null));
for (com.strobel.decompiler.languages.java.ast.Statement updater : node.getIterators()) {
TreeNode stmt = updater.acceptVisitor(this, null);
forStatement.addUpdater(((ExpressionStatement) stmt).getExpression().copy());
}
forStatement.setBody((Statement) node.getEmbeddedStatement().acceptVisitor(this, null));
return forStatement;
}
use of com.google.devtools.j2objc.ast.VariableDeclarationExpression in project j2objc by google.
the class TreeConverter method convertForLoop.
private TreeNode convertForLoop(ForLoopTree node, TreePath parent) {
TreePath path = getTreePath(parent, node);
ForStatement newNode = new ForStatement().setExpression((Expression) convert(node.getCondition(), path)).setBody((Statement) convert(node.getStatement(), path));
VariableDeclarationExpression lastVar = null;
for (StatementTree initializer : node.getInitializer()) {
if (initializer.getKind() == Kind.VARIABLE) {
VariableTree var = (VariableTree) initializer;
VariableDeclarationExpression newVar = convertVariableExpression(var, path);
if (lastVar == null) {
newNode.addInitializer(newVar);
lastVar = newVar;
} else {
lastVar.addFragment(TreeUtil.remove(newVar.getFragment(0)));
}
} else {
assert initializer.getKind() == Kind.EXPRESSION_STATEMENT;
TreePath initializerPath = getTreePath(path, initializer);
TreeNode expr = convert(((ExpressionStatementTree) initializer).getExpression(), initializerPath);
newNode.addInitializer((Expression) expr);
}
}
for (ExpressionStatementTree updater : node.getUpdate()) {
newNode.addUpdater((Expression) convert(updater.getExpression(), getTreePath(path, updater)));
}
return newNode;
}
use of com.google.devtools.j2objc.ast.VariableDeclarationExpression in project j2objc by google.
the class Rewriter method visit.
@Override
public boolean visit(TryStatement node) {
// This visit rewrites try-with-resources constructs into regular try statements according to
// JLS 14.20.3. The rewriting is done in a visit instead of endVisit because the mutations may
// result in more try-with-resources constructs that need to be rewritten recursively.
List<TreeNode> resources = node.getResources();
if (resources.isEmpty()) {
return true;
}
if (!node.getCatchClauses().isEmpty() || node.getFinally() != null) {
// Extended try-with-resources. (JLS 14.20.3.2)
// The new innerTry statement will be a "Basic try-with-resources" and will be rewritten by
// the code below when it is visited.
TryStatement innerTry = new TryStatement().setBody(TreeUtil.remove(node.getBody()));
;
TreeUtil.moveList(resources, innerTry.getResources());
node.setBody(new Block().addStatement(innerTry));
return true;
}
// Basic try-with-resources. (JLS 14.20.3.1)
DeclaredType throwableType = (DeclaredType) typeUtil.getJavaThrowable().asType();
VariableElement primaryException = GeneratedVariableElement.newLocalVar("__primaryException" + resources.size(), throwableType, null);
TreeNode resource = resources.remove(0);
VariableElement resourceVar = null;
VariableDeclarationFragment resourceFrag = null;
if (resource.getKind() == Kind.VARIABLE_DECLARATION_EXPRESSION) {
List<VariableDeclarationFragment> resourceFrags = ((VariableDeclarationExpression) resource).getFragments();
assert resourceFrags.size() == 1;
resourceFrag = resourceFrags.get(0);
resourceVar = resourceFrag.getVariableElement();
} else {
resourceVar = TreeUtil.getVariableElement((Expression) resource);
}
assert resourceVar != null;
DeclaredType closeableType = typeUtil.findSupertype(resourceVar.asType(), "java.lang.AutoCloseable");
ExecutablePair closeMethod = typeUtil.findMethod(closeableType, "close");
ExecutablePair addSuppressedMethod = typeUtil.findMethod(throwableType, "addSuppressed", "java.lang.Throwable");
Block block = new Block();
if (resourceFrag != null) {
block.addStatement(new VariableDeclarationStatement(resourceVar, TreeUtil.remove(resourceFrag.getInitializer())));
}
block.addStatement(new VariableDeclarationStatement(primaryException, new NullLiteral(typeUtil.getNull())));
// If the current try node is the only statement in its parent block then replace the parent
// block instead of the try node to avoid extra nesting of braces.
TreeNode parent = node.getParent();
if (parent instanceof Block && ((Block) parent).getStatements().size() == 1) {
parent.replaceWith(block);
} else {
node.replaceWith(block);
}
block.addStatement(TreeUtil.remove(node));
VariableElement caughtException = GeneratedVariableElement.newLocalVar("e", throwableType, null);
Block catchBlock = new Block().addStatement(new ExpressionStatement(new Assignment(new SimpleName(primaryException), new SimpleName(caughtException)))).addStatement(new ThrowStatement(new SimpleName(caughtException)));
node.addCatchClause(new CatchClause().setException(new SingleVariableDeclaration(caughtException)).setBody(catchBlock));
Statement closeResource = new ExpressionStatement(new MethodInvocation(closeMethod, typeUtil.getVoid(), new SimpleName(resourceVar)));
VariableElement suppressedException = GeneratedVariableElement.newLocalVar("e", throwableType, null);
node.setFinally(new Block().addStatement(new IfStatement().setExpression(new InfixExpression(typeUtil.getBoolean(), InfixExpression.Operator.NOT_EQUALS, new SimpleName(resourceVar), new NullLiteral(typeUtil.getNull()))).setThenStatement(new Block().addStatement(new IfStatement().setExpression(new InfixExpression(typeUtil.getBoolean(), InfixExpression.Operator.NOT_EQUALS, new SimpleName(primaryException), new NullLiteral(typeUtil.getNull()))).setThenStatement(new Block().addStatement(new TryStatement().setBody(new Block().addStatement(closeResource)).addCatchClause(new CatchClause().setException(new SingleVariableDeclaration(suppressedException)).setBody(new Block().addStatement(new ExpressionStatement(new MethodInvocation(addSuppressedMethod, typeUtil.getVoid(), new SimpleName(primaryException)).addArgument(new SimpleName(suppressedException)))))))).setElseStatement(new Block().addStatement(closeResource.copy()))))));
// Visit the new block instead of the current node because some of content of the node (eg. the
// resource initializer) has been moved outside of the try node.
block.accept(this);
return false;
}
Aggregations