public Object visit(NewArrayExpression node) {
            ExpressionList list = node.getExpressionList();
            check(list);

            Expression[] exprs = list.getExpressions();

            if (node.isAssociative()) {
                if (exprs.length % 2 != 0) {
                    error("newarrayexpression.associative", node);
                }

                Type elementType = newArrayElementType(exprs, 1, 2);
                // Since an element might not be found for a given key, the
                // element type is set to be nullable.
                elementType = elementType.toNonPrimitive().toNullable();

                Type arrayType = new Type(Map.class);
                try {
                    arrayType = arrayType.setArrayElementType(elementType);
                }
                catch (IntrospectionException e) {
                    error(e.toString(), node);
                    return null;
                }
                node.setType(arrayType);

                // Make sure all keys are converted to Objects.
                for (int i=0; i<exprs.length; i+=2) {
                    exprs[i].convertTo(Type.OBJECT_TYPE);
                }
            }
            else {
                Type elementType = newArrayElementType(exprs, 0, 1);
                Class<?> elementClass = elementType.getNaturalClass();
                Class<?> arrayClass =
                    Array.newInstance(elementClass, 0).getClass();

                Type arrayType = new Type
                (
                    arrayClass,
                    new GenericArrayTypeImpl(elementType.getGenericClass())
                );

                if (elementType.isNonNull()) {
                    try {
                        arrayType = arrayType.setArrayElementType(elementType);
                    }
                    catch (IntrospectionException e) {
                    }
                }

                node.setType(arrayType);
            }

            return null;
        }