[svn] r7409: nemerle/trunk: macros/DesignPatterns.n ncc/hierarchy/TypeBuilder.n ncc/parsing/ParseTree.n nc...

nazgul svnadmin at nemerle.org
Mon Feb 12 23:26:14 CET 2007


Log:
Fix implements wrapper for generic classes

Author: nazgul
Date: Mon Feb 12 23:26:10 2007
New Revision: 7409

Modified:
   nemerle/trunk/macros/DesignPatterns.n
   nemerle/trunk/ncc/hierarchy/TypeBuilder.n
   nemerle/trunk/ncc/parsing/ParseTree.n
   nemerle/trunk/ncc/testsuite/positive/iface.n
   nemerle/trunk/ncc/typing/MType.n
   nemerle/trunk/ncc/typing/TypedTree.n

Modified: nemerle/trunk/macros/DesignPatterns.n
==============================================================================
--- nemerle/trunk/macros/DesignPatterns.n	(original)
+++ nemerle/trunk/macros/DesignPatterns.n	Mon Feb 12 23:26:10 2007
@@ -36,8 +36,9 @@
   macro ProxyPublicMembers (t : TypeBuilder, f : FieldBuilder, params options : list [PExpr])
   {
     def inclusion_regexs = MacrosHelper.AnalyseNameInclusionPatterns (options);
+    def ftype = f.GetMemType();
     
-    def classty = match (f.GetMemType()) {
+    def classty = match (ftype) {
       | Class (typeinfo, _) => typeinfo
       | _ => Message.FatalError ("expected simple class type")
     }
@@ -47,6 +48,8 @@
       // create Name object for name of created object
       def member_name = t.ParsedName.NewName (mem.Name);
        
+      def subst = ftype.ConstructSubstForTypeInfo (mem.DeclaringType);
+       
       when (!mem.Name.Equals (".ctor") && MacrosHelper.NameMatchesPatterns (mem.Name, inclusion_regexs))
       match (mem) {
         | meth is IMethod
@@ -56,17 +59,15 @@
       
           // prepare method invocation parameters
           def parms = meth.GetParameters ().Map(fun (p) {
-            <[ $(t.ParsedName.NewName (p.name) : name) :
-               $(f.GetMemType().ConvertTypeFromTypeInfo (p.ty.Fix(), classty) : typed) ]>
+            <[ $(t.ParsedName.NewName (p.name) : name) : $(subst.Apply (p.ty.Fix()) : typed) ]>
           });
           // prepare created method function parameters
           def fparms = parms.Map (Parsetree.Fun_parm);
 
-
           // define the wrapper method
           t.Define (<[ decl:
             public virtual $(member_name : name) (..$fparms)
-            : $(f.GetMemType().ConvertTypeFromTypeInfo (meth.ReturnType.Fix(), classty) : typed)
+            : $(subst.Apply (meth.ReturnType.Fix()) : typed)
             {
               this.$(f.Name : dyn).$(member_name : name) (..$parms)
             }
@@ -74,7 +75,7 @@
 
         | prop is IProperty when prop.GetGetter() != null && !prop.IsIndexer =>
           t.Define (<[ decl:
-            public virtual $(member_name : name) : $(f.GetMemType().TypeOfMember (prop) : typed) {
+            public virtual $(member_name : name) : $(ftype.TypeOfMember (prop) : typed) {
               get { 
                 this.$(f.Name : dyn).$(member_name : name)
               }

Modified: nemerle/trunk/ncc/hierarchy/TypeBuilder.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/TypeBuilder.n	(original)
+++ nemerle/trunk/ncc/hierarchy/TypeBuilder.n	Mon Feb 12 23:26:10 2007
@@ -2053,7 +2053,8 @@
   {
     if (iface_meth.GetHeader ().typarms.Length == meth.GetHeader ().typarms.Length) {
       def iftype = get_method_type_after_subst (iface_meth, meth);
-      meth.GetMemType ().TrySigRequire (iftype)
+      def methd_type = if (meth.DeclaringType.Equals (this)) meth.GetMemType () else GetMemType ().TypeOfMember (meth).Fix ();
+      methd_type.TrySigRequire (iftype)
     } 
     else false
   }
@@ -2284,7 +2285,8 @@
                     !(meth.Attributes %&& NemerleAttributes.Sealed))
                   NemerleAttributes.Override 
                 else NemerleAttributes.New;
-              def parse_tr = meth_header.CreateAliasMethod (mods | NemerleAttributes.Public, obj);
+              def subst = GetMemType ().ConstructSubstForTypeInfo (meth.DeclaringType);
+              def parse_tr = meth_header.CreateAliasMethod (mods | NemerleAttributes.Public, obj, subst);
               def wrapper = DefineAndReturn (parse_tr) :> MethodBuilder;
 
               wrapper.MarkWithSpecialName ();

Modified: nemerle/trunk/ncc/parsing/ParseTree.n
==============================================================================
--- nemerle/trunk/ncc/parsing/ParseTree.n	(original)
+++ nemerle/trunk/ncc/parsing/ParseTree.n	Mon Feb 12 23:26:10 2007
@@ -254,20 +254,36 @@
     public virtual ExistingTyvars : list [StaticTyVar] { get { null } } 
   }
   
+  public class SubstitutingTyparms : Typarms {
+    subst : Subst;  
+    
+    public this (subst : Subst) {
+      base ([], []);
+      this.subst = subst;   
+    }
+
+    public override Substitute (ty : MType) : TyVar { subst.Apply (ty) }         
+  }
+  
   /** The specified list of typed type parameters will be used as template for new type parameters. 
       Compiler will also perform substitution of references to old parameters in type/method signature into references
       to fresh type parameters */
-  public class CopyTypedTyparms : Typarms {
+  public class CopyTypedTyparms : SubstitutingTyparms {
     fresh_vars : list [StaticTyVar];
-    subst : Subst;
        
     public this (template_tyvars : list [StaticTyVar]) {
-      base ([], []);
-      (subst, fresh_vars) = StaticTyVar.CopyList (template_tyvars);
+      this (template_tyvars, null)
+    }   
+    
+    public this (template_tyvars : list [StaticTyVar], subst : Subst) {
+      def (fsubst, fresh_vars) = StaticTyVar.CopyList (template_tyvars);
+      when (subst != null)
+        fsubst.AddSubst (subst);
+      base (fsubst);
+      this.fresh_vars = fresh_vars;
     }   
     
     public override IsCopyOfExisting : bool { get { true } }
-    public override Substitute (ty : MType) : TyVar { subst.Apply (ty) } 
     public override ExistingTyvars : list [StaticTyVar] { get { fresh_vars } } 
   }
 

Modified: nemerle/trunk/ncc/testsuite/positive/iface.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/iface.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/iface.n	Mon Feb 12 23:26:10 2007
@@ -35,6 +35,21 @@
   class Derived : Base, IFace {} 
 }
 
+namespace Bug885 {
+  class Base[T]
+  {
+    public Foo(_x : T) : void {}
+  }
+
+  interface IFace
+  {
+    Foo(_x : int) : void;
+  }
+
+  class Derived : Base[int], IFace { } 
+}
+
+
 class Bar { }
  
 def d = Bug881.Derived () : Bug881.IFace;

Modified: nemerle/trunk/ncc/typing/MType.n
==============================================================================
--- nemerle/trunk/ncc/typing/MType.n	(original)
+++ nemerle/trunk/ncc/typing/MType.n	Mon Feb 12 23:26:10 2007
@@ -726,16 +726,23 @@
     }
     
 
-    public ConvertTypeFromTypeInfo (ty : MType, from : TypeInfo) : TyVar
+    /**
+     * Returns substitution which should be applied to types of members of $from in order to get their
+     * instatiation in $this, like  SCG.List[int].ConstructSubstForTypeInfo (SCG.ICollection) --> { T := int }
+     *
+     * It supports only MType.Class
+     */
+    public ConstructSubstForTypeInfo (from : TypeInfo) : Subst
     {
       match (this) {
         | Class (ti, args) =>
           def s1 = ti.SubtypingSubst (from);
           def s2 = ti.MakeSubst (args);
-          s2.Apply (s1.Apply (ty).Fix ())
+          s1.AddSubst (s2);
+          s1
 
         | _ =>
-          Util.ice ($"unsupported type: $this");
+          throw System.ArgumentException ($"unsupported type: $this");
       }
     }
       

Modified: nemerle/trunk/ncc/typing/TypedTree.n
==============================================================================
--- nemerle/trunk/ncc/typing/TypedTree.n	(original)
+++ nemerle/trunk/ncc/typing/TypedTree.n	Mon Feb 12 23:26:10 2007
@@ -356,7 +356,7 @@
       get { parms.Map (_.ReferencingExpr) }
     }    
     
-    public CreateAliasMethod (mods : NemerleAttributes, obj : Parsetree.PExpr) : Parsetree.ClassMember
+    public CreateAliasMethod (mods : NemerleAttributes, obj : Parsetree.PExpr, custom_subst : Subst) : Parsetree.ClassMember
     {
       def attrs = Modifiers (mods, []);
   
@@ -364,7 +364,7 @@
         ..$attrs $(this.name : usesite) (..$(this.ParametersDeclarations)) : $(this.ret_type : typed)
         {}
       ]>;
-      parse_tr.header.typarms = Parsetree.CopyTypedTyparms (this.typarms);
+      parse_tr.header.typarms = Parsetree.CopyTypedTyparms (this.typarms, custom_subst);
       def tyargs = parse_tr.header.typarms.ExistingTyvars.Map (x => <[ $(MType.TyVarRef (x) : typed) ]>);
       parse_tr.Body = <[ $obj.$(this.name : usesite) .[..$tyargs] (..$(this.ParametersReferences)) ]>;
       parse_tr



More information about the svn mailing list