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 a TypeDeclaration. 025 * Common fields of ClassDeclarations and InterfaceDeclarations are here. 026 */ 027 028 public abstract class TypeDecl extends ASTNode implements TypeDeclElem 029 { 030 /** 031 * If specOnly is true, then this is only a spec. In particular, 032 * methods do not have non-empty bodies, no initializers are present 033 * for fields, and no static bodies are present. 034 */ 035 public boolean specOnly = false; 036 037 public int modifiers; 038 039 public ModifierPragmaVec pmodifiers; 040 041 public /*@ non_null @*/ Identifier id; 042 043 public /*@ non_null @*/ TypeNameVec superInterfaces; 044 045 046 public TypeModifierPragmaVec tmodifiers; 047 048 049 //* "invariant" elems.<each element>.hasParent is true 050 public /*@ non_null @*/ TypeDeclElemVec elems; 051 052 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 //@ invariant locOpenBrace != javafe.util.Location.NULL; 060 public int locOpenBrace; 061 062 //@ invariant locCloseBrace != javafe.util.Location.NULL; 063 public int locCloseBrace; 064 065 066 //@ invariant hasParent ==> parent != null; 067 public TypeDecl parent; 068 069 public TypeDecl getParent() { return parent; } 070 public void setParent(TypeDecl p) { parent = p; } 071 072 public int getModifiers() { return modifiers; } 073 public void setModifiers(int m) { modifiers = m; } 074 public ModifierPragmaVec getPModifiers() { return pmodifiers; } 075 076 private void postCheck() { 077 // check invariants on modifiers... 078 for(int i = 0; i < elems.size(); i++) { 079 Assert.notFalse(elems.elementAt(i).getParent() == this); //@ nowarn Pre; 080 for(int j = i+1; j < elems.size(); j++) 081 Assert.notFalse(elems.elementAt(i) != elems.elementAt(j)); //@ nowarn Pre; 082 } 083 } 084 085 /** 086 * @return true iff this TypeDecl was created from a .class 087 * file. 088 * 089 * precondition: We have already been associated with a TypeSig. 090 */ 091 public boolean isBinary() { 092 javafe.tc.TypeSig sig = javafe.tc.TypeSig.getSig(this); 093 CompilationUnit cu = sig.getCompilationUnit(); 094 095 return cu.isBinary(); 096 } 097 098 public int getStartLoc() { return loc; } 099 public int getEndLoc() { return locCloseBrace; } 100 101 102 // Generated boilerplate constructors: 103 104 /** 105 * Construct a raw TypeDecl whose class invariant(s) have not 106 * yet been established. It is the caller's job to 107 * initialize the returned node's fields so that any 108 * class invariants hold. 109 */ 110 //@ requires I_will_establish_invariants_afterwards; 111 protected TypeDecl() {} //@ nowarn Invariant,NonNullInit; 112 113 public void check() { 114 super.check(); 115 if (this.pmodifiers != null) 116 for(int i = 0; i < this.pmodifiers.size(); i++) 117 this.pmodifiers.elementAt(i).check(); 118 if (this.id == null) throw new RuntimeException(); 119 for(int i = 0; i < this.superInterfaces.size(); i++) 120 this.superInterfaces.elementAt(i).check(); 121 if (this.tmodifiers != null) 122 for(int i = 0; i < this.tmodifiers.size(); i++) 123 this.tmodifiers.elementAt(i).check(); 124 if (this.elems == null) throw new RuntimeException(); 125 postCheck(); 126 } 127 128 }