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 ANamedTypeExp extends PExp
00040 {
00041 private PName _name_;
00042 private final LinkedList _dim_ = new TypedLinkedList(new Dim_Cast());
00043 private TDot _dot_;
00044 private TClass _tClass_;
00045
00046 private class Dim_Cast implements Cast
00047 {
00048 public Object cast(Object o)
00049 {
00050 PDim node = (PDim) o;
00051
00052 if((node.parent() != null) &&
00053 (node.parent() != ANamedTypeExp.this))
00054 {
00055 node.parent().removeChild(node);
00056 }
00057
00058 if((node.parent() == null) ||
00059 (node.parent() != ANamedTypeExp.this))
00060 {
00061 node.parent(ANamedTypeExp.this);
00062 }
00063
00064 return node;
00065 }
00066 }
00067 public ANamedTypeExp()
00068 {
00069 }
00070 public ANamedTypeExp(
00071 PName _name_,
00072 List _dim_,
00073 TDot _dot_,
00074 TClass _tClass_)
00075 {
00076 setName(_name_);
00077
00078 {
00079 Object temp[] = _dim_.toArray();
00080 for(int i = 0; i < temp.length; i++)
00081 {
00082 this._dim_.add(temp[i]);
00083 }
00084 }
00085
00086 setDot(_dot_);
00087
00088 setTClass(_tClass_);
00089
00090 }
00091 public ANamedTypeExp(
00092 PName _name_,
00093 XPDim _dim_,
00094 TDot _dot_,
00095 TClass _tClass_)
00096 {
00097 setName(_name_);
00098
00099 if(_dim_ != null)
00100 {
00101 while(_dim_ instanceof X1PDim)
00102 {
00103 this._dim_.addFirst(((X1PDim) _dim_).getPDim());
00104 _dim_ = ((X1PDim) _dim_).getXPDim();
00105 }
00106 this._dim_.addFirst(((X2PDim) _dim_).getPDim());
00107 }
00108
00109 setDot(_dot_);
00110
00111 setTClass(_tClass_);
00112
00113 }
00114 public void apply(Switch sw)
00115 {
00116 ((Analysis) sw).caseANamedTypeExp(this);
00117 }
00118 public Object clone()
00119 {
00120 return new ANamedTypeExp(
00121 (PName) cloneNode(_name_),
00122 cloneList(_dim_),
00123 (TDot) cloneNode(_dot_),
00124 (TClass) cloneNode(_tClass_));
00125 }
00126 public LinkedList getDim()
00127 {
00128 return _dim_;
00129 }
00130 public TDot getDot()
00131 {
00132 return _dot_;
00133 }
00134 public PName getName()
00135 {
00136 return _name_;
00137 }
00138 public TClass getTClass()
00139 {
00140 return _tClass_;
00141 }
00142 void removeChild(Node child)
00143 {
00144 if(_name_ == child)
00145 {
00146 _name_ = null;
00147 return;
00148 }
00149
00150 if(_dim_.remove(child))
00151 {
00152 return;
00153 }
00154
00155 if(_dot_ == child)
00156 {
00157 _dot_ = null;
00158 return;
00159 }
00160
00161 if(_tClass_ == child)
00162 {
00163 _tClass_ = null;
00164 return;
00165 }
00166
00167 }
00168 void replaceChild(Node oldChild, Node newChild)
00169 {
00170 if(_name_ == oldChild)
00171 {
00172 setName((PName) newChild);
00173 return;
00174 }
00175
00176 for(ListIterator i = _dim_.listIterator(); i.hasNext();)
00177 {
00178 if(i.next() == oldChild)
00179 {
00180 if(newChild != null)
00181 {
00182 i.set(newChild);
00183 oldChild.parent(null);
00184 return;
00185 }
00186
00187 i.remove();
00188 oldChild.parent(null);
00189 return;
00190 }
00191 }
00192
00193 if(_dot_ == oldChild)
00194 {
00195 setDot((TDot) newChild);
00196 return;
00197 }
00198
00199 if(_tClass_ == oldChild)
00200 {
00201 setTClass((TClass) newChild);
00202 return;
00203 }
00204
00205 }
00206 public void setDim(List list)
00207 {
00208 Object temp[] = list.toArray();
00209 for(int i = 0; i < temp.length; i++)
00210 {
00211 _dim_.add(temp[i]);
00212 }
00213 }
00214 public void setDot(TDot node)
00215 {
00216 if(_dot_ != null)
00217 {
00218 _dot_.parent(null);
00219 }
00220
00221 if(node != null)
00222 {
00223 if(node.parent() != null)
00224 {
00225 node.parent().removeChild(node);
00226 }
00227
00228 node.parent(this);
00229 }
00230
00231 _dot_ = node;
00232 }
00233 public void setName(PName node)
00234 {
00235 if(_name_ != null)
00236 {
00237 _name_.parent(null);
00238 }
00239
00240 if(node != null)
00241 {
00242 if(node.parent() != null)
00243 {
00244 node.parent().removeChild(node);
00245 }
00246
00247 node.parent(this);
00248 }
00249
00250 _name_ = node;
00251 }
00252 public void setTClass(TClass node)
00253 {
00254 if(_tClass_ != null)
00255 {
00256 _tClass_.parent(null);
00257 }
00258
00259 if(node != null)
00260 {
00261 if(node.parent() != null)
00262 {
00263 node.parent().removeChild(node);
00264 }
00265
00266 node.parent(this);
00267 }
00268
00269 _tClass_ = node;
00270 }
00271 public String toString()
00272 {
00273 return ""
00274 + toString(_name_)
00275 + toString(_dim_)
00276 + toString(_dot_)
00277 + toString(_tClass_);
00278 }
00279 }