changeset 377:906599374b69

- Added tparams member to IsExpression. - Added code for parsing optional TemplateParameterList in IsExpression (D 2.0). - Separated common code to parseTemplateParameterList_(). - Added method parseTemplateParameterList2(). - Fix in ctor of TemplateDeclaration: tparams can be null.
author aziz
date Sat, 08 Sep 2007 18:25:01 +0000
parents 5ebe80ce84f2
children ffb92a52ff44
files trunk/src/dil/Declarations.d trunk/src/dil/Expressions.d trunk/src/dil/Parser.d
diffstat 3 files changed, 43 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/dil/Declarations.d	Sat Sep 08 17:24:05 2007 +0000
+++ b/trunk/src/dil/Declarations.d	Sat Sep 08 18:25:01 2007 +0000
@@ -464,7 +464,9 @@
   {
     super(true);
     mixin(set_kind);
-    this.children = [cast(Node)tparams, decls];
+    if (tparams)
+      this.children = [tparams];
+    this.children ~= decls;
     this.name = name;
     this.tparams = tparams;
     this.decls = decls;
--- a/trunk/src/dil/Expressions.d	Sat Sep 08 17:24:05 2007 +0000
+++ b/trunk/src/dil/Expressions.d	Sat Sep 08 18:25:01 2007 +0000
@@ -819,17 +819,21 @@
   Token* ident;
   Token* opTok, specTok;
   Type specType;
-  this(Type type, Token* ident, Token* opTok, Token* specTok, Type specType)
+  TemplateParameters tparams; // D 2.0
+  this(Type type, Token* ident, Token* opTok, Token* specTok, Type specType, typeof(tparams) tparams)
   {
     mixin(set_kind);
     this.children = [type];
     if (specType)
       this.children ~= specType;
+    if (tparams)
+      this.children ~= tparams;
     this.type = type;
     this.ident = ident;
     this.opTok = opTok;
     this.specTok = specTok;
     this.specType = specType;
+    this.tparams = tparams;
   }
 }
 
--- a/trunk/src/dil/Parser.d	Sat Sep 08 17:24:05 2007 +0000
+++ b/trunk/src/dil/Parser.d	Sat Sep 08 18:25:01 2007 +0000
@@ -3514,8 +3514,17 @@
         }
       default:
       }
+
+      TemplateParameters tparams;
+    version(D2)
+    {
+      // is ( Type Identifier : TypeSpecialization , TemplateParameterList )
+      // is ( Type Identifier == TypeSpecialization , TemplateParameterList )
+      if (ident && specType && token.type == T.Comma)
+        tparams = parseTemplateParameterList2();
+    }
       require(T.RParen);
-      e = new IsExpression(type, ident, opTok, specTok, specType);
+      e = new IsExpression(type, ident, opTok, specTok, specType, tparams);
       break;
     case T.LParen:
       if (tokenAfterParenIs(T.LBrace))
@@ -4026,11 +4035,34 @@
 
   TemplateParameters parseTemplateParameterList()
   {
+    TemplateParameters tparams;
+    require(T.LParen);
+    if (token.type != T.RParen)
+      tparams = parseTemplateParameterList_();
+    require(T.RParen);
+    return tparams;
+  }
+
+version(D2)
+{
+  TemplateParameters parseTemplateParameterList2()
+  {
+    assert(token.type == T.Comma);
+    nT();
+    TemplateParameters tparams;
+    if (token.type != T.RParen)
+      tparams = parseTemplateParameterList_();
+    else
+      error(MID.ExpectedButFound, "Type/Expression", ")");
+    return tparams;
+  }
+} // version(D2)
+
+  TemplateParameters parseTemplateParameterList_()
+  {
     auto begin = token;
     auto tparams = new TemplateParameters;
 
-    require(T.LParen);
-    if (token.type != T.RParen)
     while (1)
     {
       auto paramBegin = token;
@@ -4119,7 +4151,6 @@
         break;
       nT();
     }
-    require(T.RParen);
     set(tparams, begin);
     return tparams;
   }