[svn] r6812: nemerle/trunk/ncc: hierarchy/ClassMembers.n parsing/MainParser.n parsing/ParseTree.n passes.n

VladD2 svnadmin at nemerle.org
Mon Oct 30 09:52:51 CET 2006


Log:
Add caching of method body contents (accessible only in completion mode).
BodyTokens property cache a tokens.
BodyParsed property cache a PExpr.
BodyParsed property cache a TExpr.
ResetBody method reset cache.

Author: VladD2
Date: Mon Oct 30 09:52:47 2006
New Revision: 6812

Modified:
   nemerle/trunk/ncc/hierarchy/ClassMembers.n
   nemerle/trunk/ncc/parsing/MainParser.n
   nemerle/trunk/ncc/parsing/ParseTree.n
   nemerle/trunk/ncc/passes.n

Modified: nemerle/trunk/ncc/hierarchy/ClassMembers.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/ClassMembers.n	(original)
+++ nemerle/trunk/ncc/hierarchy/ClassMembers.n	Mon Oct 30 09:52:47 2006
@@ -714,14 +714,6 @@
     method_builder
   }
 
-  public RunBodyTyper () : void
-  {
-    match (fun_header.body) {
-      | FunBody.Parsed => _ = Typer (this)
-      | _ => ()
-    }
-  }
-  
   public override HasBeenUsed : bool
   {
     get { m_has_been_used }
@@ -737,6 +729,84 @@
     get { (fun_header.body is FunBody.Abstract) }
   }
   
