1// Copyright 2008 Google Inc. All Rights Reserved. 2 3package com.google.clearsilver.jsilver.syntax.node; 4 5import java.util.LinkedList; 6 7/** 8 * Replacement for SableCC generated AMultipleCommand. Iterates much faster. Important because this 9 * iteration is called a lot. 10 * 11 * NOTE: Because the SableCC generated code contains methods of package visibility that need to be 12 * overriden, this class needs to reside in the same package. 13 * 14 * @see com.google.clearsilver.jsilver.syntax.SyntaxTreeOptimizer 15 */ 16public class AOptimizedMultipleCommand extends PCommand { 17 18 private final PCommand[] commands; 19 20 public AOptimizedMultipleCommand(AMultipleCommand originalNode) { 21 LinkedList<PCommand> originalChildCommands = originalNode.getCommand(); 22 commands = new PCommand[originalChildCommands.size()]; 23 originalChildCommands.toArray(commands); 24 for (int i = 0; i < commands.length; i++) { 25 commands[i].parent(this); // set parent. 26 } 27 } 28 29 @Override 30 public Object clone() { 31 return this; // Immutable object. Clone not necessary. 32 } 33 34 @Override 35 void removeChild(Node child) { 36 throw new UnsupportedOperationException(); 37 } 38 39 @Override 40 void replaceChild(Node oldChild, Node newChild) { 41 if (newChild == null) { 42 throw new IllegalArgumentException("newChild cannot be null."); 43 } 44 // Replace child 45 for (int i = 0; i < commands.length; i++) { 46 if (commands[i] == oldChild) { 47 commands[i] = (PCommand) newChild; 48 newChild.parent(this); 49 oldChild.parent(null); 50 return; 51 } 52 } 53 throw new RuntimeException("Not a child."); 54 } 55 56 @Override 57 public void apply(Switch sw) { 58 for (int i = 0; i < commands.length; i++) { 59 commands[i].apply(sw); 60 } 61 } 62} 63