[svn] r6566: nemerle/trunk/ncc: completion/CodeCompletionEngine.n parsing/Lexer.n parsing/MainParser.n typ...

VladD2 svnadmin at nemerle.org
Tue Aug 22 23:17:48 CEST 2006


Log:
1. Add completion whiteout prefix.
2. Add completion for match expression (for the time being for variants only).

Author: VladD2
Date: Tue Aug 22 23:17:38 2006
New Revision: 6566

Modified:
   nemerle/trunk/ncc/completion/CodeCompletionEngine.n
   nemerle/trunk/ncc/parsing/Lexer.n
   nemerle/trunk/ncc/parsing/MainParser.n
   nemerle/trunk/ncc/typing/Typer-PatternTyper.n
   nemerle/trunk/ncc/typing/Typer.n

Modified: nemerle/trunk/ncc/completion/CodeCompletionEngine.n
==============================================================================
--- nemerle/trunk/ncc/completion/CodeCompletionEngine.n	(original)
+++ nemerle/trunk/ncc/completion/CodeCompletionEngine.n	Tue Aug 22 23:17:38 2006
@@ -57,7 +57,8 @@
       [NotNull] elems : SCG.List[Elem],
       [NotNull] nss : list [NamespaceTree.Node],
       obj : PExpr, // nullable
