[svn] r6847: nemerle/trunk/ncc/typing/Typer.n

VladD2 svnadmin at nemerle.org
Tue Nov 7 22:30:49 CET 2006


Log:
Implements completion of extension methods.

Author: VladD2
Date: Tue Nov  7 22:30:48 2006
New Revision: 6847

Modified:
   nemerle/trunk/ncc/typing/Typer.n

Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n	(original)
+++ nemerle/trunk/ncc/typing/Typer.n	Tue Nov  7 22:30:48 2006
@@ -1429,7 +1429,8 @@
           def name = name; // for debug
           def elems = SCG.List ();
 
-          def overloads = TypeNameFull(expression, FreshTyVar(), true);
+          // Try interpret as qualified name...
+          mutable overloads = TypeNameFull(expression, FreshTyVar(), true);
 
           when (overloads.Length > 0)
           {
@@ -1437,11 +1438,27 @@
             throw CompletionResult (elems, name.Id)
           }
 
+          // Try get extention methods...
+          def extMethods = Manager.LibrariesManager.GetExtensionMethods
+            (name.Id, name.GetEnv (env), true);
+
           def tobj = TypeExpr (obj);
+          def ty = tobj.MType;
+          def isExtendType(meth) { ty.TryProvide (meth.GetParameters ().Head.ty) }
+
+          when (ty != null)
+            foreach (method when isExtendType(method) in extMethods)
+              foreach (over in ConstructMethodOverload (method, null, true))
+              {
+                over.ExtensionMethodObject = tobj;
+                overloads ::= over;
+              }
+
+          // Try interpret as member access at general expression...
           def member_overloads = match (TypeMember (tobj, name, expected, for_completion = true))
           {
-            | Some (lst)
-            | None with lst = [] => lst
+            | Some (lst) => overloads.RevAppend(lst);
+            | None       => overloads
           };
 
           if (member_overloads.IsEmpty)
@@ -2456,15 +2473,11 @@
 
         lookup (possible_type);
  
-        foreach (meth in Manager.LibrariesManager.GetExtensionMethods (name.Id, name.GetEnv (env), false))//for_completion)) 
-        {
-          //when (possible_type != null && !possible_type.TryProvide (meth.GetParameters ().Head.ty))
-          //  Nemerle.Imperative.Continue ();
+        foreach (meth in Manager.LibrariesManager.GetExtensionMethods (name.Id, name.GetEnv (env), false))
           foreach (over in ConstructMethodOverload (meth, maybe_varargs = true)) {
             over.ExtensionMethodObject = obj;
             res ::= over;
           }
-        }
                
         when (res.IsEmpty) {
           print_errors = true;



More information about the svn mailing list