X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fcs-parser.jay;h=97cfaaca0e8b225f0171d73bc31ad0d183b6a7f6;hb=f37e86ff58d7b5a47484e60aded45bf8b98ae918;hp=c65a7ae5e72bc2515cfe0459246444d69c82e381;hpb=8209756fd0f550df18bb26eb88611b70670ff9aa;p=mono.git diff --git a/mcs/mcs/cs-parser.jay b/mcs/mcs/cs-parser.jay index c65a7ae5e72..97cfaaca0e8 100644 --- a/mcs/mcs/cs-parser.jay +++ b/mcs/mcs/cs-parser.jay @@ -35,7 +35,8 @@ namespace Mono.CSharp Arglist = 1 << 5, DefaultValue = 1 << 6, - All = Ref | Out | This | Params | Arglist | DefaultValue + All = Ref | Out | This | Params | Arglist | DefaultValue, + PrimaryConstructor = Ref | Out | Params | DefaultValue } static readonly object ModifierNone = 0; @@ -54,7 +55,7 @@ namespace Mono.CSharp /// Block current_block; - BlockVariableDeclaration current_variable; + BlockVariable current_variable; Delegate current_delegate; @@ -116,6 +117,8 @@ namespace Mono.CSharp // Keeps track of global data changes to undo on parser error // public Undo undo; + + bool? interactive_async; Stack linq_clause_blocks; @@ -139,6 +142,7 @@ namespace Mono.CSharp // LocationsBag lbag; List> mod_locations; + Stack location_stack; %} %token EOF @@ -416,7 +420,7 @@ extern_alias_directives extern_alias_directive : EXTERN_ALIAS IDENTIFIER IDENTIFIER SEMICOLON { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; string s = lt.Value; if (s != "alias") { syntax_error (lt.Location, "`alias' expected"); @@ -424,7 +428,7 @@ extern_alias_directive if (lang_version == LanguageVersion.ISO_1) FeatureIsNotAvailable (lt.Location, "external alias"); - lt = (Tokenizer.LocatedToken) $3; + lt = (LocatedToken) $3; if (lt.Value == QualifiedAliasMember.GlobalAlias) { RootNamespace.Error_GlobalNamespaceRedefined (report, lt.Location); } @@ -464,7 +468,7 @@ using_namespace } | USING IDENTIFIER ASSIGN namespace_or_type_expr SEMICOLON { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; if (lang_version != LanguageVersion.ISO_1 && lt.Value == "global") { report.Warning (440, 2, lt.Location, "An alias named `global' will not be used when resolving `global::'. The global namespace will be used instead"); @@ -554,13 +558,14 @@ opt_semicolon_error namespace_name : IDENTIFIER { - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; $$ = new MemberName (lt.Value, lt.Location); } | namespace_name DOT IDENTIFIER { - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; $$ = new MemberName ((MemberName) $1, lt.Value, lt.Location); + lbag.AddLocation ($$, GetLocation ($2)); } | error { @@ -666,7 +671,7 @@ attribute_sections var sect = (List) $2; if (attrs == null) attrs = new Attributes (sect); - else + else if (sect != null) attrs.AddAttributes (sect); $$ = attrs; } @@ -675,6 +680,7 @@ attribute_sections attribute_section : OPEN_BRACKET { + PushLocation (GetLocation ($1)); lexer.parsing_attribute_section = true; } attribute_section_cont @@ -700,18 +706,32 @@ attribute_section_cont else $$ = $4; + lbag.InsertLocation ($$, 0, PopLocation ()); + if ($5 != null) { + lbag.AddLocation ($$, GetLocation ($2), GetLocation ($5), GetLocation ($6)); + } else { + lbag.AddLocation ($$, GetLocation ($2), GetLocation ($6)); + } + current_attr_target = null; lexer.parsing_attribute_section = false; } | attribute_list opt_comma CLOSE_BRACKET { $$ = $1; + + lbag.InsertLocation ($$, 0, PopLocation ()); + if ($2 != null) { + lbag.AddLocation ($$, GetLocation($2), GetLocation ($3)); + } else { + lbag.AddLocation ($$, GetLocation($3)); + } } | IDENTIFIER error { Error_SyntaxError (yyToken); - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; var tne = new SimpleName (lt.Value, null, lt.Location); $$ = new List () { @@ -720,7 +740,7 @@ attribute_section_cont } | error { - $$ = CheckAttributeTarget (GetTokenName (yyToken), GetLocation ($1)); + CheckAttributeTarget (yyToken, GetTokenName (yyToken), GetLocation ($1)); $$ = null; } ; @@ -728,8 +748,8 @@ attribute_section_cont attribute_target : IDENTIFIER { - var lt = (Tokenizer.LocatedToken) $1; - $$ = CheckAttributeTarget (lt.Value, lt.Location); + var lt = (LocatedToken) $1; + $$ = CheckAttributeTarget (yyToken, lt.Value, lt.Location); } | EVENT { $$ = "event"; } | RETURN { $$ = "return"; } @@ -743,7 +763,10 @@ attribute_list | attribute_list COMMA attribute { var attrs = (List) $1; - attrs.Add ((Attribute) $3); + if (attrs != null) { + attrs.Add ((Attribute) $3); + lbag.AppendTo (attrs, GetLocation ($2)); + } $$ = attrs; } @@ -840,14 +863,14 @@ named_attribute_argument expression { --lexer.parsing_block; - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; $$ = new NamedArgument (lt.Value, lt.Location, (Expression) $4); lbag.AddLocation ($$, GetLocation($2)); } ; named_argument - : identifier_inside_body COLON opt_named_modifier expression + : identifier_inside_body COLON opt_named_modifier expression_or_error { if (lang_version <= LanguageVersion.V_3) FeatureIsNotAvailable (GetLocation ($1), "named argument"); @@ -855,7 +878,7 @@ named_argument // Avoid boxing in common case (no modifier) var arg_mod = $3 == null ? Argument.AType.None : (Argument.AType) $3; - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; $$ = new NamedArgument (lt.Value, lt.Location, (Expression) $4, arg_mod); lbag.AddLocation ($$, GetLocation($2)); } @@ -882,10 +905,12 @@ class_member_declarations : class_member_declaration { lexer.parsing_modifiers = true; + lexer.parsing_block = 0; } | class_member_declarations class_member_declaration { lexer.parsing_modifiers = true; + lexer.parsing_block = 0; } ; @@ -921,15 +946,21 @@ struct_declaration type_declaration_name { lexer.ConstraintsParsing = true; + valid_param_mod = ParameterModifierType.PrimaryConstructor; push_current_container (new Struct (current_container, (MemberName) $6, (Modifiers) $2, (Attributes) $1), $3); } + opt_primary_parameters opt_class_base opt_type_parameter_constraints_clauses { + valid_param_mod = 0; lexer.ConstraintsParsing = false; - if ($9 != null) - current_container.SetConstraints ((List) $9); + if ($8 != null) + current_type.PrimaryConstructorParameters = (ParametersCompiled) $8; + + if ($10 != null) + current_container.SetConstraints ((List) $10); if (doc_support) current_container.PartialContainer.DocComment = Lexer.consume_doc_comment (); @@ -951,7 +982,11 @@ struct_declaration } opt_semicolon { - lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($14), GetLocation ($16)); + if ($16 == null) { + lbag.AppendToMember (current_container, GetLocation ($12), GetLocation ($15)); + } else { + lbag.AppendToMember (current_container, GetLocation ($12), GetLocation ($15), GetLocation ($17)); + } $$ = pop_current_class (); } | opt_attributes opt_modifiers opt_partial STRUCT error @@ -965,7 +1000,7 @@ constant_declaration opt_modifiers CONST type IDENTIFIER { - var lt = (Tokenizer.LocatedToken) $5; + var lt = (LocatedToken) $5; var mod = (Modifiers) $2; current_field = new Const (current_type, (FullNamedExpression) $4, mod, new MemberName (lt.Value, lt.Location), (Attributes) $1); current_type.AddMember (current_field); @@ -1016,7 +1051,7 @@ constant_declarators constant_declarator : COMMA IDENTIFIER constant_initializer { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (ConstInitializer) $3); lbag.AddLocation ($$, GetLocation ($1)); } @@ -1055,7 +1090,7 @@ field_declaration if (type.Type != null && type.Type.Kind == MemberKind.Void) report.Error (670, GetLocation ($3), "Fields cannot have void type"); - var lt = (Tokenizer.LocatedToken) $4; + var lt = (LocatedToken) $4; current_field = new Field (current_type, type, (Modifiers) $2, new MemberName (lt.Value, lt.Location), (Attributes) $1); current_type.AddField (current_field); $$ = current_field; @@ -1080,7 +1115,7 @@ field_declaration if (lang_version < LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation ($3), "fixed size buffers"); - var lt = (Tokenizer.LocatedToken) $5; + var lt = (LocatedToken) $5; current_field = new FixedField (current_type, (FullNamedExpression) $4, (Modifiers) $2, new MemberName (lt.Value, lt.Location), (Attributes) $1); @@ -1119,6 +1154,7 @@ opt_field_initializer { --lexer.parsing_block; current_field.Initializer = (Expression) $3; + lbag.AppendToMember (current_field, GetLocation ($1)); end_block (lexer.Location); current_local_parameters = null; } @@ -1143,7 +1179,7 @@ field_declarators field_declarator : COMMA IDENTIFIER { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), null); lbag.AddLocation ($$, GetLocation ($1)); } @@ -1154,7 +1190,7 @@ field_declarator variable_initializer { --lexer.parsing_block; - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (Expression) $5); lbag.AddLocation ($$, GetLocation ($1), GetLocation ($3)); } @@ -1179,7 +1215,7 @@ fixed_field_declarators fixed_field_declarator : COMMA IDENTIFIER fixed_field_size { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (ConstInitializer) $3); lbag.AddLocation ($$, GetLocation ($1)); } @@ -1323,8 +1359,10 @@ method_header current_type.AddMember (method); - if ($11 != null) - method.SetConstraints ((List) $11); + async_block = (method.ModFlags & Modifiers.ASYNC) != 0; + + if ($12 != null) + method.SetConstraints ((List) $12); if (doc_support) method.DocComment = Lexer.consume_doc_comment (); @@ -1487,7 +1525,7 @@ fixed_parameter parameter_type identifier_inside_body { - var lt = (Tokenizer.LocatedToken) $4; + var lt = (LocatedToken) $4; $$ = new Parameter ((FullNamedExpression) $3, lt.Value, (Parameter.Modifier) $2, (Attributes) $1, lt.Location); } | opt_attributes @@ -1495,7 +1533,7 @@ fixed_parameter parameter_type identifier_inside_body OPEN_BRACKET CLOSE_BRACKET { - var lt = (Tokenizer.LocatedToken) $4; + var lt = (LocatedToken) $4; report.Error (1552, lt.Location, "Array type specifier, [], must appear before parameter name"); $$ = new Parameter ((FullNamedExpression) $3, lt.Value, (Parameter.Modifier) $2, (Attributes) $1, lt.Location); } @@ -1552,7 +1590,7 @@ fixed_parameter if ((valid_param_mod & ParameterModifierType.DefaultValue) == 0) report.Error (1065, GetLocation ($5), "Optional parameter is not valid in this context"); - var lt = (Tokenizer.LocatedToken) $4; + var lt = (LocatedToken) $4; $$ = new Parameter ((FullNamedExpression) $3, lt.Value, mod, (Attributes) $1, lt.Location); lbag.AddLocation ($$, GetLocation ($5)); @@ -1624,14 +1662,14 @@ parameter_modifier parameter_array : opt_attributes params_modifier type IDENTIFIER { - var lt = (Tokenizer.LocatedToken) $4; + var lt = (LocatedToken) $4; $$ = new ParamsParameter ((FullNamedExpression) $3, lt.Value, (Attributes) $1, lt.Location); } | opt_attributes params_modifier type IDENTIFIER ASSIGN constant_expression { report.Error (1751, GetLocation ($2), "Cannot specify a default value for a parameter array"); - var lt = (Tokenizer.LocatedToken) $4; + var lt = (LocatedToken) $4; $$ = new ParamsParameter ((FullNamedExpression) $3, lt.Value, (Attributes) $1, lt.Location); } | opt_attributes params_modifier type error @@ -1917,7 +1955,11 @@ interface_declaration } opt_semicolon { - lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13)); + if ($15 == null) { + lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13)); + } else { + lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13), GetLocation ($15)); + } $$ = pop_current_class (); } | opt_attributes opt_modifiers opt_partial INTERFACE error @@ -1935,10 +1977,12 @@ interface_member_declarations : interface_member_declaration { lexer.parsing_modifiers = true; + lexer.parsing_block = 0; } | interface_member_declarations interface_member_declaration { lexer.parsing_modifiers = true; + lexer.parsing_block = 0; } ; @@ -2043,11 +2087,11 @@ operator_declarator Operator.GetName (op)); } } else { - if (p_count > 2) { + if (p_count == 1) { + report.Error (1019, loc, "Overloadable unary operator expected"); + } else if (p_count != 2) { report.Error (1534, loc, "Overloaded binary operator `{0}' takes two parameters", Operator.GetName (op)); - } else if (p_count != 2) { - report.Error (1019, loc, "Overloadable unary operator expected"); } } @@ -2184,7 +2228,7 @@ constructor_declarator valid_param_mod = 0; current_local_parameters = (ParametersCompiled) $6; - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; var mods = (Modifiers) $2; var c = new Constructor (current_type, lt.Value, mods, (Attributes) $1, current_local_parameters, lt.Location); @@ -2281,7 +2325,7 @@ destructor_declaration } IDENTIFIER OPEN_PARENS CLOSE_PARENS method_body { - var lt = (Tokenizer.LocatedToken) $5; + var lt = (LocatedToken) $5; if (lt.Value != current_container.MemberName.Name){ report.Error (574, lt.Location, "Name of destructor must match name of class"); } else if (current_container.Kind != MemberKind.Class){ @@ -2399,7 +2443,7 @@ event_declarators event_declarator : COMMA IDENTIFIER { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), null); lbag.AddLocation ($$, GetLocation ($1)); } @@ -2410,7 +2454,7 @@ event_declarator event_variable_initializer { --lexer.parsing_block; - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (Expression) $5); lbag.AddLocation ($$, GetLocation ($1), GetLocation ($3)); } @@ -2568,6 +2612,8 @@ enum_declaration } opt_enum_member_declarations { + lexer.parsing_modifiers = true; + // here will be evaluated after CLOSE_BLACE is consumed. if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; @@ -2625,7 +2671,7 @@ enum_member_declarations enum_member_declaration : opt_attributes IDENTIFIER { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; var em = new EnumMember ((Enum) current_type, new MemberName (lt.Value, lt.Location), (Attributes) $1); ((Enum) current_type).AddEnumMember (em); @@ -2648,7 +2694,7 @@ enum_member_declaration { --lexer.parsing_block; - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; var em = new EnumMember ((Enum) current_type, new MemberName (lt.Value, lt.Location), (Attributes) $1); em.Initializer = new ConstInitializer (em, (Expression) $5, GetLocation ($4)); ((Enum) current_type).AddEnumMember (em); @@ -2662,7 +2708,7 @@ enum_member_declaration { Error_SyntaxError (yyToken); - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; var em = new EnumMember ((Enum) current_type, new MemberName (lt.Value, lt.Location), (Attributes) $1); ((Enum) current_type).AddEnumMember (em); @@ -2736,8 +2782,8 @@ namespace_or_type_expr : member_name | qualified_alias_member IDENTIFIER opt_type_argument_list { - var lt1 = (Tokenizer.LocatedToken) $1; - var lt2 = (Tokenizer.LocatedToken) $2; + var lt1 = (LocatedToken) $1; + var lt2 = (LocatedToken) $2; $$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (TypeArguments) $3, lt1.Location); lbag.AddLocation ($$, GetLocation ($2)); @@ -2748,7 +2794,7 @@ member_name : simple_name_expr | namespace_or_type_expr DOT IDENTIFIER opt_type_argument_list { - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; $$ = new MemberAccess ((Expression) $1, lt.Value, (TypeArguments) $4, lt.Location); lbag.AddLocation ($$, GetLocation ($2)); } @@ -2757,7 +2803,7 @@ member_name simple_name_expr : IDENTIFIER opt_type_argument_list { - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; $$ = new SimpleName (lt.Value, (TypeArguments)$2, lt.Location); } ; @@ -2807,7 +2853,7 @@ type_declaration_name opt_type_parameter_list { lexer.parsing_generic_declaration = false; - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; $$ = new MemberName (lt.Value, (TypeParameters)$3, lt.Location); } ; @@ -2827,7 +2873,7 @@ method_declaration_name | explicit_interface IDENTIFIER opt_type_parameter_list { lexer.parsing_generic_declaration = false; - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; $$ = new MemberName (lt.Value, (TypeParameters) $3, (ATypeNameExpression) $1, lt.Location); } ; @@ -2848,21 +2894,21 @@ indexer_declaration_name explicit_interface : IDENTIFIER opt_type_argument_list DOT { - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; $$ = new SimpleName (lt.Value, (TypeArguments) $2, lt.Location); lbag.AddLocation ($$, GetLocation ($3)); } | qualified_alias_member IDENTIFIER opt_type_argument_list DOT { - var lt1 = (Tokenizer.LocatedToken) $1; - var lt2 = (Tokenizer.LocatedToken) $2; + var lt1 = (LocatedToken) $1; + var lt2 = (LocatedToken) $2; $$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (TypeArguments) $3, lt1.Location); lbag.AddLocation ($$, GetLocation ($4)); } | explicit_interface IDENTIFIER opt_type_argument_list DOT { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; $$ = new MemberAccess ((ATypeNameExpression) $1, lt.Value, (TypeArguments) $3, lt.Location); lbag.AddLocation ($$, GetLocation ($4)); } @@ -2899,8 +2945,8 @@ type_parameters type_parameter : opt_attributes opt_type_parameter_variance IDENTIFIER { - var lt = (Tokenizer.LocatedToken)$3; - $$ = new TypeParameter (new MemberName (lt.Value, lt.Location), (Attributes)$1, (Variance) $2); + var lt = (LocatedToken)$3; + $$ = new TypeParameter (new MemberName (lt.Value, lt.Location), (Attributes)$1, (VarianceDecl) $2); } | error { @@ -2909,7 +2955,7 @@ type_parameter else Error_SyntaxError (yyToken); - $$ = new TypeParameter (MemberName.Null, null, Variance.None); + $$ = new TypeParameter (MemberName.Null, null, null); } ; @@ -3083,11 +3129,11 @@ primary_expression primary_expression_or_type : IDENTIFIER opt_type_argument_list { - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; $$ = new SimpleName (lt.Value, (TypeArguments)$2, lt.Location); } | IDENTIFIER GENERATE_COMPLETION { - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; $$ = new CompletionSimpleName (MemberName.MakeName (lt.Value, null), lt.Location); } | member_access @@ -3140,26 +3186,32 @@ parenthesized_expression member_access : primary_expression DOT identifier_inside_body opt_type_argument_list { - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; $$ = new MemberAccess ((Expression) $1, lt.Value, (TypeArguments) $4, lt.Location); lbag.AddLocation ($$, GetLocation ($2)); } | builtin_types DOT identifier_inside_body opt_type_argument_list { - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; $$ = new MemberAccess ((Expression) $1, lt.Value, (TypeArguments) $4, lt.Location); lbag.AddLocation ($$, GetLocation ($2)); } | BASE DOT identifier_inside_body opt_type_argument_list { - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; $$ = new MemberAccess (new BaseThis (GetLocation ($1)), lt.Value, (TypeArguments) $4, lt.Location); lbag.AddLocation ($$, GetLocation ($2)); } + | AWAIT DOT identifier_inside_body opt_type_argument_list + { + var lt = (LocatedToken) $3; + $$ = new MemberAccess (new SimpleName ("await", ((LocatedToken) $1).Location), lt.Value, (TypeArguments) $4, lt.Location); + lbag.AddLocation ($$, GetLocation ($2)); + } | qualified_alias_member identifier_inside_body opt_type_argument_list { - var lt1 = (Tokenizer.LocatedToken) $1; - var lt2 = (Tokenizer.LocatedToken) $2; + var lt1 = (LocatedToken) $1; + var lt2 = (LocatedToken) $2; $$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (TypeArguments) $3, lt1.Location); lbag.AddLocation ($$, GetLocation ($2)); @@ -3168,7 +3220,7 @@ member_access $$ = new CompletionMemberAccess ((Expression) $1, null,GetLocation ($3)); } | primary_expression DOT IDENTIFIER GENERATE_COMPLETION { - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; $$ = new CompletionMemberAccess ((Expression) $1, lt.Value, lt.Location); } | builtin_types DOT GENERATE_COMPLETION @@ -3176,7 +3228,7 @@ member_access $$ = new CompletionMemberAccess ((Expression) $1, null, lexer.Location); } | builtin_types DOT IDENTIFIER GENERATE_COMPLETION { - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; $$ = new CompletionMemberAccess ((Expression) $1, lt.Value, lt.Location); } ; @@ -3255,13 +3307,13 @@ member_initializer_list member_initializer : IDENTIFIER ASSIGN initializer_value { - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; $$ = new ElementInitializer (lt.Value, (Expression)$3, lt.Location); lbag.AddLocation ($$, GetLocation ($2)); } | AWAIT ASSIGN initializer_value { - var lt = (Tokenizer.LocatedToken) Error_AwaitAsIdentifier ($1); + var lt = (LocatedToken) Error_AwaitAsIdentifier ($1); $$ = new ElementInitializer (lt.Value, (Expression)$3, lt.Location); lbag.AddLocation ($$, GetLocation ($2)); } @@ -3279,15 +3331,18 @@ member_initializer | OPEN_BRACE expression_list CLOSE_BRACE { if ($2 == null) - $$ = null; + $$ = new CollectionElementInitializer (GetLocation ($1)); else $$ = new CollectionElementInitializer ((List)$2, GetLocation ($1)); + + lbag.AddLocation ($$, GetLocation ($2)); } | OPEN_BRACE CLOSE_BRACE { report.Error (1920, GetLocation ($1), "An element initializer cannot be empty"); - $$ = null; - } + $$ = new CollectionElementInitializer (GetLocation ($1)); + lbag.AddLocation ($$, GetLocation ($2)); + } ; initializer_value @@ -3403,22 +3458,18 @@ element_access ; expression_list - : expression + : expression_or_error { var list = new List (4); list.Add ((Expression) $1); $$ = list; } - | expression_list COMMA expression + | expression_list COMMA expression_or_error { var list = (List) $1; list.Add ((Expression) $3); $$ = list; } - | expression_list error { - Error_SyntaxError (yyToken); - $$ = $1; - } ; expression_list_arguments @@ -3594,13 +3645,13 @@ anonymous_type_parameters anonymous_type_parameter : identifier_inside_body ASSIGN variable_initializer { - var lt = (Tokenizer.LocatedToken)$1; + var lt = (LocatedToken)$1; $$ = new AnonymousTypeParameter ((Expression)$3, lt.Value, lt.Location); lbag.AddLocation ($$, GetLocation ($2)); } | identifier_inside_body { - var lt = (Tokenizer.LocatedToken)$1; + var lt = (LocatedToken)$1; $$ = new AnonymousTypeParameter (new SimpleName (lt.Value, lt.Location), lt.Value, lt.Location); } @@ -3728,27 +3779,27 @@ typeof_type_expression unbound_type_name : identifier_inside_body generic_dimension { - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; $$ = new SimpleName (lt.Value, (int) $2, lt.Location); } | qualified_alias_member identifier_inside_body generic_dimension { - var lt1 = (Tokenizer.LocatedToken) $1; - var lt2 = (Tokenizer.LocatedToken) $2; + var lt1 = (LocatedToken) $1; + var lt2 = (LocatedToken) $2; $$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (int) $3, lt1.Location); lbag.AddLocation ($$, GetLocation ($2)); } | unbound_type_name DOT identifier_inside_body { - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; $$ = new MemberAccess ((Expression) $1, lt.Value, lt.Location); } | unbound_type_name DOT identifier_inside_body generic_dimension { - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; $$ = new MemberAccess ((Expression) $1, lt.Value, (int) $4, lt.Location); } @@ -3758,7 +3809,7 @@ unbound_type_name if (tne.HasTypeArguments) Error_TypeExpected (GetLocation ($4)); - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; $$ = new MemberAccess (tne, lt.Value, (int) $4, lt.Location); } ; @@ -3776,7 +3827,7 @@ generic_dimension qualified_alias_member : IDENTIFIER DOUBLE_COLON { - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; if (lang_version == LanguageVersion.ISO_1) FeatureIsNotAvailable (lt.Location, "namespace alias qualifier"); @@ -3830,7 +3881,7 @@ unchecked_expression pointer_member_access : primary_expression OP_PTR IDENTIFIER opt_type_argument_list { - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; $$ = new MemberAccess (new Indirection ((Expression) $1, GetLocation ($2)), lt.Value, (TypeArguments) $4, lt.Location); } ; @@ -3906,9 +3957,12 @@ unary_expression if (current_anonymous_method is LambdaExpression) { report.Error (4034, GetLocation ($1), "The `await' operator can only be used when its containing lambda expression is marked with the `async' modifier"); - } else if (current_anonymous_method is AnonymousMethodExpression) { + } else if (current_anonymous_method != null) { report.Error (4035, GetLocation ($1), "The `await' operator can only be used when its containing anonymous method is marked with the `async' modifier"); + } else if (interactive_async != null) { + current_block.Explicit.RegisterAsyncAwait (); + interactive_async = true; } else { report.Error (4033, GetLocation ($1), "The `await' operator can only be used when its containing method is marked with the `async' modifier"); @@ -4322,6 +4376,14 @@ conditional_expression $$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, null, GetLocation ($2)); lbag.AddLocation ($$, GetLocation ($4)); } + | null_coalescing_expression INTERR expression COLON CLOSE_BRACE + { + Error_SyntaxError (Token.CLOSE_BRACE); + + $$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, null, GetLocation ($2)); + lbag.AddLocation ($$, GetLocation ($4)); + lexer.putback ('}'); + } ; assignment_expression @@ -4406,24 +4468,24 @@ lambda_parameter_list lambda_parameter : parameter_modifier parameter_type identifier_inside_body { - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; $$ = new Parameter ((FullNamedExpression) $2, lt.Value, (Parameter.Modifier) $1, null, lt.Location); } | parameter_type identifier_inside_body { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; $$ = new Parameter ((FullNamedExpression) $1, lt.Value, Parameter.Modifier.NONE, null, lt.Location); } | IDENTIFIER { - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; $$ = new ImplicitLambdaParameter (lt.Value, lt.Location); } | AWAIT { - var lt = (Tokenizer.LocatedToken) Error_AwaitAsIdentifier ($1); + var lt = (LocatedToken) Error_AwaitAsIdentifier ($1); $$ = new ImplicitLambdaParameter (lt.Value, lt.Location); } ; @@ -4472,7 +4534,7 @@ expression_or_error lambda_expression : IDENTIFIER ARROW { - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location); start_anonymous (true, new ParametersCompiled (p), false, lt.Location); } @@ -4483,7 +4545,7 @@ lambda_expression } | AWAIT ARROW { - var lt = (Tokenizer.LocatedToken) Error_AwaitAsIdentifier ($1); + var lt = (LocatedToken) Error_AwaitAsIdentifier ($1); Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location); start_anonymous (true, new ParametersCompiled (p), false, lt.Location); } @@ -4494,7 +4556,7 @@ lambda_expression } | ASYNC identifier_inside_body ARROW { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location); start_anonymous (true, new ParametersCompiled (p), true, lt.Location); } @@ -4577,6 +4639,51 @@ boolean_expression } ; +opt_primary_parameters + : /* empty */ + { + $$ = null; + } + | primary_parameters + ; + +primary_parameters + : OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS + { + $$ = $2; + + // Cannot use opt_formal_parameter_list because it can be shared instance for empty parameters + lbag.AppendToMember (current_container, GetLocation ($1), GetLocation ($3)); + } + ; + +opt_primary_parameters_with_class_base + : /* empty */ + { + $$ = null; + } + | class_base + { + $$ = null; + } + | primary_parameters + { + $$ = $1; + } + | primary_parameters class_base OPEN_PARENS + { + ++lexer.parsing_block; + } + opt_argument_list CLOSE_PARENS + { + lbag.AppendToMember (current_container, GetLocation ($3), GetLocation ($6)); + ((Class)current_type).PrimaryConstructorBaseArguments = (Arguments) $5; + --lexer.parsing_block; + + $$ = $1; + } + ; + // // 10 classes // @@ -4597,12 +4704,17 @@ class_declaration } push_current_container (c, $3); + valid_param_mod = ParameterModifierType.PrimaryConstructor; } - opt_class_base + opt_primary_parameters_with_class_base opt_type_parameter_constraints_clauses { + valid_param_mod = 0; lexer.ConstraintsParsing = false; + if ($8 != null) + current_type.PrimaryConstructorParameters = (ParametersCompiled) $8; + if ($9 != null) current_container.SetConstraints ((List) $9); lbag.AddMember (current_container, mod_locations, GetLocation ($4)); @@ -4622,7 +4734,11 @@ class_declaration } opt_semicolon { - lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13), GetLocation ($15)); + if ($15 == null) { + lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13)); + } else { + lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13), GetLocation ($15)); + } $$ = pop_current_class (); } ; @@ -4752,15 +4868,19 @@ modifier opt_class_base : /* empty */ - | COLON type_list + | class_base + ; + +class_base + : COLON type_list { - current_type.AddBasesForPart ((List) $2); + current_type.SetBaseTypes ((List) $2); } | COLON type_list error { Error_SyntaxError (yyToken); - current_type.AddBasesForPart ((List) $2); + current_type.SetBaseTypes ((List) $2); } ; @@ -4800,7 +4920,7 @@ type_parameter_constraints_clauses type_parameter_constraints_clause : WHERE IDENTIFIER COLON type_parameter_constraints { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; $$ = new Constraints (new SimpleMemberName (lt.Value, lt.Location), (List) $4, GetLocation ($1)); lbag.AddLocation ($$, GetLocation ($3)); } @@ -4808,7 +4928,7 @@ type_parameter_constraints_clause { Error_SyntaxError (yyToken); - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; $$ = new Constraints (new SimpleMemberName (lt.Value, lt.Location), null, GetLocation ($1)); } ; @@ -4871,7 +4991,7 @@ type_parameter_constraint opt_type_parameter_variance : /* empty */ { - $$ = Variance.None; + $$ = null; } | type_parameter_variance { @@ -4885,11 +5005,11 @@ opt_type_parameter_variance type_parameter_variance : OUT { - $$ = Variance.Covariant; + $$ = new VarianceDecl (Variance.Covariant, GetLocation ($1)); } | IN { - $$ = Variance.Contravariant; + $$ = new VarianceDecl (Variance.Contravariant, GetLocation ($1)); } ; @@ -5057,7 +5177,7 @@ empty_statement labeled_statement : identifier_inside_body COLON { - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; LabeledStatement labeled = new LabeledStatement (lt.Value, current_block, lt.Location); lbag.AddLocation (labeled, GetLocation ($2)); current_block.AddLabel (labeled); @@ -5174,23 +5294,26 @@ identifier_inside_body block_variable_declaration : variable_type identifier_inside_body { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; var li = new LocalVariable (current_block, lt.Value, lt.Location); current_block.AddLocalName (li); - current_variable = new BlockVariableDeclaration ((FullNamedExpression) $1, li); + current_variable = new BlockVariable ((FullNamedExpression) $1, li); } opt_local_variable_initializer opt_variable_declarators SEMICOLON { $$ = current_variable; current_variable = null; - lbag.AddLocation ($$, GetLocation ($6)); + if ($4 != null) + lbag.AddLocation ($$, PopLocation (), GetLocation ($6)); + else + lbag.AddLocation ($$, GetLocation ($6)); } | CONST variable_type identifier_inside_body { - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.Constant, lt.Location); current_block.AddLocalName (li); - current_variable = new BlockConstantDeclaration ((FullNamedExpression) $2, li); + current_variable = new BlockConstant ((FullNamedExpression) $2, li); } const_variable_initializer opt_const_declarators SEMICOLON { @@ -5205,7 +5328,8 @@ opt_local_variable_initializer | ASSIGN block_variable_initializer { current_variable.Initializer = (Expression) $2; - // TODO: lbag + PushLocation (GetLocation ($1)); + $$ = current_variable; } | error { @@ -5242,18 +5366,18 @@ variable_declarators variable_declarator : COMMA identifier_inside_body { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; var li = new LocalVariable (current_variable.Variable, lt.Value, lt.Location); - var d = new BlockVariableDeclaration.Declarator (li, null); + var d = new BlockVariableDeclarator (li, null); current_variable.AddDeclarator (d); current_block.AddLocalName (li); lbag.AddLocation (d, GetLocation ($1)); } | COMMA identifier_inside_body ASSIGN block_variable_initializer { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; var li = new LocalVariable (current_variable.Variable, lt.Value, lt.Location); - var d = new BlockVariableDeclaration.Declarator (li, (Expression) $4); + var d = new BlockVariableDeclarator (li, (Expression) $4); current_variable.AddDeclarator (d); current_block.AddLocalName (li); lbag.AddLocation (d, GetLocation ($1), GetLocation ($3)); @@ -5284,9 +5408,9 @@ const_declarators const_declarator : COMMA identifier_inside_body ASSIGN constant_initializer_expr { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.Constant, lt.Location); - var d = new BlockVariableDeclaration.Declarator (li, (Expression) $4); + var d = new BlockVariableDeclarator (li, (Expression) $4); current_variable.AddDeclarator (d); current_block.AddLocalName (li); lbag.AddLocation (d, GetLocation ($1), GetLocation ($3)); @@ -5337,7 +5461,6 @@ statement_expression ExpressionStatement s = $1 as ExpressionStatement; if (s == null) { var expr = $1 as Expression; - expr.Error_InvalidExpressionStatement (report); $$ = new StatementErrorExpression (expr); } else { $$ = new StatementExpression (s); @@ -5349,10 +5472,7 @@ interactive_statement_expression : expression { Expression expr = (Expression) $1; - ExpressionStatement s; - - s = new OptionalAssign (new SimpleName ("$retval", lexer.Location), expr, lexer.Location); - $$ = new StatementExpression (s); + $$ = new StatementExpression (new OptionalAssign (expr, lexer.Location)); } | error { @@ -5604,14 +5724,17 @@ opt_for_initializer for_initializer : variable_type identifier_inside_body { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; var li = new LocalVariable (current_block, lt.Value, lt.Location); current_block.AddLocalName (li); - current_variable = new BlockVariableDeclaration ((FullNamedExpression) $1, li); + current_variable = new BlockVariable ((FullNamedExpression) $1, li); } opt_local_variable_initializer opt_variable_declarators { $$ = current_variable; + if ($4 != null) + lbag.AddLocation (current_variable, PopLocation ()); + current_variable = null; } | statement_expression_list @@ -5669,7 +5792,7 @@ foreach_statement start_block (GetLocation ($2)); current_block.IsCompilerGenerated = true; - var lt = (Tokenizer.LocatedToken) $4; + var lt = (LocatedToken) $4; var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.ForeachVariable | LocalVariable.Flags.Used, lt.Location); current_block.AddLocalName (li); @@ -5684,7 +5807,7 @@ foreach_statement start_block (GetLocation ($2)); current_block.IsCompilerGenerated = true; - var lt = (Tokenizer.LocatedToken) $4; + var lt = (LocatedToken) $4; var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.ForeachVariable | LocalVariable.Flags.Used, lt.Location); current_block.AddLocalName (li); $$ = li; @@ -5735,7 +5858,7 @@ continue_statement goto_statement : GOTO identifier_inside_body SEMICOLON { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; $$ = new Goto (lt.Value, GetLocation ($1)); lbag.AddStatement ($$, GetLocation ($2), GetLocation ($3)); } @@ -5775,6 +5898,11 @@ throw_statement $$ = new Throw ((Expression) $2, GetLocation ($1)); lbag.AddStatement ($$, GetLocation ($3)); } + | THROW expression error + { + Error_SyntaxError (yyToken); + $$ = new Throw ((Expression) $2, GetLocation ($1)); + } | THROW error { Error_SyntaxError (yyToken); @@ -5785,7 +5913,7 @@ throw_statement yield_statement : identifier_inside_body RETURN opt_expression SEMICOLON { - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; string s = lt.Value; if (s != "yield"){ report.Error (1003, lt.Location, "; expected"); @@ -5803,7 +5931,7 @@ yield_statement { Error_SyntaxError (yyToken); - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; string s = lt.Value; if (s != "yield"){ report.Error (1003, lt.Location, "; expected"); @@ -5819,7 +5947,7 @@ yield_statement } | identifier_inside_body BREAK SEMICOLON { - var lt = (Tokenizer.LocatedToken) $1; + var lt = (LocatedToken) $1; string s = lt.Value; if (s != "yield"){ report.Error (1003, lt.Location, "; expected"); @@ -5827,7 +5955,7 @@ yield_statement FeatureIsNotAvailable (lt.Location, "iterators"); } - current_block.Explicit.RegisterIteratorYield (); + current_block.ParametersBlock.TopBlock.IsIterator = true; $$ = new YieldBreak (lt.Location); lbag.AddStatement ($$, GetLocation ($2), GetLocation ($3)); } @@ -5845,12 +5973,12 @@ try_statement } | TRY block FINALLY block { - $$ = new TryFinally ((Statement) $2, (Block) $4, GetLocation ($1)); + $$ = new TryFinally ((Statement) $2, (ExplicitBlock) $4, GetLocation ($1)); lbag.AddStatement ($$, GetLocation ($3)); } | TRY block catch_clauses FINALLY block { - $$ = new TryFinally (new TryCatch ((Block) $2, (List) $3, Location.Null, true), (Block) $5, GetLocation ($1)); + $$ = new TryFinally (new TryCatch ((Block) $2, (List) $3, Location.Null, true), (ExplicitBlock) $5, GetLocation ($1)); lbag.AddStatement ($$, GetLocation ($4)); } | TRY block error @@ -5873,7 +6001,8 @@ catch_clauses var l = (List) $1; Catch c = (Catch) $2; - if (l [l.Count - 1].IsGeneral) { + var prev_catch = l [l.Count - 1]; + if (prev_catch.IsGeneral && prev_catch.Filter == null) { report.Error (1017, c.loc, "Try statement already has an empty catch block"); } @@ -5888,18 +6017,20 @@ opt_identifier ; catch_clause - : CATCH block + : CATCH opt_catch_filter block { - $$ = new Catch ((Block) $2, GetLocation ($1)); + var c = new Catch ((ExplicitBlock) $3, GetLocation ($1)); + c.Filter = (CatchFilterExpression) $2; + $$ = c; } | CATCH open_parens_any type opt_identifier CLOSE_PARENS { start_block (GetLocation ($2)); - var c = new Catch (current_block, GetLocation ($1)); + var c = new Catch ((ExplicitBlock) current_block, GetLocation ($1)); c.TypeExpression = (FullNamedExpression) $3; if ($4 != null) { - var lt = (Tokenizer.LocatedToken) $4; + var lt = (LocatedToken) $4; c.Variable = new LocalVariable (current_block, lt.Value, lt.Location); current_block.AddLocalName (c.Variable); } @@ -5907,8 +6038,9 @@ catch_clause lbag.AddLocation (c, GetLocation ($2), GetLocation ($5)); $$ = c; } - block_prepared + opt_catch_filter block_prepared { + ((Catch) $6).Filter = (CatchFilterExpression) $7; $$ = $6; } | CATCH open_parens_any error @@ -5932,7 +6064,7 @@ catch_clause c.TypeExpression = (FullNamedExpression) $3; if ($4 != null) { - var lt = (Tokenizer.LocatedToken) $4; + var lt = (LocatedToken) $4; c.Variable = new LocalVariable (current_block, lt.Value, lt.Location); } @@ -5942,6 +6074,18 @@ catch_clause } ; +opt_catch_filter + : /* empty */ + | IF open_parens_any expression CLOSE_PARENS + { + if (lang_version <= LanguageVersion.V_5) + FeatureIsNotAvailable (GetLocation ($1), "exception filter"); + + $$ = new CatchFilterExpression ((Expression) $3, GetLocation ($1)); + lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4)); + } + ; + checked_statement : CHECKED block { @@ -5990,7 +6134,7 @@ fixed_statement start_block (GetLocation ($2)); current_block.IsCompilerGenerated = true; - var lt = (Tokenizer.LocatedToken) $4; + var lt = (LocatedToken) $4; var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.FixedVariable | LocalVariable.Flags.Used, lt.Location); current_block.AddLocalName (li); current_variable = new Fixed.VariableDeclaration ((FullNamedExpression) $3, li); @@ -6007,6 +6151,7 @@ fixed_statement Fixed f = new Fixed ((Fixed.VariableDeclaration) $9, (Statement) $10, GetLocation ($1)); current_block.AddStatement (f); + lbag.AddStatement (f, GetLocation ($2), GetLocation ($8)); $$ = end_block (GetLocation ($8)); } ; @@ -6017,7 +6162,7 @@ using_statement start_block (GetLocation ($2)); current_block.IsCompilerGenerated = true; - var lt = (Tokenizer.LocatedToken) $4; + var lt = (LocatedToken) $4; var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.UsingVariable | LocalVariable.Flags.Used, lt.Location); current_block.AddLocalName (li); current_variable = new Using.VariableDeclaration ((FullNamedExpression) $3, li); @@ -6121,21 +6266,23 @@ first_from_clause { current_block = new Linq.QueryBlock (current_block, lexer.Location); - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; var rv = new Linq.RangeVariable (lt.Value, lt.Location); - $$ = new Linq.QueryExpression (new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$4, rv, GetLocation ($1))); + var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$4, rv, GetLocation ($1)); + lbag.AddLocation (clause, GetLocation ($3)); + $$ = new Linq.QueryExpression (clause); } | FROM_FIRST type identifier_inside_body IN expression { current_block = new Linq.QueryBlock (current_block, lexer.Location); - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; var rv = new Linq.RangeVariable (lt.Value, lt.Location); - $$ = new Linq.QueryExpression ( - new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$5, rv, GetLocation ($1)) { + var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$5, rv, GetLocation ($1)) { IdentifierType = (FullNamedExpression)$2 - } - ); + }; + lbag.AddLocation (clause, GetLocation ($4)); + $$ = new Linq.QueryExpression (clause); } ; @@ -6144,21 +6291,23 @@ nested_from_clause { current_block = new Linq.QueryBlock (current_block, lexer.Location); - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; var rv = new Linq.RangeVariable (lt.Value, lt.Location); - $$ = new Linq.QueryExpression (new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$4, rv, GetLocation ($1))); + var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$4, rv, GetLocation ($1)); + lbag.AddLocation (clause, GetLocation ($3)); + $$ = new Linq.QueryExpression (clause); } | FROM type identifier_inside_body IN expression { current_block = new Linq.QueryBlock (current_block, lexer.Location); - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; var rv = new Linq.RangeVariable (lt.Value, lt.Location); - $$ = new Linq.QueryExpression ( - new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$5, rv, GetLocation ($1)) { + var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$5, rv, GetLocation ($1)) { IdentifierType = (FullNamedExpression)$2 - } - ); + }; + lbag.AddLocation (clause, GetLocation ($4)); + $$ = new Linq.QueryExpression (clause); } ; @@ -6169,7 +6318,7 @@ from_clause } expression_or_error { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; var sn = new Linq.RangeVariable (lt.Value, lt.Location); $$ = new Linq.SelectMany ((Linq.QueryBlock)current_block, sn, (Expression)$5, GetLocation ($1)); @@ -6177,6 +6326,7 @@ from_clause current_block = current_block.Parent; ((Linq.QueryBlock)current_block).AddRangeVariable (sn); + lbag.AddLocation ($$, GetLocation ($3)); } | FROM type identifier_inside_body IN { @@ -6184,7 +6334,7 @@ from_clause } expression_or_error { - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; var sn = new Linq.RangeVariable (lt.Value, lt.Location); $$ = new Linq.SelectMany ((Linq.QueryBlock)current_block, sn, (Expression)$6, GetLocation ($1)) { @@ -6195,6 +6345,8 @@ from_clause current_block = current_block.Parent; ((Linq.QueryBlock)current_block).AddRangeVariable (sn); + + lbag.AddLocation ($$, GetLocation ($4)); } ; @@ -6314,7 +6466,7 @@ let_clause } expression_or_error { - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; var sn = new Linq.RangeVariable (lt.Value, lt.Location); $$ = new Linq.Let ((Linq.QueryBlock) current_block, sn, (Expression)$5, GetLocation ($1)); lbag.AddLocation ($$, GetLocation ($3)); @@ -6373,7 +6525,7 @@ join_clause var outer_selector = linq_clause_blocks.Pop (); var block = linq_clause_blocks.Pop (); - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; var sn = new Linq.RangeVariable (lt.Value, lt.Location); Linq.RangeVariable into; @@ -6393,7 +6545,7 @@ join_clause ((Linq.QueryBlock)current_block).AddRangeVariable (sn); - lt = (Tokenizer.LocatedToken) $12; + lt = (LocatedToken) $12; into = new Linq.RangeVariable (lt.Value, lt.Location); $$ = new Linq.GroupJoin (block, sn, (Expression)$5, outer_selector, (Linq.QueryBlock) current_block, into, GetLocation ($1)); @@ -6435,7 +6587,7 @@ join_clause var outer_selector = linq_clause_blocks.Pop (); var block = linq_clause_blocks.Pop (); - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; var sn = new Linq.RangeVariable (lt.Value, lt.Location); Linq.RangeVariable into; @@ -6444,6 +6596,7 @@ join_clause $$ = new Linq.Join (block, sn, (Expression)$6, outer_selector, (Linq.QueryBlock) current_block, GetLocation ($1)) { IdentifierType = (FullNamedExpression)$2 }; + lbag.AddLocation ($$, GetLocation ($3), GetLocation ($6), GetLocation ($9)); } else { // // Set equals right side parent to beginning of linq query, it is not accessible therefore cannot cause name collisions @@ -6456,7 +6609,7 @@ join_clause ((Linq.QueryBlock)current_block).AddRangeVariable (sn); - lt = (Tokenizer.LocatedToken) $13; + lt = (LocatedToken) $13; into = new Linq.RangeVariable (lt.Value, lt.Location); // TODO: $$ = new Linq.GroupJoin (block, sn, (Expression)$6, outer_selector, (Linq.QueryBlock) current_block, into, GetLocation ($1)) { @@ -6579,7 +6732,7 @@ opt_query_continuation query_body { var current_block = linq_clause_blocks.Pop (); - var lt = (Tokenizer.LocatedToken) $2; + var lt = (LocatedToken) $2; var rv = new Linq.RangeVariable (lt.Value, lt.Location); $$ = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, null, rv, GetLocation ($1)) { next = (Linq.AQueryClause)$4 @@ -6617,27 +6770,30 @@ interactive_parsing mods |= Modifiers.UNSAFE; current_local_parameters = pars; - Method method = new Method ( + var method = new InteractiveMethod ( current_type, new TypeExpression (compiler.BuiltinTypes.Void, Location.Null), mods, - new MemberName ("Host"), - pars, - null /* attributes */); + pars); current_type.AddMember (method); - oob_stack.Push (method); + + interactive_async = false; + ++lexer.parsing_block; start_block (lexer.Location); } interactive_statement_list opt_COMPLETE_COMPLETION { --lexer.parsing_block; - Method method = (Method) oob_stack.Pop (); - + var method = (InteractiveMethod) oob_stack.Pop (); method.Block = (ToplevelBlock) end_block(lexer.Location); + if (interactive_async == true) { + method.ChangeToAsync (); + } + InteractiveResult = (Class) pop_current_class (); current_local_parameters = null; } @@ -6684,7 +6840,7 @@ doc_cref { module.DocumentationBuilder.ParsedBuiltinType = (TypeExpression)$1; module.DocumentationBuilder.ParsedParameters = (List)$4; - var lt = (Tokenizer.LocatedToken) $3; + var lt = (LocatedToken) $3; $$ = new MemberName (lt.Value); } | doc_type_declaration_name DOT THIS @@ -6846,7 +7002,7 @@ object Error_AwaitAsIdentifier (object token) { if (async_block) { report.Error (4003, GetLocation (token), "`await' cannot be used as an identifier within an async method or lambda expression"); - return new Tokenizer.LocatedToken ("await", GetLocation (token)); + return new LocatedToken ("await", GetLocation (token)); } return token; @@ -6894,15 +7050,37 @@ void StoreModifierLocation (object token, Location loc) mod_locations.Add (Tuple.Create ((Modifiers) token, loc)); } -string CheckAttributeTarget (string a, Location l) +[System.Diagnostics.Conditional ("FULL_AST")] +void PushLocation (Location loc) +{ + if (location_stack == null) + location_stack = new Stack (); + + location_stack.Push (loc); +} + +Location PopLocation () +{ + if (location_stack == null) + return Location.Null; + + return location_stack.Pop (); +} + +string CheckAttributeTarget (int token, string a, Location l) { switch (a) { case "assembly" : case "module" : case "field" : case "method" : case "param" : case "property" : case "type" : return a; } - report.Warning (658, 1, l, - "`{0}' is invalid attribute target. All attributes in this attribute section will be ignored", a); + if (!Tokenizer.IsValidIdentifier (a)) { + Error_SyntaxError (token); + } else { + report.Warning (658, 1, l, + "`{0}' is invalid attribute target. All attributes in this attribute section will be ignored", a); + } + return string.Empty; } @@ -6954,7 +7132,7 @@ public CSharpParser (SeekableStreamReader reader, CompilationSourceFile file, Re lang_version = settings.Version; yacc_verbose_flag = settings.VerboseParserFlag; doc_support = settings.DocumentationFile != null; - lexer = new Tokenizer (reader, file, session); + lexer = new Tokenizer (reader, file, session, report); oob_stack = new Stack (); lbag = session.LocationsBag; use_global_stacks = session.UseJayGlobalArrays; @@ -7016,7 +7194,7 @@ void FeatureIsNotAvailable (Location loc, string feature) Location GetLocation (object obj) { - var lt = obj as Tokenizer.LocatedToken; + var lt = obj as LocatedToken; if (lt != null) return lt.Location; @@ -7093,7 +7271,7 @@ AnonymousMethodExpression end_anonymous (ParametersBlock anon_block) retval = current_anonymous_method; async_block = (bool) oob_stack.Pop (); - current_variable = (BlockVariableDeclaration) oob_stack.Pop (); + current_variable = (BlockVariable) oob_stack.Pop (); current_local_parameters = (ParametersCompiled) oob_stack.Pop (); current_anonymous_method = (AnonymousMethodExpression) oob_stack.Pop (); @@ -7202,7 +7380,7 @@ string GetSymbolName (int token) case Token.LITERAL: return ((Constant)lexer.Value).GetValue ().ToString (); case Token.IDENTIFIER: - return ((Tokenizer.LocatedToken)lexer.Value).Value; + return ((LocatedToken)lexer.Value).Value; case Token.BOOL: return "bool";