[svn] r7080: nemerle/trunk/ncc: parsing/MainParser.n passes.n typing/TyVarEnv.n typing/Typer-PatternTyper....

VladD2 svnadmin at nemerle.org
Tue Dec 12 12:15:58 CET 2006


Log:
Move completion code outside the compiler (into http://nemerle.org/svn/vs-plugin/trunk/Nemerle.Compiler.Utils).

Author: VladD2
Date: Tue Dec 12 12:15:55 2006
New Revision: 7080

Modified:
   nemerle/trunk/ncc/parsing/MainParser.n
   nemerle/trunk/ncc/passes.n
   nemerle/trunk/ncc/typing/TyVarEnv.n
   nemerle/trunk/ncc/typing/Typer-PatternTyper.n
   nemerle/trunk/ncc/typing/Typer.n

Modified: nemerle/trunk/ncc/parsing/MainParser.n
==============================================================================
--- nemerle/trunk/ncc/parsing/MainParser.n	(original)
+++ nemerle/trunk/ncc/parsing/MainParser.n	Tue Dec 12 12:15:55 2006
@@ -2215,17 +2215,7 @@
                         ty = ({ shift (); def e = parse_expr (stop | TokenStoppers.Equal);
                                expect_operator ("="); e }) 
                       | Token.Operator ("=") with ty = null =>
-                        match (ty) // Type completion in type enforcement
-                        {
-                          | PExpr.ToComplete (name) with obj = null
-                          | 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, true);
-                            throw CompletionResult (elems, name.Id);
-
-                          | _ => ()
-                        }
+                        Manager.CompleteTypeRef (ty, null, env); // Type completion in type enforcement
 
                         def expr =
                           if (ty == null) {

Modified: nemerle/trunk/ncc/passes.n
==============================================================================
--- nemerle/trunk/ncc/passes.n	(original)
+++ nemerle/trunk/ncc/passes.n	Tue Dec 12 12:15:55 2006
@@ -474,5 +474,53 @@
       _ = method;
       throw System.NotImplementedException ();
     }
+
+    /// Process completion.
+    protected internal virtual Complete (expression : PExpr, expected : TyVar, typer : Typer, env : GlobalEnv) : void
+    {
+      ignore (expression); ignore (expected); ignore (typer); ignore (env);
+      throw System.NotImplementedException ();
+    }
+
+    /// Process completion in patterns.
+    protected internal virtual CompletePattern (
+      expression         : PExpr,
+      matched_value_type : TyVar,
+      patternTyper       : Typer.PatternTyper,
+      env                : GlobalEnv
+    )
+      : void
+    {
+      ignore (expression); ignore (matched_value_type); ignore (patternTyper); ignore (env);
+      throw System.NotImplementedException ();
+    }
+
+    /// Process completion in type reference.
+    protected internal virtual CompleteTypeRef (
+      expression     : PExpr,
+      curTypeBuilder : TypeBuilder,
+      env            : GlobalEnv
+    )
+      : void
+    {
+      ignore (curTypeBuilder); ignore (env);
+
+      match (expression)
+      {
+        | PExpr.ToComplete (name) with obj = null
+        | PExpr.Member (obj, Parsetree.Splicable.HalfId (name)) =>
+          def obj = obj;
+          def name = name;
+          def elems = SCG.List ();
+
+          def nss = this.CoreEnv.NameTree.NamespaceTree 
+            :: name.GetEnv(this.CoreEnv).OpenNamespaces;
+          Completion.AddTypesAndNamespaces (elems, nss, obj, name, true);
+
+          throw CompletionResult (elems, name.Id);
+
+        | _ => ()
+      }
+    }
   }
 }

