[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