[svn] r7670: nemerle/trunk/ncc: hierarchy/ClassMembers.n hierarchy/TypeBuilder.n hierarchy/TypesManager.n ...

nazgul svnadmin at nemerle.org
Sat May 12 11:11:15 CEST 2007


Log:
Nothing changes refactoring of Typer constructors

Author: nazgul
Date: Sat May 12 11:11:12 2007
New Revision: 7670

Modified:
   nemerle/trunk/ncc/hierarchy/ClassMembers.n
   nemerle/trunk/ncc/hierarchy/TypeBuilder.n
   nemerle/trunk/ncc/hierarchy/TypesManager.n
   nemerle/trunk/ncc/typing/Messenger.n
   nemerle/trunk/ncc/typing/Typer.n

Modified: nemerle/trunk/ncc/hierarchy/ClassMembers.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/ClassMembers.n	(original)
+++ nemerle/trunk/ncc/hierarchy/ClassMembers.n	Sat May 12 11:11:12 2007
@@ -873,7 +873,9 @@
   public RunBodyTyper () : void
   {
     match (fun_header.body) {
-      | FunBody.Parsed => _ = Manager.ComponentsFactory.CreateTyper (this)
+      | FunBody.Parsed => 
+        def typer =  Manager.ComponentsFactory.CreateTyper (this);
+        typer.RunFullTyping ();
       | _ => ()
     }
   }

Modified: nemerle/trunk/ncc/hierarchy/TypeBuilder.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/TypeBuilder.n	(original)
+++ nemerle/trunk/ncc/hierarchy/TypeBuilder.n	Sat May 12 11:11:12 2007
@@ -2328,7 +2328,7 @@
   }
 
   internal process_attributes (self_parm : list [Parsetree.SyntaxElement], target : MacroTargets, 
-                               stage : MacroPhase, mods : Modifiers, meth : IMethod) : void 
+                               stage : MacroPhase, mods : Modifiers, meth : MethodBuilder) : void 
   {
     mutable macro_attrs = mods.macro_attrs;
     // we have to do the assignment here, in case macro has added a new

Modified: nemerle/trunk/ncc/hierarchy/TypesManager.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/TypesManager.n	(original)
+++ nemerle/trunk/ncc/hierarchy/TypesManager.n	Sat May 12 11:11:12 2007
@@ -53,7 +53,7 @@
       public Expression : Parsetree.PExpr;
       InitialParms : list [Parsetree.SyntaxElement];
       TBuilder : TypeBuilder;
-      CurrentMethod : IMethod;
+      CurrentMethod : MethodBuilder;
       internal mutable AddedNr : int;
     
       /// we need the earlier expanded macros to get the highest values, as heap is returning max values first
@@ -86,14 +86,13 @@
           | Some ((name, imacro, exprs)) =>
             def parms = InitialParms + exprs;
 
-            def meth_header = if (CurrentMethod == null) null else CurrentMethod.GetHeader ();
-            def tenv = if (meth_header == null) TEnv else meth_header.tenv;
+            def tenv = if (CurrentMethod == null) TEnv else CurrentMethod.Header.tenv;
             def env = name.GetEnv (GEnv);
             
             try {
               GEnv.Manager.MacroColors.PushNewColor (name.color, env);
               def res = Util.locate (Expression.Location,
-                                     imacro.Run (GEnv.Manager.ComponentsFactory.CreateTyper (TBuilder, tenv, meth_header, env), parms));
+                                     imacro.Run (GEnv.Manager.ComponentsFactory.CreateTyper (TBuilder, tenv, CurrentMethod, env), parms));
               assert (res == null);
             } finally {
               GEnv.Manager.MacroColors.PopColor ();

Modified: nemerle/trunk/ncc/typing/Messenger.n
==============================================================================
--- nemerle/trunk/ncc/typing/Messenger.n	(original)
+++ nemerle/trunk/ncc/typing/Messenger.n	Sat May 12 11:11:12 2007
@@ -27,6 +27,7 @@
  */
 
 using Nemerle.Logging;
+using Nemerle.Utility;
 
 namespace Nemerle.Compiler 
 {
@@ -39,6 +40,7 @@
     mutable need_message : bool;
     mutable throw_on_error : bool;
     mutable previous : Messenger;
+    [Accessor (set (Internal))]
     mutable in_error_mode : bool;
     mutable saved_error : string;
     mutable local_error : int;
@@ -172,15 +174,6 @@
       }
     }
     
-
-    public InErrorMode : bool
-    {
-      get { in_error_mode }
-      set {
-        in_error_mode = value;
-      }
-    }
-    
     /** Check if we have encountered an error in the current state. */
     public SeenError : bool
     {

Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n	(original)
+++ nemerle/trunk/ncc/typing/Typer.n	Sat May 12 11:11:12 2007
@@ -106,48 +106,75 @@
     #region Toplevel typing
     class SwitchToYielding : System.Exception { }
     
-    // FIXME: copy doc from TypeMethod
-    /** Walk through method body typing it. */
+    /** Prepared for walking through method body typing it. */
     public this (m : MethodBuilder)
     {
-      base (m.DeclaringType.Manager);
-      current_method_builder = m;
-      solver = Manager.Solver;
-      current_type = m.DeclaringType;
-      parent_typer = None ();
+      this (m.DeclaringType.Manager, m.DeclaringType, m);
       env = current_type.GlobalEnv;
-      current_fun = m.GetHeader ();
       tenv = current_fun.tenv.CopyWithObsolete(TriggerObsoleteWarning);
-      messenger = solver.CurrentMessenger;
-      locals_stack = Stack ();
+      assert (!solver.InUse);
+    }
 
-      local_context = LocalContext.Empty;
+    /** Prepred as reduced version of typer, ready to be passed to macros */
+    public this (tb : TypeBuilder, tenv : TyVarEnv, mb : MethodBuilder, env : GlobalEnv)
+    {
+      this (env.Manager, tb, mb);
+      this.env = env;
+      this.tenv = tenv;
+      assert (solver.IsTopLevel);
+    }
 
-      assert (!solver.InUse);
+    /** Prepared for walking through a local function body typing it. */
+    public this (parent : Typer, fn : Fun_header)
+    {
+      this (parent.Manager);
+      parent_typer = Some (parent);
 
-      is_instance_ctor = m.MemberKind == MemberKinds.Constructor && !m.IsStatic;
-      is_method = m.MemberKind == MemberKinds.Method && !m.IsStatic || is_instance_ctor;
+      // copy from parent
+      current_method_builder = parent.current_method_builder;
+      current_type = parent.current_type;
+      local_context = parent.local_context;
+      is_method = parent.is_method;
+      is_instance_ctor = parent.is_instance_ctor;
+      env = parent.env;
+      inside_yielding_function = parent.inside_yielding_function;
+      messenger = parent.messenger;
+      
+      current_fun = fn;
+      tenv = current_fun.tenv;
+    }
+    
+    private this (mng : ManagerClass) {
+      base (mng);
+      locals_stack = Stack ();    
+      solver = mng.Solver;
+    }
+
+    private this (mng : ManagerClass, tb : TypeBuilder, mb : MethodBuilder) {
+      this (mng);
+      current_type = tb;
+      parent_typer = None ();
+      local_context = LocalContext.Empty;
+      messenger = solver.CurrentMessenger;
+      current_method_builder = mb;
+      when (mb != null) {
+        current_fun = mb.Header;
+        is_instance_ctor = mb.MemberKind == MemberKinds.Constructor && !mb.IsStatic;
+        is_method = mb.MemberKind == MemberKinds.Method && !mb.IsStatic || is_instance_ctor;
+      }
+    }
 
+    public RunFullTyping () : void {
       try {
         assert (!solver.InUse);
         assert (solver.IsTopLevel);
         solver.dt_store = Map ();
         solver.InUse = true;
 
-        Util.locate (m.Location, {
+        Util.locate (current_method_builder.Location, {
           mutable typer_done = false;
           assert (messenger.IsTopLevel);
 
-          def put_in_error_mode () {
-            solver.Unwind ();
-            messenger.Cleanup ();
-            assert (!messenger.InErrorMode);
-            assert (messenger.IsTopLevel);
-            messenger.InErrorMode = true;
-            local_context = LocalContext.Empty;
-            assert (!typer_done);
-          }
-
           try {
             try {
               messenger.Cleanup ();
@@ -164,28 +191,28 @@
               MaybeDumpTypedTree ("after delayed typings");
               
               when (errcnt == Message.ErrorCount) {
-                RunSecondPass (m);
+                RunSecondPass (current_method_builder);
                 MaybeDumpTypedTree ("after second pass");
               }
             } catch {
               | e is RestartInErrorMode =>
                 def errcnt = Message.ErrorCount;
-                put_in_error_mode ();
+                put_in_error_mode (typer_done);
                 RunTyper ();
 
                 when (errcnt == Message.ErrorCount)
-                  Util.ice ($"hidden errors compiling $m - $(Message.ErrorCount) vs $errcnt: $(e.StackTrace)");
+                  Util.ice ($"hidden errors compiling $current_method_builder - $(Message.ErrorCount) vs $errcnt: $(e.StackTrace)");
             }
           } catch {
             | _ is SwitchToYielding =>
               messenger.InErrorMode = false;
-              put_in_error_mode ();
+              put_in_error_mode (typer_done);
               log (TYPING, "got STY, trying again");
               current_fun.yield_type = GetYieldType ();
               def errcnt = Message.ErrorCount;
               // just in case
-              def newBody = Util.locate(m.Body.Location, WrapYieldingFunction (m.Body));
-              m.Body = newBody;
+              def newBody = Util.locate(current_method_builder.Body.Location, WrapYieldingFunction (current_method_builder.Body));
+              current_method_builder.Body = newBody;
               inside_yielding_function = true;
               when (Manager.IsIntelliSenseMode || errcnt == Message.ErrorCount) {
                 assert (solver.IsTopLevel);
@@ -195,7 +222,7 @@
               when (Manager.IsIntelliSenseMode || errcnt == Message.ErrorCount)
                 RunDelayedTypings ();
               when (errcnt == Message.ErrorCount) {
-                RunSecondPass (m);
+                RunSecondPass (current_method_builder);
                 MaybeDumpTypedTree ("after second pass [yield mode]");
               }
           }
@@ -206,50 +233,20 @@
       }
     }
     
-    internal TriggerObsoleteWarning : bool
-    {
-      get { (current_method_builder == null || !current_method_builder.IsObsolete) 
-          && !current_type.IsObsolete }
-    }
-
-    public this (tb : TypeBuilder, tenv : TyVarEnv, fn : Fun_header, env : GlobalEnv)
-    {
-      base (env.Manager);
-      solver = Manager.Solver;
-      current_type = tb;
-      parent_typer = None ();
-      this.env = env;
-      current_fun = fn;
-      this.tenv = tenv;
-      messenger = solver.CurrentMessenger;
-
-      locals_stack = Stack ();
+    put_in_error_mode (typer_done : bool) : void {
+      solver.Unwind ();
+      messenger.Cleanup ();
+      assert (!messenger.InErrorMode);
+      assert (messenger.IsTopLevel);
+      messenger.InErrorMode = true;
+      assert (!typer_done);
       local_context = LocalContext.Empty;
-      assert (solver.IsTopLevel);
     }
 
-    /** Walk through a local function body typing it. */
-    public this (parent : Typer, fn : Fun_header)
+    internal TriggerObsoleteWarning : bool
     {
-      base (parent.Manager);
-      parent_typer = Some (parent);
-
-      // copy from parent
-      solver = parent.solver;
-      current_method_builder = parent.current_method_builder;
-      current_type = parent.current_type;
-      local_context = parent.local_context;
-      is_method = parent.is_method;
-      is_instance_ctor = parent.is_instance_ctor;
-      env = parent.env;
-      inside_yielding_function = parent.inside_yielding_function;
-      messenger = parent.messenger;
-      locals_stack = Stack ();
-      
-      current_fun = fn;
-      tenv = current_fun.tenv;
-
-      RunTyper ();
+      get { (current_method_builder == null || !current_method_builder.IsObsolete) 
+          && !current_type.IsObsolete }
     }
 
     public GetLocals () : LocalContext
@@ -1880,7 +1877,8 @@
       headers = List.Rev (headers);
 
       foreach (hd in headers) {
-        _ = Manager.ComponentsFactory.CreateTyper (this, hd);
+        def typer = Manager.ComponentsFactory.CreateTyper (this, hd);
+        typer.RunTyper ();
       }
 
       TExpr.DefFunctionsIn (headers, null)



More information about the svn mailing list