From: jzhou Date: Tue, 29 Nov 2011 01:00:40 +0000 (+0000) Subject: Fix a small bug about enumaration type: it should be able to recorgnize access patter... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d172d3c99bb01f2d1d32cadccd10f344b9e46e4c;p=IRC.git Fix a small bug about enumaration type: it should be able to recorgnize access pattern like Classname.EnumName.X --- diff --git a/Robust/src/IR/FieldDescriptor.java b/Robust/src/IR/FieldDescriptor.java index 2d5a7d5b..d2e50ac5 100644 --- a/Robust/src/IR/FieldDescriptor.java +++ b/Robust/src/IR/FieldDescriptor.java @@ -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; + } + } diff --git a/Robust/src/IR/Tree/FieldAccessNode.java b/Robust/src/IR/Tree/FieldAccessNode.java index 66c7238d..3e5187f2 100644 --- a/Robust/src/IR/Tree/FieldAccessNode.java +++ b/Robust/src/IR/Tree/FieldAccessNode.java @@ -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; diff --git a/Robust/src/IR/Tree/Modifiers.java b/Robust/src/IR/Tree/Modifiers.java index 5715d10c..f3ab2ed1 100644 --- a/Robust/src/IR/Tree/Modifiers.java +++ b/Robust/src/IR/Tree/Modifiers.java @@ -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); diff --git a/Robust/src/IR/Tree/SemanticCheck.java b/Robust/src/IR/Tree/SemanticCheck.java index 7604773c..1fa4a7c9 100644 --- a/Robust/src/IR/Tree/SemanticCheck.java +++ b/Robust/src/IR/Tree/SemanticCheck.java @@ -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()) { diff --git a/Robust/src/Tests/EnumTest.java b/Robust/src/Tests/EnumTest.java index 514e0758..34178f92 100644 --- a/Robust/src/Tests/EnumTest.java +++ b/Robust/src/Tests/EnumTest.java @@ -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: