[svn] r6818: nemerle/trunk: . macros/Internals.n ncc/external/LibrariesLoader.n ncc/generation/ILEmitter.n...

IT svnadmin at nemerle.org
Thu Nov 2 06:04:46 CET 2006


Log:
Added field:IField to Literal.Enum.

Author: IT
Date: Thu Nov  2 06:04:39 2006
New Revision: 6818

Modified:
   nemerle/trunk/   (props changed)
   nemerle/trunk/macros/Internals.n
   nemerle/trunk/ncc/external/LibrariesLoader.n
   nemerle/trunk/ncc/generation/ILEmitter.n
   nemerle/trunk/ncc/hierarchy/CustomAttribute.n
   nemerle/trunk/ncc/hierarchy/MacroClassGen.n
   nemerle/trunk/ncc/parsing/AST.n
   nemerle/trunk/ncc/typing/ConstantFolder.n
   nemerle/trunk/ncc/typing/DecisionTreeBuilder.n
   nemerle/trunk/ncc/typing/Macros.n
   nemerle/trunk/ncc/typing/Typer.n

Modified: nemerle/trunk/macros/Internals.n
==============================================================================
--- nemerle/trunk/macros/Internals.n	(original)
+++ nemerle/trunk/macros/Internals.n	Thu Nov  2 06:04:39 2006
@@ -70,7 +70,7 @@
     when (is_static && !f.IsMutable)
       match (ConstantFolder.FoldConstants (t.GlobalEnv, val)) {
         | PT.PExpr.Literal (Literal.Decimal) => ()
-        | PT.PExpr.Literal (Literal.Enum (lit : Literal, _))
+        | PT.PExpr.Literal (Literal.Enum (lit : Literal, _, _))
         | PT.PExpr.Literal (lit) =>
           // watch out, we need to get the underlying enum type,
           // so our literal to type checking works properly
@@ -88,7 +88,7 @@
               // literal as initializer
               f.const_value =
                 if (enum_ti == null) l
-                else Literal.Enum (l :> Literal.Integer, enum_ti);
+                else Literal.Enum (l :> Literal.Integer, enum_ti, f);
             | None => ()
           }
         | _ => ()

Modified: nemerle/trunk/ncc/external/LibrariesLoader.n
==============================================================================
--- nemerle/trunk/ncc/external/LibrariesLoader.n	(original)
+++ nemerle/trunk/ncc/external/LibrariesLoader.n	Thu Nov  2 06:04:39 2006
@@ -1537,7 +1537,7 @@
                 Literal.Integer (System.Math.Abs (val) :> ulong, val < 0, null).WithProperType ()
           }
         if (handle.FieldType.IsEnum)
-          Literal.Enum (lit :> Literal.Integer, library.TypeInfoOfType (handle.DeclaringType))
+          Literal.Enum (lit :> Literal.Integer, library.TypeInfoOfType (handle.DeclaringType), this)
         else
           lit
       }

Modified: nemerle/trunk/ncc/generation/ILEmitter.n
==============================================================================
--- nemerle/trunk/ncc/generation/ILEmitter.n	(original)
+++ nemerle/trunk/ncc/generation/ILEmitter.n	Thu Nov  2 06:04:39 2006
@@ -2024,7 +2024,7 @@
 
           _ilg.Emit (OpCodes.Newobj, Option.UnSome (SystemTypeCache.Decimal_ctors.Get ("Int32[]")))
 
-        | Literal.Enum (l, _) => emit_literal (l)
+        | Literal.Enum (l, _, _) => emit_literal (l)
       }
     }
 

Modified: nemerle/trunk/ncc/hierarchy/CustomAttribute.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/CustomAttribute.n	(original)
+++ nemerle/trunk/ncc/hierarchy/CustomAttribute.n	Thu Nov  2 06:04:39 2006
@@ -50,7 +50,7 @@
         | <[ $(x : string) ]> => ((x : object), InternalType.String)
         | <[ $(x : bool) ]> => ((x : object), InternalType.Boolean)
         | <[ $(x : char) ]> => ((x : object), InternalType.Char)
-        | PT.PExpr.Literal (Literal.Enum (lval, ty)) =>
+        | PT.PExpr.Literal (Literal.Enum (lval, ty, _)) =>
           def (val, _) = compile_expr (env, ti, allow_rec, PT.PExpr.Literal (lval));
           (val, MType.Class (ty, []))
 
@@ -365,10 +365,10 @@
                         best_fit_mapping = val;
                         best_fit_mapping_set = true;
 
-                      | ("CallingConvention", PT.PExpr.Literal (Literal.Enum (l, _))) =>
+                      | ("CallingConvention", PT.PExpr.Literal (Literal.Enum (l, _, _))) =>
                         callingconv = l.AsObject () :> SRI.CallingConvention;
 
