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 024 /** Represents both MethodDeclarations and ConstructorDeclarations. 025 */ 026 027 public abstract class RoutineDecl extends ASTNode implements TypeDeclElem 028 { 029 //@ invariant hasParent ==> parent != null; 030 public TypeDecl parent; 031 032 public boolean binaryArgNames = false; // true if the ids of formal 033 // arguments are binary manufactured names instead of source code names 034 035 public boolean implicit = false; 036 public TypeNameVec originalRaises = null; 037 038 public int modifiers; 039 040 public ModifierPragmaVec pmodifiers; 041 042 public TypeModifierPragmaVec tmodifiers; 043 044 public /*@ non_null @*/ FormalParaDeclVec args; 045 046 public /*@ non_null @*/ TypeNameVec raises; 047 048 public BlockStmt body; 049 050 public int locOpenBrace; 051 052 //@ invariant body != null ==> locOpenBrace != Location.NULL; 053 //@ invariant loc != javafe.util.Location.NULL; 054 public int loc; 055 056 //@ invariant locId != javafe.util.Location.NULL; 057 public int locId; 058 059 060 // The "locThrowsKeyword" field should be used only if "raises" denotes 061 // a nonempty list, in which case "locThrowsKeyword" is not "Location.NULL" 062 public int locThrowsKeyword; 063 064 065 private void postCheck() { 066 // Check invariants on modifiers... 067 068 for(int i = 0; i < args.size(); i++) 069 // Check invariants on modifiers... 070 /*skip*/; 071 } 072 073 public TypeDecl getParent() { return parent; } 074 public void setParent(TypeDecl p) { parent = p; } 075 076 public int getModifiers() { return modifiers; } 077 public void setModifiers(int m) { modifiers = m; } 078 public ModifierPragmaVec getPModifiers() { return pmodifiers; } 079 public int getStartLoc() { return loc; } 080 abstract public Identifier id(); 081 082 public int getEndLoc() { 083 if (body == null) 084 return super.getEndLoc(); 085 086 return body.getEndLoc(); 087 } 088 private Type[] argtypes = null; 089 public Type[] argTypes() { 090 if (argtypes != null) return argtypes; 091 argtypes = new Type[args.size()]; 092 for (int i=0; i<args.size(); ++i) { 093 argtypes[i] = args.elementAt(i).type; 094 } 095 return argtypes; 096 } 097 098 099 // Generated boilerplate constructors: 100 101 /** 102 * Construct a raw RoutineDecl whose class invariant(s) have not 103 * yet been established. It is the caller's job to 104 * initialize the returned node's fields so that any 105 * class invariants hold. 106 */ 107 //@ requires I_will_establish_invariants_afterwards; 108 protected RoutineDecl() {} //@ nowarn Invariant,NonNullInit; 109 110 public void check() { 111 super.check(); 112 if (this.pmodifiers != null) 113 for(int i = 0; i < this.pmodifiers.size(); i++) 114 this.pmodifiers.elementAt(i).check(); 115 if (this.tmodifiers != null) 116 for(int i = 0; i < this.tmodifiers.size(); i++) 117 this.tmodifiers.elementAt(i).check(); 118 for(int i = 0; i < this.args.size(); i++) 119 this.args.elementAt(i).check(); 120 for(int i = 0; i < this.raises.size(); i++) 121 this.raises.elementAt(i).check(); 122 if (this.body != null) 123 this.body.check(); 124 postCheck(); 125 } 126 127 }