Example usage for org.eclipse.jdt.core.dom VariableDeclaration setExtraDimensions

List of usage examples for org.eclipse.jdt.core.dom VariableDeclaration setExtraDimensions

Introduction

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

Prototype

public void setExtraDimensions(int dimensions) 

Source Link

Document

Sets the number of extra array dimensions over and above the explicitly-specified type.

Usage

From source file:net.sf.eclipsecs.ui.quickfixes.misc.ArrayTypeStyleQuickfix.java

License:Open Source License

/**
 * {@inheritDoc}/*w  ww  .  j  av  a2s . c  om*/
 */
protected ASTVisitor handleGetCorrectingASTVisitor(final IRegion lineInfo, final int markerStartOffset) {

    return new ASTVisitor() {

        public boolean visit(VariableDeclarationStatement node) {

            if (containsPosition(node, markerStartOffset)) {

                if (isCStyle(node.fragments())) {

                    int dimensions = 0;

                    List fragments = node.fragments();
                    for (int i = 0, size = fragments.size(); i < size; i++) {
                        VariableDeclaration decl = (VariableDeclaration) fragments.get(i);
                        if (decl.getExtraDimensions() > dimensions) {
                            dimensions = decl.getExtraDimensions();

                        }
                        decl.setExtraDimensions(0);
                    }

                    // wrap current type into ArrayType
                    ArrayType arrayType = createArrayType(node.getType(), dimensions);
                    node.setType(arrayType);

                } else if (isJavaStyle(node.getType())) {

                    int dimensions = ((ArrayType) node.getType()).getDimensions();

                    List fragments = node.fragments();
                    for (int i = 0, size = fragments.size(); i < size; i++) {
                        VariableDeclaration decl = (VariableDeclaration) fragments.get(i);
                        decl.setExtraDimensions(dimensions);
                    }

                    Type elementType = (Type) ASTNode.copySubtree(node.getAST(),
                            ((ArrayType) node.getType()).getElementType());
                    node.setType(elementType);
                }
            }
            return true;
        }

        public boolean visit(SingleVariableDeclaration node) {

            if (containsPosition(node, markerStartOffset)) {
                if (isCStyle(node)) {
                    // wrap the existing type into an array type
                    node.setType(createArrayType(node.getType(), node.getExtraDimensions()));
                    node.setExtraDimensions(0);
                } else if (isJavaStyle(node.getType())) {

                    ArrayType arrayType = (ArrayType) node.getType();
                    Type elementType = (Type) ASTNode.copySubtree(node.getAST(), arrayType.getElementType());

                    node.setType(elementType);
                    node.setExtraDimensions(arrayType.getDimensions());
                }
            }

            return true;
        }

        public boolean visit(FieldDeclaration node) {

            if (containsPosition(node, markerStartOffset)) {

                if (isCStyle(node.fragments())) {

                    int dimensions = 0;

                    List fragments = node.fragments();
                    for (int i = 0, size = fragments.size(); i < size; i++) {
                        VariableDeclaration decl = (VariableDeclaration) fragments.get(i);
                        if (decl.getExtraDimensions() > dimensions) {
                            dimensions = decl.getExtraDimensions();

                        }
                        decl.setExtraDimensions(0);
                    }

                    // wrap current type into ArrayType
                    ArrayType arrayType = createArrayType(node.getType(), dimensions);
                    node.setType(arrayType);
                } else if (isJavaStyle(node.getType())) {

                    int dimensions = ((ArrayType) node.getType()).getDimensions();

                    List fragments = node.fragments();
                    for (int i = 0, size = fragments.size(); i < size; i++) {
                        VariableDeclaration decl = (VariableDeclaration) fragments.get(i);
                        decl.setExtraDimensions(dimensions);
                    }

                    Type elementType = (Type) ASTNode.copySubtree(node.getAST(),
                            ((ArrayType) node.getType()).getElementType());
                    node.setType(elementType);
                }
            }
            return true;
        }

        private boolean isJavaStyle(Type type) {
            return type instanceof ArrayType;
        }

        private boolean isCStyle(VariableDeclaration decl) {
            return decl.getExtraDimensions() > 0;
        }

        private boolean isCStyle(List fragments) {

            Iterator it = fragments.iterator();
            while (it.hasNext()) {
                VariableDeclaration decl = (VariableDeclaration) it.next();
                if (isCStyle(decl)) {
                    return true;
                }
            }
            return false;
        }

        private ArrayType createArrayType(Type componentType, int dimensions) {
            Type type = (Type) ASTNode.copySubtree(componentType.getAST(), componentType);
            ArrayType arrayType = componentType.getAST().newArrayType(type, dimensions);

            return arrayType;
        }
    };
}