[svn] r6554: nemerle/trunk: lib/hashtable.n
ncc/hierarchy/NamespaceTree.n ncc/hierarchy/TypeInfo.n ncc/typ...
VladD2
svnadmin at nemerle.org
Sat Aug 19 03:35:23 CEST 2006
Log:
Add completion of namespaces.
Author: VladD2
Date: Sat Aug 19 03:35:15 2006
New Revision: 6554
Modified:
nemerle/trunk/lib/hashtable.n
nemerle/trunk/ncc/hierarchy/NamespaceTree.n
nemerle/trunk/ncc/hierarchy/TypeInfo.n
nemerle/trunk/ncc/typing/Typer.n
Modified: nemerle/trunk/lib/hashtable.n
==============================================================================
--- nemerle/trunk/lib/hashtable.n (original)
+++ nemerle/trunk/lib/hashtable.n Sat Aug 19 03:35:15 2006
@@ -149,7 +149,7 @@
* Returns value associated with the specified key or result of call getDefaultValue().
* The getDefaultValue() called only if key not exists in collection.
*/
- public GetValueOrDefault (key : 'a, getDefaultValue : void -> 'b) : 'b
+ public GetValueOrGetDefault (key : 'a, getDefaultValue : void -> 'b) : 'b
{
mutable value;
Modified: nemerle/trunk/ncc/hierarchy/NamespaceTree.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/NamespaceTree.n (original)
+++ nemerle/trunk/ncc/hierarchy/NamespaceTree.n Sat Aug 19 03:35:15 2006
@@ -235,6 +235,45 @@
loop (n, this)
}
+ /// Return Node corresponding with name or null.
+ public PassTo (name : list [string]) : Node
+ {
+ if (Children == null)
+ null
+ else match (name)
+ {
+ | part :: tail =>
+ match (Children.GetValueOrDefault(part, null))
+ {
+ | null => null
+ | sub_node => sub_node.PassTo(tail)
+ }
+
+ | [] => this
+ }
+ }
+
+ /// Return Node corresponding with name or null.
+ public static PassTo (
+ nss : list [Node],
+ name : list [string]
+ ) : Node
+ {
+ match (nss)
+ {
+ | ns :: tail =>
+ if (ns.Children == null)
+ PassTo (tail, name)
+ else match (ns.PassTo (name))
+ {
+ | null => PassTo (tail, name)
+ | result => result
+ }
+
+ | [] => null
+ }
+ }
+
internal LoadValue (val : TypeInfoCache.NotLoadedList) : list [TypeInfo]
{
def by_parms_amount = Hashtable ();
Modified: nemerle/trunk/ncc/hierarchy/TypeInfo.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/TypeInfo.n (original)
+++ nemerle/trunk/ncc/hierarchy/TypeInfo.n Sat Aug 19 03:35:15 2006
@@ -599,7 +599,8 @@
InitBuiltinMembers ();
if (for_completion)
- GetMembers ().Filter (fun (mem) { mem.Name.StartsWith (name) })
+ GetMembers ().Filter (fun (mem) { mem.Name.StartsWith (name,
+ System.StringComparison.InvariantCultureIgnoreCase) })
else if (special_members.Contains (name))
special_members [name]
else {
Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n (original)
+++ nemerle/trunk/ncc/typing/Typer.n Sat Aug 19 03:35:15 2006
@@ -67,6 +67,7 @@
[ManagerAccess]
public partial class Typer
{
+ static CmpOptins = System.StringComparison.InvariantCultureIgnoreCase;
is_instance_ctor : bool;
is_method : bool;
env : GlobalEnv;
@@ -1403,32 +1404,39 @@
| PT.PExpr.Member (obj, PT.Splicable.HalfId (name)) =>
- def obj = obj;
- def name = name;
- def skip_name =
- ! CanBeTypeName (obj) ||
- try {
- solver.PushState ();
- TypeNameFull (expression, expected, for_completion = true).IsEmpty
- } finally {
- solver.PopState ()
- }
-
- def name_overloads =
- if (skip_name) []
- else
- TypeNameFull (expression, expected, for_completion = true);
-
+ def obj = obj; // for debug
+ def name = name; // for debug
+ def prefix = name.Id;
+ def isAll = string.IsNullOrEmpty(prefix);
def tobj = TypeExpr (obj);
- def member_overloads =
- match (TypeMember (tobj, name, expected,
- for_completion = true)) {
+ def member_overloads = match (TypeMember (tobj, name, expected, for_completion = true))
+ {
| Some (lst)
| None with lst = [] => lst
- }
+ };
def elems = SCG.List ();
- elems.Add(Elem.Overloads (member_overloads + name_overloads));
+
+ if (member_overloads.IsEmpty)
+ {
+ def nss = Manager.CoreEnv.NameTree.NamespaceTree :: name.GetEnv(env).OpenNamespaces;
+ match (Util.QidOfExpr (obj))
+ {
+ | Some ((idl, _)) =>
+ match (NamespaceTree.Node.PassTo (nss, idl))
+ {
+ | null => ()
+ | subNode =>
+ when (subNode.Children != null)
+ foreach (elem when isAll || elem.Key.StartsWith(prefix, CmpOptins) in subNode.Children)
+ elems.Add(Elem.Node (elem.Key, elem.Value));
+ }
+ | None => ()
+ }
+ }
+ else
+ elems.Add(Elem.Overloads (member_overloads));
+
def compl_exc = CompletionResult (elems, name.Id);
compl_exc.ObjectType = tobj.Type.Fix();
@@ -1443,29 +1451,28 @@
elems.Add(Elem.Overloads (overloads));
// find locals
- def optins = System.StringComparison.InvariantCultureIgnoreCase;
- foreach ((name, local) when name.Id.StartsWith (prefix, optins) in local_context.GetLocals ())
+ foreach ((name, local) when name.Id.StartsWith (prefix, CmpOptins) in local_context.GetLocals ())
elems.Add(Elem.Local (local));
// find namespaces and types
def find_namespaces (ns)
{
- foreach ((name, node) when name.StartsWith (prefix, optins) in ns.Children.KeyValuePairs)
+ foreach ((name, node) when name.StartsWith (prefix, CmpOptins) in ns.Children.KeyValuePairs)
match (node.Value)
{
| No => ()
| MacroCall(macr) =>
elems.Add(Elem.Node (
- if (macr.Keywords.IsEmpty) node.GetDisplayName () else macr.Keywords.Head,
+ if (macr.Keywords.IsEmpty) node.PartName else macr.Keywords.Head,
node));
| _ => elems.Add(Elem.Node (name, node));
}
}
- find_namespaces (Manager.CoreEnv.CurrentNamespace);
- foreach (ns when ns.Children != null in name.context.OpenNamespaces)
+ def nss = Manager.CoreEnv.NameTree.NamespaceTree :: name.GetEnv(env).OpenNamespaces;
+ foreach (ns when ns.Children != null in nss)
find_namespaces (ns);
throw CompletionResult (elems, prefix)
More information about the svn
mailing list