[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