[svn] r7732: nemerle/trunk/ncc: testsuite/negative/operators.n typing/OverloadPossibility.n typing/Typer-D...

divan svnadmin at nemerle.org
Wed Jul 4 20:53:41 CEST 2007


Log:
Work on delayed operators (fix part of bug 882).

Author: divan
Date: Wed Jul  4 20:53:39 2007
New Revision: 7732

Modified:
   nemerle/trunk/ncc/testsuite/negative/operators.n
   nemerle/trunk/ncc/typing/OverloadPossibility.n
   nemerle/trunk/ncc/typing/Typer-DelayedTyping.n

Modified: nemerle/trunk/ncc/testsuite/negative/operators.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/negative/operators.n	(original)
+++ nemerle/trunk/ncc/testsuite/negative/operators.n	Wed Jul  4 20:53:39 2007
@@ -40,7 +40,7 @@
           {
                   mutable  k =  Foo ();
 
-                  mutable  i = ~ k; (); // E: cannot find the operator
+                  mutable  i = ~ k; (); // E: typing fails on finding the operator
 
           }
   }

Modified: nemerle/trunk/ncc/typing/OverloadPossibility.n
==============================================================================
--- nemerle/trunk/ncc/typing/OverloadPossibility.n	(original)
+++ nemerle/trunk/ncc/typing/OverloadPossibility.n	Wed Jul  4 20:53:39 2007
@@ -365,7 +365,8 @@
     public static OnlyPossible (overloads : list [OverloadPossibility], expected : TyVar) 
                                           : list [OverloadPossibility]
     {
-      assert (!overloads.IsEmpty);
+      when (overloads.IsEmpty)
+        Nemerle.Imperative.Return ([]);
 
       def Manager = overloads.Head.Manager;
 

Modified: nemerle/trunk/ncc/typing/Typer-DelayedTyping.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer-DelayedTyping.n	(original)
+++ nemerle/trunk/ncc/typing/Typer-DelayedTyping.n	Wed Jul  4 20:53:39 2007
@@ -363,10 +363,13 @@
       public GetDescriptionForError () : list [string]
       {
         match (DtKind) {
+          | OverloadedOperator ([], t1, t2, name, _env, _seen) =>
+            "finding the operator " +
+            $"$name($t1" + (if (t2 != null) $", $t2" else "") + ")" :: []
           | OverloadedOperator (overloads, t1, t2, name, _env, _seen) =>
             def used (o) { o.UsedLastTime }
             "ambiguity between operator " +
-            $"$name($t1" + (if (t2 != null) $", $t2" else "") + ")"
+            $"$name($t1" + (if (t2 != null) $", $t2" else "") + ")" +
             " overloads:" :: 
             (if (overloads.Exists (used))
                overloads.Filter (used) 
@@ -615,8 +618,28 @@
               }
               Some (res)
               
-            | Some (MType.Fun) =>
-              Some (LookupOperatorIn (InternalType.Object, name))
+            | Some (MType.Fun (from, to)) =>
+              
+              match (from.AnyHint) {
+                | Some (MType.Tuple (args))
+                | Some (MType.Void) with args = []
+                | Some (x) with args = [x] =>
+                  def inst = InternalType.GetFunctionType (args.Length);
+                  Some (
+                    LookupOperatorIn (
+                      match (to.AnyHint) {
+                        | Some (MType.Void) =>
+                          MType.Class (inst.VoidTyCon, args)
+                        | Some => 
+                          MType.Class (inst.TyCon, (args + [to]))
+                        | None => 
+                          InternalType.Object
+                      }, 
+                      name
+                    )
+                  )
+                | _ => Some (LookupOperatorIn (InternalType.Object, name))
+              }
 
             | _ => None ()
           }
@@ -688,6 +711,7 @@
                   else
                   {
                     SetKind (Kind.OverloadedOperator (lst, t1, t2, name, env, seen));
+                    Resolve ();
                     true
                   }
                 | _ => false
@@ -716,9 +740,6 @@
            
                 when (o'.Length != overloads.Length || o'.Length == 1)
                   match (o') {
-                    | [] =>
-                      SetKind (Kind.Error ())
-                  
                     | [one] when hints == args
                               || hints > 0 && typer.BadnessAllowed > 0
                               || typer.BadnessAllowed > 1 =>
@@ -730,38 +751,21 @@
               }
            
           | Kind.Operator (t1, t2, name, env) =>
-            def operators =
-              match ((LookupOperator (t1, name), LookupOperator (t2, name))) {
-                | (Some (l1), Some (l2)) => Some (l1 + l2)
-                | (Some as s, None)
-                | (None, Some as s) => s
-                | (None, None) => None ()
-              }
             def operators = {
               def globals = env.LookupSymbol ([name], typer.current_type);
               mutable res = [];
               foreach (meth is IMethod in globals)
                 when (meth.IsStatic)
                   res = typer.ConstructMethodOverload (meth) + res;
-
-              match ((operators, res)) {
-                | (x, []) => x
-                | (Some (l1), l2) => Some (l1 + l2)
-                | (None, l) => Some (l)
-              }
+              when (LookupOperator (t1, name) is Some (lst))
+                res = lst + res;
+              when (LookupOperator (t2, name) is Some (lst))
+                res = lst + res;
+              res
             }
-            match (operators) {
-              | Some ([]) =>
-                ReportError (messenger, "cannot find the " + ToString ());
-                SetKind (Kind.Error ())
-                
-              | Some (lst) =>
-                SetKind (Kind.OverloadedOperator (lst, t1, t2, name, env, lst));
+            SetKind (Kind.OverloadedOperator (operators, t1, t2, name, env, operators));
                 Resolve ()
                 
-              | None => {}
-            }
-          
           | Kind.Resolved (expr) =>
             unless (typer.Expect (expected, expr.Type, "already resolved overload"))
               SetKind (Kind.Error ())



More information about the svn mailing list