2 import IR.Tree.Modifiers;
3 import IR.Tree.ExpressionNode;
4 import java.util.Vector;
9 * represents a symbol in the language (var name, function name, etc).
12 public class MethodDescriptor extends Descriptor {
14 protected Modifiers modifier;
15 protected TypeDescriptor returntype;
16 protected String identifier;
17 protected Vector params;
18 protected SymbolTable paramtable;
19 protected ClassDescriptor cd;
20 protected VarDescriptor thisvd;
21 protected boolean isglobal;
23 public MethodDescriptor(Modifiers m, TypeDescriptor rt, String identifier) {
27 this.identifier=identifier;
28 this.safename = "___" + name + "___";
29 this.uniqueid=count++;
31 paramtable=new SymbolTable();
35 public Modifiers getModifiers() {
39 public boolean matches(MethodDescriptor md) {
41 if (!identifier.equals(md.identifier))
43 if (numParameters()!=md.numParameters())
45 for(int i=0; i<numParameters(); i++) {
46 Descriptor d1=getParameter(i);
47 Descriptor d2=md.getParameter(i);
48 TypeDescriptor td1=(d1 instanceof TagVarDescriptor) ? ((TagVarDescriptor)d1).getType() : ((VarDescriptor)d1).getType();
49 TypeDescriptor td2=(d2 instanceof TagVarDescriptor) ? ((TagVarDescriptor)d2).getType() : ((VarDescriptor)d2).getType();
56 public MethodDescriptor(Modifiers m, String identifier) {
57 this(m, identifier, false);
60 public MethodDescriptor(Modifiers m, String identifier, boolean isglobal) {
62 this.isglobal=isglobal;
65 this.identifier=identifier;
66 this.safename = "___" + name + "___";
67 this.uniqueid=count++;
69 paramtable=new SymbolTable();
74 public boolean isGlobal() {
78 public void setThis(VarDescriptor vd) {
83 public VarDescriptor getThis() {
87 public String getClassMethodName() {
91 public String getSafeMethodDescriptor() {
93 for(int i=0; i<numParameters(); i++) {
94 st+=getParamType(i).getSafeDescriptor();
95 if ((i+1)<numParameters())
101 public boolean isStatic() {
102 return modifier.isStatic();
105 public boolean isConstructor() {
106 return (returntype==null);
109 public TypeDescriptor getReturnType() {
113 public void setClassDesc(ClassDescriptor cd) {
117 public ClassDescriptor getClassDesc() {
121 public SymbolTable getParameterTable() {
125 public void addParameter(TypeDescriptor type, String paramname) {
126 if (paramname.equals("this"))
127 throw new Error("Can't have parameter named this");
128 VarDescriptor vd=new VarDescriptor(type, paramname);
131 if (paramtable.getFromSameScope(paramname)!=null) {
132 throw new Error("Parameter "+paramname+" already defined");
137 public void addTagParameter(TypeDescriptor type, String paramname) {
138 if (paramname.equals("this"))
139 throw new Error("Can't have parameter named this");
140 TagVarDescriptor vd=new TagVarDescriptor(null, paramname);
143 if (paramtable.getFromSameScope(paramname)!=null) {
144 throw new Error("Parameter "+paramname+" already defined");
149 public int numParameters() {
150 return params.size();
153 public Descriptor getParameter(int i) {
154 return (Descriptor) params.get(i);
157 public String getParamName(int i) {
158 return ((Descriptor)params.get(i)).getSymbol();
161 public TypeDescriptor getParamType(int i) {
162 Descriptor d=(Descriptor)params.get(i);
163 if (d instanceof VarDescriptor)
164 return ((VarDescriptor)params.get(i)).getType();
165 else if (d instanceof TagVarDescriptor)
166 return new TypeDescriptor(TypeDescriptor.TAG);
167 else throw new Error();
170 public String toString() {
175 if (returntype!=null)
176 st=modifier.toString()+returntype.toString()+" "+type+identifier+"(";
178 st=modifier.toString()+" "+type+identifier+"(";
179 for(int i=0; i<params.size(); i++) {
180 st+=getParamType(i)+" "+getParamName(i);
181 if ((i+1)!=params.size())