X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fgmcs%2Fcs-parser.jay;h=112788986c9d52bac6f08d7b0e8de11dfebd1320;hb=dd866d68820e0f66046256bb5d3f84e3988a8be0;hp=425bf94aa95c4f6d98055228e18664cd0f5a6ef8;hpb=76716bfa3aef87dbf324016eaad111a7a4e74171;p=mono.git diff --git a/mcs/gmcs/cs-parser.jay b/mcs/gmcs/cs-parser.jay index 425bf94aa95..112788986c9 100755 --- a/mcs/gmcs/cs-parser.jay +++ b/mcs/gmcs/cs-parser.jay @@ -35,48 +35,57 @@ namespace Mono.CSharp IIteratorContainer iterator_container; - // - // Current block is used to add statements as we find - // them. - // + /// + /// Current block is used to add statements as we find + /// them. + /// Block current_block; - // - // Current interface is used by the various declaration - // productions in the interface declaration to "add" - // the interfaces as we find them. - // + /// + /// If true, creates a toplevel block in the block production + /// This is flagged by the delegate creation + /// + bool create_toplevel_block; + + /// + /// + /// Current interface is used by the various declaration + /// productions in the interface declaration to "add" + /// the interfaces as we find them. + /// Interface current_interface; - // - // This is used by the unary_expression code to resolve - // a name against a parameter. - // + Delegate current_delegate; + + /// + /// This is used by the unary_expression code to resolve + /// a name against a parameter. + /// Parameters current_local_parameters; - // - // Using during property parsing to describe the implicit - // value parameter that is passed to the "set" and "get"accesor - // methods (properties and indexers). - // + /// + /// Using during property parsing to describe the implicit + /// value parameter that is passed to the "set" and "get"accesor + /// methods (properties and indexers). + /// Expression implicit_value_parameter_type; Parameters indexer_parameters; - // - // Used to determine if we are parsing the get/set pair - // of an indexer or a property - // + /// + /// Used to determine if we are parsing the get/set pair + /// of an indexer or a property + /// bool parsing_indexer; - // - // An out-of-band stack. - // + /// + /// An out-of-band stack. + /// Stack oob_stack; - // - // Switch stack. - // + /// + /// Switch stack. + /// Stack switch_stack; public bool yacc_verbose_flag; @@ -84,10 +93,17 @@ namespace Mono.CSharp // Name of the file we are parsing public string name; - // - // The current file. - // + /// + /// The current file. + /// SourceFile file; + + + /// Current attribute target + string current_attr_target; + + /// assembly and module attribute definition is enabled + bool global_attrs_enabled = true; %} %token EOF @@ -180,9 +196,7 @@ namespace Mono.CSharp %token VOLATILE %token WHERE %token WHILE - -/* v2 tokens */ -%token YIELD +%token ARGLIST /* C# keywords which are not really keywords */ %token GET "get" @@ -255,6 +269,7 @@ namespace Mono.CSharp %token CLOSE_PARENS_NO_CAST %token CLOSE_PARENS_OPEN_PARENS %token CLOSE_PARENS_MINUS +%token DEFAULT_OPEN_PARENS /* Add precedence rules to solve dangling else s/r conflict */ %nonassoc LOWPREC @@ -280,8 +295,8 @@ namespace Mono.CSharp compilation_unit : outer_declarations opt_EOF - | outer_declarations attribute_sections opt_EOF - | attribute_sections opt_EOF + | outer_declarations global_attributes opt_EOF + | global_attributes opt_EOF | opt_EOF /* allow empty files */ ; @@ -314,7 +329,7 @@ using_alias_directive : USING IDENTIFIER ASSIGN namespace_or_type_name SEMICOLON { - current_namespace.UsingAlias ((string) $2, (Expression) $4, lexer.Location); + current_namespace.UsingAlias ((string) $2, (MemberName) $4, lexer.Location); } | USING error { CheckIdentifierToken (yyToken); @@ -334,17 +349,10 @@ using_namespace_directive // detach them // namespace_declaration - : opt_attributes NAMESPACE qualified_identifier + : opt_attributes NAMESPACE namespace_name { - Attributes attrs = (Attributes) $1; - - if (attrs != null) { - foreach (AttributeSection asec in attrs.AttributeSections) - if (asec.Target == "assembly") - RootContext.AddGlobalAttributeSection (current_container, asec); - else - Report.Error(1518, Lexer.Location, - "Attributes cannot be applied to namespaces." + if ($1 != null) { + Report.Error(1518, Lexer.Location, "Attributes cannot be applied to namespaces." + " Expected class, delegate, enum, interface, or struct"); } @@ -366,15 +374,15 @@ opt_comma | COMMA ; -qualified_identifier - : IDENTIFIER - | qualified_identifier DOT IDENTIFIER { - $$ = (($1).ToString ()) + "." + ($3.ToString ()); } - ; +namespace_name + : namespace_or_type_name { + MemberName name = (MemberName) $1; + if (name.TypeArguments != null) + syntax_error (lexer.Location, "namespace name expected"); -namespace_name - : qualified_identifier + $$ = name.GetName (); + } ; namespace_body @@ -429,6 +437,13 @@ namespace_member_declaration | namespace_declaration { current_namespace.DeclarationFound = true; } + + | field_declaration { + Report.Error (116, lexer.Location, "A namespace can only contain types and namespace declarations"); + } + | method_declaration { + Report.Error (116, lexer.Location, "A namespace can only contain types and namespace declarations"); + } ; type_declaration @@ -450,58 +465,93 @@ type_declaration // Attributes 17.2 // +global_attributes + : attribute_sections +{ + if ($1 != null) + CodeGen.Assembly.AddAttributes (((Attributes)$1).Attrs); + + $$ = $1; +} + opt_attributes : /* empty */ - | attribute_sections { $$ = $1; } + { + global_attrs_enabled = false; + $$ = null; + } + | attribute_sections + { + global_attrs_enabled = false; + $$ = $1; + } ; + attribute_sections : attribute_section { - AttributeSection sect = (AttributeSection) $1; - - if (sect.Target == "assembly") - RootContext.AddGlobalAttributeSection (current_container, sect); - + ArrayList sect = (ArrayList) $1; - $$ = new Attributes ((AttributeSection) $1); + if (global_attrs_enabled) { + if (current_attr_target == "module") { + CodeGen.Module.AddAttributes (sect); + $$ = null; + } else if (current_attr_target == "assembly") { + CodeGen.Assembly.AddAttributes (sect); + $$ = null; + } else { + $$ = new Attributes (sect); + } + } else { + $$ = new Attributes (sect); } + current_attr_target = null; + } | attribute_sections attribute_section { - Attributes attrs = null; - AttributeSection sect = (AttributeSection) $2; + Attributes attrs = $1 as Attributes; + ArrayList sect = (ArrayList) $2; - if (sect.Target == "assembly") - RootContext.AddGlobalAttributeSection (current_container, sect); - - if ($1 != null) { - attrs = (Attributes) $1; - attrs.AddAttributeSection (sect); + if (global_attrs_enabled) { + if (current_attr_target == "module") { + CodeGen.Module.AddAttributes (sect); + $$ = null; + } else if (current_attr_target == "assembly") { + CodeGen.Assembly.AddAttributes (sect); + $$ = null; + } else { + if (attrs == null) + attrs = new Attributes (sect); + else + attrs.AddAttributes (sect); + } + } else { + if (attrs == null) + attrs = new Attributes (sect); + else + attrs.AddAttributes (sect); } - $$ = attrs; + current_attr_target = null; } ; attribute_section : OPEN_BRACKET attribute_target_specifier attribute_list opt_comma CLOSE_BRACKET { - string target = null; - - if ($2 != null) - target = (string) $2; - - $$ = new AttributeSection (target, (ArrayList) $3); + $$ = $3; } | OPEN_BRACKET attribute_list opt_comma CLOSE_BRACKET { - $$ = new AttributeSection (null, (ArrayList) $2); + $$ = $2; } ; attribute_target_specifier : attribute_target COLON { + current_attr_target = (string)$1; $$ = $1; } ; @@ -541,15 +591,24 @@ attribute } opt_attribute_arguments { - // - // Attributes need a string, not an expression: generic types will fail here. - // - $$ = new Attribute (((Expression) $1).ToString (), (ArrayList) $3, (Location) $2); + MemberName mname = (MemberName) $1; + if (mname.IsGeneric) { + Report.Error (404, lexer.Location, + "'<' unexpected: attributes cannot be generic"); + } + + string name = mname.GetName (); + if (current_attr_target == "assembly" || current_attr_target == "module") + $$ = new GlobalAttribute (current_container, current_attr_target, + name, (ArrayList) $3, (Location) $2); + else + $$ = new Attribute (current_attr_target, name, (ArrayList) $3, + (Location) $2); } ; attribute_name - : type_name { /* reserved attribute name or identifier: 17.4 */ } + : namespace_or_type_name { /* reserved attribute name or identifier: 17.4 */ } ; opt_attribute_arguments @@ -672,32 +731,31 @@ class_member_declaration struct_declaration : opt_attributes opt_modifiers - STRUCT IDENTIFIER + STRUCT member_name { Struct new_struct; - string full_struct_name = MakeName ((string) $4); + MemberName full_struct_name = MakeName ((MemberName) $4); new_struct = new Struct (current_namespace, current_container, full_struct_name, (int) $2, (Attributes) $1, lexer.Location); current_container = new_struct; - RootContext.Tree.RecordDecl (full_struct_name, new_struct); + RootContext.Tree.RecordDecl (full_struct_name.GetName (true), new_struct); + lexer.ConstraintsParsing = true; } - opt_type_parameter_list opt_class_base opt_type_parameter_constraints_clauses + { + lexer.ConstraintsParsing = false; + } struct_body opt_semicolon { Struct new_struct = (Struct) current_container; - if ($8 != null && $6 == null) - Report.Error (-200, new_struct.Location, - "Type parameter constraints only valid if there is a type parameter list"); - if ($6 != null) - CheckDef (new_struct.SetParameterInfo ((ArrayList) $6, (ArrayList) $8), new_struct.Name, new_struct.Location); + CheckDef (new_struct.SetParameterInfo ((ArrayList) $7), new_struct.Name, new_struct.Location); - if ($7 != null) - new_struct.Bases = (ArrayList) $7; + if ($6 != null) + new_struct.Bases = (ArrayList) $6; current_container = current_container.Parent; CheckDef (current_container.AddStruct (new_struct), new_struct.Name, new_struct.Location); @@ -907,63 +965,94 @@ opt_error_modifier method_header : opt_attributes opt_modifiers - type - member_name - opt_type_parameter_list + type namespace_or_type_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS + { + lexer.ConstraintsParsing = true; + } opt_type_parameter_constraints_clauses { - if ($9 != null && $5 == null) - Report.Error (-200, lexer.Location, - "Type parameter constraints only valid if there is a type parameter list"); + lexer.ConstraintsParsing = false; + + MemberName name = (MemberName) $4; + + if ($9 != null && name.TypeArguments == null) + Report.Error (80, lexer.Location, + "Contraints are not allowed on non-generic declarations"); Method method; + GenericMethod generic = null; - if ($5 != null) { + if (name.TypeArguments != null) { generic = new GenericMethod (current_namespace, current_container, - (string) $4, lexer.Location); + name, lexer.Location); - CheckDef (generic.SetParameterInfo ((ArrayList) $5, (ArrayList) $9), generic.Name, generic.Location); - method = new Method (generic, (Expression) $3, (int) $2, (string) $4, - (Parameters) $7, (Attributes) $1, lexer.Location); + CheckDef (generic.SetParameterInfo ((ArrayList) $9), name.Name, lexer.Location); + + method = new Method (generic, (Expression) $3, (int) $2, false, name, + (Parameters) $6, (Attributes) $1, lexer.Location); } else - method = new Method (current_container, (Expression) $3, (int) $2, (string) $4, - (Parameters) $7, (Attributes) $1, lexer.Location); + method = new Method (current_container, (Expression) $3, (int) $2, + false, name, (Parameters) $6, (Attributes) $1, + lexer.Location); - current_local_parameters = (Parameters) $7; + current_local_parameters = (Parameters) $6; $$ = method; } | opt_attributes opt_modifiers - VOID - member_name - opt_type_parameter_list + VOID namespace_or_type_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS + { + lexer.ConstraintsParsing = true; + } opt_type_parameter_constraints_clauses { - if ($9 != null && $5 == null) - Report.Error (-200, lexer.Location, - "Type parameter constraints only valid if there is a type parameter list"); + lexer.ConstraintsParsing = false; + + MemberName name = (MemberName) $4; + + if ($9 != null && name.TypeArguments == null) + Report.Error (80, lexer.Location, + "Contraints are not allowed on non-generic declarations"); Method method; GenericMethod generic = null; - if ($5 != null) { + if (name.TypeArguments != null) { generic = new GenericMethod (current_namespace, current_container, - (string) $4, lexer.Location); + name, lexer.Location); - CheckDef (generic.SetParameterInfo ((ArrayList) $5, (ArrayList) $9), generic.Name, generic.Location); + + CheckDef (generic.SetParameterInfo ((ArrayList) $9), name.Name, lexer.Location); method = new Method (generic, TypeManager.system_void_expr, (int) $2, - (string) $4, (Parameters) $7, (Attributes) $1, - lexer.Location); + false, name, (Parameters) $6, (Attributes) $1, + lexer.Location); } else - method = new Method (current_container, TypeManager.system_void_expr, (int) $2, - (string) $4, (Parameters) $7, (Attributes) $1, - lexer.Location); + method = new Method (current_container, TypeManager.system_void_expr, + (int) $2, false, name, (Parameters) $6, + (Attributes) $1, lexer.Location); - current_local_parameters = (Parameters) $7; + current_local_parameters = (Parameters) $6; + $$ = method; + } + | opt_attributes + opt_modifiers + type + modifiers namespace_or_type_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS + { + Report.Error (1585, lexer.Location, + String.Format ("Modifier {0} should appear before type", + Modifiers.Name ((int) $4))); + MemberName name = (MemberName) $4; + + Method method = new Method (current_container, TypeManager.system_void_expr, + 0, false, name, (Parameters) $6, (Attributes) $1, + lexer.Location); + + current_local_parameters = (Parameters) $6; $$ = method; } ; @@ -997,10 +1086,23 @@ formal_parameter_list $$ = new Parameters (pars, (Parameter) $3, lexer.Location); } + | fixed_parameters COMMA ARGLIST + { + ArrayList pars_list = (ArrayList) $1; + + Parameter [] pars = new Parameter [pars_list.Count]; + pars_list.CopyTo (pars); + + $$ = new Parameters (pars, true, lexer.Location); + } | parameter_array { $$ = new Parameters (null, (Parameter) $1, lexer.Location); } + | ARGLIST + { + $$ = new Parameters (null, true, lexer.Location); + } ; fixed_parameters @@ -1059,14 +1161,10 @@ parameter_array } ; -member_name - : qualified_identifier - ; - property_declaration : opt_attributes opt_modifiers - type member_name + type namespace_or_type_name OPEN_BRACE { implicit_value_parameter_type = (Expression) $3; @@ -1074,6 +1172,8 @@ property_declaration lexer.PropertyParsing = true; $$ = lexer.Location; + + iterator_container = SimpleIteratorContainer.GetSimple (); } accessor_declarations { @@ -1086,12 +1186,19 @@ property_declaration Accessor get_block = (Accessor) pair.First; Accessor set_block = (Accessor) pair.Second; + MemberName name = (MemberName) $4; + if (name.TypeArguments != null) + syntax_error (lexer.Location, "a property can't have type arguments"); + Location loc = (Location) $6; - prop = new Property (current_container, (Expression) $3, (string) $4, (int) $2, - get_block, set_block, (Attributes) $1, loc); + prop = new Property (current_container, (Expression) $3, (int) $2, false, + name, (Attributes) $1, get_block, set_block, loc); + if (SimpleIteratorContainer.Simple.Yields) + prop.SetYields (); CheckDef (current_container.AddProperty (prop), prop.Name, loc); implicit_value_parameter_type = null; + iterator_container = null; } ; @@ -1180,10 +1287,10 @@ accessor_body interface_declaration : opt_attributes opt_modifiers - INTERFACE IDENTIFIER + INTERFACE member_name { Interface new_interface; - string full_interface_name = MakeName ((string) $4); + MemberName full_interface_name = MakeName ((MemberName) $4); new_interface = new Interface (current_namespace, current_container, full_interface_name, (int) $2, (Attributes) $1, lexer.Location); @@ -1192,25 +1299,26 @@ interface_declaration Report.Error (-2, l, "Internal compiler error: interface inside interface"); } current_interface = new_interface; - RootContext.Tree.RecordDecl (full_interface_name, new_interface); + current_container = new_interface; + RootContext.Tree.RecordDecl ( + full_interface_name.GetName (true), new_interface); + lexer.ConstraintsParsing = true; } - opt_type_parameter_list - opt_interface_base + opt_class_base opt_type_parameter_constraints_clauses + { + lexer.ConstraintsParsing = false; + } interface_body opt_semicolon { Interface new_interface = (Interface) current_interface; - if ($8 != null && $6 == null) - Report.Error (-200, new_interface.Location, - "Type parameter constraints only valid if there is a type parameter list"); - + CheckDef (new_interface.SetParameterInfo ((ArrayList) $7), new_interface.Name, new_interface.Location); if ($6 != null) - CheckDef (new_interface.SetParameterInfo ((ArrayList) $6, (ArrayList) $8), new_interface.Name, new_interface.Location); - if ($7 != null) - new_interface.Bases = (ArrayList) $7; + new_interface.Bases = (ArrayList) $6; current_interface = null; + current_container = current_container.Parent; CheckDef (current_container.AddInterface (new_interface), new_interface.Name, new_interface.Location); } @@ -1219,31 +1327,6 @@ interface_declaration } ; -opt_interface_base - : /* empty */ { $$ = null; } - | interface_base - ; - -interface_base - : COLON interface_type_list { $$ = $2; } - ; - -interface_type_list - : interface_type - { - ArrayList interfaces = new ArrayList (4); - - interfaces.Add ($1); - $$ = interfaces; - } - | interface_type_list COMMA interface_type - { - ArrayList interfaces = (ArrayList) $1; - interfaces.Add ($3); - $$ = interfaces; - } - ; - interface_body : OPEN_BRACE opt_interface_member_declarations @@ -1263,50 +1346,101 @@ interface_member_declarations interface_member_declaration : interface_method_declaration { - InterfaceMethod m = (InterfaceMethod) $1; + Method m = (Method) $1; CheckDef (current_interface.AddMethod (m), m.Name, m.Location); } | interface_property_declaration { - InterfaceProperty p = (InterfaceProperty) $1; + Property p = (Property) $1; CheckDef (current_interface.AddProperty (p), p.Name, p.Location); } | interface_event_declaration { - InterfaceEvent e = (InterfaceEvent) $1; - - CheckDef (current_interface.AddEvent (e), e.Name, lexer.Location); + if ($1 != null){ + Event e = (Event) $1; + CheckDef (current_interface.AddEvent (e), e.Name, lexer.Location); + } } | interface_indexer_declaration { - InterfaceIndexer i = (InterfaceIndexer) $1; + Indexer i = (Indexer) $1; - CheckDef (current_interface.AddIndexer (i), "indexer", i.Location); + current_interface.AddIndexer (i); } ; opt_new - : /* empty */ { $$ = false; } - | NEW { $$ = true; } + : opt_modifiers + { + int val = (int) $1; + val = Modifiers.Check (Modifiers.NEW | Modifiers.UNSAFE, val, 0, lexer.Location); + $$ = val; + } ; interface_method_declaration - : opt_attributes opt_new type IDENTIFIER + : opt_attributes opt_new type namespace_or_type_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS + { + lexer.ConstraintsParsing = true; + } + opt_type_parameter_constraints_clauses SEMICOLON { - $$ = new InterfaceMethod ((Expression) $3, (string) $4, (bool) $2, - (Parameters) $6, (Attributes) $1, lexer.Location); + lexer.ConstraintsParsing = false; + + MemberName name = (MemberName) $4; + + if ($9 != null && name.TypeArguments == null) + Report.Error (80, lexer.Location, + "Contraints are not allowed on non-generic declarations"); + + GenericMethod generic = null; + if (name.TypeArguments != null) { + generic = new GenericMethod (current_namespace, current_container, + name, lexer.Location); + + CheckDef (generic.SetParameterInfo ((ArrayList) $9), name.Name, lexer.Location); + + $$ = new Method (generic, (Expression) $3, (int) $2, true, name, + (Parameters) $6, (Attributes) $1, lexer.Location); + } else + $$ = new Method (current_container, (Expression) $3, (int) $2, true, + name, (Parameters) $6, (Attributes) $1, + lexer.Location); } - | opt_attributes opt_new VOID IDENTIFIER + | opt_attributes opt_new VOID namespace_or_type_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS + { + lexer.ConstraintsParsing = true; + } + opt_type_parameter_constraints_clauses SEMICOLON { - $$ = new InterfaceMethod ( - TypeManager.system_void_expr, (string) $4, (bool) $2, (Parameters) $6, - (Attributes) $1, lexer.Location); + lexer.ConstraintsParsing = false; + + MemberName name = (MemberName) $4; + + if ($9 != null && name.TypeArguments == null) + Report.Error (80, lexer.Location, + "Contraints are not allowed on non-generic declarations"); + + GenericMethod generic = null; + if (name.TypeArguments != null) { + generic = new GenericMethod (current_namespace, current_container, + name, lexer.Location); + + CheckDef (generic.SetParameterInfo ((ArrayList) $9), name.Name, lexer.Location); + + $$ = new Method (generic, TypeManager.system_void_expr, (int) $2, + true, name, (Parameters) $6, (Attributes) $1, + lexer.Location); + } else + $$ = new Method (current_container, TypeManager.system_void_expr, + (int) $2, true, name, (Parameters) $6, + (Attributes) $1, lexer.Location); } ; @@ -1316,15 +1450,15 @@ interface_property_declaration type IDENTIFIER OPEN_BRACE { lexer.PropertyParsing = true; } - interface_accesors + interface_accessors { lexer.PropertyParsing = false; } CLOSE_BRACE { - int gs = (int) $7; + InterfaceAccessorInfo pinfo = (InterfaceAccessorInfo) $7; - $$ = new InterfaceProperty ((Expression) $3, (string) $4, (bool) $2, - (gs & 1) == 1, (gs & 2) == 2, (Attributes) $1, - lexer.Location); + $$ = new Property (current_container, (Expression) $3, (int) $2, true, + new MemberName ((string) $4), (Attributes) $1, + pinfo.Get, pinfo.Set, lexer.Location); } | opt_attributes opt_new @@ -1334,25 +1468,34 @@ interface_property_declaration } ; -interface_accesors - : opt_attributes GET SEMICOLON { $$ = 1; } - | opt_attributes SET SEMICOLON { $$ = 2; } +interface_accessors + : opt_attributes GET SEMICOLON { $$ = new InterfaceAccessorInfo (true, false, (Attributes) $1, null); } + | opt_attributes SET SEMICOLON { $$ = new InterfaceAccessorInfo (false, true, null, (Attributes) $1); } | opt_attributes GET SEMICOLON opt_attributes SET SEMICOLON - { $$ = 3; } + { $$ = new InterfaceAccessorInfo (true, true, (Attributes) $1, (Attributes) $3); } | opt_attributes SET SEMICOLON opt_attributes GET SEMICOLON - { $$ = 3; } + { $$ = new InterfaceAccessorInfo (true, true, (Attributes) $3, (Attributes) $1); } ; interface_event_declaration : opt_attributes opt_new EVENT type IDENTIFIER SEMICOLON { - $$ = new InterfaceEvent ((Expression) $4, (string) $5, (bool) $2, (Attributes) $1, - lexer.Location); + $$ = new EventField (current_container, (Expression) $4, (int) $2, true, + new MemberName ((string) $5), null, + (Attributes) $1, lexer.Location); } | opt_attributes opt_new EVENT type error { CheckIdentifierToken (yyToken); $$ = null; } + | opt_attributes opt_new EVENT type IDENTIFIER ASSIGN { + Report.Error (68, lexer.Location, "Event declarations on interfaces can not be initialized."); + $$ = null; + } + | opt_attributes opt_new EVENT type IDENTIFIER OPEN_BRACE event_accessor_declarations CLOSE_BRACE { + Report.Error (69, lexer.Location, "Event accessors not valid on interfaces"); + $$ = null; + } ; interface_indexer_declaration @@ -1360,32 +1503,38 @@ interface_indexer_declaration OPEN_BRACKET formal_parameter_list CLOSE_BRACKET OPEN_BRACE { lexer.PropertyParsing = true; } - interface_accesors + interface_accessors { lexer.PropertyParsing = false; } CLOSE_BRACE { - int a_flags = (int) $10; - - bool do_get = (a_flags & 1) == 1; - bool do_set = (a_flags & 2) == 2; + InterfaceAccessorInfo info = (InterfaceAccessorInfo) $10; - $$ = new InterfaceIndexer ((Expression) $3, (Parameters) $6, do_get, do_set, - (bool) $2, (Attributes) $1, lexer.Location); + $$ = new Indexer (current_container, (Expression) $3, (int) $2, true, + MemberName.Null, (Parameters) $6, (Attributes) $1, + info.Get, info.Set, lexer.Location); } ; operator_declaration - : opt_attributes opt_modifiers operator_declarator operator_body + : opt_attributes opt_modifiers operator_declarator + { + iterator_container = SimpleIteratorContainer.GetSimple (); + } + operator_body { OperatorDeclaration decl = (OperatorDeclaration) $3; Operator op = new Operator (decl.optype, decl.ret_type, (int) $2, decl.arg1type, decl.arg1name, - decl.arg2type, decl.arg2name, (Block) $4, (Attributes) $1, decl.location); + decl.arg2type, decl.arg2name, (Block) $5, (Attributes) $1, decl.location); + + if (SimpleIteratorContainer.Simple.Yields) + op.SetYields (); // Note again, checking is done in semantic analysis current_container.AddOperator (op); current_local_parameters = null; + iterator_container = null; } ; @@ -1556,7 +1705,7 @@ constructor_declarator opt_constructor_initializer { Location l = (Location) oob_stack.Pop (); - $$ = new Constructor (current_container, (string) $1, (Parameters) $3, + $$ = new Constructor (current_container, (string) $1, 0, (Parameters) $3, (ConstructorInitializer) $6, l); } ; @@ -1611,12 +1760,12 @@ destructor_declaration if ((m & Modifiers.UNSAFE) != 0){ if (!RootContext.Unsafe){ Report.Error (227, l, - "Unsafe code requires the --unsafe command " + + "Unsafe code requires the -unsafe command " + "line option to be specified"); } } - Method d = new Method ( + Method d = new Destructor ( current_container, TypeManager.system_void_expr, m, "Finalize", new Parameters (null, null, l), (Attributes) $1, l); @@ -1624,6 +1773,14 @@ destructor_declaration CheckDef (current_container.AddMethod (d), d.Name, d.Location); } } + | opt_attributes opt_modifiers EVENT type member_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS block { + string mn = (string) $5; + + if (mn.IndexOf ('.') != -1) + Report.Error (71, lexer.Location, "Explicit implementation of events requires property syntax"); + else + Report.Error (71, lexer.Location, "Event declaration should use property syntax"); + } ; event_declaration @@ -1633,9 +1790,12 @@ event_declaration { foreach (VariableDeclaration var in (ArrayList) $5) { - Event e = new Event ((Expression) $4, var.identifier, - var.expression_or_array_initializer, - (int) $2, null, null, (Attributes) $1, lexer.Location); + MemberName name = new MemberName (var.identifier); + + Event e = new EventField (current_container, (Expression) $4, (int) $2, + false, name, + var.expression_or_array_initializer, + (Attributes) $1, lexer.Location); CheckDef (current_container.AddEvent (e), e.Name, e.Location); @@ -1643,7 +1803,7 @@ event_declaration } | opt_attributes opt_modifiers - EVENT type member_name + EVENT type namespace_or_type_name OPEN_BRACE { implicit_value_parameter_type = (Expression) $4; @@ -1658,21 +1818,25 @@ event_declaration { Location loc = (Location) oob_stack.Pop (); + if ($8 == null){ + Report.Error (65, lexer.Location, "Event must have both add and remove accesors"); + $$ = null; + } else { Pair pair = (Pair) $8; - Accessor add_accessor = null; - Accessor rem_accessor = null; - if (pair.First != null) - add_accessor = (Accessor) pair.First; - if (pair.Second != null) - rem_accessor = (Accessor) pair.Second; - - Event e = new Event ((Expression) $4, (string) $5, null, (int) $2, add_accessor, rem_accessor, - (Attributes) $1, loc); + MemberName name = (MemberName) $5; + if (name.TypeArguments != null) + syntax_error (lexer.Location, "an event can't have type arguments"); + + Event e = new EventProperty (current_container, (Expression) $4, (int) $2, + false, name, null, (Attributes) $1, + (Accessor) pair.First, (Accessor) pair.Second, + loc); CheckDef (current_container.AddEvent (e), e.Name, loc); implicit_value_parameter_type = null; } + } ; event_accessor_declarations @@ -1684,6 +1848,8 @@ event_accessor_declarations { $$ = new Pair ($2, $1); } + | add_accessor_declaration { $$ = null; } + | remove_accessor_declaration { $$ = null; } ; add_accessor_declaration @@ -1764,8 +1930,15 @@ indexer_declaration Accessor get_block = (Accessor) pair.First; Accessor set_block = (Accessor) pair.Second; - indexer = new Indexer (current_container, decl.type, decl.interface_type, (int) $2, - decl.param_list, get_block, set_block, (Attributes) $1, loc); + MemberName name; + if (decl.interface_type != null) + name = new MemberName (decl.interface_type, "", null); + else + name = MemberName.Null; + + indexer = new Indexer (current_container, decl.type, (int) $2, false, + name, decl.param_list, (Attributes) $1, + get_block, set_block, loc); // Note that there is no equivalent of CheckDef for this case // We shall handle this in semantic analysis @@ -1789,14 +1962,18 @@ indexer_declarator $$ = new IndexerDeclaration ((Expression) $1, null, pars); } - | type qualified_identifier DOT THIS OPEN_BRACKET opt_formal_parameter_list CLOSE_BRACKET + | type namespace_or_type_name DOT THIS OPEN_BRACKET opt_formal_parameter_list CLOSE_BRACKET { Parameters pars = (Parameters) $6; if (pars.FixedParameters == null && pars.ArrayParameter == null){ Report.Error (1551, lexer.Location, "Indexers must have at least one parameter"); } - $$ = new IndexerDeclaration ((Expression) $1, (string) $2, pars); + MemberName name = (MemberName) $2; + if (name.TypeArguments != null) + syntax_error (lexer.Location, "an indexer can't have type arguments"); + + $$ = new IndexerDeclaration ((Expression) $1, name, pars); } ; @@ -1810,7 +1987,7 @@ enum_declaration { Location enum_location = lexer.Location; - string full_name = MakeName ((string) $4); + MemberName full_name = MakeName (new MemberName ((string) $4)); Enum e = new Enum (current_namespace, current_container, (Expression) $5, (int) $2, full_name, (Attributes) $1, enum_location); @@ -1823,8 +2000,9 @@ enum_declaration ev.identifier, loc); } - CheckDef (current_container.AddEnum (e), full_name, enum_location); - RootContext.Tree.RecordDecl (full_name, e); + string name = full_name.GetName (false); + CheckDef (current_container.AddEnum (e), name, enum_location); + RootContext.Tree.RecordDecl (name, e); } ; @@ -1882,73 +2060,72 @@ enum_member_declaration delegate_declaration : opt_attributes opt_modifiers - DELEGATE type - IDENTIFIER OPEN_PARENS - opt_formal_parameter_list - CLOSE_PARENS - SEMICOLON + DELEGATE type member_name + OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS { Location l = lexer.Location; - Delegate del = new Delegate (current_namespace, current_container, (Expression) $4, - (int) $2, MakeName ((string) $5), (Parameters) $7, - (Attributes) $1, l); + Delegate del = new Delegate ( + current_namespace, current_container, (Expression) $4, (int) $2, + MakeName ((MemberName) $5), (Parameters) $7, (Attributes) $1, l); CheckDef (current_container.AddDelegate (del), del.Name, l); - } + + current_delegate = del; + + lexer.ConstraintsParsing = true; + } + opt_type_parameter_constraints_clauses + { + lexer.ConstraintsParsing = false; + } + SEMICOLON + { + CheckDef (current_delegate.SetParameterInfo ((ArrayList) $9), current_delegate.Name, current_delegate.Location); + + current_delegate = null; + } | opt_attributes opt_modifiers - DELEGATE VOID - IDENTIFIER OPEN_PARENS - opt_formal_parameter_list - CLOSE_PARENS - SEMICOLON + DELEGATE VOID member_name + OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS { Location l = lexer.Location; Delegate del = new Delegate ( current_namespace, current_container, - TypeManager.system_void_expr, (int) $2, MakeName ((string) $5), + TypeManager.system_void_expr, (int) $2, MakeName ((MemberName) $5), (Parameters) $7, (Attributes) $1, l); CheckDef (current_container.AddDelegate (del), del.Name, l); - } - ; -type_name - : namespace_or_type_name - ; + current_delegate = del; -namespace_or_type_name - : IDENTIFIER opt_type_argument_list { - if ($2 == null) - $$ = new SimpleName ((string) $1, lexer.Location); - else - $$ = new ConstructedType ((string) $1, (TypeArguments) $2, lexer.Location); + lexer.ConstraintsParsing = true; + } + opt_type_parameter_constraints_clauses + { + lexer.ConstraintsParsing = false; } - | namespace_or_type_name DOT IDENTIFIER opt_type_argument_list + SEMICOLON { - Expression right; + CheckDef (current_delegate.SetParameterInfo ((ArrayList) $9), current_delegate.Name, current_delegate.Location); - // - // Third argument will become an Expression, when we have sorted out - // the issues with SimpleName first - // + current_delegate = null; + } + ; - if ($4 == null) - $$ = new MemberAccess ((Expression) $1, (string) $3, lexer.Location); - else - $$ = new GenericMemberAccess ((Expression) $1, (string) $3, - (TypeArguments) $4, lexer.Location); +namespace_or_type_name + : member_name + | namespace_or_type_name DOT IDENTIFIER opt_type_argument_list { + $$ = new MemberName ((MemberName) $1, (string) $3, (TypeArguments) $4); } - | namespace_or_type_name DOT DEFAULT - { - $$ = new DefaultValueExpression ((Expression) $1, lexer.Location); + ; + +member_name + : IDENTIFIER opt_type_argument_list { + $$ = new MemberName ((string) $1, (TypeArguments) $2); } ; -// -// TODO: -// Figure out what to do with the list -// opt_type_argument_list : /* empty */ { $$ = null; } | OP_GENERICS_LT type_arguments OP_GENERICS_GT @@ -1959,7 +2136,7 @@ opt_type_argument_list type_arguments : type { - TypeArguments type_args = new TypeArguments (); + TypeArguments type_args = new TypeArguments (lexer.Location); type_args.Add ((Expression) $1); $$ = type_args; } @@ -1977,7 +2154,9 @@ type_arguments * gets rid of a shift/reduce couple */ type - : type_name { /* class_type */ + : namespace_or_type_name + { + $$ = ((MemberName) $1).GetTypeExpression (lexer.Location); } | builtin_types | array_type @@ -2074,10 +2253,6 @@ integral_type | VOID { $$ = TypeManager.system_void_expr; } ; -interface_type - : type_name - ; - array_type : type rank_specifiers { @@ -2094,9 +2269,9 @@ primary_expression // 7.5.1: Literals } - | type_name + | member_name { - $$ = $1; + $$ = ((MemberName) $1).GetTypeExpression (lexer.Location); } | parenthesized_expression | default_value_expression @@ -2186,13 +2361,15 @@ parenthesized_expression ;; member_access - : primary_expression DOT IDENTIFIER + : primary_expression DOT IDENTIFIER opt_type_argument_list { - $$ = new MemberAccess ((Expression) $1, (string) $3, lexer.Location); + $$ = new MemberAccess ((Expression) $1, (string) $3, + (TypeArguments) $4, lexer.Location); } - | predefined_type DOT IDENTIFIER + | predefined_type DOT IDENTIFIER opt_type_argument_list { - $$ = new MemberAccess ((Expression) $1, (string) $3, lexer.Location); + $$ = new MemberAccess ((Expression) $1, (string) $3, + (TypeArguments) $4, lexer.Location); } ; @@ -2255,6 +2432,19 @@ argument { $$ = new Argument ((Expression) $2, Argument.AType.Out); } + | ARGLIST OPEN_PARENS argument_list CLOSE_PARENS + { + ArrayList list = (ArrayList) $3; + Argument[] args = new Argument [list.Count]; + list.CopyTo (args, 0); + + Expression expr = new Arglist (args, lexer.Location); + $$ = new Argument (expr, Argument.AType.Expression); + } + | ARGLIST + { + $$ = new Argument (new ArglistAccess (lexer.Location), Argument.AType.ArgList); + } ; variable_reference @@ -2274,7 +2464,7 @@ element_access // Foo.Bar.Blah i; // SimpleName is when you have // Blah i; - + Expression expr = (Expression) $1; if (expr is ComposedCast){ $$ = new ComposedCast (expr, (string) $2, lexer.Location); @@ -2503,13 +2693,21 @@ anonymous_method_expression : DELEGATE opt_anonymous_method_signature { oob_stack.Push (current_local_parameters); current_local_parameters = (Parameters)$2; + create_toplevel_block = true; } block { - if (!RootContext.V2){ - Report.Error (-213, lexer.Location, "Anonymous methods are only supported in V2"); + if (true){ + Report.Error (-213, lexer.Location, "Anonymous methods are not supported in this branch"); $$ = null; - } else - $$ = new AnonymousMethod ((Parameters) $2, (Block) $4, lexer.Location); - current_local_parameters = (Parameters) oob_stack.Pop (); + } else { + create_toplevel_block = false; + Report.Error (-213, lexer.Location, "Anonymous methods are only supported in V2"); + if (!RootContext.V2){ + Report.Error (-213, lexer.Location, "Anonymous methods are only supported in V2"); + $$ = null; + } else + $$ = new AnonymousMethod ((Parameters) $2, (Block) $4, lexer.Location); + current_local_parameters = (Parameters) oob_stack.Pop (); + } } ; @@ -2559,13 +2757,9 @@ anonymous_method_parameter ; default_value_expression - : primary_expression DOT DEFAULT - { - $$ = new DefaultValueExpression ((Expression) $1, lexer.Location); - } - | predefined_type DOT DEFAULT + : DEFAULT_OPEN_PARENS type CLOSE_PARENS { - $$ = new DefaultValueExpression ((Expression) $1, lexer.Location); + $$ = new DefaultValueExpression ((Expression) $2, lexer.Location); } ; @@ -2893,48 +3087,42 @@ boolean_expression class_declaration : opt_attributes opt_modifiers - CLASS IDENTIFIER + CLASS member_name { Class new_class; - string name; - name = MakeName ((string) $4); + MemberName name = MakeName ((MemberName) $4); new_class = new Class (current_namespace, current_container, name, (int) $2, (Attributes) $1, lexer.Location); current_container = new_class; - RootContext.Tree.RecordDecl (name, new_class); + RootContext.Tree.RecordDecl (name.GetName (true), new_class); + + lexer.ConstraintsParsing = true; } - opt_type_parameter_list opt_class_base opt_type_parameter_constraints_clauses + { + lexer.ConstraintsParsing = false; + } class_body opt_semicolon { Class new_class = (Class) current_container; - if ($8 != null && $6 == null) - Report.Error (-200, new_class.Location, - "Type parameter constraints only valid if there is a type parameter list"); + CheckDef (new_class.SetParameterInfo ((ArrayList) $7), new_class.Name, new_class.Location); + if ($6 != null) { + if (new_class.Name == "System.Object") { + Report.Error (537, new_class.Location, "The class System.Object cannot have a base class or implement an interface."); + } - if ($6 != null) - CheckDef (new_class.SetParameterInfo ((ArrayList) $6, (ArrayList) $8), new_class.Name, new_class.Location); - if ($7 != null) - new_class.Bases = (ArrayList) $7; + new_class.Bases = (ArrayList) $6; + } current_container = current_container.Parent; CheckDef (current_container.AddClass (new_class), new_class.Name, new_class.Location); $$ = new_class; } - | opt_attributes - opt_modifiers - CLASS IDENTIFIER - WHERE { - Report.Error (-200, lexer.Location, - "Type parameter constraints only valid if there is a type parameter list"); - yyErrorFlag = 0; - $$ = null; - } ; opt_modifiers @@ -2983,37 +3171,6 @@ class_base : COLON type_list { $$ = $2; } ; -opt_type_parameter_list - : /* empty */ { $$ = null; } - | type_parameter_list { $$ = $1; } - ; - -type_parameter_list - : OP_GENERICS_LT type_parameters OP_GENERICS_GT { $$ = $2; } - ; - -type_parameters - : type_parameter { - // - // Do some profiling to find the optimal size, for now we - // assume most people will be generic on one type (saves space - // - ArrayList type_parameters = new ArrayList (1); - type_parameters.Add ($1); - $$ = type_parameters; - } - | type_parameters COMMA type_parameter { - ArrayList type_parameters = (ArrayList) $1; - - type_parameters.Add ($3); - $$ = type_parameters; - } - ; - -type_parameter - : IDENTIFIER - ; - opt_type_parameter_constraints_clauses : /* empty */ { $$ = null; } | type_parameter_constraints_clauses @@ -3021,7 +3178,11 @@ opt_type_parameter_constraints_clauses ; type_parameter_constraints_clauses - : type_parameter_constraints_clause + : type_parameter_constraints_clause { + ArrayList constraints = new ArrayList (1); + constraints.Add ($1); + $$ = constraints; + } | type_parameter_constraints_clauses type_parameter_constraints_clause { ArrayList constraints = (ArrayList) $1; @@ -3031,10 +3192,8 @@ type_parameter_constraints_clauses ; type_parameter_constraints_clause - : WHERE type_parameter COLON type_parameter_constraints { - ArrayList constraints = new ArrayList (1); - constraints.Add (new Constraints ((string) $2, (ArrayList) $4, lexer.Location)); - $$ = constraints; + : WHERE IDENTIFIER COLON type_parameter_constraints { + $$ = new Constraints ((string) $2, (ArrayList) $4, lexer.Location); } ; @@ -3055,7 +3214,13 @@ type_parameter_constraints type_parameter_constraint : type | NEW OPEN_PARENS CLOSE_PARENS { - $$ = true; + $$ = SpecialConstraint.Constructor; + } + | CLASS { + $$ = SpecialConstraint.ReferenceType; + } + | STRUCT { + $$ = SpecialConstraint.ValueType; } ; @@ -3075,8 +3240,12 @@ type_parameter_constraint block : OPEN_BRACE { + if (current_block == null || create_toplevel_block){ + current_block = new ToplevelBlock (current_local_parameters, lexer.Location); + } else { current_block = new Block (current_block, current_local_parameters, lexer.Location, Location.Null); + } } opt_statement_list CLOSE_BRACE { @@ -3106,17 +3275,14 @@ statement current_block = (Block) $1; } } - | embedded_statement + | valid_declaration_statement { - Statement s = (Statement) $1; - - current_block.AddStatement ((Statement) $1); } | labeled_statement ; -embedded_statement +valid_declaration_statement : block | empty_statement | expression_statement @@ -3132,10 +3298,24 @@ embedded_statement | fixed_statement ; +embedded_statement + : valid_declaration_statement + | declaration_statement + { + Report.Error (1023, lexer.Location, "An embedded statement may not be a declaration."); + $$ = null; + } + | labeled_statement + { + Report.Error (1023, lexer.Location, "An embedded statement may not be a labeled statement."); + $$ = null; + } + ; + empty_statement : SEMICOLON { - $$ = new EmptyStatement (); + $$ = EmptyStatement.Value; } ; @@ -3144,11 +3324,8 @@ labeled_statement { LabeledStatement labeled = new LabeledStatement ((string) $1, lexer.Location); - if (!current_block.AddLabel ((string) $1, labeled)){ - Location l = lexer.Location; - Report.Error (140, l, "The label '" + ((string) $1) + "' is a duplicate"); - } - current_block.AddStatement (labeled); + if (current_block.AddLabel ((string) $1, labeled, lexer.Location)) + current_block.AddStatement (labeled); } statement ; @@ -3187,7 +3364,7 @@ local_variable_type // Ok, the above "primary_expression" is there to get rid of // both reduce/reduce and shift/reduces in the grammar, it should // really just be "type_name". If you use type_name, a reduce/reduce - // creeps up. If you use qualified_identifier (which is all we need + // creeps up. If you use namespace_or_type_name (which is all we need // really) two shift/reduces appear. // @@ -3341,7 +3518,7 @@ if_statement_rest $$ = new If ((Expression) $1, (Statement) $3, l); if (RootContext.WarningLevel >= 3){ - if ($3 is EmptyStatement) + if ($3 == EmptyStatement.Value) Report.Warning (642, lexer.Location, "Possibly mistaken empty statement"); } @@ -3463,7 +3640,7 @@ while_statement $$ = new While ((Expression) $4, (Statement) $6, l); if (RootContext.WarningLevel >= 3){ - if ($6 is EmptyStatement) + if ($6 == EmptyStatement.Value) Report.Warning (642, lexer.Location, "Possibly mistaken empty statement"); } } @@ -3538,7 +3715,7 @@ for_statement For f = new For ((Statement) $3, (Expression) $6, (Statement) $8, (Statement) $10, l); if (RootContext.WarningLevel >= 3){ - if ($10 is EmptyStatement) + if ($10 == EmptyStatement.Value) Report.Warning (642, lexer.Location, "Possibly mistaken empty statement"); } @@ -3551,7 +3728,7 @@ for_statement ; opt_for_initializer - : /* empty */ { $$ = new EmptyStatement (); } + : /* empty */ { $$ = EmptyStatement.Value; } | for_initializer ; @@ -3566,7 +3743,7 @@ opt_for_condition ; opt_for_iterator - : /* empty */ { $$ = new EmptyStatement (); } + : /* empty */ { $$ = EmptyStatement.Value; } | for_iterator ; @@ -3601,7 +3778,7 @@ foreach_statement { oob_stack.Push (current_block); - Block foreach_block = new Block (current_block, Block.Flags.Implicit); + Block foreach_block = new Block (current_block); LocalVariableReference v = null; Location l = lexer.Location; LocalInfo vi; @@ -3689,8 +3866,17 @@ throw_statement ; yield_statement - : YIELD RETURN expression SEMICOLON + : IDENTIFIER RETURN expression SEMICOLON { + string s = (string) $1; + if (s != "yield"){ + Report.Error (1003, lexer.Location, "; expected"); + $$ = null; + } + if (!RootContext.V2){ + Report.Error (-222, lexer.Location, "yield statement only available in C# 2.0 mode"); + $$ = null; + } if (iterator_container == null){ Report.Error (204, lexer.Location, "yield statement can only be used within a method, operator or property"); $$ = null; @@ -3699,18 +3885,17 @@ yield_statement $$ = new Yield ((Expression) $3, lexer.Location); } } - | YIELD expression SEMICOLON + | IDENTIFIER BREAK SEMICOLON { - if (iterator_container == null){ - Report.Error (204, lexer.Location, "yield statement can only be used within a method, operator or property"); + string s = (string) $1; + if (s != "yield"){ + Report.Error (1003, lexer.Location, "; expected"); + $$ = null; + } + if (!RootContext.V2){ + Report.Error (-222, lexer.Location, "yield statement only available in C# 2.0 mode"); $$ = null; - } else { - iterator_container.SetYields (); - $$ = new Yield ((Expression) $2, lexer.Location); } - } - | YIELD BREAK SEMICOLON - { if (iterator_container == null){ Report.Error (204, lexer.Location, "yield statement can only be used within a method, operator or property"); $$ = null; @@ -3908,10 +4093,7 @@ fixed_statement embedded_statement { Location l = (Location) oob_stack.Pop (); - Block assign_block = (Block) oob_stack.Pop (); - - ArrayList list = (ArrayList) $4; - int top = list.Count; + oob_stack.Pop (); $$ = new Fixed ((Expression) $3, (ArrayList) $4, (Statement) $7, l); } @@ -4040,16 +4222,34 @@ public class VariableDeclaration { } } +/// +/// Used to pass around interface property information +/// +public class InterfaceAccessorInfo { + + public readonly Accessor Get, Set; + + public InterfaceAccessorInfo (bool has_get, bool has_set, + Attributes get_attrs, Attributes set_attrs) + { + if (has_get) + Get = new Accessor (null, get_attrs); + if (has_set) + Set = new Accessor (null, set_attrs); + } +} + + // // A class used to hold info about an indexer declarator // - public class IndexerDeclaration { public Expression type; - public string interface_type; + public MemberName interface_type; public Parameters param_list; - public IndexerDeclaration (Expression type, string interface_type, Parameters param_list) + public IndexerDeclaration (Expression type, MemberName interface_type, + Parameters param_list) { this.type = type; this.interface_type = interface_type; @@ -4057,10 +4257,28 @@ public class IndexerDeclaration { } } +// +// We use this when we do not have an object in advance that is an IIteratorContainer +// +public class SimpleIteratorContainer : IIteratorContainer { + public bool Yields; + + public static SimpleIteratorContainer Simple = new SimpleIteratorContainer (); + + // + // Reset and return + // + public static SimpleIteratorContainer GetSimple () { + Simple.Yields = false; + return Simple; + } + + public void SetYields () { Yields = true; } +} + // // A class used to hold info about an operator declarator // - public class OperatorDeclaration { public Operator.OpType optype; public Expression ret_type, arg1type, arg2type; @@ -4095,19 +4313,19 @@ void Error_ExpectingTypeName (Location l, Expression expr) // Given the @class_name name, it creates a fully qualified name // based on the containing declaration space // -string -MakeName (string class_name) +MemberName +MakeName (MemberName class_name) { string ns = current_namespace.FullName; - string container_name = current_container.Name; - if (container_name == ""){ + if (current_container.Name == ""){ if (ns != "") - return ns + "." + class_name; + return new MemberName (new MemberName (ns), class_name); else return class_name; - } else - return container_name + "." + class_name; + } else { + return new MemberName (current_container.MemberName, class_name); + } } // @@ -4161,23 +4379,6 @@ CheckDef (bool result, string name, Location l) CheckDef (DeclSpace.AdditionResult.NameExists, name, l); } -Expression DecomposeQI (string name, Location loc) -{ - Expression o; - - if (name.IndexOf ('.') == -1){ - return new SimpleName (name, loc); - } else { - int pos = name.LastIndexOf ("."); - string left = name.Substring (0, pos); - string right = name.Substring (pos + 1); - - o = DecomposeQI (left, loc); - - return new MemberAccess (o, right, loc); - } -} - Block declare_local_variables (Expression type, ArrayList variable_declarators, Location loc) { Block implicit_block; @@ -4198,10 +4399,9 @@ Block declare_local_variables (Expression type, ArrayList variable_declarators, // // int j = 1; int k = j + 1; // - if (current_block.Used) { + if (current_block.Used) implicit_block = new Block (current_block, Block.Flags.Implicit, loc, Location.Null); - implicit_block.AddChildVariableNames (current_block); - } else + else implicit_block = current_block; foreach (VariableDeclaration decl in variable_declarators){ @@ -4263,7 +4463,7 @@ void CheckAttributeTarget (string a) { switch (a) { - case "assembly" : case "field" : case "method" : case "param" : case "property" : case "type" : + case "assembly" : case "module" : case "field" : case "method" : case "param" : case "property" : case "type" : return; default :