[svn] r7034: nemerle/trunk/ncc: testsuite/positive/overloading.n typing/Typer-DelayedTyping.n typing/Typer...

malekith svnadmin at nemerle.org
Fri Dec 1 14:24:00 CET 2006


Log:
Put a constrain 'need member foo' if 'foo' is accessed on overloaded value. Resolves #723.

Author: malekith
Date: Fri Dec  1 14:23:59 2006
New Revision: 7034

Modified:
   nemerle/trunk/ncc/testsuite/positive/overloading.n
   nemerle/trunk/ncc/typing/Typer-DelayedTyping.n
   nemerle/trunk/ncc/typing/Typer.n

Modified: nemerle/trunk/ncc/testsuite/positive/overloading.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/overloading.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/overloading.n	Fri Dec  1 14:23:59 2006
@@ -79,6 +79,22 @@
   public this (_ : object) { printf("743x.object\n"); }
 }
 
+namespace Bug723 {
+class X1
+{
+  public M() : void {}
+}
+
+class X2
+{
+  public X1 : X1 = X1();
+  public K() : void
+  {
+    X1.M()
+  }
+}
+}
+
 module M {
   foo (_ : array [string]) : void { }
   foo (_ : array [object]) : void { assert (false) }

Modified: nemerle/trunk/ncc/typing/Typer-DelayedTyping.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer-DelayedTyping.n	(original)
+++ nemerle/trunk/ncc/typing/Typer-DelayedTyping.n	Fri Dec  1 14:23:59 2006
@@ -262,6 +262,35 @@
         }
       }
       
+      public ExpectMember (name : string) : void
+      {
+        def can_have (_ : MType) {
+          | Class (tc, _) => ! (tc.LookupMember (name) is [])
+          | Array (_, n) => ! (InternalType.GetArrayType (n).LookupMember (name) is [])
+          | TyVarRef (tv) => tv.Constraints.Exists (can_have)
+          | Intersection (lst) => lst.Exists (can_have)
+          | Tuple | Fun | Void | Ref | Out => false
+        }
+
+        match (DtKind) {
+          | Kind.Overloaded (lst) =>
+            when (InternalType.Object_tc.LookupMember (name) is []) {
+              // otherwise it's pointless
+              def newlst = List.RevFilter (lst, fun (o : OverloadPossibility) {
+                match (o.Type.Hint) {
+                  | Some (mt) => can_have (mt)
+                  | None => true // we don't yet know
+                }
+              });
+
+              if (newlst is []) {}
+              else SetKind (Kind.Overloaded (newlst));
+            }
+ 
+          | _ => {}
+        }
+      }
+      
       public IsResolved : bool
       {
         get {

Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n	(original)
+++ nemerle/trunk/ncc/typing/Typer.n	Fri Dec  1 14:23:59 2006
@@ -2450,8 +2450,12 @@
                     : option [list [OverloadPossibility]]
     {
       def mem_name = name.Id;
-      // XXX we should add a bound here, that the type should have the
-      // field mem_name
+
+      match (obj) {
+        | Delayed (dt) => dt.ExpectMember (mem_name)
+        | _ => {}
+      }
+
       def possible_type =
         match (obj.Type.Hint) {
           | Some (t) => t



More information about the svn mailing list