[svn] r6230: nemerle/trunk/ncc: hierarchy/ClassMembers.n testsuite/positive/delegate.n typing/Typer2.n

malekith svnadmin at nemerle.org
Fri May 5 15:45:04 CEST 2006


Log:
Fix access to events from generic types. Prevent complaints about unused event add_/remove_ methods (never scream about remove_, scream about add_ only if really not used). Resolves #590.

Author: malekith
Date: Fri May  5 15:45:03 2006
New Revision: 6230

Modified:
   nemerle/trunk/ncc/hierarchy/ClassMembers.n
   nemerle/trunk/ncc/testsuite/positive/delegate.n
   nemerle/trunk/ncc/typing/Typer2.n

Modified: nemerle/trunk/ncc/hierarchy/ClassMembers.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/ClassMembers.n	(original)
+++ nemerle/trunk/ncc/hierarchy/ClassMembers.n	Fri May  5 15:45:03 2006
@@ -1119,6 +1119,7 @@
 
     adder = make_method (f.add);
     remover = make_method (f.remove);
+    remover.HasBeenUsed = true;
 
     ty.CheckAccessibility (this, accessibility);
   }

Modified: nemerle/trunk/ncc/testsuite/positive/delegate.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/delegate.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/delegate.n	Fri May  5 15:45:03 2006
@@ -132,6 +132,37 @@
   }
 }
 
+namespace Bug590 {
+
+delegate Test[T] (mutable t : T) : void;
+
+class Foo[T]
+{
+        public event MyEvent : Test[T];
+
+        public Hello (mutable t : T) : void
+        {
+                when (MyEvent != null)
+                        MyEvent (t);
+        }
+}
+
+class X
+{
+        static do_hello (mutable hello : string) : void
+        {
+                Console.WriteLine ("Hello: {0}", hello);
+        }
+
+        public static Main2 () : void
+        {
+                mutable foo = Foo ();
+                foo.MyEvent += Test (do_hello);
+                foo.Hello ("Boston");
+        }
+}
+}
+
 public delegate GenDel[X] (x : X) : int;
 
 public module M {
@@ -219,6 +250,8 @@
     printf ("non-void: %s",
             run_my_non_void_delegate ("foobarized", M.MySprintDelegate (sprint_static_meth)));
 
+    Bug590.X.Main2 ();
+
     def c1 = C1 ("c1");
     def c2 = C1 ("c2");
     run_delegate (System.Threading.ThreadStart (c1.m1));
@@ -245,6 +278,7 @@
 s: bar:f
 string_static_meth: foobarized
 non-void: sprint_static_meth: foobarized
+Hello: Boston
 c1 C.m1
 c2 C.m1
 c1: qux:t

Modified: nemerle/trunk/ncc/typing/Typer2.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer2.n	(original)
+++ nemerle/trunk/ncc/typing/Typer2.n	Fri May  5 15:45:03 2006
@@ -312,14 +312,14 @@
                         else
                           ev2.GetRemover ();
                       assert (ev_meth != null);
+                      ev_meth.HasBeenUsed = true;
                       def ev_meth_ref =
-                      // XXX possibly wrong type here
                         if (obj1 == null) {
-                          def (ty, vars) = ev_meth.GetFreshType ();
+                          def (ty, vars) = ty1.Fix ().TypeOfMethodWithTyparms (ev_meth);
                           TExpr.StaticRef (ty, ty1, ev_meth, vars)
                         } else {
                           def obj1 = Walk (obj1); 
-                          def (ty, vars) = ev_meth.GetFreshType ();
+                          def (ty, vars) = obj1.Type.Fix ().TypeOfMethodWithTyparms (ev_meth);
                           TExpr.MethodRef (ty, obj1, ev_meth, 
                                            vars, IsBaseRef (obj1));
                         }



More information about the svn mailing list