Mercurial > projects > dil
changeset 196:ea3f66901fa4
- Added code for parsing template parameter lists for functions.
author | aziz |
---|---|
date | Sun, 15 Jul 2007 19:19:03 +0000 |
parents | 37c2ffd649c4 |
children | ff32eb87300e |
files | trunk/src/Parser.d trunk/src/Types.d |
diffstat | 2 files changed, 43 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/trunk/src/Parser.d Sun Jul 15 19:00:05 2007 +0000 +++ b/trunk/src/Parser.d Sun Jul 15 19:19:03 2007 +0000 @@ -2716,6 +2716,38 @@ assert(0); } + bool isTemplateParameterList() + { + // We count nested parentheses tokens because template types may appear inside parameter lists; e.g. (int x, Foo!(int) y). + Token t; + uint level = 1; + while (1) + { + lx.peek(t); + switch (t.type) + { + case T.RParen: + if (--level == 0) + { // Closing parentheses found. Return next token. + lx.peek(t); + break; + } + continue; + case T.LParen: + ++level; + continue; + case T.EOF: + break; + default: + continue; + } + break; + } + if (t.type == T.LParen) + return true; + return false; + } + Type parseDeclaratorSuffix(Type t) { switch (token.type) @@ -2728,10 +2760,16 @@ while (token.type == T.LBracket) break; case T.LParen: + TemplateParameter[] tparams; + if (isTemplateParameterList()) + { + // ( TemplateParameterList ) ( ParameterList ) + tparams = parseTemplateParameterList(); + } + auto params = parseParameterList(); - // TODO: handle ( TemplateParameterList ) ( ParameterList ) // ReturnType FunctionName ( ParameterList ) - t = new FunctionType(t, params); + t = new FunctionType(t, params, tparams); break; default: break;
--- a/trunk/src/Types.d Sun Jul 15 19:00:05 2007 +0000 +++ b/trunk/src/Types.d Sun Jul 15 19:19:03 2007 +0000 @@ -332,11 +332,13 @@ { Type returnType; Parameters parameters; - this(Type returnType, Parameters parameters) + TemplateParameter[] tparams; + this(Type returnType, Parameters parameters, TemplateParameter[] tparams = null) { super(TID.Function, null); this.returnType = returnType; this.parameters = parameters; + this.tparams = tparams; } }