Mercurial > projects > dil
changeset 144:cfd890b250e6
- Added bool parameter to parseBaseClasses. BaseClasses in anonymous classes don't start with a colon.
- Implemented parseNewExpression().
author | aziz |
---|---|
date | Thu, 12 Jul 2007 10:24:02 +0000 |
parents | e760d7552f66 |
children | f401bd3feb2d |
files | trunk/src/Expressions.d trunk/src/Parser.d |
diffstat | 2 files changed, 68 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/trunk/src/Expressions.d Wed Jul 11 21:38:05 2007 +0000 +++ b/trunk/src/Expressions.d Thu Jul 12 10:24:02 2007 +0000 @@ -318,8 +318,32 @@ class NewExpression : UnaryExpression { - this(Expression e) - { super(e); } + Expression[] newArgs; + Type type; + Expression[] ctorArgs; + this(Expression e, Expression[] newArgs, Type type, Expression[] ctorArgs) + { + super(e); + this.newArgs = newArgs; + this.type = type; + this.ctorArgs = ctorArgs; + } +} + +class NewAnonClassExpression : UnaryExpression +{ + Expression[] newArgs; + BaseClass[] bases; + Expression[] ctorArgs; + Declaration[] decls; + this(Expression e, Expression[] newArgs, BaseClass[] bases, Expression[] ctorArgs, Declaration[] decls) + { + super(e); + this.newArgs = newArgs; + this.bases = bases; + this.ctorArgs = ctorArgs; + this.decls = decls; + } } class DeleteExpression : UnaryExpression @@ -338,12 +362,6 @@ } } -class AnonClassExpression : UnaryExpression -{ - this(Expression e) - { super(e); } -} - class IndexExpression : UnaryExpression { Expression[] args;
--- a/trunk/src/Parser.d Wed Jul 11 21:38:05 2007 +0000 +++ b/trunk/src/Parser.d Thu Jul 12 10:24:02 2007 +0000 @@ -414,14 +414,16 @@ return new ClassDeclaration(className, bases, decls, hasBody); } - BaseClass[] parseBaseClasses() + BaseClass[] parseBaseClasses(bool colonLeadsOff = true) { - assert(token.type == T.Colon); + if (colonLeadsOff) + { + assert(token.type == T.Colon); + nT(); // Skip colon + } BaseClass[] bases; - nT(); // Skip colon - while (1) { Protection prot = Protection.Public; @@ -1438,8 +1440,42 @@ Expression parseNewExpression(Expression e) { - // TODO: implement this method. - return null; + assert(token.type == T.New); + nT(); // Skip new keyword. + + Expression[] newArguments; + Expression[] ctorArguments; + + if (token.type == T.LParen) + newArguments = parseArguments(T.RParen); + + // NewAnonClassExpression: + // new (ArgumentList)opt class (ArgumentList)opt SuperClassopt InterfaceClassesopt ClassBody + if (token.type == T.Class) + { + nT(); + if (token.type == T.LParen) + ctorArguments = parseArguments(T.RParen); + + BaseClass[] bases = token.type != T.LBrace ? parseBaseClasses(false) : null ; + + require(T.LBrace); + auto decls = parseDeclarationDefinitions(); + require(T.RBrace); + return new NewAnonClassExpression(e, newArguments, bases, ctorArguments, decls); + } + + // NewExpression: + // NewArguments Type [ AssignExpression ] + // NewArguments Type ( ArgumentList ) + // NewArguments Type + auto type = parseType(); + // TODO: consider "new Foo!(int)(1,2,3)" + if (type.tid == TID.Identifier) + { + ctorArguments = parseArguments(T.RParen); + } + return new NewExpression(e, newArguments, type, ctorArguments); } Type parseType()