[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