+  public RunBodyTyper () : void
+  {
+    match (fun_header.body) {
+      | FunBody.Parsed => _ = Typer (this)
+      | _ => ()
+    }
+  }
+  
+  //***********************************************************************
+  // This members available only under completion engine.
+
+  public ResetBody () : void
+  {
+    _bodyTokens     = null;
+    _bodyParsed     = null;
+    _bodyTyped      = null;
+    fun_header.body = null;
+  }
+
+  mutable _bodyTokens : Token.BracesGroup;
+
+  /// The method body tokens. 
+  /// Note: For call this method you must implement method 
+  /// PreParseMethodBody in a subtype.
+  public BodyTokens : Token.BracesGroup
+  {
+    get
+    {
+      System.Diagnostics.Trace.Assert(Manager.IsInCompletionMode);
+      when (_bodyTokens == null)
+        _bodyTokens = Manager.PreParseMethodBody (this);
+
+      _bodyTokens
+    }
+
+    set { ResetBody(); _bodyTokens = value; }
+  }
+
+  mutable _bodyParsed : PT.PExpr;
+
+  /// The method body parsed expressions. 
+  public BodyParsed : PT.PExpr
+  {
+    get
+    {
+      System.Diagnostics.Trace.Assert(Manager.IsInCompletionMode);
+      when (_bodyParsed == null)
+      {
+        _bodyParsed = MainParser.ParseFunctionBody (Env, Ast.header, BodyTokens);
+        fun_header.body = FunBody.Parsed (_bodyParsed);
+      }
+
+      _bodyParsed
+    }
+  }
+
+  mutable _bodyTyped : TExpr;
+
+  /// The method body parsed expressions. 
+  public BodyTyped : TExpr
+  {
+    get
+    {
+      System.Diagnostics.Trace.Assert(Manager.IsInCompletionMode);
+      when (_bodyTyped == null)
+      {
+        _ = BodyParsed; // Use side affect
+        RunBodyTyper();
+        _bodyTyped = (fun_header.body :> FunBody.Typed).expr;
+      }
+
+      _bodyTyped
+    }
+  }
+
+  // End: This members available only under completion engine.
+  //***********************************************************************
+
   public Body : PT.PExpr {
     get {
       match (fun_header.body) {
@@ -770,6 +840,8 @@
 
     def f = functionAst;
 
+    _bodyTokens = f.Tokens;
+
     when (LexerBase.IsOperator (name))
       unless (IsStatic && IsPublic)
         Message.Error ($"User defined operator '$(DeclaringType).$(name)'"

Modified: nemerle/trunk/ncc/parsing/MainParser.n
==============================================================================
--- nemerle/trunk/ncc/parsing/MainParser.n	(original)
+++ nemerle/trunk/ncc/parsing/MainParser.n	Mon Oct 30 09:52:47 2006
@@ -159,6 +159,15 @@
     {
       def preparser = PreParser (lexer, env);
       def tokens = preparser.PreParse ();
+      ParseFunctionBody (env, funHeader, tokens);
+    }
+    
+    public static ParseFunctionBody (
+      [NotNull] env       : GlobalEnv,
+      [NotNull] funHeader : Fun_header,
+      [NotNull] tokens    : Token.BracesGroup
+    ) : PExpr
+    {
       def parser = MainParser (env);
       
       def tokens2 = match (tokens)
@@ -167,7 +176,7 @@
           | _ => tokens
         };
 
-      parser.parse_block (tokens2, funHeader.parms);
+      parser.ParseBlock (tokens2, funHeader.parms);
     }
     
     /** Parse well formed source code of toplevel program, using the given instance
@@ -786,6 +795,7 @@
       parse_top_extensions (modifiers, MacroTargets.Method);
       
       mutable loc = h.loc;
+      mutable bodyTokens = null;
       
       def body =
         match (peek_token ()) {
@@ -796,14 +806,18 @@
             // we skip body parsing in completion mode,
             // to save time and ignore errors
             if (Manager.IsInCompletionMode)
+            {
+              bodyTokens = brac;
               FunBody.Parsed (PExpr.Sequence (brac.Location, []))
+            }
             else
-              FunBody.Parsed (parse_block (brac, h.parms))
+              FunBody.Parsed (ParseBlock (brac, h.parms))
 
           | Token.EndOfGroup as tok =>
             loc += tok.Location;
             FunBody.Abstract ()
           | Token.Operator ("$") =>
+            System.Diagnostics.Trace.Assert(!Manager.IsInCompletionMode);
             def expr = parse_spliced_expr ();
             loc += expr.Location;
             def result = FunBody.Parsed (expr);
@@ -816,6 +830,8 @@
       def member = ClassMember.Function (header = h, name = h.name,  modifiers = modifiers,
                                          loc = loc, body = body, kind = FunKind.Method (impl));
       member.Env = env;
+      when (Manager.IsInCompletionMode)
+        member.Tokens = bodyTokens;
       member
     }
 
@@ -1449,7 +1465,7 @@
       };
     }
        
-    parse_block (tok : Token.BracesGroup, parms : list [Fun_parm]) : PExpr
+    public ParseBlock (tok : Token.BracesGroup, parms : list [Fun_parm]) : PExpr
     {
       def loc = tok.Location;
       mutable res =
@@ -1507,7 +1523,7 @@
         | Token.Operator ("$") =>
           push_back (); parse_spliced_expr ()
 
-        | Token.BracesGroup as brac => parse_block (brac, parms)
+        | Token.BracesGroup as brac => ParseBlock (brac, parms)
         | x => fatal_error (x, "expected `{' at the beginning of function body"); 
       }
     }
@@ -1919,7 +1935,7 @@
             PExpr.ListLiteral (loc, parse_expr_sequence (groups));
 
           | Token.BracesGroup as brac when !(stop %&& TokenStoppers.Braces) =>
-            parse_block (brac, [])
+            ParseBlock (brac, [])
 
           | Token.QuoteGroup (group) =>
             push_stream (group);

Modified: nemerle/trunk/ncc/parsing/ParseTree.n
==============================================================================
--- nemerle/trunk/ncc/parsing/ParseTree.n	(original)
+++ nemerle/trunk/ncc/parsing/ParseTree.n	Mon Oct 30 09:52:47 2006
@@ -72,7 +72,7 @@
     public this () { base (Splicable.Name (Name ("")), Modifiers.Empty) }
   }
 
-  [Record (Exclude = [Env])]
+  [Record (Exclude = [Env, Tokens])]
   public variant ClassMember : DeclarationBase
   {
     | TypeDeclaration { td : TopDeclaration; }
@@ -98,6 +98,7 @@
     | EnumOption { value : option [PExpr]; }
 
     internal mutable Env : GlobalEnv;
+    internal mutable Tokens : Token.BracesGroup;
     
     /** accessible only for ClassMember.Function, when its FunBody is not typed or compiled */
     public Body : PExpr {

Modified: nemerle/trunk/ncc/passes.n
==============================================================================
--- nemerle/trunk/ncc/passes.n	(original)
+++ nemerle/trunk/ncc/passes.n	Mon Oct 30 09:52:47 2006
@@ -449,5 +449,11 @@
         | None => Util.ice ("internal type " + type_name + " not found")
       }
     }
+
+    protected internal virtual PreParseMethodBody (_method : MethodBuilder)
+      : Token.BracesGroup
+    {
+      throw System.NotImplementedException ();
+    }
   }
 }



More information about the svn mailing list