[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