001    /* Copyright 2000, 2001, Compaq Computer Corporation */
002    
003    /* IF THIS IS A JAVA FILE, DO NOT EDIT IT!  
004    
005       Most Java files in this directory which are part of the Javafe AST
006       are automatically generated using the astgen comment (see
007       ESCTools/Javafe/astgen) from the input file 'hierarchy.h'.  If you
008       wish to modify AST classes or introduce new ones, modify
009       'hierarchy.j.'
010     */
011    
012    package javafe.ast;
013    
014    import javafe.util.Assert;
015    import javafe.util.Location;
016    import javafe.util.ErrorSet;
017    
018    // Convention: unless otherwise noted, integer fields named "loc" refer
019    // to the location of the first character of the syntactic unit
020    
021    
022    /**
023     * Represents a MethodInvocation. 
024     */
025    
026    public class MethodInvocation extends Expr
027    {
028      public /*@ non_null @*/ ObjectDesignator od;
029    
030      public /*@ non_null @*/ Identifier id;
031    
032      public TypeModifierPragmaVec tmodifiers;
033    
034      //@ invariant locId != javafe.util.Location.NULL;
035      public int locId;
036    
037      //@ invariant locOpenParen != javafe.util.Location.NULL;
038      public int locOpenParen;
039    
040      public /*@ non_null @*/ ExprVec args;
041    
042    
043      //@ invariant decl == null || decl.id==id;
044      public MethodDecl decl;
045    
046      private void postCheck() {
047        if (decl != null) {
048          Assert.notFalse(id == decl.id);
049          // Any other invariants here...???
050        }
051      }
052      public int getStartLoc() {
053        int loc = od.getStartLoc();
054        if (loc != Location.NULL)
055          return loc;
056        else
057          return locId;
058      }
059      public int getEndLoc() { 
060        if (args.size()<1)
061          return locId;
062    
063        return args.elementAt(args.size()-1).getEndLoc();
064      }
065    
066      //@ requires locId != javafe.util.Location.NULL;
067      //@ requires locOpenParen != javafe.util.Location.NULL;
068      //@ ensures \result != null;
069      public static MethodInvocation make(/*@ non_null @*/ ObjectDesignator od, 
070                                          /*@ non_null @*/ Identifier id, 
071                                          TypeModifierPragmaVec tmodifiers, 
072                                          int locId, 
073                                          int locOpenParen, 
074                                          /*@ non_null @*/ ExprVec args) {
075         //@ set I_will_establish_invariants_afterwards = true;
076         MethodInvocation result = new MethodInvocation();
077         result.od = od;
078         result.id = id;
079         result.locId = locId;
080         result.locOpenParen = locOpenParen;
081         result.args = args;
082         result.decl = null;  // Easier than puting an ensures on constructor
083         result.tmodifiers = tmodifiers;
084         return result;
085      }
086    
087    
088    // Generated boilerplate constructors:
089    
090      /**
091       * Construct a raw MethodInvocation whose class invariant(s) have not
092       * yet been established.  It is the caller's job to
093       * initialize the returned node's fields so that any
094       * class invariants hold.
095       */
096      //@ requires I_will_establish_invariants_afterwards;
097      protected MethodInvocation() {}    //@ nowarn Invariant,NonNullInit;
098    
099    
100    // Generated boilerplate methods:
101    
102      public final int childCount() {
103         int sz = 0;
104         if (this.tmodifiers != null) sz += this.tmodifiers.size();
105         if (this.args != null) sz += this.args.size();
106         return sz + 2;
107      }
108    
109      public final Object childAt(int index) {
110              /*throws IndexOutOfBoundsException*/
111         if (index < 0)
112            throw new IndexOutOfBoundsException("AST child index " + index);
113         int indexPre = index;
114    
115         int sz;
116    
117         if (index == 0) return this.od;
118         else index--;
119    
120         if (index == 0) return this.id;
121         else index--;
122    
123         sz = (this.tmodifiers == null ? 0 : this.tmodifiers.size());
124         if (0 <= index && index < sz)
125            return this.tmodifiers.elementAt(index);
126         else index -= sz;
127    
128         sz = (this.args == null ? 0 : this.args.size());
129         if (0 <= index && index < sz)
130            return this.args.elementAt(index);
131         else index -= sz;
132    
133         throw new IndexOutOfBoundsException("AST child index " + indexPre);
134      }   //@ nowarn Exception;
135    
136      public final String toString() {
137         return "[MethodInvocation"
138            + " od = " + this.od
139            + " id = " + this.id
140            + " tmodifiers = " + this.tmodifiers
141            + " locId = " + this.locId
142            + " locOpenParen = " + this.locOpenParen
143            + " args = " + this.args
144            + "]";
145      }
146    
147      public final int getTag() {
148         return TagConstants.METHODINVOCATION;
149      }
150    
151      public final void accept(Visitor v) { v.visitMethodInvocation(this); }
152    
153      public final Object accept(VisitorArgResult v, Object o) {return v.visitMethodInvocation(this, o); }
154    
155      public void check() {
156         super.check();
157         this.od.check();
158         if (this.id == null) throw new RuntimeException();
159         if (this.tmodifiers != null)
160            for(int i = 0; i < this.tmodifiers.size(); i++)
161               this.tmodifiers.elementAt(i).check();
162         for(int i = 0; i < this.args.size(); i++)
163            this.args.elementAt(i).check();
164         postCheck();
165      }
166    
167    }