All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mozilla.javascript.ast.ArrayLiteral Maven / Gradle / Ivy

There is a newer version: 2024.11.18751.20241128T090041Z-241100
Show newest version
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package org.mozilla.javascript.ast;

import org.mozilla.javascript.Token;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * AST node for an Array literal.  The elements list will always be
 * non-{@code null}, although the list will have no elements if the Array literal
 * is empty.

* * Node type is {@link Token#ARRAYLIT}.

* *

ArrayLiteral :
 *        [ Elisionopt ]
 *        [ ElementList ]
 *        [ ElementList , Elisionopt ]
 * ElementList :
 *        Elisionopt AssignmentExpression
 *        ElementList , Elisionopt AssignmentExpression
 * Elision :
 *        ,
 *        Elision ,
*/ public class ArrayLiteral extends AstNode implements DestructuringForm { private static final List NO_ELEMS = Collections.unmodifiableList(new ArrayList()); private List elements; private int destructuringLength; private int skipCount; private boolean isDestructuring; { type = Token.ARRAYLIT; } public ArrayLiteral() { } public ArrayLiteral(int pos) { super(pos); } public ArrayLiteral(int pos, int len) { super(pos, len); } /** * Returns the element list * @return the element list. If there are no elements, returns an immutable * empty list. Elisions are represented as {@link EmptyExpression} * nodes. */ public List getElements() { return elements != null ? elements : NO_ELEMS; } /** * Sets the element list, and sets each element's parent to this node. * @param elements the element list. Can be {@code null}. */ public void setElements(List elements) { if (elements == null) { this.elements = null; } else { if (this.elements != null) this.elements.clear(); for (AstNode e : elements) addElement(e); } } /** * Adds an element to the list, and sets its parent to this node. * @param element the element to add * @throws IllegalArgumentException if element is {@code null}. To indicate * an empty element, use an {@link EmptyExpression} node. */ public void addElement(AstNode element) { assertNotNull(element); if (elements == null) elements = new ArrayList(); elements.add(element); element.setParent(this); } /** * Returns the number of elements in this {@code Array} literal, * including empty elements. */ public int getSize() { return elements == null ? 0 : elements.size(); } /** * Returns element at specified index. * @param index the index of the element to retrieve * @return the element * @throws IndexOutOfBoundsException if the index is invalid */ public AstNode getElement(int index) { if (elements == null) throw new IndexOutOfBoundsException("no elements"); return elements.get(index); } /** * Returns destructuring length */ public int getDestructuringLength() { return destructuringLength; } /** * Sets destructuring length. This is set by the parser and used * by the code generator. {@code for ([a,] in obj)} is legal, * but {@code for ([a] in obj)} is not since we have both key and * value supplied. The difference is only meaningful in array literals * used in destructuring-assignment contexts. */ public void setDestructuringLength(int destructuringLength) { this.destructuringLength = destructuringLength; } /** * Used by code generator. * @return the number of empty elements */ public int getSkipCount() { return skipCount; } /** * Used by code generator. * @param count the count of empty elements */ public void setSkipCount(int count) { skipCount = count; } /** * Marks this node as being a destructuring form - that is, appearing * in a context such as {@code for ([a, b] in ...)} where it's the * target of a destructuring assignment. */ public void setIsDestructuring(boolean destructuring) { isDestructuring = destructuring; } /** * Returns true if this node is in a destructuring position: * a function parameter, the target of a variable initializer, the * iterator of a for..in loop, etc. */ public boolean isDestructuring() { return isDestructuring; } @Override public String toSource(int depth) { StringBuilder sb = new StringBuilder(); sb.append(makeIndent(depth)); sb.append("["); if (elements != null) { printList(elements, sb); } sb.append("]"); return sb.toString(); } /** * Visits this node, then visits its element expressions in order. * Any empty elements are represented by {@link EmptyExpression} * objects, so the callback will never be passed {@code null}. */ @Override public void visit(NodeVisitor v) { if (v.visit(this)) { for (AstNode e : getElements()) { e.visit(v); } } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy