[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