2004-08-26 Bernie Solomon <bernard@ugsolutions.com>
authorBernie Solomon <bernard@mono-cvs.ximian.com>
Thu, 26 Aug 2004 14:50:32 +0000 (14:50 -0000)
committerBernie Solomon <bernard@mono-cvs.ximian.com>
Thu, 26 Aug 2004 14:50:32 +0000 (14:50 -0000)
* mb-parser.jay: rework parsing of ParamArray parameters

svn path=/trunk/mcs/; revision=32885

mcs/mbas/ChangeLog
mcs/mbas/mb-parser.jay

index 2b647beec199f2db88583491d350c5fd2ebbc845..1afdcdac99d0c5493448ad7ef5ddb62d2774a108 100644 (file)
@@ -1,3 +1,6 @@
+2004-08-26 Bernie Solomon <bernard@ugsolutions.com>
+       * mb-parser.jay: rework parsing of ParamArray parameters
+
 2004-08-23 Bernie Solomon <bernard@ugsolutions.com>
        * mb-parser.jay: cope with more varieties of array declarations
 
index b4d2075a6399c95fd98be0ef2c131d0d8216bab9..6b977e1c3504159a1e7115b3a0e1337ee2b074a0 100644 (file)
@@ -2216,38 +2216,40 @@ opt_formal_parameter_list
        ;
        
 formal_parameter_list
-       : fixed_parameters              
+       : parameters            
          { 
                ArrayList pars_list = (ArrayList) $1;
-
-               Parameter [] pars = new Parameter [pars_list.Count];
-               pars_list.CopyTo (pars);
-               $$ = new Parameters (pars, null, lexer.Location); 
+               Parameter [] pars = null; 
+               Parameter array_parameter = null;
+               int non_array_count = pars_list.Count;
+               if (pars_list.Count > 0 && (((Parameter) pars_list [pars_list.Count - 1]).ModFlags & Parameter.Modifier.PARAMS) != 0) {
+                       array_parameter = (Parameter) pars_list [pars_list.Count - 1];
+                       non_array_count = pars_list.Count - 1;
+               }
+               foreach (Parameter par in pars_list)
+                       if (par != array_parameter && (par.ModFlags & Parameter.Modifier.PARAMS) != 0) {
+                               Report.Error (30192, lexer.Location, "ParamArray parameters must be last");
+                               non_array_count = 0; 
+                               array_parameter = null;
+                               break;
+                       }
+               if (non_array_count > 0) {
+                       pars = new Parameter [non_array_count];
+                       pars_list.CopyTo (pars);
+               }
+               $$ = new Parameters (pars, array_parameter, lexer.Location); 
          } 
-       | fixed_parameters COMMA parameter_array
-         {
-               ArrayList pars_list = (ArrayList) $1;
-
-               Parameter [] pars = new Parameter [pars_list.Count];
-               pars_list.CopyTo (pars);
-
-               $$ = new Parameters (pars, (Parameter) $3, lexer.Location); 
-         }
-       | parameter_array 
-         {
-               $$ = new Parameters (null, (Parameter) $1, lexer.Location);
-         }
        ;
 
-fixed_parameters
-       : fixed_parameter       
+parameters
+       : parameter     
          {
                ArrayList pars = new ArrayList ();
 
                pars.Add ($1);
                $$ = pars;
          }
-       | fixed_parameters COMMA fixed_parameter
+       | parameters COMMA parameter
          {
                ArrayList pars = (ArrayList) $1;
 
@@ -2256,7 +2258,7 @@ fixed_parameters
          }
        ;
 
-fixed_parameter
+parameter
        : opt_attributes
          opt_parameter_modifier
          identifier opt_type_character opt_rank_specifiers opt_type_with_ranks opt_variable_initializer
@@ -2266,7 +2268,12 @@ fixed_parameter
                Expression ptype;
                
                if (opt_parm && ($7 == null))
-                       Report.Error (30812, "Optional parameters must have a default value");
+                       Report.Error (30812, lexer.Location, "Optional parameters must have a default value");
+
+               if ((pm & Parameter.Modifier.PARAMS) != 0) {
+                       if ((pm & ~Parameter.Modifier.PARAMS) != 0)
+                               Report.Error (30667, lexer.Location, "ParamArray parameters must be ByVal");
+               }
                
                if (opt_parm) {
                        if ((pm & Parameter.Modifier.REF) !=0)
@@ -2280,37 +2287,19 @@ fixed_parameter
 
                ptype = (Expression)(($6 == null) ? (($4 == null) ? TypeManager.system_object_expr : $4) : $6);
                if ($5 != null) {
-                       string t = ptype.ToString();
+                       string t = ptype.ToString ();
                        if (t.IndexOf('[') >= 0)
                                Report.Error (31087, lexer.Location, "Array types specified in too many places");
                        else    
                                ptype = DecomposeQI (t + VariableDeclaration.BuildRanks ((ArrayList) $5, true, lexer.Location), lexer.Location);
-               }                       
+               }
+               if ((pm & Parameter.Modifier.PARAMS) != 0 && ptype.ToString ().IndexOf('[') < 0)
+                       Report.Error (30050, lexer.Location, "ParamArray parameters must be an array type");
                $$ = new Parameter (ptype, (string) $3, pm,
                                        (Attributes) $1, (Expression) $7, opt_parm);
          }
        ;
        
-parameter_array
-       : PARAM_ARRAY identifier opt_parens AS type 
-         { 
-               string s_patype = ((Expression) $5).ToString();
-               if ((bool) $3)
-                       s_patype += "[]";
-                       
-               Expression patype = DecomposeQI (s_patype, Location.Null);
-               $$ = new Parameter (patype, (string) $2, Parameter.Modifier.PARAMS, null);
-               // note  ("type must be a single-dimension array type"); 
-         }
-       ;
-               
-opt_parens
-       : /* empty */
-         {     $$ = false;     }
-       | OPEN_PARENS CLOSE_PARENS
-         {     $$ = true;      }
-       ;
-       
 opt_parameter_modifier
        : /* empty */           { $$ = Parameter.Modifier.VAL;  }
        | parameter_modifiers   { $$ = $1;                      }
@@ -2325,6 +2314,7 @@ parameter_modifier
        : BYREF                 { $$ = Parameter.Modifier.REF | Parameter.Modifier.ISBYREF; }
        | BYVAL                 { $$ = Parameter.Modifier.VAL; }
        | OPTIONAL              { $$ = Parameter.Modifier.OPTIONAL; } 
+       | PARAM_ARRAY           { $$ = Parameter.Modifier.PARAMS; } 
        ;       
 
 opt_statement_list