Example usage for org.eclipse.jdt.core.dom Block statements

List of usage examples for org.eclipse.jdt.core.dom Block statements

Introduction

In this page you can find the example usage for org.eclipse.jdt.core.dom Block statements.

Prototype

ASTNode.NodeList statements

To view the source code for org.eclipse.jdt.core.dom Block statements.

Click Source Link

Document

The list of statements (element type: Statement ).

Usage

From source file:com.google.devtools.j2cpp.translate.InitializationNormalizer.java

License:Open Source License

/**
 * Returns true if this is a constructor that doesn't doesn't call
 * "this(...)".  This constructors are skipped so initializers
 * aren't run more than once per instance creation.
 *///from   w w  w . j a va2 s.c  o m
boolean isDesignatedConstructor(MethodDeclaration node) {
    if (!node.isConstructor()) {
        return false;
    }
    Block body = node.getBody();
    if (body == null) {
        return false;
    }
    @SuppressWarnings("unchecked")
    List<Statement> stmts = body.statements(); // safe by specification
    if (stmts.isEmpty()) {
        return true;
    }
    Statement firstStmt = stmts.get(0);
    return !(firstStmt instanceof ConstructorInvocation);
}

From source file:com.google.devtools.j2cpp.translate.InitializationNormalizer.java

License:Open Source License

@SuppressWarnings("unchecked")
private void addMethod(String name, int modifiers, ITypeBinding type, List<Statement> initStatements,
        List<BodyDeclaration> members, AST ast, boolean isConstructor) {
    Block body = ast.newBlock();
    List<Statement> stmts = body.statements(); // safe by definition
    for (Statement stmt : initStatements) {
        Statement newStmt = NodeCopier.copySubtree(ast, stmt);
        stmts.add(newStmt);/*from   w w w .  j  a  v a 2  s. c o m*/
    }
    MethodDeclaration method = ast.newMethodDeclaration();
    GeneratedMethodBinding binding = new GeneratedMethodBinding(name, modifiers, null, type, isConstructor,
            false, true);
    Types.addBinding(method, binding);
    Type returnType = ast.newPrimitiveType(PrimitiveType.VOID);
    Types.addBinding(returnType, ast.resolveWellKnownType("void"));
    method.setReturnType2(returnType);
    method.setBody(body);
    method.setConstructor(isConstructor);
    method.modifiers().addAll(ast.newModifiers(modifiers));
    SimpleName nameNode = NameTable.unsafeSimpleName(name, ast);
    Types.addBinding(nameNode, binding);
    method.setName(nameNode);
    members.add(method);
    Symbols.resolve(method, binding);
}

From source file:com.google.devtools.j2cpp.translate.InnerClassExtractor.java

License:Open Source License

public boolean visitType(AbstractTypeDeclaration node) {
    ASTNode parentNode = node.getParent();
    if (!(parentNode instanceof CompilationUnit)) {
        ITypeBinding type = Types.getTypeBinding(node);
        if (!type.isInterface() && !type.isAnnotation() && !Modifier.isStatic(type.getModifiers())) {
            addOuterFields(node);/*from  w w w. j  a  v  a  2s  .c om*/
        }

        if (parentNode instanceof AbstractTypeDeclaration) {
            // Remove declaration from declaring type.
            AbstractTypeDeclaration parent = (AbstractTypeDeclaration) node.getParent();
            @SuppressWarnings("unchecked")
            List<AbstractTypeDeclaration> parentTypes = parent.bodyDeclarations(); // safe by definition
            boolean success = parentTypes.remove(node);
            assert success;
        } else {
            TypeDeclarationStatement typeStatement = (TypeDeclarationStatement) parentNode;
            node = NodeCopier.copySubtree(node.getAST(), typeStatement.getDeclaration());

            // Remove stmt from method body (or an if/else/try/catch/finally clause).
            Block body = (Block) typeStatement.getParent();
            @SuppressWarnings("unchecked")
            List<Statement> stmts = body.statements(); // safe by definition
            boolean success = stmts.remove(typeStatement);
            assert success;
        }

        // Make this node non-private, if necessary, and add it to the unit's type
        // list.
        @SuppressWarnings("unchecked") // safe by definition
        List<IExtendedModifier> modifiers = node.modifiers();
        for (IExtendedModifier iem : modifiers) {
            if (iem instanceof Modifier) {
                Modifier mod = (Modifier) iem;
                if (mod.getKeyword().equals(ModifierKeyword.PRIVATE_KEYWORD)) {
                    modifiers.remove(mod);
                    break;
                }
            }
        }
        unitTypes.add(node);
    }
    return true;
}

From source file:com.google.devtools.j2cpp.translate.JavaToIOSMethodTranslator.java

License:Open Source License

