Fix a small bug about enumaration type: it should be able to recorgnize access patter...
authorjzhou <jzhou>
Tue, 29 Nov 2011 01:00:40 +0000 (01:00 +0000)
committerjzhou <jzhou>
Tue, 29 Nov 2011 01:00:40 +0000 (01:00 +0000)
Robust/src/IR/FieldDescriptor.java
Robust/src/IR/Tree/FieldAccessNode.java
Robust/src/IR/Tree/Modifiers.java
Robust/src/IR/Tree/SemanticCheck.java
Robust/src/Tests/EnumTest.java

index 2d5a7d5baa25703a0bd505225cd1851d9fcf07f1..d2e50ac5342ece7e94ce0fba821742e65842bce0 100644 (file)
@@ -19,6 +19,7 @@ public class FieldDescriptor extends Descriptor {
   private boolean isglobal;
   private boolean isenum;
   private int enumvalue;
+  private boolean isEnumClass;
 
   private ClassDescriptor cn;
 
@@ -32,6 +33,7 @@ public class FieldDescriptor extends Descriptor {
     this.isglobal=isglobal;
     this.isenum = false;
     this.enumvalue = -1;
+    this.isEnumClass = false;
   }
 
   public ClassDescriptor getClassDescriptor() {
@@ -107,4 +109,13 @@ public class FieldDescriptor extends Descriptor {
   public String toPrettyStringBrief() {
     return td.toPrettyString()+" "+getSymbol();
   }
+  
+  public void setIsEnumClass() {
+    this.isEnumClass = true;
+  }
+
+  public boolean isEnumClass() {
+    return this.isEnumClass;
+  }
+
 }
index 66c7238d75a9d5f1cdf18c0e50babc21f3fbe294..3e5187f2b407b2648031b30db67ecf5823a1d1b1 100644 (file)
@@ -54,7 +54,7 @@ public class FieldAccessNode extends ExpressionNode {
   public boolean isSuper() {
       return issuper;
   }
-
+  
   public Long evaluate() {
     // if the field is a constant value then OK
     eval = null;
index 5715d10c78e3e2387d711c7e7739de3c979f6611..f3ab2ed1e250f6e5bfb38b9b90488a9fc1a9df34 100644 (file)
@@ -61,6 +61,10 @@ public class Modifiers {
   public boolean isStatic() {
     return ((value&STATIC)!=0);
   }
+  
+  public boolean isPublic() {
+    return ((value&PUBLIC)!=0);
+  }
 
   public boolean isNative() {
     return ((value&NATIVE)!=0);
index 7604773c5b08ecb3236ac3042eca10abecbd8c47..1fa4a7c9203c4c3cde685175856a6ae0c26b9aef 100644 (file)
@@ -723,6 +723,23 @@ public class SemanticCheck {
          }
          surroundingCls=surroundingCls.getSurroundingDesc();
        }
+       
+       // check if it is to access an enum field
+       Iterator it_enum = ltd.getClassDesc().getEnum();
+       while(it_enum.hasNext()) {
+        ClassDescriptor ecd = (ClassDescriptor)it_enum.next();
+        if(ecd.getSymbol().equals(ltd.getClassDesc().getSymbol()+"$"+fieldname)) {
+          // this is an enum field access
+          if(!ecd.isStatic() && !ecd.getModifier().isStatic() && !ecd.getModifier().isPublic()) {
+            throw new Error(fieldname + " is not a public/static enum field in "+fan.printNode(0)+" in "+md);
+          }
+          TypeDescriptor tp = new TypeDescriptor(ecd);
+          tp.setClassNameRef();
+          fd=new FieldDescriptor(ecd.getModifier(), tp, ltd.getClassDesc().getSymbol()+"$"+fieldname, null, false);;
+          fd.setIsEnumClass();
+          break;
+        }
+       }
       }
 
       if(ltd.getClassDesc().isEnum()) {
index 514e0758bb1e0806e715973fa5e9811246a5c4bb..34178f9214754f04844025c326903fbaf998db82 100644 (file)
@@ -6,7 +6,7 @@ public class EnumTest {
   
   public Spiciness1 howHot;
   
-  public enum Spiciness1 {
+  public static enum Spiciness1 {
     NOT, FLAMING, MILD, MEDIUM, HOT
   } ///:~
   
@@ -17,7 +17,7 @@ public class EnumTest {
     System.out.println(howHot);
     
     EnumTest et = new EnumTest();
-    et.howHot = Spiciness1.MEDIUM; // EnumTest.Spiciness1.MEDIUM;
+    et.howHot = EnumTest.Spiciness1.MEDIUM;
     System.out.println(et.howHot);
   }
 } /* Output: