diff trunk/src/dil/Parser.d @ 340:1accb3013bd2

- Changed class TemplateParameter to an abstract class. - Added classes TemplateAlias-, Type-, Value- and TupleParameter.
author aziz
date Wed, 22 Aug 2007 19:50:01 +0000
parents b245b234fdd9
children 3ac651ea83fb
line wrap: on
line diff
--- a/trunk/src/dil/Parser.d	Wed Aug 22 15:56:02 2007 +0000
+++ b/trunk/src/dil/Parser.d	Wed Aug 22 19:50:01 2007 +0000
@@ -3971,26 +3971,16 @@
     auto tparams = new TemplateParameters;
 
     require(T.LParen);
-    if (token.type == T.RParen)
-      return tparams;
-
+    if (token.type != T.RParen)
     while (1)
     {
       auto paramBegin = token;
-      TP tp;
+      TemplateParameter tp;
       Token* ident;
-      Type valueType;
       Type specType, defType;
-      Expression specValue, defValue;
-
-      switch (token.type)
+
+      void parseSpecAndOrDefaultType()
       {
-      case T.Alias:
-        // TemplateAliasParameter:
-        //         alias Identifier
-        tp = TP.Alias;
-        nT(); // Skip alias keyword.
-        ident = requireId();
         // : SpecializationType
         if (token.type == T.Colon)
         {
@@ -4003,6 +3993,17 @@
           nT();
           defType = parseType();
         }
+      }
+
+      switch (token.type)
+      {
+      case T.Alias:
+        // TemplateAliasParameter:
+        //         alias Identifier
+        nT(); // Skip alias keyword.
+        ident = requireId();
+        parseSpecAndOrDefaultType();
+        tp = new TemplateAliasParameter(ident, specType, defType);
         break;
       case T.Identifier:
         ident = token;
@@ -4011,29 +4012,18 @@
         case T.Ellipses:
           // TemplateTupleParameter:
           //         Identifier ...
-          tp = TP.Tuple;
           nT(); // Skip Identifier.
           nT(); // Skip Ellipses.
           // if (token.type == T.Comma)
           //  error(); // TODO: issue error msg for variadic param not being last.
+          tp = new TemplateTupleParameter(ident);
           break;
         case T.Comma, T.RParen, T.Colon, T.Assign:
           // TemplateTypeParameter:
           //         Identifier
-          tp = TP.Type;
           nT(); // Skip Identifier.
-          // : SpecializationType
-          if (token.type == T.Colon)
-          {
-            nT();
-            specType = parseType();
-          }
-          // = DefaultType
-          if (token.type == T.Assign)
-          {
-            nT();
-            defType = parseType();
-          }
+          parseSpecAndOrDefaultType();
+          tp = new TemplateAliasParameter(ident, specType, defType);
           break;
         default:
           // TemplateValueParameter:
@@ -4046,8 +4036,8 @@
       LTemplateValueParameter:
         // TemplateValueParameter:
         //         Declarator
-        tp = TP.Value;
-        valueType = parseDeclarator(ident);
+        Expression specValue, defValue;
+        auto valueType = parseDeclarator(ident);
         // : SpecializationValue
         if (token.type == T.Colon)
         {
@@ -4060,9 +4050,11 @@
           nT();
           defValue = parseCondExpression();
         }
+        tp = new TemplateValueParameter(valueType, ident, specValue, defValue);
       }
 
-      tparams ~= set(new TemplateParameter(tp, valueType, ident, specType, defType, specValue, defValue), paramBegin);
+      // Push template parameter.
+      tparams ~= set(tp, paramBegin);
 
       if (token.type != T.Comma)
         break;