/**
 * Explicitly walk block statement lists, to work around a bug in
 * ASTNode.visitChildren that skips list members.
 *///from   w  ww . j  a  v  a 2 s  . c o m
@Override
public boolean visit(Block node) {
    @SuppressWarnings("unchecked")
    List<Statement> stmts = node.statements(); // safe by design
    for (Statement s : stmts) {
        s.accept(this);
    }
    return false;
}

From source file:com.google.devtools.j2cpp.translate.JavaToIOSMethodTranslator.java

License:Open Source License

private void addCopyWithZoneMethod(TypeDeclaration node) {
    // Create copyWithZone: method.
    ITypeBinding type = Types.getTypeBinding(node).getTypeDeclaration();
    SimpleName methodName = newCloneMethodName(type, true);
    GeneratedMethodBinding binding = (GeneratedMethodBinding) Types.getMethodBinding(methodName);
    IOSMethod iosMethod = Types.getMappedMethod(binding);
    MethodDeclaration cloneMethod = ast.newMethodDeclaration();
    Types.addBinding(cloneMethod, binding);
    cloneMethod.setName(methodName);/*from w  ww  .  ja  v a2s .  c  o  m*/
    cloneMethod.setReturnType2(Types.makeType(binding.getReturnType()));

    // Add NSZone *zone parameter.
    IOSTypeBinding nsZoneType = new IOSTypeBinding("NSZone", false);
    GeneratedVariableBinding zoneBinding = new GeneratedVariableBinding("zone", 0, nsZoneType, false, true,
            binding.getDeclaringClass(), binding);
    binding.addParameter(zoneBinding);
    @SuppressWarnings("unchecked")
    List<SingleVariableDeclaration> parameters = cloneMethod.parameters(); // safe by definition
    parameters.add(makeZoneParameter(zoneBinding));
    Types.addMappedIOSMethod(binding, iosMethod);

    Block block = ast.newBlock();
    cloneMethod.setBody(block);

    MethodInvocation cloneInvocation = makeCloneInvocation(type, zoneBinding);
    ReturnStatement returnStmt = ast.newReturnStatement();
    returnStmt.setExpression(cloneInvocation);
    @SuppressWarnings("unchecked")
    List<Statement> stmts = block.statements(); // safe by definition
    stmts.add(returnStmt);

    @SuppressWarnings("unchecked")
    List<BodyDeclaration> members = node.bodyDeclarations(); // safe by definition
    members.add(cloneMethod);
}

From source file:com.google.devtools.j2cpp.translate.Rewriter.java

License:Open Source License

@Override
public boolean visit(FieldDeclaration node) {
    int mods = node.getModifiers();
    if (Modifier.isStatic(mods)) {
        ASTNode parent = node.getParent();
        @SuppressWarnings("unchecked")
        List<BodyDeclaration> classMembers = parent instanceof AbstractTypeDeclaration
                ? ((AbstractTypeDeclaration) parent).bodyDeclarations()
                : ((AnonymousClassDeclaration) parent).bodyDeclarations(); // safe by specification
        int indexOfNewMember = classMembers.indexOf(node) + 1;

        @SuppressWarnings("unchecked")
        List<VariableDeclarationFragment> fragments = node.fragments(); // safe by specification
        for (VariableDeclarationFragment var : fragments) {
            IVariableBinding binding = Types.getVariableBinding(var);
            if (Types.isPrimitiveConstant(binding) && Modifier.isPrivate(binding.getModifiers())) {
                // Don't define accessors for private constants, since they can be
                // directly referenced.
                continue;
            }/* ww w . j  av a  2 s.  c o  m*/

            // rename varName to varName_, per Obj-C style guide
            SimpleName oldName = var.getName();
            ITypeBinding type = ((AbstractTypeDeclaration) node.getParent()).resolveBinding();
            String varName = NameTable.getStaticVarQualifiedName(type, oldName.getIdentifier());
            NameTable.rename(binding, varName);
            ITypeBinding typeBinding = binding.getType();
            var.setExtraDimensions(0); // if array, type was corrected above

            // add accessor(s)
            if (needsReader(var, classMembers)) {
                classMembers.add(indexOfNewMember++, makeStaticReader(var, mods));
            }
            if (!Modifier.isFinal(node.getModifiers()) && needsWriter(var, classMembers)) {
                classMembers.add(indexOfNewMember++,
                        makeStaticWriter(var, oldName.getIdentifier(), node.getType(), mods));
            }

            // move non-constant initialization to init block
            Expression initializer = var.getInitializer();
            if (initializer != null && initializer.resolveConstantExpressionValue() == null) {
                var.setInitializer(null);

                AST ast = var.getAST();
                SimpleName newName = ast.newSimpleName(varName);
                Types.addBinding(newName, binding);
                Assignment assign = ast.newAssignment();
                assign.setLeftHandSide(newName);
                Expression newInit = NodeCopier.copySubtree(ast, initializer);
                assign.setRightHandSide(newInit);
                Types.addBinding(assign, typeBinding);

                Block initBlock = ast.newBlock();
                @SuppressWarnings("unchecked")
                List<Statement> stmts = initBlock.statements(); // safe by definition
                stmts.add(ast.newExpressionStatement(assign));
                Initializer staticInitializer = ast.newInitializer();
                staticInitializer.setBody(initBlock);
                @SuppressWarnings("unchecked")
                List<IExtendedModifier> initMods = staticInitializer.modifiers(); // safe by definition
                initMods.add(ast.newModifier(ModifierKeyword.STATIC_KEYWORD));
                classMembers.add(indexOfNewMember++, staticInitializer);
            }
        }
    }
    return true;
}

