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 ATryOneTryStmt extends POneTryStmt
00040 {
00041 private TTry _try_;
00042 private PBlock _block_;
00043 private final LinkedList _catchClause_ = new TypedLinkedList(new CatchClause_Cast());
00044
00045 private class CatchClause_Cast implements Cast
00046 {
00047 public Object cast(Object o)
00048 {
00049 PCatchClause node = (PCatchClause) o;
00050
00051 if((node.parent() != null) &&
00052 (node.parent() != ATryOneTryStmt.this))
00053 {
00054 node.parent().removeChild(node);
00055 }
00056
00057 if((node.parent() == null) ||
00058 (node.parent() != ATryOneTryStmt.this))
00059 {
00060 node.parent(ATryOneTryStmt.this);
00061 }
00062
00063 return node;
00064 }
00065 }
00066 public ATryOneTryStmt()
00067 {
00068 }
00069 public ATryOneTryStmt(
00070 TTry _try_,
00071 PBlock _block_,
00072 List _catchClause_)
00073 {
00074 setTry(_try_);
00075
00076 setBlock(_block_);
00077
00078 {
00079 Object temp[] = _catchClause_.toArray();
00080 for(int i = 0; i < temp.length; i++)
00081 {
00082 this._catchClause_.add(temp[i]);
00083 }
00084 }
00085
00086 }
00087 public ATryOneTryStmt(
00088 TTry _try_,
00089 PBlock _block_,
00090 XPCatchClause _catchClause_)
00091 {
00092 setTry(_try_);
00093
00094 setBlock(_block_);
00095
00096 if(_catchClause_ != null)
00097 {
00098 while(_catchClause_ instanceof X1PCatchClause)
00099 {
00100 this._catchClause_.addFirst(((X1PCatchClause) _catchClause_).getPCatchClause());
00101 _catchClause_ = ((X1PCatchClause) _catchClause_).getXPCatchClause();
00102 }
00103 this._catchClause_.addFirst(((X2PCatchClause) _catchClause_).getPCatchClause());
00104 }
00105
00106 }
00107 public void apply(Switch sw)
00108 {
00109 ((Analysis) sw).caseATryOneTryStmt(this);
00110 }
00111 public Object clone()
00112 {
00113 return new ATryOneTryStmt(
00114 (TTry) cloneNode(_try_),
00115 (PBlock) cloneNode(_block_),
00116 cloneList(_catchClause_));
00117 }
00118 public PBlock getBlock()
00119 {
00120 return _block_;
00121 }
00122 public LinkedList getCatchClause()
00123 {
00124 return _catchClause_;
00125 }
00126 public TTry getTry()
00127 {
00128 return _try_;
00129 }
00130 void removeChild(Node child)
00131 {
00132 if(_try_ == child)
00133 {
00134 _try_ = null;
00135 return;
00136 }
00137
00138 if(_block_ == child)
00139 {
00140 _block_ = null;
00141 return;
00142 }
00143
00144 if(_catchClause_.remove(child))
00145 {
00146 return;
00147 }
00148
00149 }
00150 void replaceChild(Node oldChild, Node newChild)
00151 {
00152 if(_try_ == oldChild)
00153 {
00154 setTry((TTry) newChild);
00155 return;
00156 }
00157
00158 if(_block_ == oldChild)
00159 {
00160 setBlock((PBlock) newChild);
00161 return;
00162 }
00163
00164 for(ListIterator i = _catchClause_.listIterator(); i.hasNext();)
00165 {
00166 if(i.next() == oldChild)
00167 {
00168 if(newChild != null)
00169 {
00170 i.set(newChild);
00171 oldChild.parent(null);
00172 return;
00173 }
00174
00175 i.remove();
00176 oldChild.parent(null);
00177 return;
00178 }
00179 }
00180
00181 }
00182 public void setBlock(PBlock node)
00183 {
00184 if(_block_ != null)
00185 {
00186 _block_.parent(null);
00187 }
00188
00189 if(node != null)
00190 {
00191 if(node.parent() != null)
00192 {
00193 node.parent().removeChild(node);
00194 }
00195
00196 node.parent(this);
00197 }
00198
00199 _block_ = node;
00200 }
00201 public void setCatchClause(List list)
00202 {
00203 Object temp[] = list.toArray();
00204 for(int i = 0; i < temp.length; i++)
00205 {
00206 _catchClause_.add(temp[i]);
00207 }
00208 }
00209 public void setTry(TTry node)
00210 {
00211 if(_try_ != null)
00212 {
00213 _try_.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 _try_ = node;
00227 }
00228 public String toString()
00229 {
00230 return ""
00231 + toString(_try_)
00232 + toString(_block_)
00233 + toString(_catchClause_);
00234 }
00235 }