Fix inner class implementation. Now code like inner.this.X/outer.this.X work correctl...
[IRC.git] / Robust / src / IR / Tree / FieldAccessNode.java
1 package IR.Tree;
2 import IR.FieldDescriptor;
3 import IR.TypeDescriptor;
4
5 public class FieldAccessNode extends ExpressionNode {
6   ExpressionNode left;
7   String fieldname;
8   FieldDescriptor field;
9
10   public FieldAccessNode(ExpressionNode l, String field) {
11     fieldname=field;
12     left=l;
13   }
14
15   public void setField(FieldDescriptor fd) {
16     field=fd;
17   }
18
19   public String getFieldName() {
20     return fieldname;
21   }
22   
23   public void setFieldName(String fieldname) {
24       this.fieldname = fieldname;
25   }
26
27   public FieldDescriptor getField() {
28     return field;
29   }
30
31   public ExpressionNode getExpression() {
32     return left;
33   }
34
35   public void setExpression( ExpressionNode en ) {
36         left = en;  
37   }
38   public String printNode(int indent) {
39     return left.printNode(indent)+"."+fieldname;
40   }
41   public int kind() {
42     return Kind.FieldAccessNode;
43   }
44   public TypeDescriptor getType() {
45     return getField().getType();
46   }
47
48   public Long evaluate() {
49     // if the field is a constant value then OK
50     eval = null;
51     if(field.isStatic() && field.isFinal()) {
52       eval = field.getExpressionNode().evaluate();
53     } else if (field.isEnum()) {
54       eval = Long.valueOf((long)field.enumValue());
55     }
56     return eval;
57   }
58 }