From source file:com.google.devtools.j2cpp.translate.Rewriter.java

License:Open Source License

@Override
public boolean visit(Block node) {
    // split array declarations so that initializers are in separate statements.
    @SuppressWarnings("unchecked")
    List<Statement> stmts = node.statements(); // safe by definition
    int n = stmts.size();
    for (int i = 0; i < n; i++) {
        Statement s = stmts.get(i);
        if (s instanceof VariableDeclarationStatement) {
            VariableDeclarationStatement var = (VariableDeclarationStatement) s;
            Map<VariableDeclarationFragment, Expression> initializers = Maps.newLinkedHashMap();
            @SuppressWarnings("unchecked")
            List<VariableDeclarationFragment> fragments = var.fragments();
            for (VariableDeclarationFragment fragment : fragments) {
                ITypeBinding varType = Types.getTypeBinding(fragment);
                if (varType.isArray()) {
                    fragment.setExtraDimensions(0);
                    Expression initializer = fragment.getInitializer();
                    if (initializer != null) {
                        initializers.put(fragment, initializer);
                        if (initializer instanceof ArrayCreation) {
                            ArrayCreation creator = (ArrayCreation) initializer;
                            if (creator.getInitializer() != null) {
                                // replace this redundant array creation node with its
                                // rewritten initializer
                                initializer = creator.getInitializer();
                            } else {
                                continue;
                            }//  w w  w  . j a  va  2  s  .  c o  m
                        }
                        if (initializer instanceof ArrayInitializer) {
                            fragment.setInitializer(createIOSArrayInitializer(Types.getTypeBinding(fragment),
                                    (ArrayInitializer) initializer));
                        }
                    }
                }
            }
        } else if (s instanceof ExpressionStatement
                && ((ExpressionStatement) s).getExpression() instanceof Assignment) {
            Assignment assign = (Assignment) ((ExpressionStatement) s).getExpression();
            ITypeBinding assignType = Types.getTypeBinding(assign);
            if (assign.getRightHandSide() instanceof ArrayInitializer) {
                ArrayInitializer arrayInit = (ArrayInitializer) assign.getRightHandSide();
                assert assignType.isArray() : "array initializer assigned to non-array";
                assign.setRightHandSide(createIOSArrayInitializer(assignType, arrayInit));
            } else if (assign.getRightHandSide() instanceof ArrayCreation) {
                ArrayCreation arrayCreate = (ArrayCreation) assign.getRightHandSide();
                ArrayInitializer arrayInit = arrayCreate.getInitializer();
                if (arrayInit != null) {
                    // Replace ArrayCreation node with its initializer.
                    AST ast = node.getAST();
                    Assignment newAssign = ast.newAssignment();
                    Types.addBinding(newAssign, assignType);
                    newAssign.setLeftHandSide(NodeCopier.copySubtree(ast, assign.getLeftHandSide()));
                    newAssign.setRightHandSide(createIOSArrayInitializer(assignType, arrayInit));
                    ((ExpressionStatement) s).setExpression(newAssign);
                }
            }
        }
    }
    return true;
}

From source file:com.google.devtools.j2cpp.translate.Rewriter.java

License:Open Source License

