[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