[svn] r7797: nemerle/trunk/ncc/external: Codec.n LibrariesLoader.n

pbludov svnadmin at nemerle.org
Fri Sep 14 10:36:39 CEST 2007


Log:
TyCodec.reflect_typarms.set_constraints extracted from TyCodec.reflect_typarms: a reflected generic type parameter may have a constraint to the type itself

Author: pbludov
Date: Fri Sep 14 10:36:36 2007
New Revision: 7797

Modified:
   nemerle/trunk/ncc/external/Codec.n
   nemerle/trunk/ncc/external/LibrariesLoader.n

Modified: nemerle/trunk/ncc/external/Codec.n
==============================================================================
--- nemerle/trunk/ncc/external/Codec.n	(original)
+++ nemerle/trunk/ncc/external/Codec.n	Fri Sep 14 10:36:36 2007
@@ -133,15 +133,23 @@
       tenv = tenv.Replace (gparm.Name, tv)
     }
     
+    tyvars = List.Rev (tyvars);
+    
+    (tyvars, tenv)
+  }
+
+  
+  public ReflectConstraints (_lib : LibraryReference, tenv : Map [string, StaticTyVar], 
+                  sys_type : System.Type, self_type : MType,  tyvars : list [StaticTyVar]) : void
+  {
+    def vars = sys_type.GetGenericArguments ();
+
     def set_constraints (t, tv : StaticTyVar) {
       def constraints = t.GetGenericParameterConstraints ();
       tv.SetConstraints (t.GenericParameterAttributes,
-                         List.MapFromArray (constraints, fun (t) { _lib.TypeOfType (tenv, t) }))
+                         List.MapFromArray (constraints, fun (t) { if (t.Equals(sys_type)) self_type else _lib.TypeOfType (tenv, t) }))
     };
-    tyvars = List.Rev (tyvars);
     NArray.Iter2 (vars, tyvars, set_constraints);
-    
-    (tyvars, tenv)
   }
 
   

Modified: nemerle/trunk/ncc/external/LibrariesLoader.n
==============================================================================
--- nemerle/trunk/ncc/external/LibrariesLoader.n	(original)
+++ nemerle/trunk/ncc/external/LibrariesLoader.n	Fri Sep 14 10:36:36 2007
@@ -761,6 +761,8 @@
         def parms = List.Map (typarms, fun (x) { MType.TyVarRef (x) });
         self_type = MType.Class (this, parms);
         
+        TyCodec.ReflectConstraints(library, tenv, system_type, self_type, typarms);
+        
         attributes = NemerleAttributes.None;
 
         when (system_type.IsAbstract) attributes |= NemerleAttributes.Abstract;



More information about the svn mailing list