Merge pull request #1949 from lewurm/fixtype
[mono.git] / mcs / ilasm / parser / ILParser.jay
index c6cdbfea21cecf187d0435cbc29c636337f5d661..63ddee82bfa286db0e183495ef80d6a93e4d5b90 100644 (file)
@@ -480,6 +480,9 @@ namespace Mono.ILASM {
 %token K_OFF\r
 %token K_FORWARDER\r
 %token K_CHARMAPERROR\r
+%token K_LEGACY\r
+%token K_LIBRARY\r
+%token K_AUTO\r
 \r
 /* end generated */\r
 \r
@@ -591,9 +594,6 @@ class_head          : D_CLASS class_attr comp_name formal_typars_clause extends_clause
                           }\r
                        ;\r
 \r
-class_attrs            : class_attrs class_attr\r
-                       ;\r
-\r
 class_attr             : /* EMPTY */                           \r
                          { \r
                                // Reset some flags\r
@@ -610,8 +610,7 @@ class_attr          : /* EMPTY */
                        | class_attr K_NESTED K_FAMANDASSEM     { $$ = (TypeAttr)$1 | TypeAttr.NestedFamAndAssem; }\r
                        | class_attr K_NESTED K_FAMORASSEM      { $$ = (TypeAttr)$1 | TypeAttr.NestedFamOrAssem; }\r
                        | class_attr K_VALUE                    { is_value_class = true; }\r
-                       | class_attr K_ENUM                     { is_enum_class = true; is_value_class = true;\r
-                         }\r
+                       | class_attr K_ENUM                     { is_enum_class = true; }\r
                        | class_attr K_INTERFACE                { $$ = (TypeAttr)$1 | TypeAttr.Interface; }\r
                        | class_attr K_SEALED                   { $$ = (TypeAttr)$1 | TypeAttr.Sealed; }\r
                        | class_attr K_ABSTRACT                 { $$ = (TypeAttr)$1 | TypeAttr.Abstract; }\r
@@ -657,22 +656,14 @@ impl_class_refs           : K_IMPLEMENTS generic_class_ref
 formal_typars_clause           : /* EMPTY */\r
                         | OPEN_ANGLE_BRACKET formal_typars CLOSE_ANGLE_BRACKET\r
                           {\r
-#if NET_2_0 || BOOTSTRAP_NET_2_0\r
                                 $$ = $2;\r
-#else\r
-                               Report.Error ("Use ilasm2 for generics support.");\r
-#endif\r
                           }\r
                         ;\r
 \r
 typars_clause           : /* EMPTY */\r
                         | OPEN_ANGLE_BRACKET typars CLOSE_ANGLE_BRACKET\r
                           {\r
-#if NET_2_0 || BOOTSTRAP_NET_2_0\r
                                 $$ = $2;\r
-#else\r
-                               Report.Error ("Use ilasm2 for generics support.");\r
-#endif\r
                           }\r
                         ;\r
 \r
@@ -697,13 +688,13 @@ constraints_clause        : /* EMTPY */
                        ;\r
 \r
 \r
-constraints            : generic_class_ref\r
+constraints            : type\r
                          {\r
                                 ArrayList al = new ArrayList ();\r
                                 al.Add ($1);\r
                                 $$ = al;\r
                            }\r
-                       | constraints COMMA generic_class_ref\r
+                       | constraints COMMA type\r
                           {\r
                                 ArrayList al = (ArrayList) $1;\r
                                 al.Add ($3);\r
@@ -715,6 +706,10 @@ generic_class_ref  : class_ref
                          {\r
                                 $$ = $1;\r
                          }\r
+                       | K_OBJECT\r
+                          {\r
+                                $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
+                          }\r
                        | K_CLASS class_ref typars_clause\r
                          {\r
                                 if ($3 != null)\r
@@ -929,17 +924,13 @@ class_decl                : method_all
 \r
 type                   : generic_class_ref\r
                           {\r
-                               $$ = $1;\r
-                          }\r
-                       | K_OBJECT\r
-                          {\r
-                                $$ = new PrimitiveTypeRef (PrimitiveType.Object, "System.Object");\r
+                               $$ = GetTypeRef ((BaseTypeRef) $1);\r
                           }\r
                        | K_VALUE K_CLASS class_ref\r
                           {\r
-                               BaseClassRef class_ref = (BaseClassRef) $3;\r
-                               class_ref.MakeValueClass ();\r
-                                $$ = class_ref;\r
+                                BaseClassRef class_ref = (BaseClassRef) $3;\r
+                                class_ref.MakeValueClass ();\r
+                                $$ = GetTypeRef (class_ref);\r
                           }\r
                        | K_VALUETYPE OPEN_BRACKET slashed_name CLOSE_BRACKET slashed_name typars_clause\r
                           {\r
@@ -947,7 +938,7 @@ type                        : generic_class_ref
                                 if ($6 != null)\r
                                         $$ = ext_ref.GetGenericTypeInst ((GenericArguments) $6);\r
                                 else\r
-                                        $$ = ext_ref;\r
+                                        $$ = GetTypeRef (ext_ref);\r
                           }\r
                         | K_VALUETYPE slashed_name typars_clause\r
                           {\r
@@ -956,51 +947,51 @@ type                      : generic_class_ref
                                 if ($3 != null)\r
                                         $$ = t_ref.GetGenericTypeInst ((GenericArguments) $3);\r
                                 else\r
-                                        $$ = t_ref;\r
+                                        $$ = GetTypeRef (t_ref);\r
                           }\r
                        | type OPEN_BRACKET CLOSE_BRACKET\r
                           {\r
-                                BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+                                BaseTypeRef base_type = (BaseTypeRef) $1;\r
                                 base_type.MakeArray ();\r
                                 $$ = base_type;\r
                           }\r
                        | type OPEN_BRACKET bounds CLOSE_BRACKET\r
                           {\r
-                                BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+                                BaseTypeRef base_type = (BaseTypeRef) $1;\r
                                 ArrayList bound_list = (ArrayList) $3;\r
                                 base_type.MakeBoundArray (bound_list);\r
                                 $$ = base_type;\r
                           }\r
                        | type AMPERSAND\r
                           {\r
-                                BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+                                BaseTypeRef base_type = (BaseTypeRef) $1;\r
                                 base_type.MakeManagedPointer ();\r
                                 $$ = base_type;\r
                           }\r
                        | type STAR\r
                           {\r
-                                BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+                                BaseTypeRef base_type = (BaseTypeRef) $1;\r
                                 base_type.MakeUnmanagedPointer ();\r
                                 $$ = base_type;\r
                           }\r
                        | type K_PINNED\r
                           {\r
-                                BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
+                                BaseTypeRef base_type = (BaseTypeRef) $1;\r
                                 base_type.MakePinned ();\r
                                 $$ = base_type;\r
                           }\r
-                       | type K_MODREQ OPEN_PARENS class_ref CLOSE_PARENS\r
+                       | type K_MODREQ OPEN_PARENS custom_modifier_type CLOSE_PARENS\r
                           {\r
-                                BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
-                                BaseClassRef class_ref = (BaseClassRef) $4;\r
+                                BaseTypeRef base_type = (BaseTypeRef) $1;\r
+                                BaseTypeRef class_ref = (BaseTypeRef) $4;\r
                                 base_type.MakeCustomModified (codegen,\r
                                         CustomModifier.modreq, class_ref);\r
                                 $$ = base_type;\r
                           }\r
-                       | type K_MODOPT OPEN_PARENS class_ref CLOSE_PARENS\r
+                       | type K_MODOPT OPEN_PARENS custom_modifier_type CLOSE_PARENS\r
                           {\r
-                                BaseTypeRef base_type = GetTypeRef ((BaseTypeRef) $1);\r
-                                BaseClassRef class_ref = (BaseClassRef) $4;\r
+                                BaseTypeRef base_type = (BaseTypeRef) $1;\r
+                                BaseTypeRef class_ref = (BaseTypeRef) $4;\r
                                 base_type.MakeCustomModified (codegen,\r
                                         CustomModifier.modopt, class_ref);\r
                                 $$ = base_type;\r
@@ -1012,8 +1003,6 @@ type                      : generic_class_ref
                        | primitive_type\r
                        ;\r
 \r
-                       ;\r
-\r
 primitive_type         : K_INT8\r
                           {\r
                                 $$ = new PrimitiveTypeRef (PrimitiveType.Int8, "System.SByte");\r
@@ -1493,7 +1482,12 @@ variant_type             : /* EMPTY */
                        | K_CLSID\r
                        ;\r
 \r
-field_decl             : D_FIELD repeat_opt field_attr type id at_opt init_opt\r
+custom_modifier_type\r
+                       : primitive_type\r
+                       | class_ref\r
+                       ;\r
+\r
+field_decl             : D_FIELD repeat_opt field_attr type id at_opt init_opt semicolon_opt\r
                           {\r
                                 FieldDef field_def = new FieldDef((FieldAttr) $3, \r
                                        (string) $5, (BaseTypeRef) $4);\r
@@ -1660,11 +1654,14 @@ field_init_primitive    : K_FLOAT32 OPEN_PARENS float64 CLOSE_PARENS
                           }\r
                        ;\r
 \r
-field_init             : field_init_primitive\r
+field_init_full : field_init_primitive\r
                        | K_BYTEARRAY bytes_list\r
                           {\r
                                 $$ = new ByteArrConst ((byte[]) $2);\r
                           }\r
+                       ;\r
+\r
+field_init : field_init_full\r
                        | comp_qstring\r
                           {\r
                                 // ******** THIS IS NOT IN THE DOCUMENTATION ******** //\r
@@ -1676,6 +1673,30 @@ field_init               : field_init_primitive
                           }\r
                        ;\r
 \r
+member_init : field_init_full\r
+                       | K_STRING OPEN_PARENS SQSTRING CLOSE_PARENS\r
+                         {\r
+                               $$ = new StringConst ((string) $3);\r
+                         }\r
+                       ;\r
+\r
+opt_truefalse_list\r
+                               : truefalse_list\r
+                               ;\r
+\r
+truefalse_list\r
+                               : truefalse\r
+                                 {\r
+                                       $$ = new List<BoolConst> () { new BoolConst ((bool) $1) };\r
+                                 }\r
+                               | truefalse_list truefalse\r
+                                 {\r
+                                       var l = (List<BoolConst>) $1;\r
+                                       l.Add (new BoolConst ((bool) $2));\r
+                                       $$ = l;\r
+                                 }\r
+                               ;\r
+\r
 data_decl              : data_head data_body\r
                           {\r
                                 DataDef datadef = (DataDef) $1;\r
@@ -2691,22 +2712,22 @@ event_decls             : /* EMPTY */
                        | event_decls event_decl\r
                        ;\r
 \r
-event_decl             : D_ADDON method_ref\r
+event_decl             : D_ADDON method_ref semicolon_opt\r
                           {\r
                                 codegen.CurrentTypeDef.CurrentEvent.AddAddon (\r
                                         (MethodRef) $2);                                \r
                           }\r
-                       | D_REMOVEON method_ref\r
+                       | D_REMOVEON method_ref semicolon_opt\r
                           {\r
                                 codegen.CurrentTypeDef.CurrentEvent.AddRemoveon (\r
                                         (MethodRef) $2);\r
                           }\r
-                       | D_FIRE method_ref\r
+                       | D_FIRE method_ref semicolon_opt\r
                           {\r
                                 codegen.CurrentTypeDef.CurrentEvent.AddFire (\r
                                         (MethodRef) $2);\r
                           }\r
-                       | D_OTHER method_ref\r
+                       | D_OTHER method_ref semicolon_opt\r
                           {\r
                                 codegen.CurrentTypeDef.CurrentEvent.AddOther (\r
                                         (MethodRef) $2);\r
@@ -2782,21 +2803,76 @@ prop_decl               : D_SET method_ref
                        | language_decl\r
                        ;\r
 \r
-customattr_decl                : D_CUSTOM custom_type\r
-                          {\r
-                                $$ = new CustomAttr ((BaseMethodRef) $2, null);\r
-                          }\r
-                       | D_CUSTOM custom_type ASSIGN comp_qstring\r
-                       | D_CUSTOM custom_type ASSIGN bytes_list\r
-                          {\r
-                                $$ = new CustomAttr ((BaseMethodRef) $2,\r
-                                        (byte[]) $4);\r
-                          }\r
-                       | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type\r
-                       | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN comp_qstring\r
-                       | D_CUSTOM OPEN_PARENS owner_type CLOSE_PARENS custom_type ASSIGN\r
-                         bytes_list\r
-                       ;\r
+customattr_decl\r
+                       : D_CUSTOM customattr_owner_type_opt custom_type\r
+                          {\r
+                                $$ = new CustomAttr ((BaseMethodRef) $3, null);\r
+                          }\r
+                       | D_CUSTOM customattr_owner_type_opt custom_type ASSIGN comp_qstring\r
+                       | D_CUSTOM customattr_owner_type_opt custom_type ASSIGN bytes_list\r
+                          {\r
+                                $$ = new CustomAttr ((BaseMethodRef) $3, new ByteArrConst ((byte[]) $5));\r
+                          }\r
+            | D_CUSTOM customattr_owner_type_opt custom_type ASSIGN OPEN_BRACE customattr_values CLOSE_BRACE\r
+              {\r
+               $$ = new CustomAttr ((BaseMethodRef) $3, (PEAPI.Constant) $6);\r
+              }\r
+                       ;\r
+\r
+// TODO: unused for now\r
+customattr_owner_type_opt\r
+                       : /* empty */\r
+                       | OPEN_PARENS type CLOSE_PARENS\r
+                       ;\r
+\r
+customattr_values\r
+                               : /* empty */\r
+                               | K_BOOL OPEN_BRACKET int32 CLOSE_BRACKET OPEN_PARENS opt_truefalse_list CLOSE_PARENS\r
+                                 {\r
+                                       var l = (List<BoolConst>) $6;\r
+                                       $$ = new ArrayConstant (l?.ToArray ()) {\r
+                                               ExplicitSize = (int) $3\r
+                                       };\r
+                                 }\r
+                               | K_BYTEARRAY bytes_list\r
+                 {\r
+                               $$ = new ByteArrConst ((byte[]) $2);\r
+                 }\r
+                               | K_STRING OPEN_PARENS SQSTRING CLOSE_PARENS\r
+                                 {\r
+                                       $$ = new StringConst ((string) $3);\r
+                                 }\r
+                               | customattr_ctor_args\r
+                                 {\r
+                                       var c = $1 as Constant;\r
+                                       $$ = c ?? new ArrayConstant (((List<DataConstant>) $1).ToArray ());\r
+                                 }\r
+                               ;\r
+\r
+customattr_ctor_args\r
+                               : customattr_ctor_arg\r
+                               | customattr_ctor_args customattr_ctor_arg\r
+                                 {\r
+                                       var l = $1 as List<DataConstant>;\r
+                                       if (l == null) {\r
+                                               l = new List<DataConstant> () {\r
+                                                       (DataConstant) $1\r
+                                               };\r
+                                       }\r
+\r
+                                       l.Add ((DataConstant) $2);\r
+                                       $$ = l;\r
+                                 }\r
+                               ;\r
+\r
+customattr_ctor_arg\r
+                               : field_init_primitive\r
+                               | K_TYPE OPEN_PARENS type CLOSE_PARENS\r
+                                 {\r
+                                       $$ = new StringConst (((TypeRef) $3).FullName);\r
+                                 }\r
+                               ;\r
+\r
                        \r
 custom_type            : call_conv type type_spec DOUBLE_COLON method_name OPEN_PARENS type_list CLOSE_PARENS\r
                           {\r
@@ -2850,11 +2926,7 @@ sec_decl         : D_PERMISSION sec_action type_spec OPEN_PARENS nameval_pairs CLOSE_PA
                          }\r
                        | D_PERMISSIONSET sec_action ASSIGN OPEN_BRACE permissions CLOSE_BRACE\r
                          {\r
-#if NET_2_0\r
                                $$ = new MIPermissionSet ((PEAPI.SecurityAction) $2, (ArrayList) $5);\r
-#else\r
-                               Report.Error ("Use ilasm2 for 2.0 style declarative security attributes.");\r
-#endif\r
                          }\r
                        ;\r
 \r
@@ -2904,18 +2976,10 @@ permission_member       : prop_or_field primitive_type perm_mbr_nameval_pair
                          }\r
                        ;\r
 \r
-perm_mbr_nameval_pair  : SQSTRING ASSIGN field_init_primitive\r
+perm_mbr_nameval_pair  : SQSTRING ASSIGN member_init\r
                          {\r
                                $$ = new NameValuePair ((string) $1, (PEAPI.Constant) $3);\r
                          }\r
-                       | SQSTRING ASSIGN K_BYTEARRAY bytes_list\r
-                          {\r
-                                $$ = new NameValuePair ((string) $1, new ByteArrConst ((byte[]) $4));\r
-                          }\r
-                       | SQSTRING ASSIGN K_STRING OPEN_PARENS SQSTRING CLOSE_PARENS\r
-                         {\r
-                               $$ = new NameValuePair ((string) $1, new StringConst ((string) $5));\r
-                         }\r
                        ;\r
 \r
 prop_or_field          : K_PROPERTY\r
@@ -3088,9 +3152,9 @@ assembly_all              : assembly_head OPEN_BRACE assembly_decls CLOSE_BRACE
                          }\r
                        ;\r
 \r
-assembly_head          : D_ASSEMBLY asm_attr slashed_name\r
+assembly_head          : D_ASSEMBLY legacylibrary_opt asm_attr slashed_name\r
                           {\r
-                                codegen.SetThisAssembly ((string) $3, (PEAPI.AssemAttr) $2);\r
+                                codegen.SetThisAssembly ((string) $4, (PEAPI.AssemAttr) $3);\r
                                 codegen.CurrentCustomAttrTarget = codegen.ThisAssembly;\r
                                codegen.CurrentDeclSecurityTarget = codegen.ThisAssembly;\r
                           }\r
@@ -3150,19 +3214,19 @@ asm_or_ref_decl         : D_PUBLICKEY ASSIGN bytes_list
 assemblyref_all                : assemblyref_head OPEN_BRACE assemblyref_decls CLOSE_BRACE\r
                        ;\r
 \r
-assemblyref_head       : D_ASSEMBLY K_EXTERN asm_attr slashed_name\r
+assemblyref_head       : D_ASSEMBLY K_EXTERN legacylibrary_opt asm_attr slashed_name\r
                           {\r
                                 System.Reflection.AssemblyName asmb_name = \r
                                        new System.Reflection.AssemblyName ();\r
-                               asmb_name.Name = (string) $4;\r
-                               codegen.BeginAssemblyRef ((string) $4, asmb_name, (PEAPI.AssemAttr) $3);\r
+                               asmb_name.Name = (string) $5;\r
+                               codegen.BeginAssemblyRef ((string) $5, asmb_name, (PEAPI.AssemAttr) $4);\r
                           }\r
-                       | D_ASSEMBLY K_EXTERN asm_attr slashed_name K_AS slashed_name\r
+                       | D_ASSEMBLY K_EXTERN legacylibrary_opt asm_attr slashed_name K_AS slashed_name\r
                           {\r
                                 System.Reflection.AssemblyName asmb_name = \r
                                        new System.Reflection.AssemblyName ();\r
-                               asmb_name.Name = (string) $4;\r
-                               codegen.BeginAssemblyRef ((string) $6, asmb_name, (PEAPI.AssemAttr) $3);\r
+                               asmb_name.Name = (string) $5;\r
+                               codegen.BeginAssemblyRef ((string) $7, asmb_name, (PEAPI.AssemAttr) $4);\r
                           }\r
                        ;\r
 \r
@@ -3197,6 +3261,7 @@ assemblyref_decl  : D_VER int32 COLON int32 COLON int32 COLON int32
                                 if (codegen.CurrentCustomAttrTarget != null)\r
                                         codegen.CurrentCustomAttrTarget.AddCustomAttribute ((CustomAttr) $1);\r
                           }\r
+            | K_AUTO  /* MS ilasm uses this keyword to lookup the specified assembly in the GAC and embeds its attributes, we just ignore it */\r
                        ;\r
 \r
 exptype_all            : exptype_head OPEN_BRACE exptype_decls CLOSE_BRACE\r
@@ -3358,6 +3423,15 @@ comp_name                : id
                         | COMP_NAME\r
                        ;\r
 \r
+semicolon_opt\r
+                       : /* empty */\r
+                       | SEMICOLON\r
+                       ;\r
+\r
+legacylibrary_opt      : /* empty */\r
+                                       | K_LEGACY K_LIBRARY  /* MS ilasm has these keywords for backwards compatibility, we just ignore them */\r
+                                       ;\r
+\r
 %%\r
 \r
 }\r