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    }