-      [NotNull] name : Parsetree.Name) : void
+      [NotNull] name : Parsetree.Name,
+      noMacros : bool) : void
     {
       def prefix = name.Id;
       def isAll = string.IsNullOrEmpty(prefix); // don't use prefix
@@ -74,6 +75,7 @@
             {
               | No => ()
               | MacroCall(macr) => 
+                when (!noMacros)
                 elems.Add(Elem.Node (
                   if (macr.Keywords.IsEmpty) node.PartName else macr.Keywords.Head,
                   node));

Modified: nemerle/trunk/ncc/parsing/Lexer.n
==============================================================================
--- nemerle/trunk/ncc/parsing/Lexer.n	(original)
+++ nemerle/trunk/ncc/parsing/Lexer.n	Tue Aug 22 23:17:38 2006
@@ -951,7 +951,9 @@
         
       | '@' =>
         def next = read ();
-        if (IsOperatorChar (next))
+        if (next == '#') // Completion token.
+          Token.IdentifierToComplete ("")
+        else if (IsOperatorChar (next))
           match (get_op (next)) {
             | Token.Operator (s) => Token.Identifier (s)
             | _ => Util.ice ()
@@ -1667,7 +1669,9 @@
             CompletionMarkAt = -1;
             pendingToken = Token.IdentifierToComplete ("");
             tok
-          | _ => tok
+          | _ =>
+            CompletionMarkAt = -1;
+            Token.IdentifierToComplete (tok.ToString())
         }
       else
         tok;

Modified: nemerle/trunk/ncc/parsing/MainParser.n
==============================================================================
--- nemerle/trunk/ncc/parsing/MainParser.n	(original)
+++ nemerle/trunk/ncc/parsing/MainParser.n	Tue Aug 22 23:17:38 2006
@@ -1755,12 +1755,24 @@
     }
 
     parse_match_case () : MatchCase {
-      def loop2 (acc) {
+      def loop2 (acc)
+      {
+        def ReportError (x, res)
+        {
+          Error (x, "'=>' or '|' expected (or incorrect pattern format)");
+          List.Rev (res :: acc)
+        }
         def res = parse_expr (TokenStoppers.Pipe | TokenStoppers.Arrow);
         match (get_token ()) {
           | Token.Operator ("=>") => List.Rev (res :: acc)
           | Token.Operator ("|") => loop2 (res :: acc)
-          | x => Error (x, "found junk after pattern"); List.Rev (res :: acc)
+          | Token.EndOfGroup as x =>
+            match (res) {
+              | PExpr.ToComplete (_)
+              | PExpr.Member (_, Splicable.HalfId (_)) => List.Rev (res :: acc)
+              | _ => ReportError (x, res)
+            }
+          | x => ReportError (x, res)
         }
       };
       def case_group = (stream :> Token.LooseGroup);
@@ -2116,7 +2128,7 @@
                           | PExpr.Member (obj, Splicable.HalfId (name)) =>
                             def elems = SCG.List ();
                             def nss = Manager.CoreEnv.NameTree.NamespaceTree :: name.GetEnv(env).OpenNamespaces;
-                            Completion.AddTypesAndNamespaces (elems, nss, obj, name);
+                            Completion.AddTypesAndNamespaces (elems, nss, obj, name, true);
                             throw CompletionResult (elems, name.Id);
 
                           | _ => ()

Modified: nemerle/trunk/ncc/typing/Typer-PatternTyper.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer-PatternTyper.n	(original)
+++ nemerle/trunk/ncc/typing/Typer-PatternTyper.n	Tue Aug 22 23:17:38 2006
@@ -33,6 +33,7 @@
 using Nemerle.Compiler.Typedtree;
 using Nemerle.Compiler.SolverMacros;
 
+using SCG = System.Collections.Generic;
 using PT = Nemerle.Compiler.Parsetree;
 
 namespace Nemerle.Compiler
@@ -557,6 +558,37 @@
       DoTypePattern (matched_value_type : TyVar, pattern : PT.PExpr) : Pattern
       {
         match (pattern) {
+          | PT.PExpr.ToComplete (name) with obj = null
+          | PT.PExpr.Member (obj, Parsetree.Splicable.HalfId (name)) =>
+            def elems = SCG.List ();
+            match (matched_value_type.Hint)
+            {
+              | Some(ty) =>
+                def prefix = name.Id;
+                def option = System.StringComparison.InvariantCultureIgnoreCase;
+                match (ty)
+                {
+                  | MType.Class (ti, _args) =>
+                    match (ti.GetTydecl ())
+                    {
+                      | TypeDeclaration.Variant (members) =>
+                        foreach (m when m.Name.StartsWith (prefix, option) in members)
+                          elems.Add (Elem.Node (m.Name, m.NamespaceNode));
+
+                    //| TypeDeclaration.VariantOption =>
+                      | _ => System.Console.WriteLine(ty);
+                    }
+                  | _ => System.Console.WriteLine(ty);
+                }
+
+              | None =>
+                def nss = Manager.CoreEnv.NameTree.NamespaceTree 
+                  :: name.GetEnv(Manager.CoreEnv).OpenNamespaces;
+                Completion.AddTypesAndNamespaces (elems, nss, obj, name, true);
+            }
+                
+            throw CompletionResult (elems, name.Id);
+
           | PT.PExpr.ListLiteral (l) =>
             TypePattern (matched_value_type, Macros.Lift (l))
 
@@ -756,7 +788,6 @@
                          ".. arguments list may appear only within <[ ... ]> quotation");
             Pattern.Error ()
             
-            
           | _ =>
             ReportError (messenger, "invalid pattern");
             Pattern.Error ()

Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n	(original)
+++ nemerle/trunk/ncc/typing/Typer.n	Tue Aug 22 23:17:38 2006
@@ -1418,7 +1418,7 @@
           if (member_overloads.IsEmpty)
           {
             def nss = Manager.CoreEnv.NameTree.NamespaceTree :: name.GetEnv(env).OpenNamespaces;
-            Completion.AddTypesAndNamespaces (elems, nss, obj, name);
+            Completion.AddTypesAndNamespaces (elems, nss, obj, name, false);
           }
           else
             elems.Add(Elem.Overloads (member_overloads));
@@ -1443,7 +1443,7 @@
           // add namespaces and types
 
           def nss = Manager.CoreEnv.NameTree.NamespaceTree :: name.GetEnv(env).OpenNamespaces;
-          Completion.AddTypesAndNamespaces (elems, nss, null, name);
+          Completion.AddTypesAndNamespaces (elems, nss, null, name, false);
             
           throw CompletionResult (elems, prefix)
  



More information about the svn mailing list