changes
[IRC.git] / Robust / src / IR / ClassDescriptor.java
1 package IR;
2 import java.util.*;
3 import IR.Tree.*;
4 import IR.SymbolTable;
5 import IR.FieldDescriptor;
6 import IR.MethodDescriptor;
7 import IR.NameDescriptor;
8
9 public class ClassDescriptor extends Descriptor {
10     public ClassDescriptor(String classname) {
11         super(classname);
12         this.classname=classname;
13         superclass=null;
14         fields=new SymbolTable();
15         methods=new SymbolTable();
16         classid=UIDCount++;
17     }
18     private static int UIDCount=10; /* 0 is for Arrays */
19     /*    For element types we use as defined in TypeDescriptor
20           public static final int BYTE=1;
21           public static final int SHORT=2;
22           public static final int INT=3;
23           public static final int LONG=4;
24           public static final int CHAR=5;
25           public static final int BOOLEAN=6;
26           public static final int FLOAT=7;
27           public static final int DOUBLE=8;*/
28
29     private final int classid;
30     String classname;
31     String superclass;
32     ClassDescriptor superdesc;
33
34     Modifiers modifiers;
35
36     SymbolTable fields;
37     SymbolTable methods;
38
39     public int getId() {
40         return classid;
41     }
42     
43     public Iterator getMethods() {
44         return methods.getDescriptorsIterator();
45     }
46
47     public Iterator getFields() {
48         return fields.getDescriptorsIterator();
49     }
50     
51     public SymbolTable getFieldTable() {
52         return fields;
53     }
54
55     public SymbolTable getMethodTable() {
56         return methods;
57     }
58
59     public String getSafeDescriptor() {
60         return "L"+safename.replace('.','/');
61     }
62
63     public String printTree(State state) {
64         int indent;
65         String st=modifiers.toString()+"class "+classname;
66         if (superclass!=null) 
67             st+="extends "+superclass.toString();
68         st+=" {\n";
69         indent=TreeNode.INDENT;
70         boolean printcr=false;
71
72         for(Iterator it=getFields();it.hasNext();) {
73             FieldDescriptor fd=(FieldDescriptor)it.next();
74             st+=TreeNode.printSpace(indent)+fd.toString()+"\n";
75             printcr=true;
76         }
77         if (printcr)
78             st+="\n";
79
80         for(Iterator it=getMethods();it.hasNext();) {
81             MethodDescriptor md=(MethodDescriptor)it.next();
82             st+=TreeNode.printSpace(indent)+md.toString()+" ";
83             BlockNode bn=state.getMethodBody(md);
84             st+=bn.printNode(indent)+"\n\n";
85         }
86         st+="}\n";
87         return st;
88     }
89
90     public void addField(FieldDescriptor fd) {
91         if (fields.contains(fd.getSymbol()))
92             throw new Error(fd.getSymbol()+" already defined");
93         fields.add(fd);
94     }
95
96     public void addMethod(MethodDescriptor md) {
97         methods.add(md);
98     }
99   
100     public void setModifiers(Modifiers modifiers) {
101         this.modifiers=modifiers;
102     }
103
104     public void setName(String name) {
105         classname=name;
106     }
107
108     public void setSuper(String superclass) {
109         this.superclass=superclass;
110     }
111
112     public ClassDescriptor getSuperDesc() {
113         return superdesc;
114     }
115
116     public void setSuper(ClassDescriptor scd) {
117         this.superdesc=scd;
118     }
119
120     public String getSuper() {
121         return superclass;
122     }
123 }