Modified: nemerle/trunk/ncc/typing/TyVarEnv.n
==============================================================================
--- nemerle/trunk/ncc/typing/TyVarEnv.n	(original)
+++ nemerle/trunk/ncc/typing/TyVarEnv.n	Tue Dec 12 12:15:55 2006
@@ -253,17 +253,10 @@
         f2 (t, false)
       } and f2 (t, allow_ref) {
         match (t) {
-          | PExpr.ToComplete (name) with obj = null
-          | PExpr.Member (obj, Parsetree.Splicable.HalfId (name)) =>
-            def obj = obj;
-            def name = name;
-            def elems = SCG.List ();
-
-            def nss = Manager.CoreEnv.NameTree.NamespaceTree 
-              :: name.GetEnv(Manager.CoreEnv).OpenNamespaces;
-            Completion.AddTypesAndNamespaces (elems, nss, obj, name, true);
-
-            throw CompletionResult (elems, name.Id);
+          | PExpr.ToComplete (_)
+          | PExpr.Member (_, Parsetree.Splicable.HalfId (_)) =>
+            Manager.CompleteTypeRef (t, curtc, env);
+            throw System.NotImplementedException ();
 
           | <[ ref $t ]> when allow_ref =>
             MType.Ref (f (t))

Modified: nemerle/trunk/ncc/typing/Typer-PatternTyper.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer-PatternTyper.n	(original)
+++ nemerle/trunk/ncc/typing/Typer-PatternTyper.n	Tue Dec 12 12:15:55 2006
@@ -152,7 +152,7 @@
   public partial class Typer
   {
     [ManagerAccess (typer.Manager)]
-    class PatternTyper
+    public class PatternTyper
     {
       typer : Typer;
       matched_value_type : TyVar;
@@ -558,56 +558,17 @@
       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));
-
-                        throw CompletionResult (elems, name.Id);
-
-                    //| TypeDeclaration.VariantOption =>
-                      | _ => System.Console.WriteLine(ty);
-                    }
-                  | _ => System.Console.WriteLine(ty);
-                }
-
-              | None => System.Console.WriteLine(matched_value_type);
-            }
-
-            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.TypeEnforcement (nested, PT.PExpr.ToComplete (name)) with obj = null
-          | PT.PExpr.TypeEnforcement (nested, PT.PExpr.Member (obj, Parsetree.Splicable.HalfId (name)))
-          | PT.PExpr.Is (nested, PT.PExpr.ToComplete (name)) with obj = null
-          | PT.PExpr.Is (nested, PT.PExpr.Member (obj, Parsetree.Splicable.HalfId (name))) =>
-            def obj = obj;
-            def name = name;
-            def nested = nested;
-            ignore(obj); ignore(nested);
-
-            def elems = SCG.List ();
-
-            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.ToComplete (_)
+          | PT.PExpr.Member (_, Parsetree.Splicable.HalfId (_)) =>
+            Manager.CompletePattern (pattern, matched_value_type, this, typer.env);
+            throw System.NotImplementedException ();
+
+          | PT.PExpr.TypeEnforcement (_, PT.PExpr.ToComplete (_))
+          | PT.PExpr.TypeEnforcement (_, PT.PExpr.Member (_, Parsetree.Splicable.HalfId (_)))
+          | PT.PExpr.Is (_, PT.PExpr.ToComplete (_))
+          | PT.PExpr.Is (_, PT.PExpr.Member (_, Parsetree.Splicable.HalfId (_))) =>
+            Manager.CompletePattern (pattern, matched_value_type, this, typer.env);
+            throw System.NotImplementedException ();
 
           | PT.PExpr.ListLiteral (l) =>
             TypePattern (matched_value_type, Macros.Lift (l))

Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n	(original)
+++ nemerle/trunk/ncc/typing/Typer.n	Tue Dec 12 12:15:55 2006
@@ -77,7 +77,6 @@
   /** A class responsible for typing a single (global or local) function.  */
   public partial class Typer : TyperBase
   {
-    static CmpOptins = System.StringComparison.InvariantCultureIgnoreCase;
     is_instance_ctor : bool;
     is_method : bool;
     env : GlobalEnv;
@@ -1148,7 +1147,13 @@
    
     DoType (expression : PT.PExpr, expected : TyVar, is_toplevel_in_seq : bool) : TExpr
     {
-      match (expression) {
+      assert(true);
+      match (expression)
+      {
+        | PT.PExpr.Member (_, PT.Splicable.HalfId (_)) | PT.PExpr.ToComplete (_) =>
+          Manager.Complete (expression, expected, this, env);
+          throw System.NotImplementedException ();
+ 
         | PT.PExpr.ParmByRef
         | PT.PExpr.ParmOut =>
           ReportFatal (messenger, 
@@ -1457,85 +1462,6 @@
           else
             TypeMemberExpr (TypeExpr (obj), name, expected)
             
-
-        | PT.PExpr.Member (obj, PT.Splicable.HalfId (name)) =>
-          def obj = obj; // for debug
-          def name = name; // for debug
-          def elems = SCG.List ();
-          def tobj = TypeExpr (obj);
-
-          def AddOverloads(overloads)
-          {
-            unless (overloads.IsEmpty)
-              elems.Add(Elem.Overloads (overloads));
-          }
-
-          def tryInterpretAsGlobals()
-          {
-            def nss = Manager.CoreEnv.NameTree.NamespaceTree :: name.GetEnv(env).OpenNamespaces;
-            Completion.AddTypesAndNamespaces (elems, nss, obj, name, false);
-          }
-
-          def tryInterpretAsQualifiedName() : void
-          {
-            // Try interpret as qualified name...
-            AddOverloads(TypeNameFull(expression, FreshTyVar(), true));
-          }
-
-          def tryInterpretAsExtentionMethods() : void
-          {
-            // Try get extention methods...
-            def extMethods = Manager.LibrariesManager.GetExtensionMethods (name.Id, name.GetEnv (env), true);
-            def ty = tobj.MType;
-
-            when (ty != null)
-              foreach (method when Manager.IsExtensionMethod(method, ty) in extMethods)
-                foreach (over in ConstructMethodOverload (method, null, true))
-                {
-                  over.ExtensionMethodObject = tobj;
-                  elems.Add(Elem.Overload (over));
-                }
-          }
-
-          def tryInterpretAsMemberAccessAtGeneralExpression() : void
-          {
-            // Try interpret as member access at general expression...
-            match (TypeMember (tobj, name, expected, for_completion = true))
-            {
-              | Some (lst) => AddOverloads(lst);
-              | None       => ()
-            }
-          }
-
-          tryInterpretAsGlobals();
-          tryInterpretAsQualifiedName();
-          tryInterpretAsExtentionMethods();
-          tryInterpretAsMemberAccessAtGeneralExpression();
-
-          def compl_exc = CompletionResult (elems, name.Id);
-          compl_exc.ObjectType = tobj.Type.Fix();
-          throw compl_exc
-
-        | PT.PExpr.ToComplete (name) =>
-          def prefix = name.Id;
-          //def builder = CurrentMethodBuilder;
-          def overloads = TypeNameFull (expression, expected, for_completion = true);
-
-          def elems = SCG.List ();
-          elems.Add(Elem.Overloads (overloads));
-          
-          // find locals
-          foreach ((name, local) when name.Id.StartsWith (prefix, CmpOptins) in local_context.GetLocals ())
-            elems.Add(Elem.Local (local));
-
-          // add namespaces and types
-
-          def nss = Manager.CoreEnv.NameTree.NamespaceTree :: name.GetEnv(env).OpenNamespaces;
-          Completion.AddTypesAndNamespaces (elems, nss, null, name, false);
-            
-          throw CompletionResult (elems, prefix)
- 
-          
         | PT.PExpr.Member (_, _) =>
           ReportFatal (messenger,
                        "$ operator outside quotation <[ ... ]> context")
@@ -2310,7 +2236,7 @@
     }
 
     
-    ConstructMethodOverload (m : IMethod, pt_from : PT.PExpr = null, 
+    public ConstructMethodOverload (m : IMethod, pt_from : PT.PExpr = null, 
                              maybe_varargs = false) : list [OverloadPossibility]
     {
       def bounds = m.GetHeader ().typarms.Map (fun (tv) { tv.LowerBound });
@@ -2462,7 +2388,7 @@
     }
 
                     
-    TypeMember (obj : TExpr, name : PT.Name, expected : TyVar, for_completion = false) 
+    public TypeMember (obj : TExpr, name : PT.Name, expected : TyVar, for_completion = false) 
                     : option [list [OverloadPossibility]]
     {
       def mem_name = name.Id;
@@ -2661,7 +2587,7 @@
     }
 
 
-    TypeNameFull (expr : PT.PExpr, expected : TyVar, for_completion = false) : list [OverloadPossibility]
+    public TypeNameFull (expr : PT.PExpr, expected : TyVar, for_completion = false) : list [OverloadPossibility]
     {
       mutable mem_name = null;
       
@@ -3346,7 +3272,7 @@
               PopLocals ();
             }
           } else if (ns.Equals (Manager.Typer_yield_macro)) {
-            when (! inside_yielding_function) {
+            when (!inside_yielding_function && !Manager.IsInCompletionMode) {
               _ = GetYieldType ();
               log (TYPING, "throwing STY");
               throw SwitchToYielding ();



More information about the svn mailing list