001 /* This file was generated with JastAdd2 (http://jastadd.org) version R20130213 */ 002 package AST; 003 004 import java.util.HashSet; 005 import java.io.File; 006 import java.util.*; 007 import beaver.*; 008 import java.util.ArrayList; 009 import java.util.zip.*; 010 import java.io.*; 011 import java.io.FileNotFoundException; 012 import java.util.Collection; 013 /** 014 * A catch clause that can catch a single exception type. 015 * @production BasicCatch : {@link CatchClause} ::= <span class="component">Parameter:{@link ParameterDeclaration}</span> <span class="component">{@link Block}</span>; 016 * @ast node 017 * @declaredat /home/jesper/svn/JastAddJ/Java7Frontend/MultiCatch.ast:9 018 */ 019 public class BasicCatch extends CatchClause implements Cloneable { 020 /** 021 * @apilevel low-level 022 */ 023 public void flushCache() { 024 } 025 /** 026 * @apilevel internal 027 */ 028 public void flushCollectionCache() { 029 } 030 /** 031 * @apilevel internal 032 */ 033 @SuppressWarnings({"unchecked", "cast"}) 034 public BasicCatch clone() throws CloneNotSupportedException { 035 BasicCatch node = (BasicCatch)super.clone(); 036 node.parameterDeclaration_String_values = null; 037 node.in$Circle(false); 038 node.is$Final(false); 039 return node; 040 } 041 /** 042 * @apilevel internal 043 */ 044 @SuppressWarnings({"unchecked", "cast"}) 045 public BasicCatch copy() { 046 047 try { 048 BasicCatch node = (BasicCatch) clone(); 049 node.parent = null; 050 if(children != null) 051 node.children = (ASTNode[]) children.clone(); 052 053 return node; 054 } catch (CloneNotSupportedException e) { 055 throw new Error("Error: clone not supported for " + getClass().getName()); 056 } 057 058 }/** 059 * Create a deep copy of the AST subtree at this node. 060 * The copy is dangling, i.e. has no parent. 061 * @return dangling copy of the subtree at this node 062 * @apilevel low-level 063 */ 064 @SuppressWarnings({"unchecked", "cast"}) 065 public BasicCatch fullCopy() { 066 067 BasicCatch tree = (BasicCatch) copy(); 068 if (children != null) { 069 for (int i = 0; i < children.length; ++i) { 070 071 ASTNode child = (ASTNode) children[i]; 072 if(child != null) { 073 child = child.fullCopy(); 074 tree.setChild(child, i); 075 } 076 } 077 } 078 return tree; 079 080 } /** 081 * @ast method 082 * @aspect PrettyPrint 083 * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/PrettyPrint.jadd:722 084 */ 085 public void toString(StringBuffer s) { 086 s.append("catch ("); 087 getParameter().toString(s); 088 s.append(") "); 089 getBlock().toString(s); 090 } 091 /** 092 * @ast method 093 * @aspect TypeCheck 094 * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/TypeCheck.jrag:368 095 */ 096 public void typeCheck() { 097 if(!getParameter().type().instanceOf(typeThrowable())) 098 error("*** The catch variable must extend Throwable"); 099 } 100 /** 101 * @ast method 102 * @aspect CreateBCode 103 * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/CreateBCode.jrag:17 104 */ 105 public void exceptionTableEntries(CodeGeneration gen, TryStmt tryStmt) { 106 gen.addException( 107 gen.addressOf(tryStmt.label_begin()), 108 gen.addressOf(tryStmt.label_block_end()), 109 gen.addressOf(label()), 110 gen.constantPool().addClass(getParameter().type().constantPoolName()) 111 ); 112 } 113 /** 114 * @ast method 115 * @aspect CreateBCode 116 * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/CreateBCode.jrag:1525 117 */ 118 public void createBCode(CodeGeneration gen) { 119 gen.addLabel(label()); 120 // add 1 to stack depth 121 gen.changeStackDepth(1); 122 getParameter().type().emitStoreLocal(gen, getParameter().localNum()); 123 getBlock().createBCode(gen); 124 } 125 /** 126 * @ast method 127 * @aspect PreciseRethrow 128 * @declaredat /home/jesper/svn/JastAddJ/Java7Frontend/PreciseRethrow.jrag:198 129 */ 130 void checkUnreachableStmt() { 131 if (!getBlock().reachable() && reportUnreachable()) 132 error("the exception "+getParameter().type().fullName()+ 133 " is not thrown in the body of the try statement"); 134 } 135 /** 136 * @ast method 137 * 138 */ 139 public BasicCatch() { 140 super(); 141 142 143 } 144 /** 145 * Initializes the child array to the correct size. 146 * Initializes List and Opt nta children. 147 * @apilevel internal 148 * @ast method 149 * @ast method 150 * 151 */ 152 public void init$Children() { 153 children = new ASTNode[2]; 154 } 155 /** 156 * @ast method 157 * 158 */ 159 public BasicCatch(ParameterDeclaration p0, Block p1) { 160 setChild(p0, 0); 161 setChild(p1, 1); 162 } 163 /** 164 * @apilevel low-level 165 * @ast method 166 * 167 */ 168 protected int numChildren() { 169 return 2; 170 } 171 /** 172 * @apilevel internal 173 * @ast method 174 * 175 */ 176 public boolean mayHaveRewrite() { 177 return false; 178 } 179 /** 180 * Replaces the Parameter child. 181 * @param node The new node to replace the Parameter child. 182 * @apilevel high-level 183 * @ast method 184 * 185 */ 186 public void setParameter(ParameterDeclaration node) { 187 setChild(node, 0); 188 } 189 /** 190 * Retrieves the Parameter child. 191 * @return The current node used as the Parameter child. 192 * @apilevel high-level 193 * @ast method 194 * 195 */ 196 public ParameterDeclaration getParameter() { 197 return (ParameterDeclaration)getChild(0); 198 } 199 /** 200 * Retrieves the Parameter child. 201 * <p><em>This method does not invoke AST transformations.</em></p> 202 * @return The current node used as the Parameter child. 203 * @apilevel low-level 204 * @ast method 205 * 206 */ 207 public ParameterDeclaration getParameterNoTransform() { 208 return (ParameterDeclaration)getChildNoTransform(0); 209 } 210 /** 211 * Replaces the Block child. 212 * @param node The new node to replace the Block child. 213 * @apilevel high-level 214 * @ast method 215 * 216 */ 217 public void setBlock(Block node) { 218 setChild(node, 1); 219 } 220 /** 221 * Retrieves the Block child. 222 * @return The current node used as the Block child. 223 * @apilevel high-level 224 * @ast method 225 * 226 */ 227 public Block getBlock() { 228 return (Block)getChild(1); 229 } 230 /** 231 * Retrieves the Block child. 232 * <p><em>This method does not invoke AST transformations.</em></p> 233 * @return The current node used as the Block child. 234 * @apilevel low-level 235 * @ast method 236 * 237 */ 238 public Block getBlockNoTransform() { 239 return (Block)getChildNoTransform(1); 240 } 241 /** 242 * @attribute syn 243 * @aspect ExceptionHandling 244 * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/ExceptionHandling.jrag:212 245 */ 246 public boolean handles(TypeDecl exceptionType) { 247 ASTNode$State state = state(); 248 try { return !getParameter().type().isUnknown() 249 && exceptionType.instanceOf(getParameter().type()); } 250 finally { 251 } 252 } 253 protected java.util.Map parameterDeclaration_String_values; 254 /** 255 * @attribute syn 256 * @aspect VariableScope 257 * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/LookupVariable.jrag:113 258 */ 259 @SuppressWarnings({"unchecked", "cast"}) 260 public SimpleSet parameterDeclaration(String name) { 261 Object _parameters = name; 262 if(parameterDeclaration_String_values == null) parameterDeclaration_String_values = new java.util.HashMap(4); 263 if(parameterDeclaration_String_values.containsKey(_parameters)) { 264 return (SimpleSet)parameterDeclaration_String_values.get(_parameters); 265 } 266 ASTNode$State state = state(); 267 int num = state.boundariesCrossed; 268 boolean isFinal = this.is$Final(); 269 SimpleSet parameterDeclaration_String_value = parameterDeclaration_compute(name); 270 if(isFinal && num == state().boundariesCrossed){ parameterDeclaration_String_values.put(_parameters, parameterDeclaration_String_value); } 271 return parameterDeclaration_String_value; 272 } 273 /** 274 * @apilevel internal 275 */ 276 private SimpleSet parameterDeclaration_compute(String name) { return getParameter().name().equals(name) ? getParameter() : SimpleSet.emptySet; } 277 /** 278 * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/LookupVariable.jrag:83 279 * @apilevel internal 280 */ 281 public SimpleSet Define_SimpleSet_lookupVariable(ASTNode caller, ASTNode child, String name) { 282 if(caller == getParameterNoTransform()) { 283 return parameterDeclaration(name); 284 } 285 else { return super.Define_SimpleSet_lookupVariable(caller, child, name); 286 } 287 } 288 /** 289 * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/NameCheck.jrag:295 290 * @apilevel internal 291 */ 292 public VariableScope Define_VariableScope_outerScope(ASTNode caller, ASTNode child) { 293 if(caller == getParameterNoTransform()) { 294 return this; 295 } 296 else { return getParent().Define_VariableScope_outerScope(this, caller); 297 } 298 } 299 /** 300 * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/SyntacticClassification.jrag:86 301 * @apilevel internal 302 */ 303 public NameType Define_NameType_nameType(ASTNode caller, ASTNode child) { 304 if(caller == getParameterNoTransform()) { 305 return NameType.TYPE_NAME; 306 } 307 else { return getParent().Define_NameType_nameType(this, caller); 308 } 309 } 310 /** 311 * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/UnreachableStatements.jrag:122 312 * @apilevel internal 313 */ 314 public boolean Define_boolean_reachable(ASTNode caller, ASTNode child) { 315 if(caller == getBlockNoTransform()) { 316 return reachableCatchClause(getParameter().type()); 317 } 318 else { return getParent().Define_boolean_reachable(this, caller); 319 } 320 } 321 /** 322 * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/VariableDeclaration.jrag:64 323 * @apilevel internal 324 */ 325 public boolean Define_boolean_isMethodParameter(ASTNode caller, ASTNode child) { 326 if(caller == getParameterNoTransform()) { 327 return false; 328 } 329 else { return getParent().Define_boolean_isMethodParameter(this, caller); 330 } 331 } 332 /** 333 * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/VariableDeclaration.jrag:65 334 * @apilevel internal 335 */ 336 public boolean Define_boolean_isConstructorParameter(ASTNode caller, ASTNode child) { 337 if(caller == getParameterNoTransform()) { 338 return false; 339 } 340 else { return getParent().Define_boolean_isConstructorParameter(this, caller); 341 } 342 } 343 /** 344 * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/VariableDeclaration.jrag:66 345 * @apilevel internal 346 */ 347 public boolean Define_boolean_isExceptionHandlerParameter(ASTNode caller, ASTNode child) { 348 if(caller == getParameterNoTransform()) { 349 return true; 350 } 351 else { return getParent().Define_boolean_isExceptionHandlerParameter(this, caller); 352 } 353 } 354 /** 355 * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/LocalNum.jrag:120 356 * @apilevel internal 357 */ 358 public int Define_int_localNum(ASTNode caller, ASTNode child) { 359 if(caller == getBlockNoTransform()) { 360 return getParameter().localNum() + getParameter().type().variableSize(); 361 } 362 else { return getParent().Define_int_localNum(this, caller); 363 } 364 } 365 /** 366 * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/VariableArityParameters.jrag:23 367 * @apilevel internal 368 */ 369 public boolean Define_boolean_variableArityValid(ASTNode caller, ASTNode child) { 370 if(caller == getParameterNoTransform()) { 371 return false; 372 } 373 else { return getParent().Define_boolean_variableArityValid(this, caller); 374 } 375 } 376 /** 377 * @declaredat /home/jesper/svn/JastAddJ/Java7Frontend/PreciseRethrow.jrag:52 378 * @apilevel internal 379 */ 380 public boolean Define_boolean_inhModifiedInScope(ASTNode caller, ASTNode child, Variable var) { 381 if(caller == getParameterNoTransform()) { 382 return getBlock().modifiedInScope(var); 383 } 384 else { return getParent().Define_boolean_inhModifiedInScope(this, caller, var); 385 } 386 } 387 /** 388 * @declaredat /home/jesper/svn/JastAddJ/Java7Frontend/PreciseRethrow.jrag:125 389 * @apilevel internal 390 */ 391 public boolean Define_boolean_isCatchParam(ASTNode caller, ASTNode child) { 392 if(caller == getParameterNoTransform()) { 393 return true; 394 } 395 else { return getParent().Define_boolean_isCatchParam(this, caller); 396 } 397 } 398 /** 399 * @apilevel internal 400 */ 401 public ASTNode rewriteTo() { 402 return super.rewriteTo(); 403 } 404 }