package IR.Tree;
import IR.NameDescriptor;
+import IR.Descriptor;
import IR.VarDescriptor;
+import IR.TagVarDescriptor;
import IR.TypeDescriptor;
+import IR.FieldDescriptor;
+import IR.ClassDescriptor;
public class NameNode extends ExpressionNode {
- NameDescriptor name;
- VarDescriptor vd;
+ NameDescriptor name;
+ Descriptor vd;
+ FieldDescriptor fd;
+ ExpressionNode en;
+ ClassDescriptor cd;
- public NameNode(NameDescriptor nd) {
- this.name=nd;
- }
+ public NameNode(NameDescriptor nd) {
+ this.name=nd;
+ this.vd=null;
+ this.fd=null;
+ this.cd = null;
+ }
- public void setVar(VarDescriptor vd) {
- this.vd=vd;
- }
+ public ExpressionNode getExpression() {
+ return en;
+ }
+
+ public ClassDescriptor getClassDesc() {
+ return this.cd;
+ }
+
+ public void setClassDesc(ClassDescriptor cd) {
+ this.cd = cd;
+ }
- public TypeDescriptor getType() {
- return vd.getType();
- }
+ /* Gross hack */
+ public void setExpression(ExpressionNode en) {
+ this.en=en;
+ }
- NameDescriptor getName() {
- return name;
- }
+ public void setVar(Descriptor vd) {
+ this.vd=vd;
+ }
- public String printNode(int indent) {
- return name.toString();
- }
+ public void setField(FieldDescriptor fd) {
+ this.fd=fd;
+ }
- public int kind() {
- return Kind.NameNode;
- }
+ public FieldDescriptor getField() {
+ return fd;
+ }
+
+ public boolean isTag() {
+ return (vd instanceof TagVarDescriptor);
+ }
+
+ public VarDescriptor getVar() {
+ return (VarDescriptor) vd;
+ }
+
+ public TagVarDescriptor getTagVar() {
+ return (TagVarDescriptor) vd;
+ }
+
+ public TypeDescriptor getType() {
+ if (en!=null)
+ return en.getType();
+ else if (fd!=null) {
+ return fd.getType();
+ } else if (isTag())
+ return new TypeDescriptor(TypeDescriptor.TAG);
+ else if(cd != null) {
+ TypeDescriptor tp = new TypeDescriptor(cd);
+ tp.setStatic();
+ return tp;
+ } else
+ return ((VarDescriptor)vd).getType();
+ }
+
+ public TypeDescriptor getClassType() {
+ if(cd != null) {
+ TypeDescriptor tp = new TypeDescriptor(cd);
+ tp.setStatic();
+ return tp;
+ } else
+ return null;
+ }
+
+ NameDescriptor getName() {
+ return name;
+ }
+
+ public String printNode(int indent) {
+ return name.toString();
+ }
+
+ public int kind() {
+ return Kind.NameNode;
+ }
}