-                      | ("CharSet", PT.PExpr.Literal (Literal.Enum (l, _))) =>
+                      | ("CharSet", PT.PExpr.Literal (Literal.Enum (l, _, _))) =>
                         charset = l.AsObject () :> SRI.CharSet;
 
                       | ("EntryPoint", <[ $(val : string) ]>) =>

Modified: nemerle/trunk/ncc/hierarchy/MacroClassGen.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/MacroClassGen.n	(original)
+++ nemerle/trunk/ncc/hierarchy/MacroClassGen.n	Thu Nov  2 06:04:39 2006
@@ -93,7 +93,7 @@
           | <[ $_.MacroUsage (..$(ph :: tar :: _)) ]> =>
             phase =
             match (ConstantFolder.FoldConstants (env, ph)) {
-              | PExpr.Literal (Literal.Enum (Literal.Integer (x, false, _), ty))
+              | PExpr.Literal (Literal.Enum (Literal.Integer (x, false, _), ty, _))
                 when ty.FullName == "Nemerle.MacroPhase" =>
                 x :> MacroPhase
               | _ =>
@@ -101,7 +101,7 @@
             }
             target =
             match (ConstantFolder.FoldConstants (env, tar)) {
-              | PExpr.Literal (Literal.Enum (Literal.Integer (x, false, _), ty))
+              | PExpr.Literal (Literal.Enum (Literal.Integer (x, false, _), ty, _))
                 when ty.FullName == "System.AttributeTargets" =>
                 x :> MacroTargets
               | _ =>

Modified: nemerle/trunk/ncc/parsing/AST.n
==============================================================================
--- nemerle/trunk/ncc/parsing/AST.n	(original)
+++ nemerle/trunk/ncc/parsing/AST.n	Thu Nov  2 06:04:39 2006
@@ -289,7 +289,7 @@
         mutable treat_as : MType.Class;
       } 
 
-    | Enum { val : Literal.Integer; ty : TypeInfo; }
+    | Enum { val : Literal.Integer; ty : TypeInfo; field : IField; }
 
 
     [OverrideObjectEquals]
@@ -306,7 +306,8 @@
         | (Bool (x1), Bool (x2)) => x1 == x2
         | (Integer (val, is_neg, _), Integer (val', is_neg', _)) =>
           val == val' && is_neg == is_neg'
-        | (Enum (v1, t1), Enum (v2, t2)) => v1.Equals (v2) && t1.Equals (t2)
+        | (Enum (v1, t1, f1), Enum (v2, t2, f2)) => 
+          v1.Equals (v2) && t1.Equals (t2) && (if (f1 == null) f2 == null else f1.Equals (f2))
         | _ => false
       }
     }
@@ -337,7 +338,7 @@
           else $ "($s : $treat_as)";
           */
           
-        | Literal.Enum (val, ty) => "(" + val.ToString () + " :> " + ty.FullName + ")"
+        | Literal.Enum (val, ty, _) => "(" + val.ToString () + " :> " + ty.FullName + ")"
       }
     }
     
@@ -361,7 +362,7 @@
         | Literal.Bool => InternalType.Boolean
         // for enums we want to stay with original type
         // because e.g. ToString is called on enum not int
-        | Literal.Enum (_, ty) => ty.GetMemType ()
+        | Literal.Enum (_, ty, _) => ty.GetMemType ()
         | Literal.Integer (_, _, t) => t
       }
     }
@@ -378,7 +379,7 @@
         | Literal.Double when t.Equals (InternalType.Double)
         | Literal.Decimal when t.Equals (InternalType.Decimal)
         | Literal.Bool when t.Equals (InternalType.Boolean) 
-        | Literal.Enum (_, tc) when MType.Class (tc, []).Equals (t)
+        | Literal.Enum (_, tc, _) when MType.Class (tc, []).Equals (t)
           => Some (this)
           
         | Literal.Integer (val, is_neg, cur) =>
@@ -431,7 +432,7 @@
         | Literal.Double (d) => d
         | Literal.Decimal (d) => d
         | Literal.Bool (b) => b
-        | Literal.Enum (l, t) =>
+        | Literal.Enum (l, t, _) =>
           def t = t.SystemType;
           if (t is System.Reflection.Emit.EnumBuilder || t is System.Reflection.Emit.TypeBuilder)
             l.AsObject ()
@@ -649,7 +650,8 @@
                 Integer (ulong.Parse (s.Substring (1)), true, t)
               else
                 Integer (ulong.Parse (s), false, t);
-            Enum (int_lit, tc)
+            // IT : Need IField
+            Enum (int_lit, tc, null)
 
           | _ =>
             Util.ice ($ "cannot create literal from $o")

Modified: nemerle/trunk/ncc/typing/ConstantFolder.n
==============================================================================
--- nemerle/trunk/ncc/typing/ConstantFolder.n	(original)
+++ nemerle/trunk/ncc/typing/ConstantFolder.n	Thu Nov  2 06:04:39 2006
@@ -282,7 +282,7 @@
       ManagerClass.Instance.MarkAsUsed (field);
       match (enum_ty) {
         | Some (tc) when ! (lit is Literal.Enum) => 
-          Some (Literal.Enum (lit :> Literal.Integer, tc))
+          Some (Literal.Enum (lit :> Literal.Integer, tc, field))
         | _ => Some (lit)
       }
     }
