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     * @production MethodDecl : {@link MemberDecl} ::= <span class="component">{@link Modifiers}</span> <span class="component">TypeAccess:{@link Access}</span> <span class="component">&lt;ID:String&gt;</span> <span class="component">Parameter:{@link ParameterDeclaration}*</span> <span class="component">Exception:{@link Access}*</span> <span class="component">[{@link Block}]</span>;
015     * @ast node
016     * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/java.ast:95
017     */
018    public class MethodDecl extends MemberDecl implements Cloneable, SimpleSet, Iterator, ExceptionHolder {
019      /**
020       * @apilevel low-level
021       */
022      public void flushCache() {
023      }
024      /**
025       * @apilevel internal
026       */
027      public void flushCollectionCache() {
028      }
029      /**
030       * @apilevel internal
031       */
032      @SuppressWarnings({"unchecked", "cast"})
033      public MethodDecl clone() throws CloneNotSupportedException {
034        MethodDecl node = (MethodDecl)super.clone();
035        node.accessibleFrom_TypeDecl_values = null;
036        node.throwsException_TypeDecl_values = null;
037        node.signature_computed = false;
038        node.signature_value = null;
039        node.moreSpecificThan_MethodDecl_values = null;
040        node.overrides_MethodDecl_values = null;
041        node.hides_MethodDecl_values = null;
042        node.parameterDeclaration_String_values = null;
043        node.type_computed = false;
044        node.type_value = null;
045        node.attributes_computed = false;
046        node.attributes_value = null;
047        node.descName_computed = false;
048        node.descName_value = null;
049        node.bytecodes_ConstantPool_values = null;
050        node.flags_computed = false;
051        node.offsetBeforeParameters_computed = false;
052        node.offsetAfterParameters_computed = false;
053        node.resultOffset_computed = false;
054        node.usesTypeVariable_computed = false;
055        node.sourceMethodDecl_computed = false;
056        node.sourceMethodDecl_value = null;
057        node.handlesException_TypeDecl_values = null;
058        node.in$Circle(false);
059        node.is$Final(false);
060        return node;
061      }
062    /**
063     * @apilevel internal
064     */
065      @SuppressWarnings({"unchecked", "cast"})
066    public MethodDecl copy() {
067      
068      try {
069        MethodDecl node = (MethodDecl) clone();
070        node.parent = null;
071        if(children != null)
072          node.children = (ASTNode[]) children.clone();
073        
074        return node;
075      } catch (CloneNotSupportedException e) {
076        throw new Error("Error: clone not supported for " + getClass().getName());
077      }
078      
079    }/**
080     * Create a deep copy of the AST subtree at this node.
081     * The copy is dangling, i.e. has no parent.
082     * @return dangling copy of the subtree at this node
083     * @apilevel low-level
084     */
085      @SuppressWarnings({"unchecked", "cast"})
086    public MethodDecl fullCopy() {
087      
088      MethodDecl tree = (MethodDecl) copy();
089      if (children != null) {
090        for (int i = 0; i < children.length; ++i) {
091          
092          ASTNode child = (ASTNode) children[i];
093          if(child != null) {
094            child = child.fullCopy();
095            tree.setChild(child, i);
096          }
097        }
098      }
099      return tree;
100      
101    }  /**
102       * @ast method 
103       * @aspect BoundNames
104       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/BoundNames.jrag:77
105       */
106      public Access createBoundAccess(List args) {
107        if(isStatic()) {
108          return hostType().createQualifiedAccess().qualifiesAccess(
109            new BoundMethodAccess(name(), args, this)
110          );
111        }
112        return new BoundMethodAccess(name(), args, this);
113      }
114      /**
115       * @ast method 
116       * @aspect DataStructures
117       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DataStructures.jrag:154
118       */
119      public SimpleSet add(Object o) {
120        return new SimpleSetImpl().add(this).add(o);
121      }
122      /**
123       * @ast method 
124       * @aspect DataStructures
125       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DataStructures.jrag:158
126       */
127      public boolean isSingleton() { return true; }
128      /**
129       * @ast method 
130       * @aspect DataStructures
131       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DataStructures.jrag:159
132       */
133      public boolean isSingleton(Object o) { return contains(o); }
134      /**
135       * @ast method 
136       * @aspect DataStructures
137       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DataStructures.jrag:162
138       */
139      
140      private MethodDecl iterElem;
141      /**
142       * @ast method 
143       * @aspect DataStructures
144       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DataStructures.jrag:163
145       */
146      public Iterator iterator() { iterElem = this; return this; }
147      /**
148       * @ast method 
149       * @aspect DataStructures
150       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DataStructures.jrag:164
151       */
152      public boolean hasNext() { return iterElem != null; }
153      /**
154       * @ast method 
155       * @aspect DataStructures
156       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DataStructures.jrag:165
157       */
158      public Object next() { Object o = iterElem; iterElem = null; return o; }
159      /**
160       * @ast method 
161       * @aspect DataStructures
162       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DataStructures.jrag:166
163       */
164      public void remove() { throw new UnsupportedOperationException(); }
165      /**
166       * @ast method 
167       * @aspect NameCheck
168       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/NameCheck.jrag:101
169       */
170      public void nameCheck() {
171        // 8.4
172        // 8.4.2
173        if(!hostType().methodsSignature(signature()).contains(this))
174          error("method with signature " + signature() + " is multiply declared in type " + hostType().typeName());
175        // 8.4.3.4
176        if(isNative() && hasBlock())
177          error("native methods must have an empty semicolon body");
178        // 8.4.5
179        if(isAbstract() && hasBlock())
180          error("abstract methods must have an empty semicolon body");
181        // 8.4.5
182        if(!hasBlock() && !(isNative() || isAbstract()))
183          error("only abstract and native methods may have an empty semicolon body");
184      }
185      /**
186       * @ast method 
187       * @aspect PrettyPrint
188       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/PrettyPrint.jadd:176
189       */
190      public void toString(StringBuffer s) {
191        s.append(indent());
192        getModifiers().toString(s);
193        getTypeAccess().toString(s);
194        s.append(" " + name() + "(");
195        if(getNumParameter() > 0) {
196          getParameter(0).toString(s);
197          for(int i = 1; i < getNumParameter(); i++) {
198            s.append(", ");
199            getParameter(i).toString(s);
200          }
201        }
202        s.append(")");
203        if(getNumException() > 0) {
204          s.append(" throws ");
205          getException(0).toString(s);
206          for(int i = 1; i < getNumException(); i++) {
207            s.append(", ");
208            getException(i).toString(s);
209          }
210        }
211        if(hasBlock()) {
212          s.append(" ");
213          getBlock().toString(s);
214        }
215        else {
216          s.append(";");
217        }
218      }
219      /**
220       * @ast method 
221       * @aspect TypeCheck
222       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/TypeCheck.jrag:386
223       */
224      public void typeCheck() {
225        // Thrown vs super class method see MethodDecl.nameCheck
226        // 8.4.4
227        TypeDecl exceptionType = typeThrowable();
228        for(int i = 0; i < getNumException(); i++) {
229          TypeDecl typeDecl = getException(i).type();
230          if(!typeDecl.instanceOf(exceptionType))
231            error(signature() + " throws non throwable type " + typeDecl.fullName());
232        }
233    
234        // check returns
235        if(!isVoid() && hasBlock() && getBlock().canCompleteNormally())
236          error("the body of a non void method may not complete normally");
237    
238      }
239      /**
240       * @ast method 
241       * @aspect CodeGeneration
242       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/CodeGeneration.jrag:867
243       */
244      public void emitInvokeMethod(CodeGeneration gen, TypeDecl hostType) {
245        if(hostType.isInterfaceDecl()) {
246          int size = type().variableSize() - 1;
247          for(int i = 0; i < getNumParameter(); i++)
248            size -= getParameter(i).type().variableSize();
249          String classname = hostType.constantPoolName();
250          String      desc = descName();
251          String      name = name();
252          int index = gen.constantPool().addInterfaceMethodref(classname, name, desc);
253          int numArg = 1; // instance
254          for(int i = 0; i < getNumParameter(); i++)
255            numArg += getParameter(i).type().variableSize();
256          gen.emit(Bytecode.INVOKEINTERFACE, size).add2(index).add(numArg).add(0);
257        }
258        else {
259          String classname = hostType.constantPoolName();
260          String      desc = descName();
261          String      name = name();
262          int index = gen.constantPool().addMethodref(classname, name, desc);
263          if(isStatic()) {
264            int size = type().variableSize();
265            for(int i = 0; i < getNumParameter(); i++)
266              size -= getParameter(i).type().variableSize();
267            gen.emit(Bytecode.INVOKESTATIC, size).add2(index);
268          }
269          else {
270            int size = type().variableSize() - 1;
271            for(int i = 0; i < getNumParameter(); i++)
272              size -= getParameter(i).type().variableSize();
273            gen.emit(Bytecode.INVOKEVIRTUAL, size).add2(index);
274          }
275        }
276      }
277      /**
278       * @ast method 
279       * @aspect CodeGeneration
280       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/CodeGeneration.jrag:901
281       */
282      public void emitInvokeSpecialMethod(CodeGeneration gen, TypeDecl hostType) {
283        String classname = hostType.constantPoolName();
284        String      desc = descName();
285        String      name = name();
286        int index = gen.constantPool().addMethodref(classname, name, desc);
287        int size = type().variableSize() - 1;
288        for(int i = 0; i < getNumParameter(); i++)
289          size -= getParameter(i).type().variableSize();
290        gen.emit(Bytecode.INVOKESPECIAL, size).add2(index);
291      }
292      /**
293       * @ast method 
294       * @aspect CreateBCode
295       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/CreateBCode.jrag:84
296       */
297      private void generateBytecodes(CodeGeneration gen) {
298        int label = gen.variableScopeLabel();
299        if(!isStatic())
300          gen.addLocalVariableEntryAtCurrentPC("this", hostType().typeDescriptor(), 0, label);
301        for(int i = 0; i < getNumParameter(); i++) {
302          ParameterDeclaration p = (ParameterDeclaration)getParameter(i);
303          gen.addLocalVariableEntryAtCurrentPC(
304            p.name(), p.type().typeDescriptor(), p.localNum(), label
305          );
306        }
307        createBCode(gen);
308        if(type() instanceof VoidType) // TODO: canCompleteNormally check as well
309          gen.emitReturn();
310        gen.addVariableScopeLabel(label);
311      }
312      /**
313       * @ast method 
314       * @aspect CreateBCode
315       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/CreateBCode.jrag:125
316       */
317      public void createBCode(CodeGeneration gen) {
318        try {
319          if(hasBlock()) {
320            gen.maxLocals = Math.max(gen.maxLocals, getBlock().localNum());
321            getBlock().createBCode(gen);
322          }
323        } catch (Error e) {
324          System.err.println(hostType().typeName() + ": " + this);
325          throw e;
326        }
327      }
328      /**
329       * @ast method 
330       * @aspect GenerateClassfile
331       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/GenerateClassfile.jrag:244
332       */
333      public void generateMethod(DataOutputStream out, ConstantPool cp) throws IOException {
334        out.writeChar(flags());
335        out.writeChar(cp.addUtf8(name()));
336        out.writeChar(cp.addUtf8(descName()));
337        out.writeChar(attributes().size());
338        for(Iterator itera = attributes().iterator(); itera.hasNext();)
339          ((Attribute)itera.next()).emit(out);
340      }
341      /**
342       * @ast method 
343       * @aspect GenerateClassfile
344       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/GenerateClassfile.jrag:263
345       */
346      public void touchMethod(ConstantPool cp) {
347        cp.addUtf8(name());
348        cp.addUtf8(descName());
349        attributes();
350      }
351      /**
352       * @ast method 
353       * @aspect GenerateClassfile
354       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/GenerateClassfile.jrag:363
355       */
356      public boolean clear() {
357        if(hasBlock()) {
358          getBlock().clear();
359          setBlock(new Block(new List()));
360        }
361        bytecodes_ConstantPool_values = null;
362        return false;
363      }
364      /**
365       * @ast method 
366       * @aspect InnerClasses
367       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/InnerClasses.jrag:199
368       */
369      public MethodDecl createAccessor(TypeDecl methodQualifier) {
370        MethodDecl m = (MethodDecl)methodQualifier.getAccessor(this, "method");
371        if(m != null) return m;
372    
373        int accessorIndex = methodQualifier.accessorCounter++;
374        
375        List parameterList = new List();
376        for(int i = 0; i < getNumParameter(); i++)
377          parameterList.add(new ParameterDeclaration(
378                // We don't need to create a qualified access to the type here
379                // since there can be no ambiguity concerning unqualified
380                // type names in an inner/enclosing class
381                // Jesper 2012-05-04
382                // FALSE! We need to create a qualified access in case the
383                // method we are generating an access for is not declared
384                // in the methodQualifier type
385                getParameter(i).type().createQualifiedAccess(),
386                getParameter(i).name()));
387        List exceptionList = new List();
388        for(int i = 0; i < getNumException(); i++)
389          exceptionList.add((Access) getException(i).fullCopy());
390    
391        // add synthetic flag to modifiers
392        Modifiers modifiers = new Modifiers(new List());
393        if(getModifiers().isStatic())
394          modifiers.addModifier(new Modifier("static"));
395        modifiers.addModifier(new Modifier("synthetic"));
396        modifiers.addModifier(new Modifier("public"));
397        // build accessor declaration
398        m = new MethodDecl(
399          modifiers,
400          getTypeAccess().type().createQualifiedAccess(),
401          name() + "$access$" + accessorIndex,
402          parameterList,
403          exceptionList,
404          new Opt(
405            new Block(
406              new List().add(
407                createAccessorStmt()
408              )
409            )
410          )
411        );
412        m = methodQualifier.addMemberMethod(m);
413        methodQualifier.addAccessor(this, "method", m);
414        return m;
415      }
416      /**
417       * @ast method 
418       * @aspect InnerClasses
419       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/InnerClasses.jrag:247
420       */
421      private Stmt createAccessorStmt() {
422        List argumentList = new List();
423        for(int i = 0; i < getNumParameter(); i++)
424          argumentList.add(new VarAccess(getParameter(i).name()));
425        Access access = new BoundMethodAccess(name(), argumentList, this);
426        if(!isStatic())
427          access = new ThisAccess("this").qualifiesAccess(access);
428        return isVoid() ? (Stmt) new ExprStmt(access) : new ReturnStmt(new Opt(access));
429      }
430      /**
431       * @ast method 
432       * @aspect InnerClasses
433       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/InnerClasses.jrag:257
434       */
435      public MethodDecl createSuperAccessor(TypeDecl methodQualifier) {
436        MethodDecl m = (MethodDecl)methodQualifier.getAccessor(this, "method_super");
437        if(m != null) return m;
438    
439        int accessorIndex = methodQualifier.accessorCounter++;
440        List parameters = new List();
441        List args = new List();
442        for(int i = 0; i < getNumParameter(); i++) {
443          parameters.add(new ParameterDeclaration(getParameter(i).type(), getParameter(i).name()));
444          args.add(new VarAccess(getParameter(i).name()));
445        }
446        Stmt stmt;
447        if(type().isVoid())
448          stmt = new ExprStmt(new SuperAccess("super").qualifiesAccess(new MethodAccess(name(), args)));
449        else 
450          stmt = new ReturnStmt(new Opt(new SuperAccess("super").qualifiesAccess(new MethodAccess(name(), args))));
451        m = new MethodDecl(
452          new Modifiers(new List().add(new Modifier("synthetic"))),
453          type().createQualifiedAccess(),
454          name() + "$access$" + accessorIndex,
455          parameters,
456          new List(),
457          new Opt(
458            new Block(
459              new List().add(stmt)
460            )
461          )
462        );
463        m = methodQualifier.addMemberMethod(m);
464        methodQualifier.addAccessor(this, "method_super", m);
465        return m;
466      }
467      /**
468       * @ast method 
469       * @aspect LookupParTypeDecl
470       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/Generics.jrag:1242
471       */
472      public BodyDecl substitutedBodyDecl(Parameterization parTypeDecl) {
473        //System.out.println("Begin substituting " + signature() + " in " + hostType().typeName() + " with " + parTypeDecl.typeSignature());
474        MethodDecl m = new MethodDeclSubstituted(
475          (Modifiers)getModifiers().fullCopy(),
476          getTypeAccess().type().substituteReturnType(parTypeDecl),
477          getID(),
478          getParameterList().substitute(parTypeDecl),
479          getExceptionList().substitute(parTypeDecl),
480          substituteBody(parTypeDecl),
481          this
482        );
483        //System.out.println("End substituting " + signature());
484        return m;
485      }
486      /**
487       * @ast method 
488       * @aspect LookupParTypeDecl
489       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/Generics.jrag:1257
490       */
491      public Opt substituteBody(Parameterization parTypeDecl) {
492        return new Opt();
493      }
494      /**
495       * @ast method 
496       * @aspect AnnotationsCodegen
497       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Backend/AnnotationsCodegen.jrag:84
498       */
499      public void addRuntimeVisibleParameterAnnotationsAttribute(Collection c) {
500        boolean foundVisibleAnnotations = false;
501        Collection annotations = new ArrayList(getNumParameter());
502        for(int i = 0; i < getNumParameter(); i++) {
503          Collection a = getParameter(i).getModifiers().runtimeVisibleAnnotations();
504          if(!a.isEmpty()) foundVisibleAnnotations = true;
505          annotations.add(a);
506        }
507        if(foundVisibleAnnotations)
508          c.add(new ParameterAnnotationsAttribute(hostType().constantPool(), annotations, "RuntimeVisibleParameterAnnotations"));
509      }
510      /**
511       * @ast method 
512       * @aspect AnnotationsCodegen
513       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Backend/AnnotationsCodegen.jrag:105
514       */
515      public void addRuntimeInvisibleParameterAnnotationsAttribute(Collection c) {
516        boolean foundInvisibleAnnotations = false;
517        Collection annotations = new ArrayList(getNumParameter());
518        for(int i = 0; i < getNumParameter(); i++) {
519          Collection a = getParameter(i).getModifiers().runtimeInvisibleAnnotations();
520          if(!a.isEmpty()) foundInvisibleAnnotations = true;
521          annotations.add(a);
522        }
523        if(foundInvisibleAnnotations)
524          c.add(new ParameterAnnotationsAttribute(hostType().constantPool(), annotations, "RuntimeInvisibleParameterAnnotations"));
525      }
526      /**
527       * @ast method 
528       * @aspect GenericsCodegen
529       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Backend/GenericsCodegen.jrag:236
530       */
531      public void transformation() {
532        super.transformation();
533        HashSet processed = new HashSet();
534        for(Iterator iter = hostType().bridgeCandidates(signature()).iterator(); iter.hasNext(); ) {
535          MethodDecl m = (MethodDecl)iter.next();
536          if(this.overrides(m)) {
537            MethodDecl erased = m.erasedMethod();
538            if(!erased.signature().equals(signature()) || erased.type().erasure() != type().erasure()) {
539              StringBuffer keyBuffer = new StringBuffer();
540              for(int i = 0; i < getNumParameter(); i++) {
541                keyBuffer.append(erased.getParameter(i).type().erasure().fullName());
542              }
543              keyBuffer.append(erased.type().erasure().fullName());
544              String key = keyBuffer.toString();
545              if(!processed.contains(key)) {
546                processed.add(key);
547    
548                List args = new List();
549                List parameters = new List();
550                for(int i = 0; i < getNumParameter(); i++) {
551                  args.add(new CastExpr(getParameter(i).type().erasure().createBoundAccess(), new VarAccess("p" + i)));
552                  parameters.add(new ParameterDeclaration(erased.getParameter(i).type().erasure(), "p" + i));
553                }
554                Stmt stmt;
555                if(type().isVoid()) {
556                  stmt = new ExprStmt(
557                      createBoundAccess(
558                        args
559                        )
560                      );
561                }
562                else {
563                  stmt = new ReturnStmt(
564                      createBoundAccess(
565                        args
566                        )
567                      );
568                }
569                List modifiersList = new List();
570                if(isPublic())
571                  modifiersList.add(new Modifier("public"));
572                else if(isProtected())
573                  modifiersList.add(new Modifier("protected"));
574                else if(isPrivate())
575                  modifiersList.add(new Modifier("private"));
576                MethodDecl bridge = new BridgeMethodDecl(
577                    new Modifiers(modifiersList),
578                    erased.type().erasure().createBoundAccess(),
579                    erased.name(),
580                    parameters,
581                    (List)getExceptionList().fullCopy(),
582                    new Opt(
583                      new Block(
584                        new List().add(stmt)
585                        )
586                      )
587                    );
588                hostType().addBodyDecl(bridge);
589              }
590            }
591          }
592        }
593      }
594      /**
595        * Check if the method is missing a SafeVarargs annotation.
596        * @ast method 
597       * @aspect SafeVarargs
598       * @declaredat /home/jesper/svn/JastAddJ/Java7Frontend/SafeVarargs.jrag:151
599       */
600      public void checkWarnings() {
601               // check for illegal use of @SafeVarargs
602               super.checkWarnings();
603    
604               if (!suppressWarnings("unchecked") &&
605                               !hasAnnotationSafeVarargs() &&
606                               isVariableArity() &&
607                               !getParameter(getNumParameter()-1).type().isReifiable())
608                       warning("possible heap pollution for " +
609                               "variable arity parameter");
610       }
611      /**
612       * @ast method 
613       * 
614       */
615      public MethodDecl() {
616        super();
617    
618    
619      }
620      /**
621       * Initializes the child array to the correct size.
622       * Initializes List and Opt nta children.
623       * @apilevel internal
624       * @ast method
625       * @ast method 
626       * 
627       */
628      public void init$Children() {
629        children = new ASTNode[5];
630        setChild(new List(), 2);
631        setChild(new List(), 3);
632        setChild(new Opt(), 4);
633      }
634      /**
635       * @ast method 
636       * 
637       */
638      public MethodDecl(Modifiers p0, Access p1, String p2, List<ParameterDeclaration> p3, List<Access> p4, Opt<Block> p5) {
639        setChild(p0, 0);
640        setChild(p1, 1);
641        setID(p2);
642        setChild(p3, 2);
643        setChild(p4, 3);
644        setChild(p5, 4);
645      }
646      /**
647       * @ast method 
648       * 
649       */
650      public MethodDecl(Modifiers p0, Access p1, beaver.Symbol p2, List<ParameterDeclaration> p3, List<Access> p4, Opt<Block> p5) {
651        setChild(p0, 0);
652        setChild(p1, 1);
653        setID(p2);
654        setChild(p3, 2);
655        setChild(p4, 3);
656        setChild(p5, 4);
657      }
658      /**
659       * @apilevel low-level
660       * @ast method 
661       * 
662       */
663      protected int numChildren() {
664        return 5;
665      }
666      /**
667       * @apilevel internal
668       * @ast method 
669       * 
670       */
671      public boolean mayHaveRewrite() {
672        return false;
673      }
674      /**
675       * Replaces the Modifiers child.
676       * @param node The new node to replace the Modifiers child.
677       * @apilevel high-level
678       * @ast method 
679       * 
680       */
681      public void setModifiers(Modifiers node) {
682        setChild(node, 0);
683      }
684      /**
685       * Retrieves the Modifiers child.
686       * @return The current node used as the Modifiers child.
687       * @apilevel high-level
688       * @ast method 
689       * 
690       */
691      public Modifiers getModifiers() {
692        return (Modifiers)getChild(0);
693      }
694      /**
695       * Retrieves the Modifiers child.
696       * <p><em>This method does not invoke AST transformations.</em></p>
697       * @return The current node used as the Modifiers child.
698       * @apilevel low-level
699       * @ast method 
700       * 
701       */
702      public Modifiers getModifiersNoTransform() {
703        return (Modifiers)getChildNoTransform(0);
704      }
705      /**
706       * Replaces the TypeAccess child.
707       * @param node The new node to replace the TypeAccess child.
708       * @apilevel high-level
709       * @ast method 
710       * 
711       */
712      public void setTypeAccess(Access node) {
713        setChild(node, 1);
714      }
715      /**
716       * Retrieves the TypeAccess child.
717       * @return The current node used as the TypeAccess child.
718       * @apilevel high-level
719       * @ast method 
720       * 
721       */
722      public Access getTypeAccess() {
723        return (Access)getChild(1);
724      }
725      /**
726       * Retrieves the TypeAccess child.
727       * <p><em>This method does not invoke AST transformations.</em></p>
728       * @return The current node used as the TypeAccess child.
729       * @apilevel low-level
730       * @ast method 
731       * 
732       */
733      public Access getTypeAccessNoTransform() {
734        return (Access)getChildNoTransform(1);
735      }
736      /**
737       * Replaces the lexeme ID.
738       * @param value The new value for the lexeme ID.
739       * @apilevel high-level
740       * @ast method 
741       * 
742       */
743      public void setID(String value) {
744        tokenString_ID = value;
745      }
746      /**
747       * @apilevel internal
748       * @ast method 
749       * 
750       */
751      
752      /**
753       * @apilevel internal
754       */
755      protected String tokenString_ID;
756      /**
757       * @ast method 
758       * 
759       */
760      
761      public int IDstart;
762      /**
763       * @ast method 
764       * 
765       */
766      
767      public int IDend;
768      /**
769       * JastAdd-internal setter for lexeme ID using the Beaver parser.
770       * @apilevel internal
771       * @ast method 
772       * 
773       */
774      public void setID(beaver.Symbol symbol) {
775        if(symbol.value != null && !(symbol.value instanceof String))
776          throw new UnsupportedOperationException("setID is only valid for String lexemes");
777        tokenString_ID = (String)symbol.value;
778        IDstart = symbol.getStart();
779        IDend = symbol.getEnd();
780      }
781      /**
782       * Retrieves the value for the lexeme ID.
783       * @return The value for the lexeme ID.
784       * @apilevel high-level
785       * @ast method 
786       * 
787       */
788      public String getID() {
789        return tokenString_ID != null ? tokenString_ID : "";
790      }
791      /**
792       * Replaces the Parameter list.
793       * @param list The new list node to be used as the Parameter list.
794       * @apilevel high-level
795       * @ast method 
796       * 
797       */
798      public void setParameterList(List<ParameterDeclaration> list) {
799        setChild(list, 2);
800      }
801      /**
802       * Retrieves the number of children in the Parameter list.
803       * @return Number of children in the Parameter list.
804       * @apilevel high-level
805       * @ast method 
806       * 
807       */
808      public int getNumParameter() {
809        return getParameterList().getNumChild();
810      }
811      /**
812       * Retrieves the number of children in the Parameter list.
813       * Calling this method will not trigger rewrites..
814       * @return Number of children in the Parameter list.
815       * @apilevel low-level
816       * @ast method 
817       * 
818       */
819      public int getNumParameterNoTransform() {
820        return getParameterListNoTransform().getNumChildNoTransform();
821      }
822      /**
823       * Retrieves the element at index {@code i} in the Parameter list..
824       * @param i Index of the element to return.
825       * @return The element at position {@code i} in the Parameter list.
826       * @apilevel high-level
827       * @ast method 
828       * 
829       */
830      @SuppressWarnings({"unchecked", "cast"})
831      public ParameterDeclaration getParameter(int i) {
832        return (ParameterDeclaration)getParameterList().getChild(i);
833      }
834      /**
835       * Append an element to the Parameter list.
836       * @param node The element to append to the Parameter list.
837       * @apilevel high-level
838       * @ast method 
839       * 
840       */
841      public void addParameter(ParameterDeclaration node) {
842        List<ParameterDeclaration> list = (parent == null || state == null) ? getParameterListNoTransform() : getParameterList();
843        list.addChild(node);
844      }
845      /**
846       * @apilevel low-level
847       * @ast method 
848       * 
849       */
850      public void addParameterNoTransform(ParameterDeclaration node) {
851        List<ParameterDeclaration> list = getParameterListNoTransform();
852        list.addChild(node);
853      }
854      /**
855       * Replaces the Parameter list element at index {@code i} with the new node {@code node}.
856       * @param node The new node to replace the old list element.
857       * @param i The list index of the node to be replaced.
858       * @apilevel high-level
859       * @ast method 
860       * 
861       */
862      public void setParameter(ParameterDeclaration node, int i) {
863        List<ParameterDeclaration> list = getParameterList();
864        list.setChild(node, i);
865      }
866      /**
867       * Retrieves the Parameter list.
868       * @return The node representing the Parameter list.
869       * @apilevel high-level
870       * @ast method 
871       * 
872       */
873      public List<ParameterDeclaration> getParameters() {
874        return getParameterList();
875      }
876      /**
877       * Retrieves the Parameter list.
878       * <p><em>This method does not invoke AST transformations.</em></p>
879       * @return The node representing the Parameter list.
880       * @apilevel low-level
881       * @ast method 
882       * 
883       */
884      public List<ParameterDeclaration> getParametersNoTransform() {
885        return getParameterListNoTransform();
886      }
887      /**
888       * Retrieves the Parameter list.
889       * @return The node representing the Parameter list.
890       * @apilevel high-level
891       * @ast method 
892       * 
893       */
894      @SuppressWarnings({"unchecked", "cast"})
895      public List<ParameterDeclaration> getParameterList() {
896        List<ParameterDeclaration> list = (List<ParameterDeclaration>)getChild(2);
897        list.getNumChild();
898        return list;
899      }
900      /**
901       * Retrieves the Parameter list.
902       * <p><em>This method does not invoke AST transformations.</em></p>
903       * @return The node representing the Parameter list.
904       * @apilevel low-level
905       * @ast method 
906       * 
907       */
908      @SuppressWarnings({"unchecked", "cast"})
909      public List<ParameterDeclaration> getParameterListNoTransform() {
910        return (List<ParameterDeclaration>)getChildNoTransform(2);
911      }
912      /**
913       * Replaces the Exception list.
914       * @param list The new list node to be used as the Exception list.
915       * @apilevel high-level
916       * @ast method 
917       * 
918       */
919      public void setExceptionList(List<Access> list) {
920        setChild(list, 3);
921      }
922      /**
923       * Retrieves the number of children in the Exception list.
924       * @return Number of children in the Exception list.
925       * @apilevel high-level
926       * @ast method 
927       * 
928       */
929      public int getNumException() {
930        return getExceptionList().getNumChild();
931      }
932      /**
933       * Retrieves the number of children in the Exception list.
934       * Calling this method will not trigger rewrites..
935       * @return Number of children in the Exception list.
936       * @apilevel low-level
937       * @ast method 
938       * 
939       */
940      public int getNumExceptionNoTransform() {
941        return getExceptionListNoTransform().getNumChildNoTransform();
942      }
943      /**
944       * Retrieves the element at index {@code i} in the Exception list..
945       * @param i Index of the element to return.
946       * @return The element at position {@code i} in the Exception list.
947       * @apilevel high-level
948       * @ast method 
949       * 
950       */
951      @SuppressWarnings({"unchecked", "cast"})
952      public Access getException(int i) {
953        return (Access)getExceptionList().getChild(i);
954      }
955      /**
956       * Append an element to the Exception list.
957       * @param node The element to append to the Exception list.
958       * @apilevel high-level
959       * @ast method 
960       * 
961       */
962      public void addException(Access node) {
963        List<Access> list = (parent == null || state == null) ? getExceptionListNoTransform() : getExceptionList();
964        list.addChild(node);
965      }
966      /**
967       * @apilevel low-level
968       * @ast method 
969       * 
970       */
971      public void addExceptionNoTransform(Access node) {
972        List<Access> list = getExceptionListNoTransform();
973        list.addChild(node);
974      }
975      /**
976       * Replaces the Exception list element at index {@code i} with the new node {@code node}.
977       * @param node The new node to replace the old list element.
978       * @param i The list index of the node to be replaced.
979       * @apilevel high-level
980       * @ast method 
981       * 
982       */
983      public void setException(Access node, int i) {
984        List<Access> list = getExceptionList();
985        list.setChild(node, i);
986      }
987      /**
988       * Retrieves the Exception list.
989       * @return The node representing the Exception list.
990       * @apilevel high-level
991       * @ast method 
992       * 
993       */
994      public List<Access> getExceptions() {
995        return getExceptionList();
996      }
997      /**
998       * Retrieves the Exception list.
999       * <p><em>This method does not invoke AST transformations.</em></p>
1000       * @return The node representing the Exception list.
1001       * @apilevel low-level
1002       * @ast method 
1003       * 
1004       */
1005      public List<Access> getExceptionsNoTransform() {
1006        return getExceptionListNoTransform();
1007      }
1008      /**
1009       * Retrieves the Exception list.
1010       * @return The node representing the Exception list.
1011       * @apilevel high-level
1012       * @ast method 
1013       * 
1014       */
1015      @SuppressWarnings({"unchecked", "cast"})
1016      public List<Access> getExceptionList() {
1017        List<Access> list = (List<Access>)getChild(3);
1018        list.getNumChild();
1019        return list;
1020      }
1021      /**
1022       * Retrieves the Exception list.
1023       * <p><em>This method does not invoke AST transformations.</em></p>
1024       * @return The node representing the Exception list.
1025       * @apilevel low-level
1026       * @ast method 
1027       * 
1028       */
1029      @SuppressWarnings({"unchecked", "cast"})
1030      public List<Access> getExceptionListNoTransform() {
1031        return (List<Access>)getChildNoTransform(3);
1032      }
1033      /**
1034       * Replaces the optional node for the Block child. This is the {@code Opt} node containing the child Block, not the actual child!
1035       * @param opt The new node to be used as the optional node for the Block child.
1036       * @apilevel low-level
1037       * @ast method 
1038       * 
1039       */
1040      public void setBlockOpt(Opt<Block> opt) {
1041        setChild(opt, 4);
1042      }
1043      /**
1044       * Check whether the optional Block child exists.
1045       * @return {@code true} if the optional Block child exists, {@code false} if it does not.
1046       * @apilevel high-level
1047       * @ast method 
1048       * 
1049       */
1050      public boolean hasBlock() {
1051        return getBlockOpt().getNumChild() != 0;
1052      }
1053      /**
1054       * Retrieves the (optional) Block child.
1055       * @return The Block child, if it exists. Returns {@code null} otherwise.
1056       * @apilevel low-level
1057       * @ast method 
1058       * 
1059       */
1060      @SuppressWarnings({"unchecked", "cast"})
1061      public Block getBlock() {
1062        return (Block)getBlockOpt().getChild(0);
1063      }
1064      /**
1065       * Replaces the (optional) Block child.
1066       * @param node The new node to be used as the Block child.
1067       * @apilevel high-level
1068       * @ast method 
1069       * 
1070       */
1071      public void setBlock(Block node) {
1072        getBlockOpt().setChild(node, 0);
1073      }
1074      /**
1075       * @apilevel low-level
1076       * @ast method 
1077       * 
1078       */
1079      @SuppressWarnings({"unchecked", "cast"})
1080      public Opt<Block> getBlockOpt() {
1081        return (Opt<Block>)getChild(4);
1082      }
1083      /**
1084       * Retrieves the optional node for child Block. This is the {@code Opt} node containing the child Block, not the actual child!
1085       * <p><em>This method does not invoke AST transformations.</em></p>
1086       * @return The optional node for child Block.
1087       * @apilevel low-level
1088       * @ast method 
1089       * 
1090       */
1091      @SuppressWarnings({"unchecked", "cast"})
1092      public Opt<Block> getBlockOptNoTransform() {
1093        return (Opt<Block>)getChildNoTransform(4);
1094      }
1095      /**
1096       * @ast method 
1097       * @aspect Enums
1098       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/Enums.jrag:717
1099       */
1100       
1101      public void checkModifiers() {
1102        super.checkModifiers();
1103        if(hostType().isClassDecl()) {
1104          // 8.4.3.1
1105          if(!hostType().isEnumDecl() && isAbstract() && !hostType().isAbstract())
1106            error("class must be abstract to include abstract methods");
1107          // 8.4.3.1
1108          if(isAbstract() && isPrivate())
1109            error("method may not be abstract and private");
1110          // 8.4.3.1
1111          // 8.4.3.2
1112          if(isAbstract() && isStatic())
1113            error("method may not be abstract and static");
1114          if(isAbstract() && isSynchronized())
1115            error("method may not be abstract and synchronized");
1116          // 8.4.3.4
1117          if(isAbstract() && isNative())
1118            error("method may not be abstract and native");
1119          if(isAbstract() && isStrictfp())
1120            error("method may not be abstract and strictfp");
1121          if(isNative() && isStrictfp())
1122            error("method may not be native and strictfp");
1123        }
1124        if(hostType().isInterfaceDecl()) {
1125          // 9.4
1126          if(isStatic())
1127            error("interface method " + signature() + " in " +
1128                hostType().typeName() +  " may not be static");
1129          if(isStrictfp())
1130            error("interface method " + signature() + " in " +
1131                hostType().typeName() +  " may not be strictfp");
1132          if(isNative())
1133            error("interface method " + signature() + " in " +
1134                hostType().typeName() +  " may not be native");
1135          if(isSynchronized())
1136            error("interface method " + signature() + " in " +
1137                hostType().typeName() +  " may not be synchronized");
1138          if(isProtected())
1139            error("interface method " + signature() + " in " +
1140                hostType().typeName() +  " may not be protected");
1141          if(isPrivate())
1142            error("interface method " + signature() + " in " +
1143                hostType().typeName() +  " may not be private");
1144          else if(isFinal())
1145            error("interface method " + signature() + " in " +
1146                hostType().typeName() +  " may not be final");
1147        }
1148      }
1149      /**
1150       * @ast method 
1151       * @aspect MethodDecl
1152       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/LookupMethod.jrag:148
1153       */
1154      private boolean refined_MethodDecl_MethodDecl_moreSpecificThan_MethodDecl(MethodDecl m)
1155    {
1156        if(getNumParameter() == 0)
1157          return false;
1158        for(int i = 0; i < getNumParameter(); i++) {
1159          if(!getParameter(i).type().instanceOf(m.getParameter(i).type()))
1160            return false;
1161        }
1162        return true;
1163      }
1164      /**
1165       * @ast method 
1166       * @aspect Attributes
1167       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/Attributes.jrag:189
1168       */
1169      private Collection refined_Attributes_MethodDecl_attributes()
1170    {
1171        ArrayList l = new ArrayList();
1172        l.add(new ExceptionsAttribute(bytecodes(hostType().constantPool()), this));
1173        if(isAbstract() || isNative()) return l;
1174        l.add(new CodeAttribute(bytecodes(hostType().constantPool()), this));
1175        if(getModifiers().isSynthetic())
1176          l.add(new SyntheticAttribute(hostType().constantPool()));
1177        return l;
1178      }
1179      /**
1180       * @ast method 
1181       * @aspect Flags
1182       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/Flags.jrag:40
1183       */
1184      private int refined_Flags_MethodDecl_flags()
1185    {
1186        int res = 0;
1187        if(isPublic()) res |= Modifiers.ACC_PUBLIC;
1188        if(isPrivate()) res |= Modifiers.ACC_PRIVATE;
1189        if(isProtected()) res |= Modifiers.ACC_PROTECTED;
1190        if(isStatic()) res |= Modifiers.ACC_STATIC;
1191        if(isFinal()) res |= Modifiers.ACC_FINAL;
1192        if(isSynchronized()) res |= Modifiers.ACC_SYNCHRONIZED;
1193        if(isNative()) res |= Modifiers.ACC_NATIVE;
1194        if(isAbstract()) res |= Modifiers.ACC_ABSTRACT;
1195        if(isStrictfp() || (hostType().isStrictfp() && !hostType().isInterfaceDecl())) res |= Modifiers.ACC_STRICT;
1196        return res;
1197      }
1198      /**
1199       * @ast method 
1200       * @aspect AnnotationsCodegen
1201       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Backend/AnnotationsCodegen.jrag:23
1202       */
1203      private Collection refined_AnnotationsCodegen_MethodDecl_attributes()
1204    {
1205        Collection c = refined_Attributes_MethodDecl_attributes();
1206        getModifiers().addRuntimeVisibleAnnotationsAttribute(c);
1207        getModifiers().addRuntimeInvisibleAnnotationsAttribute(c);
1208        addRuntimeVisibleParameterAnnotationsAttribute(c);
1209        addRuntimeInvisibleParameterAnnotationsAttribute(c);
1210        return c;
1211      }
1212      protected java.util.Map accessibleFrom_TypeDecl_values;
1213      /**
1214       * @attribute syn
1215       * @aspect AccessControl
1216       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/AccessControl.jrag:77
1217       */
1218      @SuppressWarnings({"unchecked", "cast"})
1219      public boolean accessibleFrom(TypeDecl type) {
1220        Object _parameters = type;
1221        if(accessibleFrom_TypeDecl_values == null) accessibleFrom_TypeDecl_values = new java.util.HashMap(4);
1222        if(accessibleFrom_TypeDecl_values.containsKey(_parameters)) {
1223          return ((Boolean)accessibleFrom_TypeDecl_values.get(_parameters)).booleanValue();
1224        }
1225          ASTNode$State state = state();
1226      int num = state.boundariesCrossed;
1227      boolean isFinal = this.is$Final();
1228        boolean accessibleFrom_TypeDecl_value = accessibleFrom_compute(type);
1229      if(isFinal && num == state().boundariesCrossed){ accessibleFrom_TypeDecl_values.put(_parameters, Boolean.valueOf(accessibleFrom_TypeDecl_value)); }
1230            return accessibleFrom_TypeDecl_value;
1231      }
1232      /**
1233       * @apilevel internal
1234       */
1235      private boolean accessibleFrom_compute(TypeDecl type) {
1236        if(isPublic()) {
1237          return true;
1238        }
1239        else if(isProtected()) {
1240          if(hostPackage().equals(type.hostPackage()))
1241            return true;
1242          if(type.withinBodyThatSubclasses(hostType()) != null)
1243            return true;
1244          return false;
1245        }
1246        else if(isPrivate())
1247          return hostType().topLevelType() == type.topLevelType();
1248        else
1249          return hostPackage().equals(type.hostPackage());
1250      }
1251      /**
1252       * @attribute syn
1253       * @aspect DataStructures
1254       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DataStructures.jrag:152
1255       */
1256      public int size() {
1257        ASTNode$State state = state();
1258        try {  return 1;  }
1259        finally {
1260        }
1261      }
1262      /**
1263       * @attribute syn
1264       * @aspect DataStructures
1265       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DataStructures.jrag:153
1266       */
1267      public boolean isEmpty() {
1268        ASTNode$State state = state();
1269        try {  return false;  }
1270        finally {
1271        }
1272      }
1273      /**
1274       * @attribute syn
1275       * @aspect DataStructures
1276       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DataStructures.jrag:157
1277       */
1278      public boolean contains(Object o) {
1279        ASTNode$State state = state();
1280        try {  return this == o;  }
1281        finally {
1282        }
1283      }
1284      /**
1285       * @attribute syn
1286       * @aspect ErrorCheck
1287       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/ErrorCheck.jrag:22
1288       */
1289      public int lineNumber() {
1290        ASTNode$State state = state();
1291        try {  return getLine(IDstart);  }
1292        finally {
1293        }
1294      }
1295      protected java.util.Map throwsException_TypeDecl_values;
1296      /**
1297       * @attribute syn
1298       * @aspect ExceptionHandling
1299       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/ExceptionHandling.jrag:146
1300       */
1301      @SuppressWarnings({"unchecked", "cast"})
1302      public boolean throwsException(TypeDecl exceptionType) {
1303        Object _parameters = exceptionType;
1304        if(throwsException_TypeDecl_values == null) throwsException_TypeDecl_values = new java.util.HashMap(4);
1305        if(throwsException_TypeDecl_values.containsKey(_parameters)) {
1306          return ((Boolean)throwsException_TypeDecl_values.get(_parameters)).booleanValue();
1307        }
1308          ASTNode$State state = state();
1309      int num = state.boundariesCrossed;
1310      boolean isFinal = this.is$Final();
1311        boolean throwsException_TypeDecl_value = throwsException_compute(exceptionType);
1312      if(isFinal && num == state().boundariesCrossed){ throwsException_TypeDecl_values.put(_parameters, Boolean.valueOf(throwsException_TypeDecl_value)); }
1313            return throwsException_TypeDecl_value;
1314      }
1315      /**
1316       * @apilevel internal
1317       */
1318      private boolean throwsException_compute(TypeDecl exceptionType) {
1319        for(int i = 0; i < getNumException(); i++)
1320          if(exceptionType.instanceOf(getException(i).type()))
1321            return true;
1322        return false;
1323      }
1324      /**
1325       * @attribute syn
1326       * @aspect MethodDecl
1327       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/LookupMethod.jrag:131
1328       */
1329      public String name() {
1330        ASTNode$State state = state();
1331        try {  return getID();  }
1332        finally {
1333        }
1334      }
1335      /**
1336       * @apilevel internal
1337       */
1338      protected boolean signature_computed = false;
1339      /**
1340       * @apilevel internal
1341       */
1342      protected String signature_value;
1343      /**
1344       * @attribute syn
1345       * @aspect MethodSignature15
1346       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/MethodSignature.jrag:347
1347       */
1348      @SuppressWarnings({"unchecked", "cast"})
1349      public String signature() {
1350        if(signature_computed) {
1351          return signature_value;
1352        }
1353          ASTNode$State state = state();
1354      int num = state.boundariesCrossed;
1355      boolean isFinal = this.is$Final();
1356        signature_value = signature_compute();
1357      if(isFinal && num == state().boundariesCrossed){ signature_computed = true; }
1358            return signature_value;
1359      }
1360      /**
1361       * @apilevel internal
1362       */
1363      private String signature_compute() {
1364        StringBuffer s = new StringBuffer();
1365        s.append(name() + "(");
1366        for(int i = 0; i < getNumParameter(); i++) {
1367          if(i != 0) s.append(", ");
1368          s.append(getParameter(i).type().erasure().typeName());
1369        }
1370        s.append(")");
1371        return s.toString();
1372    
1373      }
1374      /**
1375       * @attribute syn
1376       * @aspect MethodDecl
1377       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/LookupMethod.jrag:146
1378       */
1379      public boolean sameSignature(MethodDecl m) {
1380        ASTNode$State state = state();
1381        try {  return signature().equals(m.signature());  }
1382        finally {
1383        }
1384      }
1385      protected java.util.Map moreSpecificThan_MethodDecl_values;
1386      /**
1387       * @attribute syn
1388       * @aspect MethodSignature15
1389       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/MethodSignature.jrag:155
1390       */
1391      @SuppressWarnings({"unchecked", "cast"})
1392      public boolean moreSpecificThan(MethodDecl m) {
1393        Object _parameters = m;
1394        if(moreSpecificThan_MethodDecl_values == null) moreSpecificThan_MethodDecl_values = new java.util.HashMap(4);
1395        if(moreSpecificThan_MethodDecl_values.containsKey(_parameters)) {
1396          return ((Boolean)moreSpecificThan_MethodDecl_values.get(_parameters)).booleanValue();
1397        }
1398          ASTNode$State state = state();
1399      int num = state.boundariesCrossed;
1400      boolean isFinal = this.is$Final();
1401        boolean moreSpecificThan_MethodDecl_value = moreSpecificThan_compute(m);
1402      if(isFinal && num == state().boundariesCrossed){ moreSpecificThan_MethodDecl_values.put(_parameters, Boolean.valueOf(moreSpecificThan_MethodDecl_value)); }
1403            return moreSpecificThan_MethodDecl_value;
1404      }
1405      /**
1406       * @apilevel internal
1407       */
1408      private boolean moreSpecificThan_compute(MethodDecl m) {
1409        if(!isVariableArity() && !m.isVariableArity())
1410          return refined_MethodDecl_MethodDecl_moreSpecificThan_MethodDecl(m);
1411        int num = Math.max(getNumParameter(), m.getNumParameter());
1412        for(int i = 0; i < num; i++) {
1413          TypeDecl t1 = i < getNumParameter() - 1 ? getParameter(i).type() : getParameter(getNumParameter()-1).type().componentType();
1414          TypeDecl t2 = i < m.getNumParameter() - 1 ? m.getParameter(i).type() : m.getParameter(m.getNumParameter()-1).type().componentType();
1415          if(!t1.instanceOf(t2))
1416            return false;
1417        }
1418        return true;
1419      }
1420      protected java.util.Map overrides_MethodDecl_values;
1421      /**
1422       * @attribute syn
1423       * @aspect MethodDecl
1424       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/LookupMethod.jrag:200
1425       */
1426      @SuppressWarnings({"unchecked", "cast"})
1427      public boolean overrides(MethodDecl m) {
1428        Object _parameters = m;
1429        if(overrides_MethodDecl_values == null) overrides_MethodDecl_values = new java.util.HashMap(4);
1430        if(overrides_MethodDecl_values.containsKey(_parameters)) {
1431          return ((Boolean)overrides_MethodDecl_values.get(_parameters)).booleanValue();
1432        }
1433          ASTNode$State state = state();
1434      int num = state.boundariesCrossed;
1435      boolean isFinal = this.is$Final();
1436        boolean overrides_MethodDecl_value = overrides_compute(m);
1437      if(isFinal && num == state().boundariesCrossed){ overrides_MethodDecl_values.put(_parameters, Boolean.valueOf(overrides_MethodDecl_value)); }
1438            return overrides_MethodDecl_value;
1439      }
1440      /**
1441       * @apilevel internal
1442       */
1443      private boolean overrides_compute(MethodDecl m) {  return !isStatic() && !m.isPrivate() && m.accessibleFrom(hostType()) && 
1444         hostType().instanceOf(m.hostType()) && m.signature().equals(signature());  }
1445      protected java.util.Map hides_MethodDecl_values;
1446      /**
1447       * @attribute syn
1448       * @aspect MethodDecl
1449       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/LookupMethod.jrag:204
1450       */
1451      @SuppressWarnings({"unchecked", "cast"})
1452      public boolean hides(MethodDecl m) {
1453        Object _parameters = m;
1454        if(hides_MethodDecl_values == null) hides_MethodDecl_values = new java.util.HashMap(4);
1455        if(hides_MethodDecl_values.containsKey(_parameters)) {
1456          return ((Boolean)hides_MethodDecl_values.get(_parameters)).booleanValue();
1457        }
1458          ASTNode$State state = state();
1459      int num = state.boundariesCrossed;
1460      boolean isFinal = this.is$Final();
1461        boolean hides_MethodDecl_value = hides_compute(m);
1462      if(isFinal && num == state().boundariesCrossed){ hides_MethodDecl_values.put(_parameters, Boolean.valueOf(hides_MethodDecl_value)); }
1463            return hides_MethodDecl_value;
1464      }
1465      /**
1466       * @apilevel internal
1467       */
1468      private boolean hides_compute(MethodDecl m) {  return isStatic() && !m.isPrivate() && m.accessibleFrom(hostType()) && 
1469         hostType().instanceOf(m.hostType()) && m.signature().equals(signature());  }
1470      protected java.util.Map parameterDeclaration_String_values;
1471      /**
1472       * @attribute syn
1473       * @aspect VariableScope
1474       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/LookupVariable.jrag:99
1475       */
1476      @SuppressWarnings({"unchecked", "cast"})
1477      public SimpleSet parameterDeclaration(String name) {
1478        Object _parameters = name;
1479        if(parameterDeclaration_String_values == null) parameterDeclaration_String_values = new java.util.HashMap(4);
1480        if(parameterDeclaration_String_values.containsKey(_parameters)) {
1481          return (SimpleSet)parameterDeclaration_String_values.get(_parameters);
1482        }
1483          ASTNode$State state = state();
1484      int num = state.boundariesCrossed;
1485      boolean isFinal = this.is$Final();
1486        SimpleSet parameterDeclaration_String_value = parameterDeclaration_compute(name);
1487      if(isFinal && num == state().boundariesCrossed){ parameterDeclaration_String_values.put(_parameters, parameterDeclaration_String_value); }
1488            return parameterDeclaration_String_value;
1489      }
1490      /**
1491       * @apilevel internal
1492       */
1493      private SimpleSet parameterDeclaration_compute(String name) {
1494        for(int i = 0; i < getNumParameter(); i++)
1495          if(getParameter(i).name().equals(name))
1496            return (ParameterDeclaration)getParameter(i);
1497        return SimpleSet.emptySet;
1498      }
1499      /**
1500       * @attribute syn
1501       * @aspect Modifiers
1502       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:214
1503       */
1504      public boolean isSynthetic() {
1505        ASTNode$State state = state();
1506        try {  return getModifiers().isSynthetic();  }
1507        finally {
1508        }
1509      }
1510      /**
1511       * @attribute syn
1512       * @aspect Modifiers
1513       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:224
1514       */
1515      public boolean isPublic() {
1516        ASTNode$State state = state();
1517        try {  return getModifiers().isPublic() || hostType().isInterfaceDecl();  }
1518        finally {
1519        }
1520      }
1521      /**
1522       * @attribute syn
1523       * @aspect Modifiers
1524       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:225
1525       */
1526      public boolean isPrivate() {
1527        ASTNode$State state = state();
1528        try {  return getModifiers().isPrivate();  }
1529        finally {
1530        }
1531      }
1532      /**
1533       * @attribute syn
1534       * @aspect Modifiers
1535       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:226
1536       */
1537      public boolean isProtected() {
1538        ASTNode$State state = state();
1539        try {  return getModifiers().isProtected();  }
1540        finally {
1541        }
1542      }
1543      /**
1544       * @attribute syn
1545       * @aspect Modifiers
1546       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:227
1547       */
1548      public boolean isAbstract() {
1549        ASTNode$State state = state();
1550        try {  return getModifiers().isAbstract() || hostType().isInterfaceDecl();  }
1551        finally {
1552        }
1553      }
1554      /**
1555       * @attribute syn
1556       * @aspect Modifiers
1557       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:228
1558       */
1559      public boolean isStatic() {
1560        ASTNode$State state = state();
1561        try {  return getModifiers().isStatic();  }
1562        finally {
1563        }
1564      }
1565      /**
1566       * @attribute syn
1567       * @aspect Modifiers
1568       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:230
1569       */
1570      public boolean isFinal() {
1571        ASTNode$State state = state();
1572        try {  return getModifiers().isFinal() || hostType().isFinal() || isPrivate();  }
1573        finally {
1574        }
1575      }
1576      /**
1577       * @attribute syn
1578       * @aspect Modifiers
1579       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:231
1580       */
1581      public boolean isSynchronized() {
1582        ASTNode$State state = state();
1583        try {  return getModifiers().isSynchronized();  }
1584        finally {
1585        }
1586      }
1587      /**
1588       * @attribute syn
1589       * @aspect Modifiers
1590       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:232
1591       */
1592      public boolean isNative() {
1593        ASTNode$State state = state();
1594        try {  return getModifiers().isNative();  }
1595        finally {
1596        }
1597      }
1598      /**
1599       * @attribute syn
1600       * @aspect Modifiers
1601       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:233
1602       */
1603      public boolean isStrictfp() {
1604        ASTNode$State state = state();
1605        try {  return getModifiers().isStrictfp();  }
1606        finally {
1607        }
1608      }
1609      /**
1610       * @attribute syn
1611       * @aspect PrettyPrint
1612       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/PrettyPrint.jadd:800
1613       */
1614      public String dumpString() {
1615        ASTNode$State state = state();
1616        try {  return getClass().getName() + " [" + getID() + "]";  }
1617        finally {
1618        }
1619      }
1620      /**
1621       * @apilevel internal
1622       */
1623      protected boolean type_computed = false;
1624      /**
1625       * @apilevel internal
1626       */
1627      protected TypeDecl type_value;
1628      /**
1629       * @attribute syn
1630       * @aspect TypeAnalysis
1631       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/TypeAnalysis.jrag:269
1632       */
1633      @SuppressWarnings({"unchecked", "cast"})
1634      public TypeDecl type() {
1635        if(type_computed) {
1636          return type_value;
1637        }
1638          ASTNode$State state = state();
1639      int num = state.boundariesCrossed;
1640      boolean isFinal = this.is$Final();
1641        type_value = type_compute();
1642      if(isFinal && num == state().boundariesCrossed){ type_computed = true; }
1643            return type_value;
1644      }
1645      /**
1646       * @apilevel internal
1647       */
1648      private TypeDecl type_compute() {  return getTypeAccess().type();  }
1649      /**
1650       * @attribute syn
1651       * @aspect TypeAnalysis
1652       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/TypeAnalysis.jrag:271
1653       */
1654      public boolean isVoid() {
1655        ASTNode$State state = state();
1656        try {  return type().isVoid();  }
1657        finally {
1658        }
1659      }
1660      /**
1661       * @attribute syn
1662       * @aspect TypeHierarchyCheck
1663       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/TypeHierarchyCheck.jrag:237
1664       */
1665      public boolean mayOverrideReturn(MethodDecl m) {
1666        ASTNode$State state = state();
1667        try {
1668        return type().instanceOf(m.type());
1669      }
1670        finally {
1671        }
1672      }
1673      /**
1674       * @apilevel internal
1675       */
1676      protected boolean attributes_computed = false;
1677      /**
1678       * @apilevel internal
1679       */
1680      protected Collection attributes_value;
1681      /**
1682       * @attribute syn
1683       * @aspect GenericsCodegen
1684       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Backend/GenericsCodegen.jrag:317
1685       */
1686      @SuppressWarnings({"unchecked", "cast"})
1687      public Collection attributes() {
1688        if(attributes_computed) {
1689          return attributes_value;
1690        }
1691          ASTNode$State state = state();
1692      int num = state.boundariesCrossed;
1693      boolean isFinal = this.is$Final();
1694        attributes_value = attributes_compute();
1695      if(isFinal && num == state().boundariesCrossed){ attributes_computed = true; }
1696            return attributes_value;
1697      }
1698      /**
1699       * @apilevel internal
1700       */
1701      private Collection attributes_compute() {
1702        Collection c = refined_AnnotationsCodegen_MethodDecl_attributes();
1703        if(needsSignatureAttribute())
1704          c.add(new SignatureAttribute(hostType().constantPool(), methodTypeSignature()));
1705        return c;
1706      }
1707      /**
1708       * @apilevel internal
1709       */
1710      protected boolean descName_computed = false;
1711      /**
1712       * @apilevel internal
1713       */
1714      protected String descName_value;
1715      /**
1716       * @attribute syn
1717       * @aspect ConstantPoolNames
1718       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/ConstantPoolNames.jrag:34
1719       */
1720      @SuppressWarnings({"unchecked", "cast"})
1721      public String descName() {
1722        if(descName_computed) {
1723          return descName_value;
1724        }
1725          ASTNode$State state = state();
1726      int num = state.boundariesCrossed;
1727      boolean isFinal = this.is$Final();
1728        descName_value = descName_compute();
1729      if(isFinal && num == state().boundariesCrossed){ descName_computed = true; }
1730            return descName_value;
1731      }
1732      /**
1733       * @apilevel internal
1734       */
1735      private String descName_compute() {
1736        StringBuffer b = new StringBuffer();
1737        b.append("(");
1738        for (int i=0; i<getNumParameter(); i++)
1739          b.append(getParameter(i).type().typeDescriptor());
1740        b.append(")");
1741        if(type().elementType().isUnknown()) {
1742          System.out.println(getTypeAccess().dumpTree());
1743          throw new Error("Error generating descName for " + signature() + ", did not expect unknown return type");
1744        }
1745        b.append(type().typeDescriptor());
1746        return b.toString();
1747      }
1748      protected java.util.Map bytecodes_ConstantPool_values;
1749      /**
1750       * @attribute syn
1751       * @aspect CreateBCode
1752       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/CreateBCode.jrag:71
1753       */
1754      @SuppressWarnings({"unchecked", "cast"})
1755      public CodeGeneration bytecodes(ConstantPool constantPool) {
1756        Object _parameters = constantPool;
1757        if(bytecodes_ConstantPool_values == null) bytecodes_ConstantPool_values = new java.util.HashMap(4);
1758        if(bytecodes_ConstantPool_values.containsKey(_parameters)) {
1759          return (CodeGeneration)bytecodes_ConstantPool_values.get(_parameters);
1760        }
1761          ASTNode$State state = state();
1762      int num = state.boundariesCrossed;
1763      boolean isFinal = this.is$Final();
1764        CodeGeneration bytecodes_ConstantPool_value = bytecodes_compute(constantPool);
1765      if(isFinal && num == state().boundariesCrossed){ bytecodes_ConstantPool_values.put(_parameters, bytecodes_ConstantPool_value); }
1766            return bytecodes_ConstantPool_value;
1767      }
1768      /**
1769       * @apilevel internal
1770       */
1771      private CodeGeneration bytecodes_compute(ConstantPool constantPool) {
1772        //if(options().verbose())
1773        //  System.out.println("Generating bytecodes for " + signature() + " in " + hostType().fullName());
1774        CodeGeneration gen = new CodeGeneration(constantPool);
1775        generateBytecodes(gen);
1776        if(!gen.numberFormatError())
1777          return gen;
1778        gen = new CodeGeneration(constantPool, true);
1779        generateBytecodes(gen);
1780        if(!gen.numberFormatError())
1781          return gen;
1782        throw new Error("Could not generate code for " + signature() + " in " + hostType().typeName());
1783      }
1784      /**
1785       * @apilevel internal
1786       */
1787      protected boolean flags_computed = false;
1788      /**
1789       * @apilevel internal
1790       */
1791      protected int flags_value;
1792      /**
1793       * @attribute syn
1794       * @aspect VariableArityParametersCodegen
1795       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Backend/VariableArityParametersCodegen.jrag:84
1796       */
1797      @SuppressWarnings({"unchecked", "cast"})
1798      public int flags() {
1799        if(flags_computed) {
1800          return flags_value;
1801        }
1802          ASTNode$State state = state();
1803      int num = state.boundariesCrossed;
1804      boolean isFinal = this.is$Final();
1805        flags_value = flags_compute();
1806      if(isFinal && num == state().boundariesCrossed){ flags_computed = true; }
1807            return flags_value;
1808      }
1809      /**
1810       * @apilevel internal
1811       */
1812      private int flags_compute() {
1813        int res = refined_Flags_MethodDecl_flags();
1814        if(isVariableArity())
1815          res |= Modifiers.ACC_VARARGS;
1816        return res;
1817      }
1818      /**
1819       * @attribute syn
1820       * @aspect GenerateClassfile
1821       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/GenerateClassfile.jrag:296
1822       */
1823      public boolean isBytecodeMethod() {
1824        ASTNode$State state = state();
1825        try {  return true;  }
1826        finally {
1827        }
1828      }
1829      /**
1830       * @attribute syn
1831       * @aspect GenerateClassfile
1832       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/GenerateClassfile.jrag:325
1833       */
1834      public boolean flush() {
1835        ASTNode$State state = state();
1836        try {  return false;  }
1837        finally {
1838        }
1839      }
1840      /**
1841       * @apilevel internal
1842       */
1843      protected boolean offsetBeforeParameters_computed = false;
1844      /**
1845       * @apilevel internal
1846       */
1847      protected int offsetBeforeParameters_value;
1848      /**
1849       * @attribute syn
1850       * @aspect LocalNum
1851       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/LocalNum.jrag:17
1852       */
1853      @SuppressWarnings({"unchecked", "cast"})
1854      public int offsetBeforeParameters() {
1855        if(offsetBeforeParameters_computed) {
1856          return offsetBeforeParameters_value;
1857        }
1858          ASTNode$State state = state();
1859      int num = state.boundariesCrossed;
1860      boolean isFinal = this.is$Final();
1861        offsetBeforeParameters_value = offsetBeforeParameters_compute();
1862      if(isFinal && num == state().boundariesCrossed){ offsetBeforeParameters_computed = true; }
1863            return offsetBeforeParameters_value;
1864      }
1865      /**
1866       * @apilevel internal
1867       */
1868      private int offsetBeforeParameters_compute() {  return isStatic() ? 0 : 1;  }
1869      /**
1870       * @apilevel internal
1871       */
1872      protected boolean offsetAfterParameters_computed = false;
1873      /**
1874       * @apilevel internal
1875       */
1876      protected int offsetAfterParameters_value;
1877      /**
1878       * @attribute syn
1879       * @aspect LocalNum
1880       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/LocalNum.jrag:19
1881       */
1882      @SuppressWarnings({"unchecked", "cast"})
1883      public int offsetAfterParameters() {
1884        if(offsetAfterParameters_computed) {
1885          return offsetAfterParameters_value;
1886        }
1887          ASTNode$State state = state();
1888      int num = state.boundariesCrossed;
1889      boolean isFinal = this.is$Final();
1890        offsetAfterParameters_value = offsetAfterParameters_compute();
1891      if(isFinal && num == state().boundariesCrossed){ offsetAfterParameters_computed = true; }
1892            return offsetAfterParameters_value;
1893      }
1894      /**
1895       * @apilevel internal
1896       */
1897      private int offsetAfterParameters_compute() {
1898        if(getNumParameter() == 0)
1899          return offsetBeforeParameters();
1900        return getParameter(getNumParameter()-1).localNum() + 
1901               getParameter(getNumParameter()-1).type().variableSize();
1902      }
1903      /**
1904       * @apilevel internal
1905       */
1906      protected boolean resultOffset_computed = false;
1907      /**
1908       * @apilevel internal
1909       */
1910      protected int resultOffset_value;
1911      /**
1912       * @attribute syn
1913       * @aspect LocalNum
1914       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/LocalNum.jrag:50
1915       */
1916      @SuppressWarnings({"unchecked", "cast"})
1917      public int resultOffset() {
1918        if(resultOffset_computed) {
1919          return resultOffset_value;
1920        }
1921          ASTNode$State state = state();
1922      int num = state.boundariesCrossed;
1923      boolean isFinal = this.is$Final();
1924        resultOffset_value = resultOffset_compute();
1925      if(isFinal && num == state().boundariesCrossed){ resultOffset_computed = true; }
1926            return resultOffset_value;
1927      }
1928      /**
1929       * @apilevel internal
1930       */
1931      private int resultOffset_compute() {  return type().isVoid() ? 0 : type().variableSize();  }
1932      /* It is also a compile-time error if any method declared in an annotation type has a
1933      signature that is override-equivalent to that of any public or protected method
1934      declared in class Object or in the interface annotation.Annotation* @attribute syn
1935       * @aspect Annotations
1936       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/Annotations.jrag:139
1937       */
1938      public boolean annotationMethodOverride() {
1939        ASTNode$State state = state();
1940        try {  return !hostType().ancestorMethods(signature()).isEmpty();  }
1941        finally {
1942        }
1943      }
1944      /**
1945       * @attribute syn
1946       * @aspect Annotations
1947       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/Annotations.jrag:283
1948       */
1949      public boolean hasAnnotationSuppressWarnings(String s) {
1950        ASTNode$State state = state();
1951        try {  return getModifiers().hasAnnotationSuppressWarnings(s);  }
1952        finally {
1953        }
1954      }
1955      /**
1956       * @attribute syn
1957       * @aspect Annotations
1958       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/Annotations.jrag:323
1959       */
1960      public boolean isDeprecated() {
1961        ASTNode$State state = state();
1962        try {  return getModifiers().hasDeprecatedAnnotation();  }
1963        finally {
1964        }
1965      }
1966      /**
1967       * @apilevel internal
1968       */
1969      protected boolean usesTypeVariable_computed = false;
1970      /**
1971       * @apilevel internal
1972       */
1973      protected boolean usesTypeVariable_value;
1974      /**
1975       * @attribute syn
1976       * @aspect LookupParTypeDecl
1977       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/Generics.jrag:1062
1978       */
1979      @SuppressWarnings({"unchecked", "cast"})
1980      public boolean usesTypeVariable() {
1981        if(usesTypeVariable_computed) {
1982          return usesTypeVariable_value;
1983        }
1984          ASTNode$State state = state();
1985      int num = state.boundariesCrossed;
1986      boolean isFinal = this.is$Final();
1987        usesTypeVariable_value = usesTypeVariable_compute();
1988      if(isFinal && num == state().boundariesCrossed){ usesTypeVariable_computed = true; }
1989            return usesTypeVariable_value;
1990      }
1991      /**
1992       * @apilevel internal
1993       */
1994      private boolean usesTypeVariable_compute() {  return getModifiers().usesTypeVariable() || getTypeAccess().usesTypeVariable() ||
1995        getParameterList().usesTypeVariable() || getExceptionList().usesTypeVariable();  }
1996      /**
1997       * @apilevel internal
1998       */
1999      protected boolean sourceMethodDecl_computed = false;
2000      /**
2001       * @apilevel internal
2002       */
2003      protected MethodDecl sourceMethodDecl_value;
2004      /**
2005       * @attribute syn
2006       * @aspect SourceDeclarations
2007       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/Generics.jrag:1511
2008       */
2009      @SuppressWarnings({"unchecked", "cast"})
2010      public MethodDecl sourceMethodDecl() {
2011        if(sourceMethodDecl_computed) {
2012          return sourceMethodDecl_value;
2013        }
2014          ASTNode$State state = state();
2015      int num = state.boundariesCrossed;
2016      boolean isFinal = this.is$Final();
2017        sourceMethodDecl_value = sourceMethodDecl_compute();
2018      if(isFinal && num == state().boundariesCrossed){ sourceMethodDecl_computed = true; }
2019            return sourceMethodDecl_value;
2020      }
2021      /**
2022       * @apilevel internal
2023       */
2024      private MethodDecl sourceMethodDecl_compute() {  return this;  }
2025      /**
2026       * @attribute syn
2027       * @aspect GenericsParTypeDecl
2028       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/GenericsParTypeDecl.jrag:67
2029       */
2030      public boolean visibleTypeParameters() {
2031        ASTNode$State state = state();
2032        try {  return !isStatic();  }
2033        finally {
2034        }
2035      }
2036      /**
2037       * @attribute syn
2038       * @aspect MethodSignature15
2039       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/MethodSignature.jrag:284
2040       */
2041      public int arity() {
2042        ASTNode$State state = state();
2043        try {  return getNumParameter();  }
2044        finally {
2045        }
2046      }
2047      /* The method is then a variable arity method. Otherwise, it is a fixed arity method.* @attribute syn
2048       * @aspect VariableArityParameters
2049       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/VariableArityParameters.jrag:33
2050       */
2051      public boolean isVariableArity() {
2052        ASTNode$State state = state();
2053        try {  return getNumParameter() == 0 ? false : getParameter(getNumParameter()-1).isVariableArity();  }
2054        finally {
2055        }
2056      }
2057      /**
2058       * @attribute syn
2059       * @aspect VariableArityParameters
2060       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/VariableArityParameters.jrag:38
2061       */
2062      public ParameterDeclaration lastParameter() {
2063        ASTNode$State state = state();
2064        try {  return getParameter(getNumParameter() - 1);  }
2065        finally {
2066        }
2067      }
2068      /**
2069       * @attribute syn
2070       * @aspect GenericsCodegen
2071       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Backend/GenericsCodegen.jrag:56
2072       */
2073      public MethodDecl erasedMethod() {
2074        ASTNode$State state = state();
2075        try {  return this;  }
2076        finally {
2077        }
2078      }
2079      /**
2080       * @attribute syn
2081       * @aspect GenericsCodegen
2082       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Backend/GenericsCodegen.jrag:363
2083       */
2084      public boolean needsSignatureAttribute() {
2085        ASTNode$State state = state();
2086        try {
2087        if(type().needsSignatureAttribute())
2088          return true;
2089        for(int i = 0; i < getNumParameter(); i++)
2090          if(getParameter(i).type().needsSignatureAttribute())
2091            return true;
2092        return false;
2093      }
2094        finally {
2095        }
2096      }
2097      /**
2098       * @attribute syn
2099       * @aspect GenericsCodegen
2100       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Backend/GenericsCodegen.jrag:482
2101       */
2102      public String methodTypeSignature() {
2103        ASTNode$State state = state();
2104        try {
2105        StringBuffer buf = new StringBuffer();
2106        buf.append("(");
2107        for(int i = 0; i < getNumParameter(); i++)
2108          buf.append(getParameter(i).type().classTypeSignature());
2109        buf.append(")");
2110        buf.append(type().classTypeSignature());
2111        for(int i = 0; i < getNumException(); i++)
2112          buf.append("^" + getException(i).type().classTypeSignature());
2113        return buf.toString();
2114      }
2115        finally {
2116        }
2117      }
2118      /**
2119      * @return true if the modifier list includes the SafeVarargs annotation
2120      * @attribute syn
2121       * @aspect SafeVarargs
2122       * @declaredat /home/jesper/svn/JastAddJ/Java7Frontend/SafeVarargs.jrag:20
2123       */
2124      public boolean hasAnnotationSafeVarargs() {
2125        ASTNode$State state = state();
2126        try {  return getModifiers().hasAnnotationSafeVarargs();  }
2127        finally {
2128        }
2129      }
2130      /**
2131      * It is an error if the SafeVarargs annotation is used on something
2132      * that is not a variable arity method or constructor.
2133      * @attribute syn
2134       * @aspect SafeVarargs
2135       * @declaredat /home/jesper/svn/JastAddJ/Java7Frontend/SafeVarargs.jrag:56
2136       */
2137      public boolean hasIllegalAnnotationSafeVarargs() {
2138        ASTNode$State state = state();
2139        try {  return hasAnnotationSafeVarargs() && (!isVariableArity() || (!isFinal() && !isStatic()));  }
2140        finally {
2141        }
2142      }
2143      /**
2144       * @attribute syn
2145       * @aspect SuppressWarnings
2146       * @declaredat /home/jesper/svn/JastAddJ/Java7Frontend/SuppressWarnings.jrag:24
2147       */
2148      public boolean suppressWarnings(String type) {
2149        ASTNode$State state = state();
2150        try {  return hasAnnotationSuppressWarnings(type) || withinSuppressWarnings(type);  }
2151        finally {
2152        }
2153      }
2154      protected java.util.Map handlesException_TypeDecl_values;
2155      /**
2156       * @attribute inh
2157       * @aspect ExceptionHandling
2158       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/ExceptionHandling.jrag:51
2159       */
2160      @SuppressWarnings({"unchecked", "cast"})
2161      public boolean handlesException(TypeDecl exceptionType) {
2162        Object _parameters = exceptionType;
2163        if(handlesException_TypeDecl_values == null) handlesException_TypeDecl_values = new java.util.HashMap(4);
2164        if(handlesException_TypeDecl_values.containsKey(_parameters)) {
2165          return ((Boolean)handlesException_TypeDecl_values.get(_parameters)).booleanValue();
2166        }
2167          ASTNode$State state = state();
2168      int num = state.boundariesCrossed;
2169      boolean isFinal = this.is$Final();
2170        boolean handlesException_TypeDecl_value = getParent().Define_boolean_handlesException(this, null, exceptionType);
2171      if(isFinal && num == state().boundariesCrossed){ handlesException_TypeDecl_values.put(_parameters, Boolean.valueOf(handlesException_TypeDecl_value)); }
2172            return handlesException_TypeDecl_value;
2173      }
2174      /**
2175       * @attribute inh
2176       * @aspect LookupMethod
2177       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/LookupMethod.jrag:14
2178       */
2179      @SuppressWarnings({"unchecked", "cast"})
2180      public MethodDecl unknownMethod() {
2181          ASTNode$State state = state();
2182        MethodDecl unknownMethod_value = getParent().Define_MethodDecl_unknownMethod(this, null);
2183            return unknownMethod_value;
2184      }
2185      /**
2186       * @attribute inh
2187       * @aspect SuppressWarnings
2188       * @declaredat /home/jesper/svn/JastAddJ/Java7Frontend/SuppressWarnings.jrag:17
2189       */
2190      @SuppressWarnings({"unchecked", "cast"})
2191      public boolean withinSuppressWarnings(String s) {
2192          ASTNode$State state = state();
2193        boolean withinSuppressWarnings_String_value = getParent().Define_boolean_withinSuppressWarnings(this, null, s);
2194            return withinSuppressWarnings_String_value;
2195      }
2196      /**
2197       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:437
2198       * @apilevel internal
2199       */
2200      public boolean Define_boolean_isDAbefore(ASTNode caller, ASTNode child, Variable v) {
2201        if(caller == getBlockOptNoTransform()) {
2202          return v.isFinal() && (v.isClassVariable() || v.isInstanceVariable()) ? true : isDAbefore(v);
2203        }
2204        else {      return getParent().Define_boolean_isDAbefore(this, caller, v);
2205        }
2206      }
2207      /**
2208       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/DefiniteAssignment.jrag:868
2209       * @apilevel internal
2210       */
2211      public boolean Define_boolean_isDUbefore(ASTNode caller, ASTNode child, Variable v) {
2212        if(caller == getBlockOptNoTransform()) {
2213          return v.isFinal() && (v.isClassVariable() || v.isInstanceVariable()) ? false : true;
2214        }
2215        else {      return getParent().Define_boolean_isDUbefore(this, caller, v);
2216        }
2217      }
2218      /**
2219       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/ExceptionHandling.jrag:143
2220       * @apilevel internal
2221       */
2222      public boolean Define_boolean_handlesException(ASTNode caller, ASTNode child, TypeDecl exceptionType) {
2223        if(caller == getBlockOptNoTransform()) {
2224          return throwsException(exceptionType) || handlesException(exceptionType);
2225        }
2226        else {      return getParent().Define_boolean_handlesException(this, caller, exceptionType);
2227        }
2228      }
2229      /**
2230       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/LookupVariable.jrag:46
2231       * @apilevel internal
2232       */
2233      public SimpleSet Define_SimpleSet_lookupVariable(ASTNode caller, ASTNode child, String name) {
2234        if(caller == getParameterListNoTransform())  {
2235        int childIndex = caller.getIndexOfChild(child);
2236        return parameterDeclaration(name);
2237      }
2238        else if(caller == getBlockOptNoTransform()){
2239        SimpleSet set = parameterDeclaration(name);
2240        // A declaration of a method parameter name shadows any other variable declarations
2241        if(!set.isEmpty()) return set;
2242        // Delegate to other declarations in scope
2243        return lookupVariable(name);
2244      }
2245        else {      return getParent().Define_SimpleSet_lookupVariable(this, caller, name);
2246        }
2247      }
2248      /**
2249       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:271
2250       * @apilevel internal
2251       */
2252      public boolean Define_boolean_mayBePublic(ASTNode caller, ASTNode child) {
2253        if(caller == getModifiersNoTransform()) {
2254          return true;
2255        }
2256        else {      return getParent().Define_boolean_mayBePublic(this, caller);
2257        }
2258      }
2259      /**
2260       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:272
2261       * @apilevel internal
2262       */
2263      public boolean Define_boolean_mayBeProtected(ASTNode caller, ASTNode child) {
2264        if(caller == getModifiersNoTransform()) {
2265          return true;
2266        }
2267        else {      return getParent().Define_boolean_mayBeProtected(this, caller);
2268        }
2269      }
2270      /**
2271       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:273
2272       * @apilevel internal
2273       */
2274      public boolean Define_boolean_mayBePrivate(ASTNode caller, ASTNode child) {
2275        if(caller == getModifiersNoTransform()) {
2276          return true;
2277        }
2278        else {      return getParent().Define_boolean_mayBePrivate(this, caller);
2279        }
2280      }
2281      /**
2282       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:274
2283       * @apilevel internal
2284       */
2285      public boolean Define_boolean_mayBeAbstract(ASTNode caller, ASTNode child) {
2286        if(caller == getModifiersNoTransform()) {
2287          return true;
2288        }
2289        else {      return getParent().Define_boolean_mayBeAbstract(this, caller);
2290        }
2291      }
2292      /**
2293       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:275
2294       * @apilevel internal
2295       */
2296      public boolean Define_boolean_mayBeStatic(ASTNode caller, ASTNode child) {
2297        if(caller == getModifiersNoTransform()) {
2298          return true;
2299        }
2300        else {      return getParent().Define_boolean_mayBeStatic(this, caller);
2301        }
2302      }
2303      /**
2304       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:276
2305       * @apilevel internal
2306       */
2307      public boolean Define_boolean_mayBeFinal(ASTNode caller, ASTNode child) {
2308        if(caller == getModifiersNoTransform()) {
2309          return true;
2310        }
2311        else {      return getParent().Define_boolean_mayBeFinal(this, caller);
2312        }
2313      }
2314      /**
2315       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:277
2316       * @apilevel internal
2317       */
2318      public boolean Define_boolean_mayBeSynchronized(ASTNode caller, ASTNode child) {
2319        if(caller == getModifiersNoTransform()) {
2320          return true;
2321        }
2322        else {      return getParent().Define_boolean_mayBeSynchronized(this, caller);
2323        }
2324      }
2325      /**
2326       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:278
2327       * @apilevel internal
2328       */
2329      public boolean Define_boolean_mayBeNative(ASTNode caller, ASTNode child) {
2330        if(caller == getModifiersNoTransform()) {
2331          return true;
2332        }
2333        else {      return getParent().Define_boolean_mayBeNative(this, caller);
2334        }
2335      }
2336      /**
2337       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/Modifiers.jrag:279
2338       * @apilevel internal
2339       */
2340      public boolean Define_boolean_mayBeStrictfp(ASTNode caller, ASTNode child) {
2341        if(caller == getModifiersNoTransform()) {
2342          return true;
2343        }
2344        else {      return getParent().Define_boolean_mayBeStrictfp(this, caller);
2345        }
2346      }
2347      /**
2348       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/NameCheck.jrag:246
2349       * @apilevel internal
2350       */
2351      public ASTNode Define_ASTNode_enclosingBlock(ASTNode caller, ASTNode child) {
2352        if(caller == getBlockOptNoTransform()) {
2353          return this;
2354        }
2355        else {      return getParent().Define_ASTNode_enclosingBlock(this, caller);
2356        }
2357      }
2358      /**
2359       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/SyntacticClassification.jrag:82
2360       * @apilevel internal
2361       */
2362      public NameType Define_NameType_nameType(ASTNode caller, ASTNode child) {
2363        if(caller == getExceptionListNoTransform())  {
2364        int childIndex = caller.getIndexOfChild(child);
2365        return NameType.TYPE_NAME;
2366      }
2367        else if(caller == getParameterListNoTransform())  {
2368        int childIndex = caller.getIndexOfChild(child);
2369        return NameType.TYPE_NAME;
2370      }
2371        else if(caller == getTypeAccessNoTransform()) {
2372          return NameType.TYPE_NAME;
2373        }
2374        else {      return getParent().Define_NameType_nameType(this, caller);
2375        }
2376      }
2377      /**
2378       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/TypeCheck.jrag:405
2379       * @apilevel internal
2380       */
2381      public TypeDecl Define_TypeDecl_returnType(ASTNode caller, ASTNode child) {
2382        if(caller == getBlockOptNoTransform()) {
2383          return type();
2384        }
2385        else {      return getParent().Define_TypeDecl_returnType(this, caller);
2386        }
2387      }
2388      /**
2389       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/TypeHierarchyCheck.jrag:142
2390       * @apilevel internal
2391       */
2392      public boolean Define_boolean_inStaticContext(ASTNode caller, ASTNode child) {
2393        if(caller == getBlockOptNoTransform()) {
2394          return isStatic();
2395        }
2396        else {      return getParent().Define_boolean_inStaticContext(this, caller);
2397        }
2398      }
2399      /**
2400       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/UnreachableStatements.jrag:33
2401       * @apilevel internal
2402       */
2403      public boolean Define_boolean_reachable(ASTNode caller, ASTNode child) {
2404        if(caller == getBlockOptNoTransform()) {
2405          return true;
2406        }
2407        else {      return getParent().Define_boolean_reachable(this, caller);
2408        }
2409      }
2410      /**
2411       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/VariableDeclaration.jrag:61
2412       * @apilevel internal
2413       */
2414      public boolean Define_boolean_isMethodParameter(ASTNode caller, ASTNode child) {
2415        if(caller == getParameterListNoTransform())  {
2416        int childIndex = caller.getIndexOfChild(child);
2417        return true;
2418      }
2419        else {      return getParent().Define_boolean_isMethodParameter(this, caller);
2420        }
2421      }
2422      /**
2423       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/VariableDeclaration.jrag:62
2424       * @apilevel internal
2425       */
2426      public boolean Define_boolean_isConstructorParameter(ASTNode caller, ASTNode child) {
2427        if(caller == getParameterListNoTransform())  {
2428        int childIndex = caller.getIndexOfChild(child);
2429        return false;
2430      }
2431        else {      return getParent().Define_boolean_isConstructorParameter(this, caller);
2432        }
2433      }
2434      /**
2435       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Frontend/VariableDeclaration.jrag:63
2436       * @apilevel internal
2437       */
2438      public boolean Define_boolean_isExceptionHandlerParameter(ASTNode caller, ASTNode child) {
2439        if(caller == getParameterListNoTransform())  {
2440        int childIndex = caller.getIndexOfChild(child);
2441        return false;
2442      }
2443        else {      return getParent().Define_boolean_isExceptionHandlerParameter(this, caller);
2444        }
2445      }
2446      /**
2447       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/LocalNum.jrag:52
2448       * @apilevel internal
2449       */
2450      public int Define_int_localNum(ASTNode caller, ASTNode child) {
2451        if(caller == getBlockOptNoTransform()) {
2452          return offsetAfterParameters() + 
2453          resultOffset();
2454        }
2455        else if(caller == getParameterListNoTransform())  { 
2456        int index = caller.getIndexOfChild(child);
2457        {
2458        if(index == 0)
2459          return offsetBeforeParameters();
2460        return getParameter(index-1).localNum() + getParameter(index-1).type().variableSize();
2461      }
2462      }
2463        else {      return getParent().Define_int_localNum(this, caller);
2464        }
2465      }
2466      /**
2467       * @declaredat /home/jesper/svn/JastAddJ/Java1.4Backend/LocalNum.jrag:45
2468       * @apilevel internal
2469       */
2470      public int Define_int_resultSaveLocalNum(ASTNode caller, ASTNode child) {
2471        if(caller == getBlockOptNoTransform()) {
2472          return offsetAfterParameters();
2473        }
2474        else {      return getParent().Define_int_resultSaveLocalNum(this, caller);
2475        }
2476      }
2477      /**
2478       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/Annotations.jrag:86
2479       * @apilevel internal
2480       */
2481      public boolean Define_boolean_mayUseAnnotationTarget(ASTNode caller, ASTNode child, String name) {
2482        if(caller == getModifiersNoTransform()) {
2483          return name.equals("METHOD");
2484        }
2485        else {      return getParent().Define_boolean_mayUseAnnotationTarget(this, caller, name);
2486        }
2487      }
2488      /**
2489       * @declaredat /home/jesper/svn/JastAddJ/Java1.5Frontend/VariableArityParameters.jrag:22
2490       * @apilevel internal
2491       */
2492      public boolean Define_boolean_variableArityValid(ASTNode caller, ASTNode child) {
2493        if(caller == getParameterListNoTransform())  {
2494        int i = caller.getIndexOfChild(child);
2495        return i == getNumParameter() - 1;
2496      }
2497        else {      return getParent().Define_boolean_variableArityValid(this, caller);
2498        }
2499      }
2500      /**
2501       * @declaredat /home/jesper/svn/JastAddJ/Java7Frontend/PreciseRethrow.jrag:50
2502       * @apilevel internal
2503       */
2504      public boolean Define_boolean_inhModifiedInScope(ASTNode caller, ASTNode child, Variable var) {
2505        if(caller == getParameterListNoTransform())  {
2506        int childIndex = caller.getIndexOfChild(child);
2507        return getBlock().modifiedInScope(var);
2508      }
2509        else {      return getParent().Define_boolean_inhModifiedInScope(this, caller, var);
2510        }
2511      }
2512      /**
2513       * @declaredat /home/jesper/svn/JastAddJ/Java7Frontend/PreciseRethrow.jrag:124
2514       * @apilevel internal
2515       */
2516      public boolean Define_boolean_isCatchParam(ASTNode caller, ASTNode child) {
2517        if(caller == getParameterListNoTransform())  {
2518        int childIndex = caller.getIndexOfChild(child);
2519        return false;
2520      }
2521        else {      return getParent().Define_boolean_isCatchParam(this, caller);
2522        }
2523      }
2524      /**
2525       * @apilevel internal
2526       */
2527      public ASTNode rewriteTo() {
2528        return super.rewriteTo();
2529      }
2530    }