@SuppressWarnings("unchecked")
@Override// w  w w  .  j av a 2s. c om
public boolean visit(LabeledStatement node) {
    Statement s = node.getBody();
    Statement statementBody = null;
    if (s instanceof DoStatement) {
        statementBody = ((DoStatement) s).getBody();
    } else if (s instanceof EnhancedForStatement) {
        statementBody = ((EnhancedForStatement) s).getBody();
    } else if (s instanceof ForStatement) {
        statementBody = ((ForStatement) s).getBody();
    } else if (s instanceof WhileStatement) {
        statementBody = ((WhileStatement) s).getBody();
    }
    if (statementBody != null) {
        AST ast = node.getAST();

        final boolean[] hasContinue = new boolean[1];
        final boolean[] hasBreak = new boolean[1];
        node.accept(new ASTVisitor() {
            @Override
            public void endVisit(ContinueStatement node) {
                if (node.getLabel() != null) {
                    hasContinue[0] = true;
                }
            }

            @Override
            public void endVisit(BreakStatement node) {
                if (node.getLabel() != null) {
                    hasBreak[0] = true;
                }
            }
        });

        List<Statement> stmts = null;
        if (hasContinue[0]) {
            if (statementBody instanceof Block) {
                // Add empty labeled statement as last block statement.
                stmts = ((Block) statementBody).statements();
                LabeledStatement newLabel = ast.newLabeledStatement();
                newLabel.setLabel(NodeCopier.copySubtree(ast, node.getLabel()));
                newLabel.setBody(ast.newEmptyStatement());
                stmts.add(newLabel);
            }
        }
        if (hasBreak[0]) {
            ASTNode parent = node.getParent();
            if (parent instanceof Block) {
                stmts = ((Block) parent).statements();
            } else {
                // Surround parent with block.
                Block block = ast.newBlock();
                stmts = block.statements();
                stmts.add((Statement) parent);

                // Replace parent in its statement list with new block.
                List<Statement> superStmts = ((Block) parent.getParent()).statements();
                for (int i = 0; i < superStmts.size(); i++) {
                    if (superStmts.get(i) == parent) {
                        superStmts.set(i, block);
                        break;
                    }
                }
                stmts = block.statements();
            }
            // Find node in statement list, and add empty labeled statement after it.
            for (int i = 0; i < stmts.size(); i++) {
                if (stmts.get(i) == node) {
                    LabeledStatement newLabel = ast.newLabeledStatement();
                    newLabel.setLabel(NodeCopier.copySubtree(ast, node.getLabel()));
                    newLabel.setBody(ast.newEmptyStatement());
                    stmts.add(i + 1, newLabel);
                    break;
                }
            }
        }

        if (hasContinue[0] || hasBreak[0]) {
            // Replace this node with its statement, thus deleting the label.
            ASTNode parent = node.getParent();
            if (parent instanceof Block) {
                stmts = ((Block) parent).statements();
                for (int i = 0; i < stmts.size(); i++) {
                    if (stmts.get(i) == node) {
                        stmts.set(i, NodeCopier.copySubtree(ast, node.getBody()));
                        break;
                    }
                }
            }
        }
    }
    return true;
}

From source file:com.google.devtools.j2cpp.translate.Rewriter.java

License:Open Source License

/**
 * Java interfaces that redeclare java.lang.Object's equals, hashCode, or
 * toString methods need a forwarding method if the implementing class
 * relies on java.lang.Object's implementation.  This is because NSObject
 * is declared as adhering to the NSObject protocol, but doesn't explicitly
 * declare these method in its interface.  This prevents gcc from finding
 * an implementation, so it issues a warning.
 *//*from  w w w. j  a v  a2s.  com*/
private void addForwardingMethod(AST ast, ITypeBinding typeBinding, IMethodBinding interfaceMethod,
        List<BodyDeclaration> decls) {
    Logger.getAnonymousLogger()
            .fine(String.format("adding %s to %s", interfaceMethod.getName(), typeBinding.getQualifiedName()));
    MethodDeclaration method = createInterfaceMethodBody(ast, typeBinding, interfaceMethod);

    // Add method body with single "super.method(parameters);" statement.
    Block body = ast.newBlock();
    method.setBody(body);
    SuperMethodInvocation superInvocation = ast.newSuperMethodInvocation();
    superInvocation.setName(NodeCopier.copySubtree(ast, method.getName()));

    @SuppressWarnings("unchecked")
    List<SingleVariableDeclaration> parameters = method.parameters(); // safe by design
    @SuppressWarnings("unchecked")
    List<Expression> args = superInvocation.arguments(); // safe by definition
    for (SingleVariableDeclaration param : parameters) {
        Expression arg = NodeCopier.copySubtree(ast, param.getName());
        args.add(arg);
    }
    Types.addBinding(superInvocation, Types.getMethodBinding(method));
    @SuppressWarnings("unchecked")
    List<Statement> stmts = body.statements(); // safe by definition
    ReturnStatement returnStmt = ast.newReturnStatement();
    returnStmt.setExpression(superInvocation);
    stmts.add(returnStmt);

    decls.add(method);
}

From source file:com.google.devtools.j2objc.util.ASTUtil.java

License:Apache License

/**
 * Helper method to isolate the unchecked warning.
 *//* w  ww  . j av a2s.  c om*/
@SuppressWarnings("unchecked")
public static List<Statement> getStatements(Block block) {
    return block.statements();
}