Further upgrades to semantic checker
[IRC.git] / Robust / src / IR / TypeUtil.java
1 package IR;
2 import java.util.*;
3
4 public class TypeUtil {
5     public static final String StringClass="java.lang.String";
6     State state;
7     Hashtable supertable;
8
9     public TypeUtil(State state) {
10         this.state=state;
11         createTables();
12     }
13
14     public ClassDescriptor getClass(String classname) {
15         ClassDescriptor cd=(ClassDescriptor)state.getClassSymbolTable().get(classname);
16         return cd;
17     }
18
19     private void createTables() {
20         supertable=new Hashtable();
21         Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();
22         while(classit.hasNext()) {
23             ClassDescriptor cd=(ClassDescriptor)classit.next();
24             String superc=cd.getSuper();
25             if (superc!=null) {
26                 ClassDescriptor cd_super=getClass(superc);
27                 supertable.put(cd,cd_super);
28             }
29         }
30     }
31
32     public ClassDescriptor getSuper(ClassDescriptor cd) {
33         return (ClassDescriptor)supertable.get(cd);
34     }
35
36     public boolean isSuperorType(TypeDescriptor possiblesuper, TypeDescriptor cd2) {
37         if ((possiblesuper.getClassDesc()==null)||
38             cd2.getClassDesc()==null)
39             throw new Error();
40         return isSuperorType(possiblesuper.getClassDesc(), cd2.getClassDesc());
41     }
42
43
44     public boolean isSuperorType(ClassDescriptor possiblesuper, ClassDescriptor cd2) {
45         if (possiblesuper==cd2)
46             return true;
47         else
48             return isSuper(possiblesuper, cd2);
49     }
50
51     public boolean isSuper(ClassDescriptor possiblesuper, ClassDescriptor cd2) {
52         while(cd2!=null) {
53             cd2=getSuper(cd2);
54             if (cd2==possiblesuper)
55                 return true;
56         }
57         return false;
58     }
59 }