156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson/* 256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Copyright (C) 2010 Google Inc. 356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Licensed under the Apache License, Version 2.0 (the "License"); 556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * you may not use this file except in compliance with the License. 656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * You may obtain a copy of the License at 756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * http://www.apache.org/licenses/LICENSE-2.0 956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 1056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Unless required by applicable law or agreed to in writing, software 1156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * distributed under the License is distributed on an "AS IS" BASIS, 1256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * See the License for the specific language governing permissions and 1456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * limitations under the License. 1556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 1656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 1756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonpackage com.google.clearsilver.jsilver.syntax; 1856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 1956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.analysis.DepthFirstAdapter; 2056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AAltCommand; 2156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ACallCommand; 2256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ADataCommand; 2356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ADefCommand; 2456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AEachCommand; 2556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AEvarCommand; 2656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AHardIncludeCommand; 2756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AHardLincludeCommand; 2856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AIfCommand; 2956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AIncludeCommand; 3056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ALincludeCommand; 3156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ALoopCommand; 3256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ALoopIncCommand; 3356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ALoopToCommand; 3456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ALvarCommand; 3556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.ANameCommand; 3656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AUvarCommand; 3756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AVarCommand; 3856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.AWithCommand; 3956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.EOF; 4056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.syntax.node.TData; 4156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 4256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.util.ArrayList; 4356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.util.List; 4456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 4556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson/** 4656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Consolidates runs of (unescaped literal output) data commands, deferring output until another 4756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * output command (var, call, etc) is encountered. 4856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 4956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonpublic class DataCommandConsolidator extends DepthFirstAdapter { 5056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 5156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * The current block nesting level. This is incremented whenever a conditional command is 5256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * encountered. 5356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 5456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private int currentBlockNestingLevel = 0; 5556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 5656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * A list of the data commands we're currently considering for consolidation. 5756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 5856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private final List<ADataCommand> datas = new ArrayList<ADataCommand>(); 5956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** The block nesting level of the data commands above. */ 6056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private int datasBlockNestingLevel = -1; 6156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 6256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 6356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Data consolidation barrier: consolidates all data contents into the last data command in the 6456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * datas list, replacing all but the last node with no-ops. 6556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 6656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private void barrier() { 6756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (datas.size() > 1) { 6856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // Put aside the last data command for later, then remove all the other 6956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // data commands, coalescing their contents into the last command. 7056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson ADataCommand last = datas.remove(datas.size() - 1); 7156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 7256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson StringBuilder sb = new StringBuilder(); 7356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson for (ADataCommand data : datas) { 7456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson sb.append(data.getData().getText()); 7556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson data.replaceBy(null); // removes the node 7656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 7756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 7856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson sb.append(last.getData().getText()); 7956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson last.replaceBy(new ADataCommand(new TData(sb.toString()))); 8056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 8156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson datas.clear(); 8256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson datasBlockNestingLevel = -1; 8356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 8456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 8556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** Block entry: just increments the current block nesting level. */ 8656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private void blockEntry() { 8756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson assert datasBlockNestingLevel <= currentBlockNestingLevel; 8856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson ++currentBlockNestingLevel; 8956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 9056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 9156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 9256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Block exit: acts as a conditional barrier only to data contained within the block. 9356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 9456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private void blockExit() { 9556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson assert datasBlockNestingLevel <= currentBlockNestingLevel; 9656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (datasBlockNestingLevel == currentBlockNestingLevel) { 9756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson barrier(); 9856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 9956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson --currentBlockNestingLevel; 10056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 10156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 10256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // data commands: continue to accumulate as long as the block nesting level 10356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // is unchanged. 10456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 10556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 10656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseADataCommand(ADataCommand node) { 10756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson assert datasBlockNestingLevel <= currentBlockNestingLevel; 10856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (currentBlockNestingLevel != datasBlockNestingLevel) { 10956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson barrier(); 11056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 11156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson datas.add(node); 11256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson datasBlockNestingLevel = currentBlockNestingLevel; 11356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 11456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 11556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // var, lvar, evar, uvar, name: all unconditional barriers. 11656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 11756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 11856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void inAVarCommand(AVarCommand node) { 11956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson barrier(); 12056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 12156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 12256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 12356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void inALvarCommand(ALvarCommand node) { 12456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson barrier(); 12556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 12656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 12756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 12856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void inAUvarCommand(AUvarCommand node) { 12956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson barrier(); 13056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 13156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 13256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 13356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void inAEvarCommand(AEvarCommand node) { 13456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson barrier(); 13556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 13656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 13756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 13856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void inANameCommand(ANameCommand node) { 13956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson barrier(); 14056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 14156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 14256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // loop, each: block barriers. 14356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 14456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 14556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void inALoopCommand(ALoopCommand node) { 14656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockEntry(); 14756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 14856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 14956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 15056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void inALoopIncCommand(ALoopIncCommand node) { 15156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockEntry(); 15256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 15356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 15456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 15556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void inALoopToCommand(ALoopToCommand node) { 15656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockEntry(); 15756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 15856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 15956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 16056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void inAEachCommand(AEachCommand node) { 16156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockEntry(); 16256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 16356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 16456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 16556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void inAWithCommand(AWithCommand node) { 16656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockEntry(); 16756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 16856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 16956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 17056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void outALoopCommand(ALoopCommand node) { 17156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockExit(); 17256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 17356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 17456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 17556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void outALoopIncCommand(ALoopIncCommand node) { 17656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockExit(); 17756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 17856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 17956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 18056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void outALoopToCommand(ALoopToCommand node) { 18156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockExit(); 18256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 18356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 18456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 18556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void outAEachCommand(AEachCommand node) { 18656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockExit(); 18756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 18856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 18956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 19056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void outAWithCommand(AWithCommand node) { 19156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockExit(); 19256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 19356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 19456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // def: special case: run another instance of this optimizer on the contained 19556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // commands. def produces no output, so it should not act as a barrier to 19656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // any accumulated data nodes; however, it contains data nodes, so we can 19756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // (and should) consolidate them. 19856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 19956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 20056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseADefCommand(ADefCommand node) { 20156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson DataCommandConsolidator consolidator = new DataCommandConsolidator(); 20256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson node.getCommand().apply(consolidator); 20356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson consolidator.barrier(); // Force final consolidation, just like EOF would. 20456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 20556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 20656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // call: unconditional barrier. 20756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 20856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 20956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void inACallCommand(ACallCommand node) { 21056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson barrier(); 21156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 21256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 21356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // if: special case: each branch is a block barrier. 21456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 21556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 21656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAIfCommand(AIfCommand node) { 21756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (node.getBlock() != null) { 21856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockEntry(); 21956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson node.getBlock().apply(this); 22056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockExit(); 22156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 22256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (node.getOtherwise() != null) { 22356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockEntry(); 22456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson node.getOtherwise().apply(this); 22556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockExit(); 22656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 22756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 22856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 22956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // alt: block barrier. 23056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 23156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 23256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void inAAltCommand(AAltCommand node) { 23356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockEntry(); 23456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 23556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 23656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 23756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void outAAltCommand(AAltCommand node) { 23856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson blockExit(); 23956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 24056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 24156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // include, hard include, linclude, hard linclude unconditional barriers. 24256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 24356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 24456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAIncludeCommand(AIncludeCommand node) { 24556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson barrier(); 24656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 24756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 24856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 24956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAHardIncludeCommand(AHardIncludeCommand node) { 25056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson barrier(); 25156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 25256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 25356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 25456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseALincludeCommand(ALincludeCommand node) { 25556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson barrier(); 25656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 25756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 25856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 25956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseAHardLincludeCommand(AHardLincludeCommand node) { 26056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson barrier(); 26156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 26256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 26356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson // EOF: unconditional barrier. 26456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 26556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 26656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void caseEOF(EOF node) { 26756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson barrier(); 26856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 26956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson} 270