[svn] r6522: nemerle/trunk/ncc: external/LibrariesLoader.n
hierarchy/BuiltinMethod.n hierarchy/ClassMember...
nazgul
svnadmin at nemerle.org
Tue Aug 15 00:16:17 CEST 2006
Log:
Fix generic methods matching in override checking
Author: nazgul
Date: Tue Aug 15 00:16:10 2006
New Revision: 6522
Modified:
nemerle/trunk/ncc/external/LibrariesLoader.n
nemerle/trunk/ncc/hierarchy/BuiltinMethod.n
nemerle/trunk/ncc/hierarchy/ClassMembers.n
nemerle/trunk/ncc/hierarchy/TypeBuilder.n
nemerle/trunk/ncc/hierarchy/TypeInfo.n
nemerle/trunk/ncc/testsuite/positive/gen-overload.n
nemerle/trunk/ncc/typing/MType.n
Modified: nemerle/trunk/ncc/external/LibrariesLoader.n
==============================================================================
--- nemerle/trunk/ncc/external/LibrariesLoader.n (original)
+++ nemerle/trunk/ncc/external/LibrariesLoader.n Tue Aug 15 00:16:10 2006
@@ -1927,7 +1927,7 @@
}
[Nemerle.Memoize (InvalidValue = null)]
- public GetMemType () : MType
+ public GetMemType () : MType.Fun
{
MType.ConstructFunctionType (GetHeader ())
}
Modified: nemerle/trunk/ncc/hierarchy/BuiltinMethod.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/BuiltinMethod.n (original)
+++ nemerle/trunk/ncc/hierarchy/BuiltinMethod.n Tue Aug 15 00:16:10 2006
@@ -76,7 +76,7 @@
MemberKind.Method (this)
}
- public GetMemType () : MType
+ public GetMemType () : MType.Fun
{
MType.ConstructFunctionType (GetHeader ())
}
Modified: nemerle/trunk/ncc/hierarchy/ClassMembers.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/ClassMembers.n (original)
+++ nemerle/trunk/ncc/hierarchy/ClassMembers.n Tue Aug 15 00:16:10 2006
@@ -649,6 +649,11 @@
GetMethodBase ()
}
+ public new GetMemType () : MType.Fun
+ {
+ ty :> MType.Fun
+ }
+
public GetConstructorInfo () : SRE.ConstructorBuilder
{
assert (ctor_builder != null);
Modified: nemerle/trunk/ncc/hierarchy/TypeBuilder.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/TypeBuilder.n (original)
+++ nemerle/trunk/ncc/hierarchy/TypeBuilder.n Tue Aug 15 00:16:10 2006
@@ -1387,14 +1387,14 @@
// traverse existing members [mems] searching one which match signature
// with the newly added method [meth]
// returns new list of members having this name
- def replace_method (acc, meth : IMethod, mems : list [IMember]) {
+ def replace_method (acc, meth : MethodBuilder, mems : list [IMember]) {
def par_amount = meth.GetParameters ().Length;
match (mems) {
// no methods with matching signature found
| [] =>
- when (mem.Attributes %&& NemerleAttributes.Override)
- Message.Error ($"`override' specified on $mem"
+ when (meth.Attributes %&& NemerleAttributes.Override)
+ Message.Error ($"`override' specified on $meth"
", but there is no method with this signature "
"in parent to override");
// we simply add this method to the existing list
@@ -1406,8 +1406,7 @@
// process next member
| x :: xs =>
def m = x :> IMethod;
- def sub = SubtypingSubst (m.DeclaringType);
- def sub_current = sub.MonoApply (m.GetMemType ());
+ def sub_current = get_method_type_after_subst (m, meth);
when (m.DeclaringType.Equals (this))
match ((sub_current, meth.GetMemType ())) {
@@ -1420,9 +1419,9 @@
def sig_matches =
(if (meth.Attributes %&& NemerleAttributes.Override)
- sub_current.Equals (mem.GetMemType ())
+ sub_current.Equals (meth.GetMemType ())
else
- (sub_current :> MType.Fun).from.Equals ((mem.GetMemType () :> MType.Fun).from))
+ (sub_current :> MType.Fun).from.Equals (meth.GetMemType ().from))
&& m.GetParameters ().Length == par_amount;
// if signature of existing method is the new one
@@ -1437,7 +1436,7 @@
if (meth.Attributes %&& NemerleAttributes.New)
()
else if (meth.Attributes %&& NemerleAttributes.Override) {
- (meth :> MethodBuilder).overridden_method = m;
+ meth.overridden_method = m;
meth.HasBeenUsed = false;
if (m.Attributes %&& NemerleAttributes.Virtual)
@@ -1493,7 +1492,7 @@
if (x.DeclaringType.Equals (this))
match ((mem.GetKind (), x.GetKind ())) {
| (MemberKind.Method (m), MemberKind.Method) =>
- replace_method ([], m, old)
+ replace_method ([], m :> MethodBuilder, old)
| (MemberKind.Property (p1), MemberKind.Property (p2)) when p1.IsIndexer && p2.IsIndexer =>
// overloading is (hopefully) checked at the get/set method level
@@ -1507,7 +1506,7 @@
else
// take a look at current member [mem] and the one found in ancestors [x]
match ((mem.GetKind (), x.GetKind ())) {
- | (MemberKind.Method (m), MemberKind.Method) => replace_method ([], m, old)
+ | (MemberKind.Method (m), MemberKind.Method) => replace_method ([], m :> MethodBuilder, old)
| (MemberKind.Property (new_prop), MemberKind.Property (old))
when new_prop.Attributes %&& NemerleAttributes.Override =>
@@ -1977,6 +1976,26 @@
}
}
+ methods_matches_by_signature (iface_meth : IMethod, meth : IMethod) : bool
+ {
+ if (iface_meth.GetHeader ().typarms.Length == meth.GetHeader ().typarms.Length) {
+ def iftype = get_method_type_after_subst (iface_meth, meth);
+ meth.GetMemType ().TrySigRequire (iftype)
+ }
+ else false
+ }
+
+ get_method_type_after_subst (iface_meth : IMethod, meth : IMethod) : MType
+ {
+ def h1 = iface_meth.GetHeader ();
+ def h2 = meth.GetHeader ();
+ def sub = SubtypingSubst (iface_meth.DeclaringType);
+ unless (h1.typarms.IsEmpty)
+ List.Iter2 (h1.typarms, h2.typarms, fun (stv, target) {
+ sub.Add (stv, MType.TyVarRef (target))
+ });
+ sub.MonoApply (iface_meth.GetMemType ());
+ }
/**
* Resolves overrides for the required interface methods
@@ -1996,25 +2015,12 @@
def iface_methods = Hashtable (30);
def can_explicitly_impl_methods = Hashtable ();
- def method_type_ok (iface_meth, meth) {
- def h1 = iface_meth.GetHeader ();
- def h2 = meth.GetHeader ();
- if (h1.typarms.Length == h2.typarms.Length) {
- def sub = Subst (Manager);
- List.Iter2 (h1.typarms, h2.typarms, fun (stv, target) {
- sub.Add (stv, MType.TyVarRef (target))
- });
- def iftype = sub.Apply (GetMemType ().TypeOfMember (iface_meth).Fix ());
- meth.GetMemType ().TrySigRequire (iftype.Fix ())
- } else false
- }
-
def partition_correct_meth (ifmethods, proposed_meth, scream) {
def is_correct (iface_meth : IMethod) {
// Message.Debug ( $ "try req: $proposed_meth req $iface_meth --- "
// "$(proposed_meth.GetMemType ()) req "
// "$(GetMemType ().TypeOfMethod (iface_meth))");
- if (method_type_ok (iface_meth, proposed_meth))
+ if (methods_matches_by_signature (iface_meth, proposed_meth))
if (proposed_meth.Attributes %&& NemerleAttributes.Public &&
!(proposed_meth.Attributes %&& NemerleAttributes.Static))
true
@@ -2061,7 +2067,7 @@
def ty = env.GetType (ns, this, -1);
def is_correct (iface_meth : IMethod) {
iface_meth.DeclaringType.Equals (ty) &&
- method_type_ok (iface_meth, meth)
+ methods_matches_by_signature (iface_meth, meth)
};
Manager.MarkAsUsed (meth);
Modified: nemerle/trunk/ncc/hierarchy/TypeInfo.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/TypeInfo.n (original)
+++ nemerle/trunk/ncc/hierarchy/TypeInfo.n Tue Aug 15 00:16:10 2006
@@ -123,6 +123,7 @@
IsVarArgs : bool { get; }
IsFinal : bool { get; }
BuiltinKind : BuiltinMethodKind { get; }
+ new GetMemType () : MType.Fun;
/// Obtains list of parameters of typed method
GetParameters () : list [Fun_parm];
Modified: nemerle/trunk/ncc/testsuite/positive/gen-overload.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/gen-overload.n (original)
+++ nemerle/trunk/ncc/testsuite/positive/gen-overload.n Tue Aug 15 00:16:10 2006
@@ -61,6 +61,16 @@
}
}
+
+namespace OverriderSubst {
+ abstract class ABase {
+ public abstract Test[T] (_a : T) : void;
+ }
+ class BDeriv : ABase {
+ public override Test[T] (_a : T) : void {}
+ }
+}
+
namespace NS
{
public class Test
Modified: nemerle/trunk/ncc/typing/MType.n
==============================================================================
--- nemerle/trunk/ncc/typing/MType.n (original)
+++ nemerle/trunk/ncc/typing/MType.n Tue Aug 15 00:16:10 2006
@@ -584,13 +584,13 @@
#region Public helper functions
- static public ConstructFunctionType (parms : list [MType], res : MType) : MType
+ static public ConstructFunctionType (parms : list [MType], res : MType) : MType.Fun
{
ConstructFunctionType (Solver.MonoTypes (parms), res)
}
- static public ConstructFunctionType (parms : list [TyVar], res : TyVar) : MType
+ static public ConstructFunctionType (parms : list [TyVar], res : TyVar) : MType.Fun
{
def from =
match (parms) {
@@ -603,7 +603,7 @@
}
- static public ConstructFunctionType (header : Typedtree.Fun_header) : MType
+ static public ConstructFunctionType (header : Typedtree.Fun_header) : MType.Fun
{
def parms = List.Map (header.parms,
fun (fp : Typedtree.Fun_parm) { fp.ty });
More information about the svn
mailing list