156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson// Copyright 2008 Google Inc. All Rights Reserved.
256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonpackage com.google.clearsilver.jsilver.syntax.node;
456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.util.LinkedList;
656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson/**
856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Replacement for SableCC generated AMultipleCommand. Iterates much faster. Important because this
956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * iteration is called a lot.
1056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson *
1156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * NOTE: Because the SableCC generated code contains methods of package visibility that need to be
1256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * overriden, this class needs to reside in the same package.
1356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson *
1456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @see com.google.clearsilver.jsilver.syntax.SyntaxTreeOptimizer
1556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */
1656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonpublic class AOptimizedMultipleCommand extends PCommand {
1756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
1856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  private final PCommand[] commands;
1956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
2056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public AOptimizedMultipleCommand(AMultipleCommand originalNode) {
2156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    LinkedList<PCommand> originalChildCommands = originalNode.getCommand();
2256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    commands = new PCommand[originalChildCommands.size()];
2356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    originalChildCommands.toArray(commands);
2456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    for (int i = 0; i < commands.length; i++) {
2556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      commands[i].parent(this); // set parent.
2656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
2756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
2856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
2956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
3056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public Object clone() {
3156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    return this; // Immutable object. Clone not necessary.
3256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
3356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
3456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
3556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  void removeChild(Node child) {
3656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    throw new UnsupportedOperationException();
3756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
3856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
3956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
4056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  void replaceChild(Node oldChild, Node newChild) {
4156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    if (newChild == null) {
4256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      throw new IllegalArgumentException("newChild cannot be null.");
4356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
4456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    // Replace child
4556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    for (int i = 0; i < commands.length; i++) {
4656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      if (commands[i] == oldChild) {
4756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        commands[i] = (PCommand) newChild;
4856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        newChild.parent(this);
4956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        oldChild.parent(null);
5056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson        return;
5156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      }
5256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
5356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    throw new RuntimeException("Not a child.");
5456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
5556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson
5656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  @Override
5756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  public void apply(Switch sw) {
5856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    for (int i = 0; i < commands.length; i++) {
5956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson      commands[i].apply(sw);
6056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson    }
6156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson  }
6256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson}
63