// Copyright 2012, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

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 final List<E> elements = Lists.newArrayListWithCapacity(0);

  /**
   * 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 parent 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) {
    for (E element : elements) {
      element.accept(visitor);
    }
  }

  @Override
  public void add(int index, E element) {
    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) {
    return elements.get(index);
  }

  @Override
  public E set(int index, E element) {
    E result = elements.set(index, element);
    owner.becomeParentOf(element);
    return result;
  }

  @Override
  public int size() {
    return elements.size();
  }
}

@@ -9,1538 +9,210 @@
 ight
+ (c)
  2012, 
-Google Inc.%0A// All rights reserved.%0A//%0A// Redistribution and use in source and binary forms, wi
+the Dart project au
 th
- 
 or
- without%0A// modification, are permitted provided that the following conditions are%0A// met:%0A//%0A// * Redistributions of source code must retain the above copyright%0A// notice, this list of conditions and the following disclaimer.%0A// * Redistributions in binary form must reproduce the above%0A// copyright notice, this list of conditions and the following disclaimer%0A// in the documentation and/or other materials provided with the%0A// distribution.%0A// * Neither the name of Google Inc. nor the names of its%0A// contributors may be used to endorse or promote products derived from%0A// this software without specific prior written permission.%0A//%0A// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS%0A// %22AS IS%22 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT%0A// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR%0A// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT%0A// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,%0A// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT%0A// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,%0A// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY%0A// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT%0A// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE%0A// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+s.  Please see the AUTHORS file%0A// for details. All rights reserved. Use of this source code is governed by a%0A// BSD-style license that can be found in the LICENSE file
 .%0A%0Ap
@@ -558,17 +558,16 @@
 st%3CE%3E %7B%0A
-%0A
   /**%0A  
@@ -853,22 +853,16 @@
 private 
-final 
 List%3CE%3E 
@@ -876,41 +876,12 @@
 s = 
-Lists.newArrayListWithCapacity(0)
+null
 ;%0A%0A 
@@ -1076,22 +1076,21 @@
  @param 
-parent
+owner
  the nod
@@ -1422,24 +1422,54 @@
  visitor) %7B%0A
+    if (elements != null) %7B%0A  
     for (E e
@@ -1491,24 +1491,26 @@
 ts) %7B%0A      
+ 
+ 
 element.acce
@@ -1522,16 +1522,24 @@
 sitor);%0A
+      %7D%0A
     %7D%0A  
@@ -1591,24 +1591,110 @@
  element) %7B%0A
+    if (elements == null) %7B%0A      elements = Lists.newArrayListWithCapacity(2);%0A    %7D%0A
     elements
@@ -1941,91 +1941,287 @@
     
-return elements.get(index);%0A  %7D%0A%0A  @Override%0A  public E set(int index, E element) %7B
+if (elements == null) %7B%0A      throw new IndexOutOfBoundsException(Integer.toString(index));%0A    %7D%0A    return elements.get(index);%0A  %7D%0A%0A  @Override%0A  public E set(int index, E element) %7B%0A    if (elements == null) %7B%0A      elements = Lists.newArrayListWithCapacity(index + 1);%0A    %7D
 %0A   
@@ -2351,24 +2351,74 @@
 nt size() %7B%0A
+    if (elements == null) %7B%0A      return 0;%0A    %7D%0A
     return e

Improve memory efficiency by not creating empty lists Review URL: https://chromiumcodereview.appspot.com//10271033