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