blob: 8eda6ba9a819259171ab959f54eb50d1eb83f4a7 [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.google.dart.compiler.ast;
import com.google.common.collect.Lists;
import java.util.AbstractList;
import java.util.Collection;
import java.util.List;
/**
* Instances of the class <code>NodeList</code> represent a list of AST nodes that have a common
* parent.
*/
public class NodeList<E extends DartNode> extends AbstractList<E> {
/**
* @return the new instance of {@link NodeList} with correct type argument.
*/
public static <E extends DartNode> NodeList<E> create(DartNode owner) {
return new NodeList<E>(owner);
}
/**
* The underlying list in which the nodes of this list are stored.
*/
private List<E> elements = null;
/**
* The node that is the parent of each of the elements in the list.
*/
private final DartNode owner;
/**
* Initialize a newly created list of nodes to be empty.
*
* @param owner the node that is the parent of each of the elements in the list
*/
public NodeList(DartNode owner) {
this.owner = owner;
}
/**
* Use the given visitor to visit each of the nodes in this list.
*
* @param visitor the visitor to be used to visit the elements of this list
*/
public void accept(ASTVisitor<?> visitor) {
if (elements != null) {
for (int i = 0, size = elements.size(); i < size; i++) {
elements.get(i).accept(visitor);
}
}
}
@Override
public void add(int index, E element) {
if (elements == null) {
elements = Lists.newArrayListWithCapacity(2);
}
elements.add(element);
owner.becomeParentOf(element);
}
@Override
public boolean addAll(Collection<? extends E> c) {
if (c != null) {
return super.addAll(c);
}
return false;
}
@Override
public E get(int index) {
if (elements == null) {
throw new IndexOutOfBoundsException(Integer.toString(index));
}
return elements.get(index);
}
@Override
public E set(int index, E element) {
if (elements == null) {
elements = Lists.newArrayListWithCapacity(index + 1);
}
E result = elements.set(index, element);
owner.becomeParentOf(element);
return result;
}
@Override
public int size() {
if (elements == null) {
return 0;
}
return elements.size();
}
}