@@ -335,10 +335,10 @@
                          e1 : PExpr, expr : PExpr) : PExpr
     {
       match (literal_of_expr (e1)) {
-        | Some (Literal.Enum (lit, enum_ty)) when name == "~" =>
+        | Some (Literal.Enum (lit, enum_ty, enum_field)) when name == "~" =>
           emit_flag_warning (enum_ty);
           def res = FoldLiteral (is_checked, name, lit);
-          PExpr.Literal (expr.loc, Literal.Enum (res, enum_ty))
+          PExpr.Literal (expr.loc, Literal.Enum (res, enum_ty, enum_field))
 
         | Some (Literal.Integer as lit) when is_known_operator (name) =>
           def res = FoldLiteral (is_checked, name, lit);
@@ -356,7 +356,7 @@
         | (Some (l1), Some (l2)) =>
           def (l1, l2, enum_ty) =
             match ((l1, l2)) {
-              | (Literal.Enum (l1, t1), Literal.Enum (l2, t2)) 
+              | (Literal.Enum (l1, t1, _), Literal.Enum (l2, t2, _)) 
                 when t1.Equals (t2) =>
                 (l1, l2, Some (t1))
               | _ => (l1, l2, None ())
@@ -375,7 +375,8 @@
               | (Some (t), "%&")
               | (Some (t), "%^") =>
                 emit_flag_warning (t);
-                def lit = if (lit is Literal.Enum) lit else Literal.Enum (lit :> Literal.Integer, t);
+                // IT : Need IField
+                def lit = if (lit is Literal.Enum) lit else Literal.Enum (lit :> Literal.Integer, t, null);
                 PExpr.Literal (expr.loc, lit)
               | (Some, _) =>
                 // other operators not allowed on enums

Modified: nemerle/trunk/ncc/typing/DecisionTreeBuilder.n
==============================================================================
--- nemerle/trunk/ncc/typing/DecisionTreeBuilder.n	(original)
+++ nemerle/trunk/ncc/typing/DecisionTreeBuilder.n	Thu Nov  2 06:04:39 2006
@@ -138,7 +138,7 @@
           | Lit (Literal.Bool (true)) :: _ => "false"
           | Lit (Literal.Bool (false)) :: _ => "true"
 
-          | (Lit (Literal.Enum (_, tc)) :: _) as lits
+          | (Lit (Literal.Enum (_, tc, _)) :: _) as lits
             when ! tc.HasAttribute (InternalType.FlagsAttribute_tc) =>
 
             // seems that both cases are possible (Enum & Integer; the latter
@@ -154,7 +154,7 @@
               else {
                 assert (val is Literal.Integer);
                 fun (l) {
-                  | Lit (Literal.Enum (v, _)) => val.Equals (v)
+                  | Lit (Literal.Enum (v, _, _)) => val.Equals (v)
                   | _ => false
                 }
               }
@@ -690,7 +690,7 @@
                   def lit =
                     match (val) {
                       | Literal.Enum => val
-                      | Literal.Integer as i => Literal.Enum (i, fld.DeclaringType)
+                      | Literal.Integer as i => Literal.Enum (i, fld.DeclaringType, fld)
                       | _ => assert (false)
                     }
                   check_if (Con.Lit (lit), rest)

Modified: nemerle/trunk/ncc/typing/Macros.n
==============================================================================
--- nemerle/trunk/ncc/typing/Macros.n	(original)
+++ nemerle/trunk/ncc/typing/Macros.n	Thu Nov  2 06:04:39 2006
@@ -461,7 +461,7 @@
       <[ Literal.Integer ($(val : ulong), $(is_negative : bool), null).WithProperType () ]>
     | Literal.Bool (val) => <[ Literal.Bool ($(val : bool)) ]>
     | Literal.Char (val) => <[ Literal.Char ($(val : char)) ]>
-    | Literal.Enum (l, _) => <[ Literal.Enum ($(quoted_literal (l)), null) ]>
+    | Literal.Enum (l, _, _) => <[ Literal.Enum ($(quoted_literal (l)), null, null) ]>
   }
   
   public quoted_fundecl (d : Function_decl) : PExpr

Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n	(original)
+++ nemerle/trunk/ncc/typing/Typer.n	Thu Nov  2 06:04:39 2006
@@ -1948,7 +1948,7 @@
           | Literal.Double => InternalType.Double
           | Literal.Decimal => InternalType.Decimal
           | Literal.Bool => InternalType.Boolean
-          | Literal.Enum (_, tc) => MType.Class (tc, [])
+          | Literal.Enum (_, tc, _) => MType.Class (tc, [])
         }
 
       if (mono_type == null) {



More information about the svn mailing list