00001 package edu.ksu.cis.bandera.jjjc.node;
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 import ca.mcgill.sable.util.*;
00037 import edu.ksu.cis.bandera.jjjc.analysis.*;
00038
00039 public final class ABlock extends PBlock
00040 {
00041 private TLBrace _lBrace_;
00042 private final LinkedList _blockedStmt_ = new TypedLinkedList(new BlockedStmt_Cast());
00043 private TRBrace _rBrace_;
00044
00045 private class BlockedStmt_Cast implements Cast
00046 {
00047 public Object cast(Object o)
00048 {
00049 PBlockedStmt node = (PBlockedStmt) o;
00050
00051 if((node.parent() != null) &&
00052 (node.parent() != ABlock.this))
00053 {
00054 node.parent().removeChild(node);
00055 }
00056
00057 if((node.parent() == null) ||
00058 (node.parent() != ABlock.this))
00059 {
00060 node.parent(ABlock.this);
00061 }
00062
00063 return node;
00064 }
00065 }
00066 public ABlock()
00067 {
00068 }
00069 public ABlock(
00070 TLBrace _lBrace_,
00071 List _blockedStmt_,
00072 TRBrace _rBrace_)
00073 {
00074 setLBrace(_lBrace_);
00075
00076 {
00077 Object temp[] = _blockedStmt_.toArray();
00078 for(int i = 0; i < temp.length; i++)
00079 {
00080 this._blockedStmt_.add(temp[i]);
00081 }
00082 }
00083
00084 setRBrace(_rBrace_);
00085
00086 }
00087 public ABlock(
00088 TLBrace _lBrace_,
00089 XPBlockedStmt _blockedStmt_,
00090 TRBrace _rBrace_)
00091 {
00092 setLBrace(_lBrace_);
00093
00094 if(_blockedStmt_ != null)
00095 {
00096 while(_blockedStmt_ instanceof X1PBlockedStmt)
00097 {
00098 this._blockedStmt_.addFirst(((X1PBlockedStmt) _blockedStmt_).getPBlockedStmt());
00099 _blockedStmt_ = ((X1PBlockedStmt) _blockedStmt_).getXPBlockedStmt();
00100 }
00101 this._blockedStmt_.addFirst(((X2PBlockedStmt) _blockedStmt_).getPBlockedStmt());
00102 }
00103
00104 setRBrace(_rBrace_);
00105
00106 }
00107 public void apply(Switch sw)
00108 {
00109 ((Analysis) sw).caseABlock(this);
00110 }
00111 public Object clone()
00112 {
00113 return new ABlock(
00114 (TLBrace) cloneNode(_lBrace_),
00115 cloneList(_blockedStmt_),
00116 (TRBrace) cloneNode(_rBrace_));
00117 }
00118 public LinkedList getBlockedStmt()
00119 {
00120 return _blockedStmt_;
00121 }
00122 public TLBrace getLBrace()
00123 {
00124 return _lBrace_;
00125 }
00126 public TRBrace getRBrace()
00127 {
00128 return _rBrace_;
00129 }
00130 void removeChild(Node child)
00131 {
00132 if(_lBrace_ == child)
00133 {
00134 _lBrace_ = null;
00135 return;
00136 }
00137
00138 if(_blockedStmt_.remove(child))
00139 {
00140 return;
00141 }
00142
00143 if(_rBrace_ == child)
00144 {
00145 _rBrace_ = null;
00146 return;
00147 }
00148
00149 }
00150 void replaceChild(Node oldChild, Node newChild)
00151 {
00152 if(_lBrace_ == oldChild)
00153 {
00154 setLBrace((TLBrace) newChild);
00155 return;
00156 }
00157
00158 for(ListIterator i = _blockedStmt_.listIterator(); i.hasNext();)
00159 {
00160 if(i.next() == oldChild)
00161 {
00162 if(newChild != null)
00163 {
00164 i.set(newChild);
00165 oldChild.parent(null);
00166 return;
00167 }
00168
00169 i.remove();
00170 oldChild.parent(null);
00171 return;
00172 }
00173 }
00174
00175 if(_rBrace_ == oldChild)
00176 {
00177 setRBrace((TRBrace) newChild);
00178 return;
00179 }
00180
00181 }
00182 public void setBlockedStmt(List list)
00183 {
00184 Object temp[] = list.toArray();
00185 for(int i = 0; i < temp.length; i++)
00186 {
00187 _blockedStmt_.add(temp[i]);
00188 }
00189 }
00190 public void setLBrace(TLBrace node)
00191 {
00192 if(_lBrace_ != null)
00193 {
00194 _lBrace_.parent(null);
00195 }
00196
00197 if(node != null)
00198 {
00199 if(node.parent() != null)
00200 {
00201 node.parent().removeChild(node);
00202 }
00203
00204 node.parent(this);
00205 }
00206
00207 _lBrace_ = node;
00208 }
00209 public void setRBrace(TRBrace node)
00210 {
00211 if(_rBrace_ != null)
00212 {
00213 _rBrace_.parent(null);
00214 }
00215
00216 if(node != null)
00217 {
00218 if(node.parent() != null)
00219 {
00220 node.parent().removeChild(node);
00221 }
00222
00223 node.parent(this);
00224 }
00225
00226 _rBrace_ = node;
00227 }
00228 public String toString()
00229 {
00230 return ""
00231 + toString(_lBrace_)
00232 + toString(_blockedStmt_)
00233 + toString(_rBrace_);
00234 }
00235 }