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