package IR;
import java.util.*;
import IR.Tree.*;
-import IR.SymbolTable;
-import IR.FieldDescriptor;
-import IR.MethodDescriptor;
-import IR.NameDescriptor;
public class ClassDescriptor extends Descriptor {
- public ClassDescriptor(String classname) {
- super(classname);
- this.classname=classname;
- superclass=null;
- fields=new SymbolTable();
- methods=new SymbolTable();
- classid=UIDCount++;
- }
- private static int UIDCount=0;
- private final int classid;
- String classname;
- String superclass;
- ClassDescriptor superdesc;
-
- Modifiers modifiers;
-
- SymbolTable fields;
- SymbolTable methods;
-
- public int getId() {
- return classid;
- }
-
- public Iterator getMethods() {
- return methods.getDescriptorsIterator();
- }
-
- public Iterator getFields() {
- return fields.getDescriptorsIterator();
- }
-
- public SymbolTable getFieldTable() {
- return fields;
- }
-
- public SymbolTable getMethodTable() {
- return methods;
- }
-
- public String getSafeDescriptor() {
- return "L"+safename.replace('.','/');
- }
-
- public String printTree(State state) {
- int indent;
- String st=modifiers.toString()+"class "+classname;
- if (superclass!=null)
- st+="extends "+superclass.toString();
- st+=" {\n";
- indent=TreeNode.INDENT;
- boolean printcr=false;
-
- for(Iterator it=getFields();it.hasNext();) {
- FieldDescriptor fd=(FieldDescriptor)it.next();
- st+=TreeNode.printSpace(indent)+fd.toString()+"\n";
- printcr=true;
- }
- if (printcr)
- st+="\n";
-
- for(Iterator it=getMethods();it.hasNext();) {
- MethodDescriptor md=(MethodDescriptor)it.next();
- st+=TreeNode.printSpace(indent)+md.toString()+" ";
- BlockNode bn=state.getMethodBody(md);
- st+=bn.printNode(indent)+"\n\n";
- }
- st+="}\n";
- return st;
- }
-
- public void addField(FieldDescriptor fd) {
- if (fields.contains(fd.getSymbol()))
- throw new Error(fd.getSymbol()+" already defined");
- fields.add(fd);
- }
-
- public void addMethod(MethodDescriptor md) {
- methods.add(md);
- }
-
- public void setModifiers(Modifiers modifiers) {
- this.modifiers=modifiers;
- }
-
- public void setName(String name) {
- classname=name;
- }
-
- public void setSuper(String superclass) {
- this.superclass=superclass;
- }
-
- public ClassDescriptor getSuperDesc() {
- return superdesc;
- }
-
- public void setSuper(ClassDescriptor scd) {
- this.superdesc=scd;
- }
-
- public String getSuper() {
- return superclass;
- }
+ private static int UIDCount=0;
+ private final int classid;
+ String superclass;
+ ClassDescriptor superdesc;
+ boolean hasFlags=false;
+ String packagename;
+
+ Modifiers modifiers;
+
+ SymbolTable fields;
+ SymbolTable flags;
+ SymbolTable methods;
+
+ public ClassDescriptor(String classname) {
+ this("", classname);
+ }
+
+ public ClassDescriptor(String packagename, String classname) {
+ super(classname);
+ superclass=null;
+ flags=new SymbolTable();
+ fields=new SymbolTable();
+ methods=new SymbolTable();
+ classid=UIDCount++;
+ this.packagename=packagename;
+ }
+
+ public int getId() {
+ return classid;
+ }
+
+ public Iterator getMethods() {
+ return methods.getDescriptorsIterator();
+ }
+
+ public Iterator getFields() {
+ return fields.getDescriptorsIterator();
+ }
+
+ public Iterator getFlags() {
+ return flags.getDescriptorsIterator();
+ }
+
+ public SymbolTable getFieldTable() {
+ return fields;
+ }
+
+ public SymbolTable getFlagTable() {
+ return flags;
+ }
+
+ public SymbolTable getMethodTable() {
+ return methods;
+ }
+
+ public String getSafeDescriptor() {
+ return "L"+safename.replace('.','/');
+ }
+
+ public String printTree(State state) {
+ int indent;
+ String st=modifiers.toString()+"class "+getSymbol();
+ if (superclass!=null)
+ st+="extends "+superclass.toString();
+ st+=" {\n";
+ indent=TreeNode.INDENT;
+ boolean printcr=false;
+
+ for(Iterator it=getFlags(); it.hasNext();) {
+ FlagDescriptor fd=(FlagDescriptor)it.next();
+ st+=TreeNode.printSpace(indent)+fd.toString()+"\n";
+ printcr=true;
+ }
+ if (printcr)
+ st+="\n";
+
+ printcr=false;
+
+ for(Iterator it=getFields(); it.hasNext();) {
+ FieldDescriptor fd=(FieldDescriptor)it.next();
+ st+=TreeNode.printSpace(indent)+fd.toString()+"\n";
+ printcr=true;
+ }
+ if (printcr)
+ st+="\n";
+
+ for(Iterator it=getMethods(); it.hasNext();) {
+ MethodDescriptor md=(MethodDescriptor)it.next();
+ st+=TreeNode.printSpace(indent)+md.toString()+" ";
+ BlockNode bn=state.getMethodBody(md);
+ st+=bn.printNode(indent)+"\n\n";
+ }
+ st+="}\n";
+ return st;
+ }
+
+ public void addFlag(FlagDescriptor fd) {
+ if (flags.contains(fd.getSymbol()))
+ throw new Error(fd.getSymbol()+" already defined");
+ hasFlags=true;
+ flags.add(fd);
+ }
+
+ public boolean hasFlags() {
+ return hasFlags||getSuperDesc()!=null&&getSuperDesc().hasFlags();
+ }
+
+ public void addField(FieldDescriptor fd) {
+ if (fields.contains(fd.getSymbol()))
+ throw new Error(fd.getSymbol()+" already defined");
+ fields.add(fd);
+ }
+
+ public void addMethod(MethodDescriptor md) {
+ methods.add(md);
+ }
+
+ public void setModifiers(Modifiers modifiers) {
+ this.modifiers=modifiers;
+ }
+
+ public void setSuper(String superclass) {
+ this.superclass=superclass;
+ }
+
+ public ClassDescriptor getSuperDesc() {
+ return superdesc;
+ }
+
+ public void setSuper(ClassDescriptor scd) {
+ this.superdesc=scd;
+ }
+
+ public String getSuper() {
+ return superclass;
+ }
}