public Expression CreateCallSiteBinder (ResolveContext ec, Arguments args) { Arguments binder_args = new Arguments (member != null ? 5 : 3); bool is_member_access = member is MemberAccess; CSharpBinderFlags call_flags; if (!is_member_access && member is SimpleName) { call_flags = CSharpBinderFlags.InvokeSimpleName; is_member_access = true; } else { call_flags = 0; } binder_args.Add (new Argument (new BinderFlags (call_flags, this))); if (is_member_access) binder_args.Add (new Argument (new StringLiteral (ec.BuiltinTypes, member.Name, member.Location))); if (member != null && member.HasTypeArguments) { TypeArguments ta = member.TypeArguments; if (ta.Resolve (ec)) { var targs = new ArrayInitializer (ta.Count, loc); foreach (TypeSpec t in ta.Arguments) targs.Add (new TypeOf (t, loc)); binder_args.Add (new Argument (new ImplicitlyTypedArrayCreation (targs, loc))); } } else if (is_member_access) { binder_args.Add (new Argument (new NullLiteral (loc))); } binder_args.Add (new Argument (new TypeOf (ec.CurrentType, loc))); Expression real_args; if (args == null) { // Cannot be null because .NET trips over real_args = new ArrayCreation ( new MemberAccess (GetBinderNamespace (loc), "CSharpArgumentInfo", loc), new ArrayInitializer (0, loc), loc); } else { real_args = new ImplicitlyTypedArrayCreation (args.CreateDynamicBinderArguments (ec), loc); } binder_args.Add (new Argument (real_args)); return new Invocation (GetBinder (is_member_access ? "InvokeMember" : "Invoke", loc), binder_args); }
public TypeSpecifier VisitArrayInitializer(ArrayInitializer exp) { foreach (var expr in exp.DimensionSizes) { var ts = Examine(expr); if (!ts.IsInt() || expr is not Expr.Literal) { Console.WriteLine($"Array initializer dimensions must be constant integer expressions"); return(TypeSpecifier.Null); } } return(new TypeSpecifier { Type = TypeEnum.ARRAY, Dimensions = exp.DimensionSizes.Count }); }
public NotificationChain basicSetInitializer(ArrayInitializer newobj, NotificationChain msgs) { var oldobj = _initializer; _initializer = newobj; if (eNotificationRequired()) { var notification = new ENotificationImpl(this, NotificationImpl.SET, Java_PackageImpl.ARRAYCREATION_INITIALIZER, oldobj, newobj); if (msgs == null) { msgs = notification; } else { msgs.add(notification); } } return(msgs); }
static private IEnumerable <T> UseEnumerate <T>(this ArrayPool <T> item, ArrayInitializer <T> initializer, ArrayFinalizer <T> finalizer) { using (Pooled <T[]> pooled = item.Withdraw()) { T[] array = pooled.Get(); int length = initializer(ref array); try { for (int i = 0; i < length; i++) { yield return(array[i]); } } finally { finalizer(ref array, length); pooled.Set(array); } } }
public Expression CreateExpressionTree(BlockContext ec, Location loc) { var initializers = new ArrayInitializer(Count, loc); foreach (Parameter p in FixedParameters) { // // Each parameter expression is stored to local variable // to save some memory when referenced later. // StatementExpression se = new StatementExpression(p.CreateExpressionTreeVariable(ec), Location.Null); if (se.Resolve(ec)) { ec.CurrentBlock.AddScopeStatement(new TemporaryVariableReference.Declarator(p.ExpressionTreeVariableReference())); ec.CurrentBlock.AddScopeStatement(se); } initializers.Add(p.ExpressionTreeVariableReference()); } return(new ArrayCreation( Parameter.ResolveParameterExpressionType(ec, loc), initializers, loc)); }
/** the generated parser. Maintains a state and a value stack, currently with fixed maximum size. @param yyLex scanner. @return result of the last reduction, if any. @throws yyException on irrecoverable parse error. */ internal Object yyparse (yyParser.yyInput yyLex) { if (yyMax <= 0) yyMax = 256; // initial size int yyState = 0; // state stack ptr int [] yyStates; // state stack Object yyVal = null; // value stack ptr Object [] yyVals; // value stack int yyToken = -1; // current input int yyErrorFlag = 0; // #tks to shift if (use_global_stacks && global_yyStates != null) { yyVals = global_yyVals; yyStates = global_yyStates; } else { yyVals = new object [yyMax]; yyStates = new int [yyMax]; if (use_global_stacks) { global_yyVals = yyVals; global_yyStates = yyStates; } } /*yyLoop:*/ for (int yyTop = 0;; ++ yyTop) { if (yyTop >= yyStates.Length) { // dynamically increase global::System.Array.Resize (ref yyStates, yyStates.Length+yyMax); global::System.Array.Resize (ref yyVals, yyVals.Length+yyMax); } yyStates[yyTop] = yyState; yyVals[yyTop] = yyVal; if (debug != null) debug.push(yyState, yyVal); /*yyDiscarded:*/ for (;;) { // discarding a token does not change stack int yyN; if ((yyN = yyDefRed[yyState]) == 0) { // else [default] reduce (yyN) if (yyToken < 0) { yyToken = yyLex.advance() ? yyLex.token() : 0; if (debug != null) debug.lex(yyState, yyToken, yyname(yyToken), yyLex.value()); } if ((yyN = yySindex[yyState]) != 0 && ((yyN += yyToken) >= 0) && (yyN < yyTable.Length) && (yyCheck[yyN] == yyToken)) { if (debug != null) debug.shift(yyState, yyTable[yyN], yyErrorFlag-1); yyState = yyTable[yyN]; // shift to yyN yyVal = yyLex.value(); yyToken = -1; if (yyErrorFlag > 0) -- yyErrorFlag; goto continue_yyLoop; } if ((yyN = yyRindex[yyState]) != 0 && (yyN += yyToken) >= 0 && yyN < yyTable.Length && yyCheck[yyN] == yyToken) yyN = yyTable[yyN]; // reduce (yyN) else switch (yyErrorFlag) { case 0: yyExpectingState = yyState; // yyerror(String.Format ("syntax error, got token `{0}'", yyname (yyToken)), yyExpecting(yyState)); if (debug != null) debug.error("syntax error"); if (yyToken == 0 /*eof*/ || yyToken == eof_token) throw new yyParser.yyUnexpectedEof (); goto case 1; case 1: case 2: yyErrorFlag = 3; do { if ((yyN = yySindex[yyStates[yyTop]]) != 0 && (yyN += Token.yyErrorCode) >= 0 && yyN < yyTable.Length && yyCheck[yyN] == Token.yyErrorCode) { if (debug != null) debug.shift(yyStates[yyTop], yyTable[yyN], 3); yyState = yyTable[yyN]; yyVal = yyLex.value(); goto continue_yyLoop; } if (debug != null) debug.pop(yyStates[yyTop]); } while (-- yyTop >= 0); if (debug != null) debug.reject(); throw new yyParser.yyException("irrecoverable syntax error"); case 3: if (yyToken == 0) { if (debug != null) debug.reject(); throw new yyParser.yyException("irrecoverable syntax error at end-of-file"); } if (debug != null) debug.discard(yyState, yyToken, yyname(yyToken), yyLex.value()); yyToken = -1; goto continue_yyDiscarded; // leave stack alone } } int yyV = yyTop + 1-yyLen[yyN]; if (debug != null) debug.reduce(yyState, yyStates[yyV-1], yyN, YYRules.getRule (yyN), yyLen[yyN]); yyVal = yyDefault(yyV > yyTop ? null : yyVals[yyV]); switch (yyN) { case 5: #line 379 "cs-parser.jay" { Lexer.CompleteOnEOF = false; } break; case 7: #line 384 "cs-parser.jay" { Lexer.check_incorrect_doc_comment (); } break; case 8: #line 388 "cs-parser.jay" { Lexer.check_incorrect_doc_comment (); } break; case 16: #line 411 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; string s = lt.Value; if (s != "alias"){ syntax_error (lt.Location, "`alias' expected"); } else if (RootContext.Version == LanguageVersion.ISO_1) { Report.FeatureIsNotAvailable (lt.Location, "external alias"); } else { lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; current_namespace.AddUsingExternalAlias (lt.Value, lt.Location, Report); } } break; case 17: #line 424 "cs-parser.jay" { syntax_error (GetLocation (yyVals[-1+yyTop]), "`alias' expected"); /* TODO: better*/ } break; case 20: #line 436 "cs-parser.jay" { if (RootContext.Documentation != null) Lexer.doc_state = XmlCommentState.Allowed; } break; case 21: #line 441 "cs-parser.jay" { if (RootContext.Documentation != null) Lexer.doc_state = XmlCommentState.Allowed; } break; case 22: #line 449 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; current_namespace.AddUsingAlias (lt.Value, (MemberName) yyVals[-1+yyTop], GetLocation (yyVals[-4+yyTop])); } break; case 23: #line 453 "cs-parser.jay" { CheckIdentifierToken (yyToken, GetLocation (yyVals[0+yyTop])); yyVal = null; } break; case 24: #line 461 "cs-parser.jay" { current_namespace.AddUsing ((MemberName) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); } break; case 25: #line 473 "cs-parser.jay" { MemberName name = (MemberName) yyVals[0+yyTop]; if (yyVals[-2+yyTop] != null) { Report.Error(1671, name.Location, "A namespace declaration cannot have modifiers or attributes"); } current_namespace = new NamespaceEntry ( current_namespace, file, name.GetName ()); current_class = current_namespace.SlaveDeclSpace; current_container = current_class.PartialContainer; } break; case 26: #line 486 "cs-parser.jay" { current_namespace = current_namespace.Parent; current_class = current_namespace.SlaveDeclSpace; current_container = current_class.PartialContainer; } break; case 27: #line 495 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new MemberName (lt.Value, lt.Location); } break; case 28: #line 500 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new MemberName ((MemberName) yyVals[-2+yyTop], lt.Value, lt.Location); } break; case 29: #line 505 "cs-parser.jay" { syntax_error (lexer.Location, "`.' expected"); yyVal = new MemberName ("<invalid>", lexer.Location); } break; case 34: #line 523 "cs-parser.jay" { MemberName name = (MemberName) yyVals[0+yyTop]; if (name.TypeArguments != null) syntax_error (lexer.Location, "namespace name expected"); yyVal = name; } break; case 35: #line 535 "cs-parser.jay" { if (RootContext.Documentation != null) Lexer.doc_state = XmlCommentState.Allowed; } break; case 38: #line 548 "cs-parser.jay" { Report.Error (1518, lexer.Location, "Expected `class', `delegate', `enum', `interface', or `struct'"); } break; case 40: #line 556 "cs-parser.jay" { Report.Error (1513, lexer.Location, "Expected `}'"); } break; case 49: #line 583 "cs-parser.jay" { if (yyVals[0+yyTop] != null) { DeclSpace ds = (DeclSpace)yyVals[0+yyTop]; if ((ds.ModFlags & (Modifiers.PRIVATE|Modifiers.PROTECTED)) != 0){ Report.Error (1527, ds.Location, "Namespace elements cannot be explicitly declared as private, protected or protected internal"); } } current_namespace.DeclarationFound = true; } break; case 50: #line 594 "cs-parser.jay" { current_namespace.DeclarationFound = true; } break; case 51: #line 598 "cs-parser.jay" { Report.Error (116, ((MemberCore) yyVals[0+yyTop]).Location, "A namespace can only contain types and namespace declarations"); } break; case 52: #line 601 "cs-parser.jay" { Report.Error (116, ((MemberCore) yyVals[0+yyTop]).Location, "A namespace can only contain types and namespace declarations"); } break; case 58: #line 627 "cs-parser.jay" { if (yyVals[0+yyTop] != null) { Attributes attrs = (Attributes)yyVals[0+yyTop]; if (global_attrs_enabled) { CodeGen.Assembly.AddAttributes (attrs.Attrs, current_namespace); } else { foreach (Attribute a in attrs.Attrs) { Report.Error (1730, a.Location, "Assembly and module attributes must precede all other elements except using clauses and extern alias declarations"); } } } yyVal = yyVals[0+yyTop]; } break; case 59: #line 644 "cs-parser.jay" { global_attrs_enabled = false; yyVal = null; } break; case 60: #line 649 "cs-parser.jay" { global_attrs_enabled = false; yyVal = yyVals[0+yyTop]; } break; case 61: #line 658 "cs-parser.jay" { if (current_attr_target != String.Empty) { var sect = (List<Attribute>) yyVals[0+yyTop]; if (global_attrs_enabled) { if (current_attr_target == "module") { current_container.Module.Compiled.AddAttributes (sect); yyVal = null; } else if (current_attr_target != null && current_attr_target.Length > 0) { CodeGen.Assembly.AddAttributes (sect, current_namespace); yyVal = null; } else { yyVal = new Attributes (sect); } if (yyVal == null) { if (RootContext.Documentation != null) { Lexer.check_incorrect_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } } } else { yyVal = new Attributes (sect); } } else yyVal = null; current_attr_target = null; } break; case 62: #line 688 "cs-parser.jay" { if (current_attr_target != String.Empty) { Attributes attrs = yyVals[-1+yyTop] as Attributes; var sect = (List<Attribute>) yyVals[0+yyTop]; if (global_attrs_enabled) { if (current_attr_target == "module") { current_container.Module.Compiled.AddAttributes (sect); yyVal = null; } else if (current_attr_target == "assembly") { CodeGen.Assembly.AddAttributes (sect, current_namespace); yyVal = 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); } yyVal = attrs; } else yyVal = null; current_attr_target = null; } break; case 63: #line 722 "cs-parser.jay" { yyVal = yyVals[-2+yyTop]; } break; case 64: #line 726 "cs-parser.jay" { yyVal = yyVals[-2+yyTop]; } break; case 65: #line 733 "cs-parser.jay" { current_attr_target = (string)yyVals[-1+yyTop]; yyVal = yyVals[-1+yyTop]; } break; case 66: #line 741 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = CheckAttributeTarget (lt.Value, lt.Location); } break; case 67: #line 745 "cs-parser.jay" { yyVal = "event"; } break; case 68: #line 746 "cs-parser.jay" { yyVal = "return"; } break; case 69: #line 748 "cs-parser.jay" { string name = GetTokenName (yyToken); yyVal = CheckAttributeTarget (name, GetLocation (yyVals[0+yyTop])); } break; case 70: #line 756 "cs-parser.jay" { yyVal = new List<Attribute> (4) { (Attribute) yyVals[0+yyTop] }; } break; case 71: #line 760 "cs-parser.jay" { var attrs = (List<Attribute>) yyVals[-2+yyTop]; attrs.Add ((Attribute) yyVals[0+yyTop]); yyVal = attrs; } break; case 72: #line 770 "cs-parser.jay" { ++lexer.parsing_block; } break; case 73: #line 774 "cs-parser.jay" { --lexer.parsing_block; MemberName mname = (MemberName) yyVals[-2+yyTop]; if (mname.IsGeneric) { Report.Error (404, lexer.Location, "'<' unexpected: attributes cannot be generic"); } Arguments [] arguments = (Arguments []) yyVals[0+yyTop]; ATypeNameExpression expr = mname.GetTypeExpression (); if (current_attr_target == String.Empty) yyVal = null; else if (global_attrs_enabled && (current_attr_target == "assembly" || current_attr_target == "module")) /* FIXME: supply "nameEscaped" parameter here.*/ yyVal = new GlobalAttribute (current_namespace, current_attr_target, expr, arguments, mname.Location, lexer.IsEscapedIdentifier (mname.Location)); else yyVal = new Attribute (current_attr_target, expr, arguments, mname.Location, lexer.IsEscapedIdentifier (mname.Location)); } break; case 74: #line 797 "cs-parser.jay" { /* reserved attribute name or identifier: 17.4 */ } break; case 75: #line 801 "cs-parser.jay" { yyVal = null; } break; case 76: #line 803 "cs-parser.jay" { yyVal = yyVals[-1+yyTop]; } break; case 77: #line 810 "cs-parser.jay" { yyVal = null; } break; case 78: #line 812 "cs-parser.jay" { Arguments a = new Arguments (4); a.Add ((Argument) yyVals[0+yyTop]); yyVal = new Arguments [] { a, null }; } break; case 79: #line 818 "cs-parser.jay" { Arguments a = new Arguments (4); a.Add ((Argument) yyVals[0+yyTop]); yyVal = new Arguments [] { null, a }; } break; case 80: #line 824 "cs-parser.jay" { Arguments[] o = (Arguments[]) yyVals[-2+yyTop]; if (o [1] != null) { Report.Error (1016, ((Argument) yyVals[0+yyTop]).Expr.Location, "Named attribute arguments must appear after the positional arguments"); o [0] = new Arguments (4); } Arguments args = ((Arguments) o [0]); if (args.Count > 0 && !(yyVals[0+yyTop] is NamedArgument) && args [args.Count - 1] is NamedArgument) Error_NamedArgumentExpected ((NamedArgument) args [args.Count - 1]); args.Add ((Argument) yyVals[0+yyTop]); } break; case 81: #line 838 "cs-parser.jay" { Arguments[] o = (Arguments[]) yyVals[-2+yyTop]; if (o [1] == null) { o [1] = new Arguments (4); } ((Arguments) o [1]).Add ((Argument) yyVals[0+yyTop]); } break; case 82: #line 850 "cs-parser.jay" { yyVal = new Argument ((Expression) yyVals[0+yyTop]); } break; case 84: #line 858 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new NamedArgument (lt.Value, lt.Location, (Expression) yyVals[0+yyTop]); } break; case 85: #line 866 "cs-parser.jay" { if (RootContext.Version <= LanguageVersion.V_3) Report.FeatureIsNotAvailable (GetLocation (yyVals[-3+yyTop]), "named argument"); /* Avoid boxing in common case (no modifier)*/ var arg_mod = yyVals[-1+yyTop] == null ? Argument.AType.None : (Argument.AType) yyVals[-1+yyTop]; var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; yyVal = new NamedArgument (lt.Value, lt.Location, (Expression) yyVals[0+yyTop], arg_mod); } break; case 86: #line 879 "cs-parser.jay" { yyVal = null; } break; case 87: #line 881 "cs-parser.jay" { yyVal = Argument.AType.Ref; } break; case 88: #line 885 "cs-parser.jay" { yyVal = Argument.AType.Out; } break; case 104: #line 917 "cs-parser.jay" { Report.Error (1519, lexer.Location, "Unexpected symbol `{0}' in class, struct, or interface member declaration", GetSymbolName (yyToken)); yyVal = null; lexer.parsing_generic_declaration = false; } break; case 105: #line 930 "cs-parser.jay" { lexer.ConstraintsParsing = true; } break; case 106: #line 934 "cs-parser.jay" { MemberName name = MakeName ((MemberName) yyVals[0+yyTop]); push_current_class (new Struct (current_namespace, current_class, name, (Modifiers) yyVals[-4+yyTop], (Attributes) yyVals[-5+yyTop]), yyVals[-3+yyTop]); } break; case 107: #line 940 "cs-parser.jay" { lexer.ConstraintsParsing = false; current_class.SetParameterInfo ((List<Constraints>) yyVals[0+yyTop]); if (RootContext.Documentation != null) current_container.DocComment = Lexer.consume_doc_comment (); } break; case 108: #line 949 "cs-parser.jay" { --lexer.parsing_declaration; if (RootContext.Documentation != null) Lexer.doc_state = XmlCommentState.Allowed; } break; case 109: #line 955 "cs-parser.jay" { yyVal = pop_current_class (); } break; case 110: #line 958 "cs-parser.jay" { CheckIdentifierToken (yyToken, GetLocation (yyVals[0+yyTop])); } break; case 111: #line 965 "cs-parser.jay" { if (RootContext.Documentation != null) Lexer.doc_state = XmlCommentState.Allowed; } break; case 127: #line 1007 "cs-parser.jay" { var modflags = (Modifiers) yyVals[-4+yyTop]; foreach (VariableDeclaration constant in (List<object>) yyVals[-1+yyTop]){ Location l = constant.Location; if ((modflags & Modifiers.STATIC) != 0) { Report.Error (504, l, "The constant `{0}' cannot be marked static", current_container.GetSignatureForError () + "." + (string) constant.identifier); continue; } Const c = new Const ( current_class, (FullNamedExpression) yyVals[-2+yyTop], (string) constant.identifier, constant.GetInitializer ((FullNamedExpression) yyVals[-2+yyTop]), modflags, (Attributes) yyVals[-5+yyTop], l); if (RootContext.Documentation != null) { c.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } current_container.AddConstant (c); } } break; case 128: #line 1032 "cs-parser.jay" { variables_bucket.Clear (); if (yyVals[0+yyTop] != null) variables_bucket.Add (yyVals[0+yyTop]); yyVal = variables_bucket; } break; case 129: #line 1039 "cs-parser.jay" { if (yyVals[0+yyTop] != null) { var constants = (List<object>) yyVals[-2+yyTop]; constants.Add (yyVals[0+yyTop]); } } break; case 130: #line 1049 "cs-parser.jay" { ++lexer.parsing_block; } break; case 131: #line 1053 "cs-parser.jay" { --lexer.parsing_block; yyVal = new VariableDeclaration ((Tokenizer.LocatedToken) yyVals[-3+yyTop], (Expression) yyVals[0+yyTop]); } break; case 132: #line 1058 "cs-parser.jay" { /* A const field requires a value to be provided*/ Report.Error (145, GetLocation (yyVals[0+yyTop]), "A const field requires a value to be provided"); yyVal = null; } break; case 135: #line 1076 "cs-parser.jay" { FullNamedExpression type = (FullNamedExpression) yyVals[-2+yyTop]; if (type == TypeManager.system_void_expr) Report.Error (670, GetLocation (yyVals[-2+yyTop]), "Fields cannot have void type"); var mod = (Modifiers) yyVals[-3+yyTop]; foreach (VariableMemberDeclaration var in (List<object>) yyVals[-1+yyTop]){ Field field = new Field (current_class, type, mod, var.MemberName, (Attributes) yyVals[-4+yyTop]); field.Initializer = var.GetInitializer (type); if (RootContext.Documentation != null) { field.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } current_container.AddField (field); yyVal = field; /* FIXME: might be better if it points to the top item*/ } } break; case 136: #line 1102 "cs-parser.jay" { FullNamedExpression type = (FullNamedExpression) yyVals[-2+yyTop]; var mod = (Modifiers) yyVals[-4+yyTop]; foreach (VariableDeclaration var in (List<VariableDeclaration>) yyVals[-1+yyTop]) { FixedField field = new FixedField (current_class, type, mod, var.identifier, var.GetInitializer (type), (Attributes) yyVals[-5+yyTop], var.Location); if (RootContext.Version < LanguageVersion.ISO_2) Report.FeatureIsNotAvailable (GetLocation (yyVals[-3+yyTop]), "fixed size buffers"); if (RootContext.Documentation != null) { field.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } current_container.AddField (field); yyVal = field; /* FIXME: might be better if it points to the top item*/ } } break; case 137: #line 1127 "cs-parser.jay" { Report.Error (1641, GetLocation (yyVals[-1+yyTop]), "A fixed size buffer field must have the array size specifier after the field name"); } break; case 138: #line 1134 "cs-parser.jay" { var decl = new List<VariableDeclaration> (2); decl.Add ((VariableDeclaration)yyVals[0+yyTop]); yyVal = decl; } break; case 139: #line 1140 "cs-parser.jay" { var decls = (List<VariableDeclaration>) yyVals[-2+yyTop]; decls.Add ((VariableDeclaration)yyVals[0+yyTop]); yyVal = yyVals[-2+yyTop]; } break; case 140: #line 1149 "cs-parser.jay" { yyVal = new VariableDeclaration ((Tokenizer.LocatedToken) yyVals[-3+yyTop], (Expression) yyVals[-1+yyTop]); } break; case 141: #line 1153 "cs-parser.jay" { Report.Error (443, lexer.Location, "Value or constant expected"); yyVal = new VariableDeclaration ((Tokenizer.LocatedToken) yyVals[-2+yyTop], null); } break; case 142: #line 1162 "cs-parser.jay" { variables_bucket.Clear (); if (yyVals[0+yyTop] != null) variables_bucket.Add (yyVals[0+yyTop]); yyVal = variables_bucket; } break; case 143: #line 1169 "cs-parser.jay" { var decls = (List<object>) yyVals[-2+yyTop]; decls.Add (yyVals[0+yyTop]); yyVal = yyVals[-2+yyTop]; } break; case 144: #line 1178 "cs-parser.jay" { yyVal = new VariableDeclaration ((Tokenizer.LocatedToken) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]); } break; case 145: #line 1182 "cs-parser.jay" { yyVal = new VariableDeclaration ((Tokenizer.LocatedToken) yyVals[0+yyTop], null); } break; case 146: #line 1186 "cs-parser.jay" { yyVal = null; } break; case 149: #line 1195 "cs-parser.jay" { yyVal = new StackAlloc ((Expression) yyVals[-3+yyTop], (Expression) yyVals[-1+yyTop], GetLocation (yyVals[-4+yyTop])); } break; case 150: #line 1199 "cs-parser.jay" { yyVal = new ArglistAccess (GetLocation (yyVals[0+yyTop])); } break; case 151: #line 1203 "cs-parser.jay" { Report.Error (1575, GetLocation (yyVals[-1+yyTop]), "A stackalloc expression requires [] after type"); yyVal = new StackAlloc ((Expression) yyVals[0+yyTop], null, GetLocation (yyVals[-1+yyTop])); } break; case 152: #line 1211 "cs-parser.jay" { variables_bucket.Clear (); if (yyVals[0+yyTop] != null) variables_bucket.Add (yyVals[0+yyTop]); yyVal = variables_bucket; } break; case 153: #line 1218 "cs-parser.jay" { var decls = (List<object>) yyVals[-2+yyTop]; decls.Add (yyVals[0+yyTop]); yyVal = yyVals[-2+yyTop]; } break; case 154: #line 1227 "cs-parser.jay" { ++lexer.parsing_block; lexer.parsing_generic_declaration = false; } break; case 155: #line 1232 "cs-parser.jay" { --lexer.parsing_block; yyVal = new VariableMemberDeclaration ((MemberName) yyVals[-3+yyTop], (Expression) yyVals[0+yyTop]); } break; case 156: #line 1237 "cs-parser.jay" { lexer.parsing_generic_declaration = false; yyVal = new VariableMemberDeclaration ((MemberName) yyVals[0+yyTop], null); } break; case 157: #line 1242 "cs-parser.jay" { lexer.parsing_generic_declaration = false; yyVal = null; } break; case 158: #line 1250 "cs-parser.jay" { Report.Error (650, GetLocation (yyVals[-2+yyTop]), "Syntax error, bad array declarator. To declare a managed array the rank specifier precedes the variable's identifier. " + "To declare a fixed size buffer field, use the fixed keyword before the field type"); } break; case 161: #line 1262 "cs-parser.jay" { if (RootContext.Documentation != null) Lexer.doc_state = XmlCommentState.NotAllowed; } break; case 162: #line 1267 "cs-parser.jay" { Method method = (Method) yyVals[-2+yyTop]; method.Block = (ToplevelBlock) yyVals[0+yyTop]; current_container.AddMethod (method); if (current_container.Kind == MemberKind.Interface && method.Block != null) { Report.Error (531, method.Location, "`{0}': interface members cannot have a definition", method.GetSignatureForError ()); } current_generic_method = null; current_local_parameters = null; if (RootContext.Documentation != null) Lexer.doc_state = XmlCommentState.Allowed; } break; case 163: #line 1289 "cs-parser.jay" { valid_param_mod = ParameterModifierType.All; } break; case 164: #line 1293 "cs-parser.jay" { lexer.ConstraintsParsing = true; } break; case 165: #line 1297 "cs-parser.jay" { lexer.ConstraintsParsing = false; valid_param_mod = 0; MemberName name = (MemberName) yyVals[-6+yyTop]; current_local_parameters = (ParametersCompiled) yyVals[-3+yyTop]; GenericMethod generic = null; if (name.TypeArguments != null) { generic = new GenericMethod (current_namespace, current_class, name, (FullNamedExpression) yyVals[-7+yyTop], current_local_parameters); generic.SetParameterInfo ((List<Constraints>) yyVals[0+yyTop]); } else if (yyVals[0+yyTop] != null) { Report.Error (80, GetLocation (yyVals[0+yyTop]), "Constraints are not allowed on non-generic declarations"); } Method method = new Method (current_class, generic, (FullNamedExpression) yyVals[-7+yyTop], (Modifiers) yyVals[-8+yyTop], name, current_local_parameters, (Attributes) yyVals[-9+yyTop]); if (yyVals[0+yyTop] != null && ((method.ModFlags & Modifiers.OVERRIDE) != 0 || method.IsExplicitImpl)) { Report.Error (460, method.Location, "`{0}': Cannot specify constraints for overrides and explicit interface implementation methods", method.GetSignatureForError ()); } current_generic_method = generic; if (RootContext.Documentation != null) method.DocComment = Lexer.consume_doc_comment (); yyVal = method; } break; case 166: #line 1335 "cs-parser.jay" { valid_param_mod = ParameterModifierType.All; } break; case 167: #line 1339 "cs-parser.jay" { lexer.ConstraintsParsing = true; } break; case 168: #line 1343 "cs-parser.jay" { lexer.ConstraintsParsing = false; valid_param_mod = 0; MemberName name = (MemberName) yyVals[-6+yyTop]; current_local_parameters = (ParametersCompiled) yyVals[-3+yyTop]; if (yyVals[-1+yyTop] != null && name.TypeArguments == null) Report.Error (80, lexer.Location, "Constraints are not allowed on non-generic declarations"); Method method; GenericMethod generic = null; if (name.TypeArguments != null) { generic = new GenericMethod (current_namespace, current_class, name, TypeManager.system_void_expr, current_local_parameters); generic.SetParameterInfo ((List<Constraints>) yyVals[0+yyTop]); } var modifiers = (Modifiers) yyVals[-9+yyTop]; const Modifiers invalid_partial_mod = Modifiers.AccessibilityMask | Modifiers.ABSTRACT | Modifiers.EXTERN | Modifiers.NEW | Modifiers.OVERRIDE | Modifiers.SEALED | Modifiers.VIRTUAL; if ((modifiers & invalid_partial_mod) != 0) { Report.Error (750, name.Location, "A partial method cannot define access modifier or " + "any of abstract, extern, new, override, sealed, or virtual modifiers"); modifiers &= ~invalid_partial_mod; } if ((current_class.ModFlags & Modifiers.PARTIAL) == 0) { Report.Error (751, name.Location, "A partial method must be declared within a " + "partial class or partial struct"); } modifiers |= Modifiers.PARTIAL | Modifiers.PRIVATE; method = new Method (current_class, generic, TypeManager.system_void_expr, modifiers, name, current_local_parameters, (Attributes) yyVals[-10+yyTop]); current_generic_method = generic; if (RootContext.Documentation != null) method.DocComment = Lexer.consume_doc_comment (); yyVal = method; } break; case 169: #line 1396 "cs-parser.jay" { MemberName name = (MemberName) yyVals[-3+yyTop]; Report.Error (1585, name.Location, "Member modifier `{0}' must precede the member type and name", ModifiersExtensions.Name ((Modifiers) yyVals[-4+yyTop])); Method method = new Method (current_class, null, TypeManager.system_void_expr, 0, name, (ParametersCompiled) yyVals[-1+yyTop], (Attributes) yyVals[-7+yyTop]); current_local_parameters = (ParametersCompiled) yyVals[-1+yyTop]; if (RootContext.Documentation != null) method.DocComment = Lexer.consume_doc_comment (); yyVal = method; } break; case 171: #line 1415 "cs-parser.jay" { yyVal = null; } break; case 172: #line 1419 "cs-parser.jay" { yyVal = ParametersCompiled.EmptyReadOnlyParameters; } break; case 174: #line 1425 "cs-parser.jay" { var pars_list = (List<Parameter>) yyVals[0+yyTop]; yyVal = new ParametersCompiled (compiler, pars_list.ToArray ()); } break; case 175: #line 1430 "cs-parser.jay" { var pars_list = (List<Parameter>) yyVals[-2+yyTop]; pars_list.Add ((Parameter) yyVals[0+yyTop]); yyVal = new ParametersCompiled (compiler, pars_list.ToArray ()); } break; case 176: #line 1437 "cs-parser.jay" { var pars_list = (List<Parameter>) yyVals[-2+yyTop]; pars_list.Add (new ArglistParameter (GetLocation (yyVals[0+yyTop]))); yyVal = new ParametersCompiled (compiler, pars_list.ToArray (), true); } break; case 177: #line 1443 "cs-parser.jay" { if (yyVals[-2+yyTop] != null) Report.Error (231, ((Parameter) yyVals[-2+yyTop]).Location, "A params parameter must be the last parameter in a formal parameter list"); yyVal = new ParametersCompiled (compiler, new Parameter[] { (Parameter) yyVals[-2+yyTop] } ); } break; case 178: #line 1450 "cs-parser.jay" { if (yyVals[-2+yyTop] != null) Report.Error (231, ((Parameter) yyVals[-2+yyTop]).Location, "A params parameter must be the last parameter in a formal parameter list"); var pars_list = (List<Parameter>) yyVals[-4+yyTop]; pars_list.Add (new ArglistParameter (GetLocation (yyVals[-2+yyTop]))); yyVal = new ParametersCompiled (compiler, pars_list.ToArray (), true); } break; case 179: #line 1460 "cs-parser.jay" { Report.Error (257, GetLocation (yyVals[-2+yyTop]), "An __arglist parameter must be the last parameter in a formal parameter list"); yyVal = new ParametersCompiled (compiler, new Parameter [] { new ArglistParameter (GetLocation (yyVals[-2+yyTop])) }, true); } break; case 180: #line 1466 "cs-parser.jay" { Report.Error (257, GetLocation (yyVals[-2+yyTop]), "An __arglist parameter must be the last parameter in a formal parameter list"); var pars_list = (List<Parameter>) yyVals[-4+yyTop]; pars_list.Add (new ArglistParameter (GetLocation (yyVals[-2+yyTop]))); yyVal = new ParametersCompiled (compiler, pars_list.ToArray (), true); } break; case 181: #line 1475 "cs-parser.jay" { yyVal = new ParametersCompiled (compiler, new Parameter[] { (Parameter) yyVals[0+yyTop] } ); } break; case 182: #line 1479 "cs-parser.jay" { yyVal = new ParametersCompiled (compiler, new Parameter [] { new ArglistParameter (GetLocation (yyVals[0+yyTop])) }, true); } break; case 183: #line 1486 "cs-parser.jay" { parameters_bucket.Clear (); Parameter p = (Parameter) yyVals[0+yyTop]; parameters_bucket.Add (p); default_parameter_used = p.HasDefaultValue; yyVal = parameters_bucket; } break; case 184: #line 1495 "cs-parser.jay" { var pars = (List<Parameter>) yyVals[-2+yyTop]; Parameter p = (Parameter) yyVals[0+yyTop]; if (p != null) { if (p.HasExtensionMethodModifier) Report.Error (1100, p.Location, "The parameter modifier `this' can only be used on the first parameter"); else if (!p.HasDefaultValue && default_parameter_used) Report.Error (1737, p.Location, "Optional parameter cannot precede required parameters"); default_parameter_used |= p.HasDefaultValue; pars.Add (p); } yyVal = yyVals[-2+yyTop]; } break; case 185: #line 1516 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new Parameter ((FullNamedExpression) yyVals[-1+yyTop], lt.Value, (Parameter.Modifier) yyVals[-2+yyTop], (Attributes) yyVals[-3+yyTop], lt.Location); } break; case 186: #line 1524 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; Report.Error (1552, lt.Location, "Array type specifier, [], must appear before parameter name"); yyVal = new Parameter ((FullNamedExpression) yyVals[-3+yyTop], lt.Value, (Parameter.Modifier) yyVals[-4+yyTop], (Attributes) yyVals[-5+yyTop], lt.Location); } break; case 187: #line 1533 "cs-parser.jay" { Location l = GetLocation (yyVals[0+yyTop]); CheckIdentifierToken (yyToken, l); yyVal = new Parameter ((FullNamedExpression) yyVals[-1+yyTop], "NeedSomeGeneratorHere", (Parameter.Modifier) yyVals[-2+yyTop], (Attributes) yyVals[-3+yyTop], l); } break; case 188: #line 1544 "cs-parser.jay" { if (RootContext.Version <= LanguageVersion.V_3) { Report.FeatureIsNotAvailable (GetLocation (yyVals[-1+yyTop]), "optional parameter"); } Parameter.Modifier mod = (Parameter.Modifier) yyVals[-4+yyTop]; if (mod != Parameter.Modifier.NONE) { switch (mod) { case Parameter.Modifier.REF: case Parameter.Modifier.OUT: Report.Error (1741, GetLocation (yyVals[-4+yyTop]), "Cannot specify a default value for the `{0}' parameter", Parameter.GetModifierSignature (mod)); break; case Parameter.Modifier.This: Report.Error (1743, GetLocation (yyVals[-4+yyTop]), "Cannot specify a default value for the `{0}' parameter", Parameter.GetModifierSignature (mod)); break; default: throw new NotImplementedException (mod.ToString ()); } mod = Parameter.Modifier.NONE; } if ((valid_param_mod & ParameterModifierType.DefaultValue) == 0) Report.Error (1065, GetLocation (yyVals[0+yyTop]), "Optional parameter is not valid in this context"); var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new Parameter ((FullNamedExpression) yyVals[-3+yyTop], lt.Value, mod, (Attributes) yyVals[-5+yyTop], lt.Location); if (yyVals[0+yyTop] != null) ((Parameter) yyVal).DefaultValue = (Expression) yyVals[0+yyTop]; } break; case 189: #line 1580 "cs-parser.jay" { yyVal = Parameter.Modifier.NONE; } break; case 191: #line 1586 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 192: #line 1590 "cs-parser.jay" { Parameter.Modifier p2 = (Parameter.Modifier)yyVals[0+yyTop]; Parameter.Modifier mod = (Parameter.Modifier)yyVals[-1+yyTop] | p2; if (((Parameter.Modifier)yyVals[-1+yyTop] & p2) == p2) { Error_DuplicateParameterModifier (lexer.Location, p2); } else { switch (mod & ~Parameter.Modifier.This) { case Parameter.Modifier.REF: Report.Error (1101, lexer.Location, "The parameter modifiers `this' and `ref' cannot be used altogether"); break; case Parameter.Modifier.OUT: Report.Error (1102, lexer.Location, "The parameter modifiers `this' and `out' cannot be used altogether"); break; default: Report.Error (1108, lexer.Location, "A parameter cannot have specified more than one modifier"); break; } } yyVal = mod; } break; case 193: #line 1614 "cs-parser.jay" { if ((valid_param_mod & ParameterModifierType.Ref) == 0) Error_ParameterModifierNotValid ("ref", GetLocation (yyVals[0+yyTop])); yyVal = Parameter.Modifier.REF; } break; case 194: #line 1621 "cs-parser.jay" { if ((valid_param_mod & ParameterModifierType.Out) == 0) Error_ParameterModifierNotValid ("out", GetLocation (yyVals[0+yyTop])); yyVal = Parameter.Modifier.OUT; } break; case 195: #line 1628 "cs-parser.jay" { if ((valid_param_mod & ParameterModifierType.This) == 0) Error_ParameterModifierNotValid ("this", GetLocation (yyVals[0+yyTop])); if (RootContext.Version <= LanguageVersion.ISO_2) Report.FeatureIsNotAvailable (GetLocation (yyVals[0+yyTop]), "extension methods"); yyVal = Parameter.Modifier.This; } break; case 196: #line 1641 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new ParamsParameter ((FullNamedExpression) yyVals[-1+yyTop], lt.Value, (Attributes) yyVals[-3+yyTop], lt.Location); } break; case 197: #line 1646 "cs-parser.jay" { Report.Error (1751, GetLocation (yyVals[-4+yyTop]), "Cannot specify a default value for a parameter array"); var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new ParamsParameter ((FullNamedExpression) yyVals[-3+yyTop], lt.Value, (Attributes) yyVals[-5+yyTop], lt.Location); } break; case 198: #line 1652 "cs-parser.jay" { CheckIdentifierToken (yyToken, GetLocation (yyVals[0+yyTop])); yyVal = null; } break; case 199: #line 1660 "cs-parser.jay" { if ((valid_param_mod & ParameterModifierType.Params) == 0) Report.Error (1670, (GetLocation (yyVals[0+yyTop])), "The `params' modifier is not allowed in current context"); } break; case 200: #line 1665 "cs-parser.jay" { Parameter.Modifier mod = (Parameter.Modifier)yyVals[0+yyTop]; if ((mod & Parameter.Modifier.This) != 0) { Report.Error (1104, GetLocation (yyVals[-1+yyTop]), "The parameter modifiers `this' and `params' cannot be used altogether"); } else { Report.Error (1611, GetLocation (yyVals[-1+yyTop]), "The params parameter cannot be declared as ref or out"); } } break; case 201: #line 1674 "cs-parser.jay" { Error_DuplicateParameterModifier (GetLocation (yyVals[-1+yyTop]), Parameter.Modifier.PARAMS); } break; case 202: #line 1681 "cs-parser.jay" { if ((valid_param_mod & ParameterModifierType.Arglist) == 0) Report.Error (1669, GetLocation (yyVals[0+yyTop]), "__arglist is not valid in this context"); } break; case 203: #line 1692 "cs-parser.jay" { if (RootContext.Documentation != null) tmpComment = Lexer.consume_doc_comment (); } break; case 204: #line 1697 "cs-parser.jay" { implicit_value_parameter_type = (FullNamedExpression) yyVals[-3+yyTop]; lexer.PropertyParsing = true; } break; case 205: #line 1702 "cs-parser.jay" { lexer.PropertyParsing = false; has_get = has_set = false; } break; case 206: #line 1707 "cs-parser.jay" { Property prop; Accessors accessors = (Accessors) yyVals[-2+yyTop]; Accessor get_block = accessors != null ? accessors.get_or_add : null; Accessor set_block = accessors != null ? accessors.set_or_remove : null; bool order = accessors != null ? accessors.declared_in_reverse : false; MemberName name = (MemberName) yyVals[-6+yyTop]; FullNamedExpression ptype = (FullNamedExpression) yyVals[-7+yyTop]; prop = new Property (current_class, ptype, (Modifiers) yyVals[-8+yyTop], name, (Attributes) yyVals[-9+yyTop], get_block, set_block, order, current_block); if (ptype == TypeManager.system_void_expr) Report.Error (547, name.Location, "`{0}': property or indexer cannot have void type", prop.GetSignatureForError ()); if (accessors == null) Report.Error (548, prop.Location, "`{0}': property or indexer must have at least one accessor", prop.GetSignatureForError ()); if (current_container.Kind == MemberKind.Interface) { if (prop.Get.Block != null) Report.Error (531, prop.Location, "`{0}.get': interface members cannot have a definition", prop.GetSignatureForError ()); if (prop.Set.Block != null) Report.Error (531, prop.Location, "`{0}.set': interface members cannot have a definition", prop.GetSignatureForError ()); } current_container.AddProperty (prop); implicit_value_parameter_type = null; if (RootContext.Documentation != null) prop.DocComment = ConsumeStoredComment (); } break; case 207: #line 1745 "cs-parser.jay" { yyVal = new Accessors ((Accessor) yyVals[0+yyTop], null); } break; case 208: #line 1749 "cs-parser.jay" { Accessors accessors = (Accessors) yyVals[0+yyTop]; accessors.get_or_add = (Accessor) yyVals[-1+yyTop]; yyVal = accessors; } break; case 209: #line 1755 "cs-parser.jay" { yyVal = new Accessors (null, (Accessor) yyVals[0+yyTop]); } break; case 210: #line 1759 "cs-parser.jay" { Accessors accessors = (Accessors) yyVals[0+yyTop]; accessors.set_or_remove = (Accessor) yyVals[-1+yyTop]; accessors.declared_in_reverse = true; yyVal = accessors; } break; case 211: #line 1766 "cs-parser.jay" { if (yyToken == Token.CLOSE_BRACE) { yyVal = null; } else { if (yyToken == Token.SEMICOLON) Report.Error (1597, lexer.Location, "Semicolon after method or accessor block is not valid"); else Report.Error (1014, GetLocation (yyVals[0+yyTop]), "A get or set accessor expected"); yyVal = new Accessors (null, null); } } break; case 212: #line 1782 "cs-parser.jay" { /* If this is not the case, then current_local_parameters has already*/ /* been set in indexer_declaration*/ if (parsing_indexer == false) current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters; else current_local_parameters = indexer_parameters; lexer.PropertyParsing = false; } break; case 213: #line 1792 "cs-parser.jay" { if (has_get) { Report.Error (1007, GetLocation (yyVals[-2+yyTop]), "Property accessor already defined"); break; } Accessor accessor = new Accessor ((ToplevelBlock) yyVals[0+yyTop], (Modifiers) yyVals[-3+yyTop], (Attributes) yyVals[-4+yyTop], current_local_parameters, GetLocation (yyVals[-2+yyTop])); has_get = true; current_local_parameters = null; lexer.PropertyParsing = true; if (RootContext.Documentation != null) if (Lexer.doc_state == XmlCommentState.Error) Lexer.doc_state = XmlCommentState.NotAllowed; yyVal = accessor; } break; case 214: #line 1812 "cs-parser.jay" { Parameter implicit_value_parameter = new Parameter ( implicit_value_parameter_type, "value", Parameter.Modifier.NONE, null, GetLocation (yyVals[0+yyTop])); if (!parsing_indexer) { current_local_parameters = new ParametersCompiled (compiler, new Parameter [] { implicit_value_parameter }); } else { current_local_parameters = ParametersCompiled.MergeGenerated (compiler, indexer_parameters, true, implicit_value_parameter, null); } lexer.PropertyParsing = false; } break; case 215: #line 1827 "cs-parser.jay" { if (has_set) { Report.Error (1007, GetLocation (yyVals[-2+yyTop]), "Property accessor already defined"); break; } Accessor accessor = new Accessor ((ToplevelBlock) yyVals[0+yyTop], (Modifiers) yyVals[-3+yyTop], (Attributes) yyVals[-4+yyTop], current_local_parameters, GetLocation (yyVals[-2+yyTop])); has_set = true; current_local_parameters = null; lexer.PropertyParsing = true; if (RootContext.Documentation != null && Lexer.doc_state == XmlCommentState.Error) Lexer.doc_state = XmlCommentState.NotAllowed; yyVal = accessor; } break; case 217: #line 1848 "cs-parser.jay" { yyVal = null; } break; case 218: #line 1852 "cs-parser.jay" { Error_SyntaxError (1043, yyToken, "Invalid accessor body"); yyVal = null; } break; case 219: #line 1863 "cs-parser.jay" { lexer.ConstraintsParsing = true; } break; case 220: #line 1867 "cs-parser.jay" { MemberName name = MakeName ((MemberName) yyVals[0+yyTop]); push_current_class (new Interface (current_namespace, current_class, name, (Modifiers) yyVals[-4+yyTop], (Attributes) yyVals[-5+yyTop]), yyVals[-3+yyTop]); } break; case 221: #line 1873 "cs-parser.jay" { lexer.ConstraintsParsing = false; current_class.SetParameterInfo ((List<Constraints>) yyVals[0+yyTop]); if (RootContext.Documentation != null) { current_container.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } } break; case 222: #line 1884 "cs-parser.jay" { --lexer.parsing_declaration; if (RootContext.Documentation != null) Lexer.doc_state = XmlCommentState.Allowed; } break; case 223: #line 1890 "cs-parser.jay" { yyVal = pop_current_class (); } break; case 224: #line 1893 "cs-parser.jay" { CheckIdentifierToken (yyToken, GetLocation (yyVals[0+yyTop])); } break; case 230: #line 1916 "cs-parser.jay" { Report.Error (525, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain fields or constants"); } break; case 231: #line 1920 "cs-parser.jay" { Report.Error (525, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain fields or constants"); } break; case 236: #line 1928 "cs-parser.jay" { Report.Error (567, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain operators"); } break; case 237: #line 1932 "cs-parser.jay" { Report.Error (526, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain contructors"); } break; case 238: #line 1936 "cs-parser.jay" { Report.Error (524, GetLocation (yyVals[0+yyTop]), "Interfaces cannot declare classes, structs, interfaces, delegates, or enumerations"); } break; case 239: #line 1943 "cs-parser.jay" { } break; case 240: #line 1946 "cs-parser.jay" { if (yyVals[-2+yyTop] == null) break; OperatorDeclaration decl = (OperatorDeclaration) yyVals[-2+yyTop]; Operator op = new Operator ( current_class, decl.optype, decl.ret_type, (Modifiers) yyVals[-3+yyTop], current_local_parameters, (ToplevelBlock) yyVals[0+yyTop], (Attributes) yyVals[-4+yyTop], decl.location); if (RootContext.Documentation != null) { op.DocComment = tmpComment; Lexer.doc_state = XmlCommentState.Allowed; } /* Note again, checking is done in semantic analysis*/ current_container.AddOperator (op); current_local_parameters = null; } break; case 242: #line 1970 "cs-parser.jay" { yyVal = null; } break; case 244: #line 1976 "cs-parser.jay" { Report.Error (590, GetLocation (yyVals[0+yyTop]), "User-defined operators cannot return void"); yyVal = TypeManager.system_void_expr; } break; case 245: #line 1984 "cs-parser.jay" { valid_param_mod = ParameterModifierType.DefaultValue; } break; case 246: #line 1988 "cs-parser.jay" { valid_param_mod = 0; Location loc = GetLocation (yyVals[-5+yyTop]); Operator.OpType op = (Operator.OpType) yyVals[-4+yyTop]; current_local_parameters = (ParametersCompiled)yyVals[-1+yyTop]; int p_count = current_local_parameters.Count; if (p_count == 1) { if (op == Operator.OpType.Addition) op = Operator.OpType.UnaryPlus; else if (op == Operator.OpType.Subtraction) op = Operator.OpType.UnaryNegation; } if (IsUnaryOperator (op)) { if (p_count == 2) { Report.Error (1020, loc, "Overloadable binary operator expected"); } else if (p_count != 1) { Report.Error (1535, loc, "Overloaded unary operator `{0}' takes one parameter", Operator.GetName (op)); } } 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"); } } if (RootContext.Documentation != null) { tmpComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.NotAllowed; } yyVal = new OperatorDeclaration (op, (FullNamedExpression) yyVals[-6+yyTop], loc); } break; case 248: #line 2031 "cs-parser.jay" { yyVal = Operator.OpType.LogicalNot; } break; case 249: #line 2032 "cs-parser.jay" { yyVal = Operator.OpType.OnesComplement; } break; case 250: #line 2033 "cs-parser.jay" { yyVal = Operator.OpType.Increment; } break; case 251: #line 2034 "cs-parser.jay" { yyVal = Operator.OpType.Decrement; } break; case 252: #line 2035 "cs-parser.jay" { yyVal = Operator.OpType.True; } break; case 253: #line 2036 "cs-parser.jay" { yyVal = Operator.OpType.False; } break; case 254: #line 2038 "cs-parser.jay" { yyVal = Operator.OpType.Addition; } break; case 255: #line 2039 "cs-parser.jay" { yyVal = Operator.OpType.Subtraction; } break; case 256: #line 2041 "cs-parser.jay" { yyVal = Operator.OpType.Multiply; } break; case 257: #line 2042 "cs-parser.jay" { yyVal = Operator.OpType.Division; } break; case 258: #line 2043 "cs-parser.jay" { yyVal = Operator.OpType.Modulus; } break; case 259: #line 2044 "cs-parser.jay" { yyVal = Operator.OpType.BitwiseAnd; } break; case 260: #line 2045 "cs-parser.jay" { yyVal = Operator.OpType.BitwiseOr; } break; case 261: #line 2046 "cs-parser.jay" { yyVal = Operator.OpType.ExclusiveOr; } break; case 262: #line 2047 "cs-parser.jay" { yyVal = Operator.OpType.LeftShift; } break; case 263: #line 2048 "cs-parser.jay" { yyVal = Operator.OpType.RightShift; } break; case 264: #line 2049 "cs-parser.jay" { yyVal = Operator.OpType.Equality; } break; case 265: #line 2050 "cs-parser.jay" { yyVal = Operator.OpType.Inequality; } break; case 266: #line 2051 "cs-parser.jay" { yyVal = Operator.OpType.GreaterThan; } break; case 267: #line 2052 "cs-parser.jay" { yyVal = Operator.OpType.LessThan; } break; case 268: #line 2053 "cs-parser.jay" { yyVal = Operator.OpType.GreaterThanOrEqual; } break; case 269: #line 2054 "cs-parser.jay" { yyVal = Operator.OpType.LessThanOrEqual; } break; case 270: #line 2059 "cs-parser.jay" { valid_param_mod = ParameterModifierType.DefaultValue; } break; case 271: #line 2063 "cs-parser.jay" { valid_param_mod = 0; Location loc = GetLocation (yyVals[-5+yyTop]); current_local_parameters = (ParametersCompiled)yyVals[-1+yyTop]; if (RootContext.Documentation != null) { tmpComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.NotAllowed; } yyVal = new OperatorDeclaration (Operator.OpType.Implicit, (FullNamedExpression) yyVals[-4+yyTop], loc); } break; case 272: #line 2077 "cs-parser.jay" { valid_param_mod = ParameterModifierType.DefaultValue; } break; case 273: #line 2081 "cs-parser.jay" { valid_param_mod = 0; Location loc = GetLocation (yyVals[-5+yyTop]); current_local_parameters = (ParametersCompiled)yyVals[-1+yyTop]; if (RootContext.Documentation != null) { tmpComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.NotAllowed; } yyVal = new OperatorDeclaration (Operator.OpType.Explicit, (FullNamedExpression) yyVals[-4+yyTop], loc); } break; case 274: #line 2095 "cs-parser.jay" { Error_SyntaxError (yyToken); current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters; yyVal = new OperatorDeclaration (Operator.OpType.Implicit, null, GetLocation (yyVals[-1+yyTop])); } break; case 275: #line 2101 "cs-parser.jay" { Error_SyntaxError (yyToken); current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters; yyVal = new OperatorDeclaration (Operator.OpType.Explicit, null, GetLocation (yyVals[-1+yyTop])); } break; case 276: #line 2111 "cs-parser.jay" { Constructor c = (Constructor) yyVals[-1+yyTop]; c.Block = (ToplevelBlock) yyVals[0+yyTop]; if (RootContext.Documentation != null) c.DocComment = ConsumeStoredComment (); current_container.AddConstructor (c); current_local_parameters = null; if (RootContext.Documentation != null) Lexer.doc_state = XmlCommentState.Allowed; } break; case 277: #line 2130 "cs-parser.jay" { if (RootContext.Documentation != null) { tmpComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } valid_param_mod = ParameterModifierType.All; } break; case 278: #line 2139 "cs-parser.jay" { valid_param_mod = 0; current_local_parameters = (ParametersCompiled) yyVals[-1+yyTop]; /**/ /* start block here, so possible anonymous methods inside*/ /* constructor initializer can get correct parent block*/ /**/ start_block (lexer.Location); } break; case 279: #line 2150 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-6+yyTop]; var mods = (Modifiers) yyVals[-7+yyTop]; ConstructorInitializer ci = (ConstructorInitializer) yyVals[0+yyTop]; Constructor c = new Constructor (current_class, lt.Value, mods, (Attributes) yyVals[-8+yyTop], current_local_parameters, ci, lt.Location); if (lt.Value != current_container.MemberName.Name) { Report.Error (1520, c.Location, "Class, struct, or interface method must have a return type"); } else if ((mods & Modifiers.STATIC) != 0) { if ((mods & Modifiers.AccessibilityMask) != 0){ Report.Error (515, c.Location, "`{0}': static constructor cannot have an access modifier", c.GetSignatureForError ()); } if (ci != null) { Report.Error (514, c.Location, "`{0}': static constructor cannot have an explicit `this' or `base' constructor call", c.GetSignatureForError ()); } } yyVal = c; } break; case 281: #line 2180 "cs-parser.jay" { current_block = null; yyVal = null; } break; case 284: #line 2190 "cs-parser.jay" { ++lexer.parsing_block; } break; case 285: #line 2194 "cs-parser.jay" { --lexer.parsing_block; yyVal = new ConstructorBaseInitializer ((Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-4+yyTop])); } break; case 286: #line 2199 "cs-parser.jay" { ++lexer.parsing_block; } break; case 287: #line 2203 "cs-parser.jay" { --lexer.parsing_block; yyVal = new ConstructorThisInitializer ((Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-4+yyTop])); } break; case 288: #line 2207 "cs-parser.jay" { Report.Error (1018, GetLocation (yyVals[-1+yyTop]), "Keyword `this' or `base' expected"); yyVal = null; } break; case 289: #line 2215 "cs-parser.jay" { if (RootContext.Documentation != null) { tmpComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.NotAllowed; } current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters; } break; case 290: #line 2224 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; 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){ Report.Error (575, lt.Location, "Only class types can contain destructor"); } else { Destructor d = new Destructor (current_class, (Modifiers) yyVals[-6+yyTop], ParametersCompiled.EmptyReadOnlyParameters, (Attributes) yyVals[-7+yyTop], lt.Location); if (RootContext.Documentation != null) d.DocComment = ConsumeStoredComment (); d.Block = (ToplevelBlock) yyVals[0+yyTop]; current_container.AddMethod (d); } current_local_parameters = null; } break; case 291: #line 2248 "cs-parser.jay" { foreach (VariableMemberDeclaration var in (List<object>) yyVals[-1+yyTop]) { EventField e = new EventField ( current_class, (FullNamedExpression) yyVals[-2+yyTop], (Modifiers) yyVals[-4+yyTop], var.MemberName, (Attributes) yyVals[-5+yyTop]); e.Initializer = var.GetInitializer ((FullNamedExpression) yyVals[-2+yyTop]); if (current_container.Kind == MemberKind.Interface && e.Initializer != null) { Report.Error (68, e.Location, "`{0}': event in interface cannot have initializer", e.GetSignatureForError ()); } if (var.MemberName.Left != null) { Report.Error (71, e.Location, "`{0}': An explicit interface implementation of an event must use property syntax", e.GetSignatureForError ()); } current_container.AddEvent (e); if (RootContext.Documentation != null) { e.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } } } break; case 292: #line 2277 "cs-parser.jay" { implicit_value_parameter_type = (FullNamedExpression) yyVals[-2+yyTop]; current_local_parameters = new ParametersCompiled (compiler, new Parameter (implicit_value_parameter_type, "value", Parameter.Modifier.NONE, null, GetLocation (yyVals[-3+yyTop]))); lexer.EventParsing = true; } break; case 293: #line 2286 "cs-parser.jay" { lexer.EventParsing = false; } break; case 294: #line 2290 "cs-parser.jay" { MemberName name = (MemberName) yyVals[-5+yyTop]; if (current_container.Kind == MemberKind.Interface) { Report.Error (69, GetLocation (yyVals[-7+yyTop]), "Event in interface cannot have add or remove accessors"); yyVals[-2+yyTop] = new Accessors (null, null); } else if (yyVals[-2+yyTop] == null) { Report.Error (65, GetLocation (yyVals[-7+yyTop]), "`{0}.{1}': event property must have both add and remove accessors", current_container.GetSignatureForError (), name.GetSignatureForError ()); yyVals[-2+yyTop] = new Accessors (null, null); } Accessors accessors = (Accessors) yyVals[-2+yyTop]; if (accessors.get_or_add == null || accessors.set_or_remove == null) /* CS0073 is already reported, so no CS0065 here.*/ yyVal = null; else { Event e = new EventProperty ( current_class, (FullNamedExpression) yyVals[-6+yyTop], (Modifiers) yyVals[-8+yyTop], name, (Attributes) yyVals[-9+yyTop], accessors.get_or_add, accessors.set_or_remove); if (RootContext.Documentation != null) { e.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } current_container.AddEvent (e); implicit_value_parameter_type = null; } current_local_parameters = null; } break; case 295: #line 2322 "cs-parser.jay" { MemberName mn = (MemberName) yyVals[-1+yyTop]; if (mn.Left != null) Report.Error (71, mn.Location, "An explicit interface implementation of an event must use property syntax"); if (RootContext.Documentation != null) Lexer.doc_state = XmlCommentState.Allowed; Error_SyntaxError (yyToken); yyVal = null; } break; case 296: #line 2337 "cs-parser.jay" { yyVal = new Accessors ((Accessor) yyVals[-1+yyTop], (Accessor) yyVals[0+yyTop]); } break; case 297: #line 2341 "cs-parser.jay" { Accessors accessors = new Accessors ((Accessor) yyVals[0+yyTop], (Accessor) yyVals[-1+yyTop]); accessors.declared_in_reverse = true; yyVal = accessors; } break; case 298: #line 2346 "cs-parser.jay" { yyVal = null; } break; case 299: #line 2347 "cs-parser.jay" { yyVal = null; } break; case 300: #line 2349 "cs-parser.jay" { Report.Error (1055, GetLocation (yyVals[0+yyTop]), "An add or remove accessor expected"); yyVal = null; } break; case 301: #line 2353 "cs-parser.jay" { yyVal = null; } break; case 302: #line 2358 "cs-parser.jay" { lexer.EventParsing = false; } break; case 303: #line 2362 "cs-parser.jay" { Accessor accessor = new Accessor ((ToplevelBlock) yyVals[0+yyTop], 0, (Attributes) yyVals[-3+yyTop], null, GetLocation (yyVals[-2+yyTop])); lexer.EventParsing = true; yyVal = accessor; } break; case 304: #line 2367 "cs-parser.jay" { Report.Error (73, GetLocation (yyVals[-1+yyTop]), "An add or remove accessor must have a body"); yyVal = null; } break; case 305: #line 2371 "cs-parser.jay" { Report.Error (1609, GetLocation (yyVals[0+yyTop]), "Modifiers cannot be placed on event accessor declarations"); yyVal = null; } break; case 306: #line 2379 "cs-parser.jay" { lexer.EventParsing = false; } break; case 307: #line 2383 "cs-parser.jay" { yyVal = new Accessor ((ToplevelBlock) yyVals[0+yyTop], 0, (Attributes) yyVals[-3+yyTop], null, GetLocation (yyVals[-2+yyTop])); lexer.EventParsing = true; } break; case 308: #line 2387 "cs-parser.jay" { Report.Error (73, GetLocation (yyVals[-1+yyTop]), "An add or remove accessor must have a body"); yyVal = null; } break; case 309: #line 2391 "cs-parser.jay" { Report.Error (1609, GetLocation (yyVals[0+yyTop]), "Modifiers cannot be placed on event accessor declarations"); yyVal = null; } break; case 310: #line 2400 "cs-parser.jay" { valid_param_mod = ParameterModifierType.Params | ParameterModifierType.DefaultValue; } break; case 311: #line 2405 "cs-parser.jay" { valid_param_mod = 0; implicit_value_parameter_type = (FullNamedExpression) yyVals[-6+yyTop]; indexer_parameters = (ParametersCompiled) yyVals[-2+yyTop]; if (indexer_parameters.IsEmpty) { Report.Error (1551, GetLocation (yyVals[-4+yyTop]), "Indexers must have at least one parameter"); } if (RootContext.Documentation != null) { tmpComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } lexer.PropertyParsing = true; parsing_indexer = true; } break; case 312: #line 2424 "cs-parser.jay" { lexer.PropertyParsing = false; has_get = has_set = false; parsing_indexer = false; } break; case 313: #line 2430 "cs-parser.jay" { Accessors accessors = (Accessors) yyVals[-2+yyTop]; Accessor get_block = accessors != null ? accessors.get_or_add : null; Accessor set_block = accessors != null ? accessors.set_or_remove : null; bool order = accessors != null ? accessors.declared_in_reverse : false; Indexer indexer = new Indexer (current_class, (FullNamedExpression) yyVals[-10+yyTop], (MemberName)yyVals[-9+yyTop], (Modifiers) yyVals[-11+yyTop], (ParametersCompiled) yyVals[-6+yyTop], (Attributes) yyVals[-12+yyTop], get_block, set_block, order); if (yyVals[-10+yyTop] == TypeManager.system_void_expr) Report.Error (620, GetLocation (yyVals[-10+yyTop]), "`{0}': indexer return type cannot be `void'", indexer.GetSignatureForError ()); if (accessors == null) Report.Error (548, indexer.Location, "`{0}': property or indexer must have at least one accessor", indexer.GetSignatureForError ()); if (current_container.Kind == MemberKind.Interface) { if (indexer.Get.Block != null) Report.Error (531, indexer.Location, "`{0}.get': interface members cannot have a definition", indexer.GetSignatureForError ()); if (indexer.Set.Block != null) Report.Error (531, indexer.Location, "`{0}.set': interface members cannot have a definition", indexer.GetSignatureForError ()); } if (RootContext.Documentation != null) indexer.DocComment = ConsumeStoredComment (); current_container.AddIndexer (indexer); current_local_parameters = null; implicit_value_parameter_type = null; indexer_parameters = null; } break; case 314: #line 2469 "cs-parser.jay" { if (RootContext.Documentation != null) enumTypeComment = Lexer.consume_doc_comment (); } break; case 315: #line 2475 "cs-parser.jay" { MemberName name = (MemberName) yyVals[-4+yyTop]; if (name.IsGeneric) { Report.Error (1675, name.Location, "Enums cannot have type parameters"); } name = MakeName (name); Enum e = new Enum (current_namespace, current_class, (TypeExpr) yyVals[-3+yyTop], (Modifiers) yyVals[-6+yyTop], name, (Attributes) yyVals[-7+yyTop]); if (RootContext.Documentation != null) e.DocComment = enumTypeComment; EnumMember em = null; foreach (VariableDeclaration ev in (IList<VariableDeclaration>) yyVals[-1+yyTop]) { em = new EnumMember ( e, em, ev.identifier, ev.GetInitializer ((FullNamedExpression) yyVals[-3+yyTop]), ev.OptAttributes, ev.Location); /* if (RootContext.Documentation != null)*/ em.DocComment = ev.DocComment; e.AddEnumMember (em); } if (RootContext.EvalMode) undo.AddTypeContainer (current_container, e); current_container.AddTypeContainer (e); yyVal = e; } break; case 316: #line 2512 "cs-parser.jay" { yyVal = TypeManager.system_int32_expr; } break; case 317: #line 2516 "cs-parser.jay" { if (yyVals[0+yyTop] != TypeManager.system_int32_expr && yyVals[0+yyTop] != TypeManager.system_uint32_expr && yyVals[0+yyTop] != TypeManager.system_int64_expr && yyVals[0+yyTop] != TypeManager.system_uint64_expr && yyVals[0+yyTop] != TypeManager.system_int16_expr && yyVals[0+yyTop] != TypeManager.system_uint16_expr && yyVals[0+yyTop] != TypeManager.system_byte_expr && yyVals[0+yyTop] != TypeManager.system_sbyte_expr) { Enum.Error_1008 (GetLocation (yyVals[0+yyTop]), Report); yyVals[0+yyTop] = TypeManager.system_int32_expr; } yyVal = yyVals[0+yyTop]; } break; case 318: #line 2528 "cs-parser.jay" { Error_TypeExpected (GetLocation (yyVals[-1+yyTop])); yyVal = TypeManager.system_int32_expr; } break; case 319: #line 2536 "cs-parser.jay" { if (RootContext.Documentation != null) Lexer.doc_state = XmlCommentState.Allowed; } break; case 320: #line 2541 "cs-parser.jay" { /* here will be evaluated after CLOSE_BLACE is consumed.*/ if (RootContext.Documentation != null) Lexer.doc_state = XmlCommentState.Allowed; } break; case 321: #line 2547 "cs-parser.jay" { yyVal = yyVals[-2+yyTop]; } break; case 322: #line 2553 "cs-parser.jay" { yyVal = new VariableDeclaration [0]; } break; case 323: #line 2554 "cs-parser.jay" { yyVal = yyVals[-1+yyTop]; } break; case 324: #line 2559 "cs-parser.jay" { var l = new List<VariableDeclaration> (4); l.Add ((VariableDeclaration) yyVals[0+yyTop]); yyVal = l; } break; case 325: #line 2565 "cs-parser.jay" { var l = (List<VariableDeclaration>) yyVals[-2+yyTop]; l.Add ((VariableDeclaration) yyVals[0+yyTop]); yyVal = l; } break; case 326: #line 2574 "cs-parser.jay" { VariableDeclaration vd = new VariableDeclaration ( (Tokenizer.LocatedToken) yyVals[0+yyTop], null, (Attributes) yyVals[-1+yyTop]); if (RootContext.Documentation != null) { vd.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } yyVal = vd; } break; case 327: #line 2586 "cs-parser.jay" { ++lexer.parsing_block; if (RootContext.Documentation != null) { tmpComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.NotAllowed; } } break; case 328: #line 2594 "cs-parser.jay" { --lexer.parsing_block; VariableDeclaration vd = new VariableDeclaration ( (Tokenizer.LocatedToken) yyVals[-3+yyTop], (Expression) yyVals[0+yyTop], (Attributes) yyVals[-4+yyTop]); if (RootContext.Documentation != null) vd.DocComment = ConsumeStoredComment (); yyVal = vd; } break; case 329: #line 2612 "cs-parser.jay" { valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out | ParameterModifierType.Params | ParameterModifierType.DefaultValue; } break; case 330: #line 2616 "cs-parser.jay" { valid_param_mod = 0; MemberName name = MakeName ((MemberName) yyVals[-4+yyTop]); ParametersCompiled p = (ParametersCompiled) yyVals[-1+yyTop]; Delegate del = new Delegate (current_namespace, current_class, (FullNamedExpression) yyVals[-5+yyTop], (Modifiers) yyVals[-7+yyTop], name, p, (Attributes) yyVals[-8+yyTop]); if (RootContext.Documentation != null) { del.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } current_container.AddDelegate (del); current_delegate = del; lexer.ConstraintsParsing = true; } break; case 331: #line 2635 "cs-parser.jay" { lexer.ConstraintsParsing = false; } break; case 332: #line 2639 "cs-parser.jay" { current_delegate.SetParameterInfo ((List<Constraints>) yyVals[-2+yyTop]); yyVal = current_delegate; current_delegate = null; } break; case 333: #line 2649 "cs-parser.jay" { yyVal = null; } break; case 334: #line 2653 "cs-parser.jay" { if (RootContext.MetadataCompatibilityVersion < MetadataVersion.v2) Report.FeatureIsNotSupported (GetLocation (yyVals[0+yyTop]), "nullable types"); else if (RootContext.Version < LanguageVersion.ISO_2) Report.FeatureIsNotAvailable (GetLocation (yyVals[0+yyTop]), "nullable types"); yyVal = this; } break; case 336: #line 2666 "cs-parser.jay" { var lt1 = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var lt2 = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberName (lt1.Value, lt2.Value, (TypeArguments) yyVals[0+yyTop], lt1.Location); } break; case 338: #line 2677 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberName ((MemberName) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location); } break; case 339: #line 2685 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberName (lt.Value, (TypeArguments)yyVals[0+yyTop], lt.Location); } break; case 340: #line 2695 "cs-parser.jay" { yyVal = null; } break; case 341: #line 2697 "cs-parser.jay" { if (RootContext.MetadataCompatibilityVersion < MetadataVersion.v2) Report.FeatureIsNotSupported (GetLocation (yyVals[-2+yyTop]), "generics"); else if (RootContext.Version < LanguageVersion.ISO_2) Report.FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "generics"); yyVal = yyVals[-1+yyTop]; } break; case 342: #line 2706 "cs-parser.jay" { Error_TypeExpected (lexer.Location); yyVal = new TypeArguments (); } break; case 343: #line 2714 "cs-parser.jay" { TypeArguments type_args = new TypeArguments (); type_args.Add ((FullNamedExpression) yyVals[0+yyTop]); yyVal = type_args; } break; case 344: #line 2720 "cs-parser.jay" { TypeArguments type_args = (TypeArguments) yyVals[-2+yyTop]; type_args.Add ((FullNamedExpression) yyVals[0+yyTop]); yyVal = type_args; } break; case 345: #line 2732 "cs-parser.jay" { lexer.parsing_generic_declaration = true; } break; case 346: #line 2736 "cs-parser.jay" { lexer.parsing_generic_declaration = false; var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new MemberName (lt.Value, (TypeArguments)yyVals[0+yyTop], lt.Location); } break; case 347: #line 2745 "cs-parser.jay" { MemberName mn = (MemberName)yyVals[0+yyTop]; if (mn.TypeArguments != null) syntax_error (mn.Location, string.Format ("Member `{0}' cannot declare type arguments", mn.GetSignatureForError ())); } break; case 349: #line 2756 "cs-parser.jay" { lexer.parsing_generic_declaration = false; var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberName ((MemberName) yyVals[-2+yyTop], lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location); } break; case 350: #line 2765 "cs-parser.jay" { lexer.parsing_generic_declaration = false; yyVal = new MemberName (TypeContainer.DefaultIndexerName, GetLocation (yyVals[0+yyTop])); } break; case 351: #line 2770 "cs-parser.jay" { lexer.parsing_generic_declaration = false; yyVal = new MemberName ((MemberName) yyVals[-1+yyTop], TypeContainer.DefaultIndexerName, null, GetLocation (yyVals[-1+yyTop])); } break; case 352: #line 2778 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new MemberName (lt.Value, (TypeArguments) yyVals[-1+yyTop], lt.Location); } break; case 353: #line 2783 "cs-parser.jay" { var lt1 = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; var lt2 = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new MemberName (lt1.Value, lt2.Value, (TypeArguments) yyVals[-1+yyTop], lt1.Location); } break; case 354: #line 2790 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new MemberName ((MemberName) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[-1+yyTop], lt.Location); } break; case 355: #line 2797 "cs-parser.jay" { yyVal = null; } break; case 356: #line 2799 "cs-parser.jay" { if (RootContext.MetadataCompatibilityVersion < MetadataVersion.v2) Report.FeatureIsNotSupported (GetLocation (yyVals[-2+yyTop]), "generics"); else if (RootContext.Version < LanguageVersion.ISO_2) Report.FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "generics"); yyVal = yyVals[-1+yyTop]; } break; case 357: #line 2811 "cs-parser.jay" { TypeArguments type_args = new TypeArguments (); type_args.Add ((FullNamedExpression)yyVals[0+yyTop]); yyVal = type_args; } break; case 358: #line 2817 "cs-parser.jay" { TypeArguments type_args = (TypeArguments) yyVals[-2+yyTop]; type_args.Add ((FullNamedExpression)yyVals[0+yyTop]); yyVal = type_args; } break; case 359: #line 2826 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken)yyVals[0+yyTop]; yyVal = new TypeParameterName (lt.Value, (Attributes)yyVals[-2+yyTop], (Variance) yyVals[-1+yyTop], lt.Location); } break; case 360: #line 2831 "cs-parser.jay" { if (GetTokenName (yyToken) == "type") Report.Error (81, GetLocation (yyVals[0+yyTop]), "Type parameter declaration must be an identifier not a type"); else Error_SyntaxError (yyToken); yyVal = new TypeParameterName ("", null, lexer.Location); } break; case 362: #line 2847 "cs-parser.jay" { yyVal = TypeManager.system_void_expr; } break; case 363: #line 2854 "cs-parser.jay" { lexer.parsing_generic_declaration = true; } break; case 365: #line 2865 "cs-parser.jay" { Expression.Error_VoidInvalidInTheContext (GetLocation (yyVals[0+yyTop]), Report); yyVal = TypeManager.system_void_expr; } break; case 367: #line 2874 "cs-parser.jay" { Expression.Error_VoidInvalidInTheContext (GetLocation (yyVals[0+yyTop]), Report); yyVal = TypeManager.system_void_expr; } break; case 369: #line 2883 "cs-parser.jay" { Report.Error (1536, GetLocation (yyVals[0+yyTop]), "Invalid parameter type `void'"); yyVal = TypeManager.system_void_expr; } break; case 371: #line 2892 "cs-parser.jay" { string rank_specifiers = (string) yyVals[0+yyTop]; yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], rank_specifiers); } break; case 372: #line 2900 "cs-parser.jay" { MemberName name = (MemberName) yyVals[-1+yyTop]; if (yyVals[0+yyTop] != null) { yyVal = new ComposedCast (name.GetTypeExpression (), "?", lexer.Location); } else { if (name.Left == null && name.Name == "var") yyVal = new VarExpr (name.Location); else yyVal = name.GetTypeExpression (); } } break; case 373: #line 2913 "cs-parser.jay" { if (yyVals[0+yyTop] != null) yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], "?", lexer.Location); } break; case 374: #line 2918 "cs-parser.jay" { /**/ /* Note that here only unmanaged types are allowed but we*/ /* can't perform checks during this phase - we do it during*/ /* semantic analysis.*/ /**/ yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], "*", Lexer.Location); } break; case 375: #line 2927 "cs-parser.jay" { yyVal = new ComposedCast (TypeManager.system_void_expr, "*", GetLocation (yyVals[-1+yyTop])); } break; case 376: #line 2934 "cs-parser.jay" { var types = new List<FullNamedExpression> (2); types.Add ((FullNamedExpression) yyVals[0+yyTop]); yyVal = types; } break; case 377: #line 2940 "cs-parser.jay" { var types = (List<FullNamedExpression>) yyVals[-2+yyTop]; types.Add ((FullNamedExpression) yyVals[0+yyTop]); yyVal = types; } break; case 378: #line 2949 "cs-parser.jay" { if (yyVals[0+yyTop] is ComposedCast) { Report.Error (1521, GetLocation (yyVals[0+yyTop]), "Invalid base type `{0}'", ((ComposedCast)yyVals[0+yyTop]).GetSignatureForError ()); } yyVal = yyVals[0+yyTop]; } break; case 379: #line 2956 "cs-parser.jay" { Error_TypeExpected (lexer.Location); yyVal = null; } break; case 380: #line 2967 "cs-parser.jay" { yyVal = TypeManager.system_object_expr; } break; case 381: #line 2968 "cs-parser.jay" { yyVal = TypeManager.system_string_expr; } break; case 382: #line 2969 "cs-parser.jay" { yyVal = TypeManager.system_boolean_expr; } break; case 383: #line 2970 "cs-parser.jay" { yyVal = TypeManager.system_decimal_expr; } break; case 384: #line 2971 "cs-parser.jay" { yyVal = TypeManager.system_single_expr; } break; case 385: #line 2972 "cs-parser.jay" { yyVal = TypeManager.system_double_expr; } break; case 387: #line 2977 "cs-parser.jay" { yyVal = TypeManager.system_sbyte_expr; } break; case 388: #line 2978 "cs-parser.jay" { yyVal = TypeManager.system_byte_expr; } break; case 389: #line 2979 "cs-parser.jay" { yyVal = TypeManager.system_int16_expr; } break; case 390: #line 2980 "cs-parser.jay" { yyVal = TypeManager.system_uint16_expr; } break; case 391: #line 2981 "cs-parser.jay" { yyVal = TypeManager.system_int32_expr; } break; case 392: #line 2982 "cs-parser.jay" { yyVal = TypeManager.system_uint32_expr; } break; case 393: #line 2983 "cs-parser.jay" { yyVal = TypeManager.system_int64_expr; } break; case 394: #line 2984 "cs-parser.jay" { yyVal = TypeManager.system_uint64_expr; } break; case 395: #line 2985 "cs-parser.jay" { yyVal = TypeManager.system_char_expr; } break; case 397: #line 2991 "cs-parser.jay" { yyVal = TypeManager.system_void_expr; } break; case 401: #line 3009 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new SimpleName (lt.Value, (TypeArguments)yyVals[0+yyTop], lt.Location); } break; case 402: #line 3013 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new CompletionSimpleName (MemberName.MakeName (lt.Value, null), lt.Location); } break; case 422: #line 3039 "cs-parser.jay" { yyVal = new NullLiteral (GetLocation (yyVals[0+yyTop])); } break; case 423: #line 3043 "cs-parser.jay" { yyVal = new BoolLiteral (true, GetLocation (yyVals[0+yyTop])); } break; case 424: #line 3044 "cs-parser.jay" { yyVal = new BoolLiteral (false, GetLocation (yyVals[0+yyTop])); } break; case 429: #line 3070 "cs-parser.jay" { yyVal = new ParenthesizedExpression ((Expression) yyVals[-1+yyTop]); } break; case 430: #line 3074 "cs-parser.jay" { yyVal = new ParenthesizedExpression ((Expression) yyVals[-1+yyTop]); } break; case 431: #line 3081 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location); } break; case 432: #line 3086 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; /* TODO: Location is wrong as some predefined types doesn't hold a location*/ yyVal = new MemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location); } break; case 433: #line 3092 "cs-parser.jay" { var lt1 = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var lt2 = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new QualifiedAliasMember (lt1.Value, lt2.Value, (TypeArguments) yyVals[0+yyTop], lt1.Location); } break; case 434: #line 3098 "cs-parser.jay" { yyVal = new CompletionMemberAccess ((Expression) yyVals[-2+yyTop], null,GetLocation (yyVals[0+yyTop])); } break; case 435: #line 3101 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new CompletionMemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, lt.Location); } break; case 436: #line 3106 "cs-parser.jay" { /* TODO: Location is wrong as some predefined types doesn't hold a location*/ yyVal = new CompletionMemberAccess ((Expression) yyVals[-2+yyTop], null, lexer.Location); } break; case 437: #line 3110 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new CompletionMemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, lt.Location); } break; case 438: #line 3118 "cs-parser.jay" { yyVal = new Invocation ((Expression) yyVals[-3+yyTop], (Arguments) yyVals[-1+yyTop]); } break; case 439: #line 3124 "cs-parser.jay" { yyVal = null; } break; case 441: #line 3130 "cs-parser.jay" { if (yyVals[-1+yyTop] == null) yyVal = CollectionOrObjectInitializers.Empty; else yyVal = new CollectionOrObjectInitializers ((List<Expression>) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); } break; case 442: #line 3137 "cs-parser.jay" { yyVal = new CollectionOrObjectInitializers ((List<Expression>) yyVals[-2+yyTop], GetLocation (yyVals[-3+yyTop])); } break; case 443: #line 3143 "cs-parser.jay" { yyVal = null; } break; case 444: #line 3145 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 445: #line 3152 "cs-parser.jay" { var a = new List<Expression> (); a.Add ((Expression) yyVals[0+yyTop]); yyVal = a; } break; case 446: #line 3158 "cs-parser.jay" { var a = (List<Expression>)yyVals[-2+yyTop]; a.Add ((Expression) yyVals[0+yyTop]); yyVal = a; } break; case 447: #line 3163 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = yyVals[-1+yyTop]; } break; case 448: #line 3171 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new ElementInitializer (lt.Value, (Expression)yyVals[0+yyTop], lt.Location); } break; case 449: #line 3176 "cs-parser.jay" { yyVal = new CompletionElementInitializer (null, GetLocation (yyVals[0+yyTop])); } break; case 450: #line 3179 "cs-parser.jay" { CompletionSimpleName csn = yyVals[-1+yyTop] as CompletionSimpleName; if (csn == null) yyVal = new CollectionElementInitializer ((Expression)yyVals[-1+yyTop]); else yyVal = new CompletionElementInitializer (csn.Prefix, csn.Location); } break; case 451: #line 3187 "cs-parser.jay" { if (yyVals[-1+yyTop] == null) yyVal = null; else yyVal = new CollectionElementInitializer ((List<Expression>)yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); } break; case 452: #line 3194 "cs-parser.jay" { Report.Error (1920, GetLocation (yyVals[-1+yyTop]), "An element initializer cannot be empty"); yyVal = null; } break; case 455: #line 3206 "cs-parser.jay" { yyVal = null; } break; case 457: #line 3212 "cs-parser.jay" { Arguments list = new Arguments (4); list.Add ((Argument) yyVals[0+yyTop]); yyVal = list; } break; case 458: #line 3218 "cs-parser.jay" { Arguments list = (Arguments) yyVals[-2+yyTop]; if (list [list.Count - 1] is NamedArgument) Error_NamedArgumentExpected ((NamedArgument) list [list.Count - 1]); list.Add ((Argument) yyVals[0+yyTop]); yyVal = list; } break; case 459: #line 3227 "cs-parser.jay" { Arguments list = (Arguments) yyVals[-2+yyTop]; NamedArgument a = (NamedArgument) yyVals[0+yyTop]; for (int i = 0; i < list.Count; ++i) { NamedArgument na = list [i] as NamedArgument; if (na != null && na.Name == a.Name) Report.Error (1740, na.Location, "Named argument `{0}' specified multiple times", na.Name); } list.Add (a); yyVal = list; } break; case 460: #line 3241 "cs-parser.jay" { Report.Error (839, GetLocation (yyVals[0+yyTop]), "An argument is missing"); yyVal = yyVals[-1+yyTop]; } break; case 461: #line 3246 "cs-parser.jay" { Report.Error (839, GetLocation (yyVals[-1+yyTop]), "An argument is missing"); yyVal = yyVals[-1+yyTop]; } break; case 462: #line 3254 "cs-parser.jay" { yyVal = new Argument ((Expression) yyVals[0+yyTop]); } break; case 466: #line 3267 "cs-parser.jay" { yyVal = new Argument ((Expression) yyVals[0+yyTop], Argument.AType.Ref); } break; case 467: #line 3271 "cs-parser.jay" { yyVal = new Argument ((Expression) yyVals[0+yyTop], Argument.AType.Out); } break; case 468: #line 3275 "cs-parser.jay" { yyVal = new Argument (new Arglist ((Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop]))); } break; case 469: #line 3279 "cs-parser.jay" { yyVal = new Argument (new Arglist (GetLocation (yyVals[-2+yyTop]))); } break; case 470: #line 3283 "cs-parser.jay" { yyVal = new Argument (new ArglistAccess (GetLocation (yyVals[0+yyTop]))); } break; case 472: #line 3294 "cs-parser.jay" { yyVal = new ElementAccess ((Expression) yyVals[-3+yyTop], (Arguments) yyVals[-1+yyTop]); } break; case 473: #line 3298 "cs-parser.jay" { /* LAMESPEC: Not allowed according to specification*/ yyVal = new ElementAccess ((Expression) yyVals[-3+yyTop], (Arguments) yyVals[-1+yyTop]); } break; case 474: #line 3303 "cs-parser.jay" { /* So the super-trick is that primary_expression*/ /* can only be either a SimpleName or a MemberAccess. */ /* The MemberAccess case arises when you have a fully qualified type-name like :*/ /* Foo.Bar.Blah i;*/ /* SimpleName is when you have*/ /* Blah i;*/ Expression expr = (Expression) yyVals[-1+yyTop]; if (expr is ComposedCast){ yyVal = new ComposedCast ((ComposedCast)expr, (string) yyVals[0+yyTop]); } else if (expr is ATypeNameExpression){ /**/ /* So we extract the string corresponding to the SimpleName*/ /* or MemberAccess*/ /* */ yyVal = new ComposedCast ((ATypeNameExpression)expr, (string) yyVals[0+yyTop]); } else { Error_ExpectingTypeName (expr); yyVal = TypeManager.system_object_expr; } } break; case 475: #line 3329 "cs-parser.jay" { var list = new List<Expression> (4); list.Add ((Expression) yyVals[0+yyTop]); yyVal = list; } break; case 476: #line 3335 "cs-parser.jay" { var list = (List<Expression>) yyVals[-2+yyTop]; list.Add ((Expression) yyVals[0+yyTop]); yyVal = list; } break; case 477: #line 3340 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = yyVals[-1+yyTop]; } break; case 478: #line 3348 "cs-parser.jay" { Arguments args = new Arguments (4); args.Add ((Argument) yyVals[0+yyTop]); yyVal = args; } break; case 479: #line 3354 "cs-parser.jay" { Arguments args = (Arguments) yyVals[-2+yyTop]; args.Add ((Argument) yyVals[0+yyTop]); yyVal = args; } break; case 480: #line 3363 "cs-parser.jay" { yyVal = new Argument ((Expression) yyVals[0+yyTop]); } break; case 482: #line 3371 "cs-parser.jay" { yyVal = new This (current_block, GetLocation (yyVals[0+yyTop])); } break; case 483: #line 3378 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new BaseAccess (lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location); } break; case 484: #line 3383 "cs-parser.jay" { yyVal = new BaseIndexerAccess ((Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); } break; case 485: #line 3387 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = new BaseAccess (null, GetLocation (yyVals[0+yyTop])); } break; case 486: #line 3395 "cs-parser.jay" { yyVal = new UnaryMutator (UnaryMutator.Mode.PostIncrement, (Expression) yyVals[-1+yyTop], GetLocation (yyVals[0+yyTop])); } break; case 487: #line 3402 "cs-parser.jay" { yyVal = new UnaryMutator (UnaryMutator.Mode.PostDecrement, (Expression) yyVals[-1+yyTop], GetLocation (yyVals[0+yyTop])); } break; case 488: #line 3409 "cs-parser.jay" { if (yyVals[0+yyTop] != null) { if (RootContext.Version <= LanguageVersion.ISO_2) Report.FeatureIsNotAvailable (GetLocation (yyVals[-4+yyTop]), "object initializers"); yyVal = new NewInitialize ((Expression) yyVals[-4+yyTop], (Arguments) yyVals[-2+yyTop], (CollectionOrObjectInitializers) yyVals[0+yyTop], GetLocation (yyVals[-4+yyTop])); } else yyVal = new New ((Expression) yyVals[-4+yyTop], (Arguments) yyVals[-2+yyTop], GetLocation (yyVals[-4+yyTop])); } break; case 489: #line 3420 "cs-parser.jay" { if (RootContext.Version <= LanguageVersion.ISO_2) Report.FeatureIsNotAvailable (GetLocation (yyVals[-1+yyTop]), "collection initializers"); yyVal = new NewInitialize ((Expression) yyVals[-1+yyTop], null, (CollectionOrObjectInitializers) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 490: #line 3432 "cs-parser.jay" { yyVal = new ArrayCreation ((FullNamedExpression) yyVals[-5+yyTop], (List<Expression>) yyVals[-3+yyTop], (string) yyVals[-1+yyTop], (ArrayInitializer) yyVals[0+yyTop], GetLocation (yyVals[-5+yyTop])); } break; case 491: #line 3436 "cs-parser.jay" { if (yyVals[0+yyTop] == null) Report.Error (1586, GetLocation (yyVals[-2+yyTop]), "Array creation must have array size or array initializer"); yyVal = new ArrayCreation ((FullNamedExpression) yyVals[-2+yyTop], (string) yyVals[-1+yyTop], (ArrayInitializer) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); } break; case 492: #line 3443 "cs-parser.jay" { if (RootContext.Version <= LanguageVersion.ISO_2) Report.FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "implicitly typed arrays"); yyVal = new ImplicitlyTypedArrayCreation ((string) yyVals[-1+yyTop], (ArrayInitializer) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); } break; case 493: #line 3450 "cs-parser.jay" { Report.Error (1526, GetLocation (yyVals[-1+yyTop]), "A new expression requires () or [] after type"); yyVal = new ArrayCreation ((FullNamedExpression) yyVals[-1+yyTop], "[]", null, GetLocation (yyVals[-1+yyTop])); } break; case 494: #line 3458 "cs-parser.jay" { ++lexer.parsing_type; } break; case 495: #line 3462 "cs-parser.jay" { --lexer.parsing_type; yyVal = yyVals[0+yyTop]; } break; case 496: #line 3470 "cs-parser.jay" { if (RootContext.MetadataCompatibilityVersion < MetadataVersion.v2) Report.FeatureIsNotSupported (GetLocation (yyVals[-3+yyTop]), "anonymous types"); else if (RootContext.Version <= LanguageVersion.ISO_2) Report.FeatureIsNotAvailable (GetLocation (yyVals[-3+yyTop]), "anonymous types"); yyVal = new NewAnonymousType ((List<AnonymousTypeParameter>) yyVals[-1+yyTop], current_container, GetLocation (yyVals[-3+yyTop])); } break; case 499: #line 3486 "cs-parser.jay" { yyVal = null; } break; case 501: #line 3492 "cs-parser.jay" { var a = new List<AnonymousTypeParameter> (4); a.Add ((AnonymousTypeParameter) yyVals[0+yyTop]); yyVal = a; } break; case 502: #line 3498 "cs-parser.jay" { var a = (List<AnonymousTypeParameter>) yyVals[-2+yyTop]; a.Add ((AnonymousTypeParameter) yyVals[0+yyTop]); yyVal = a; } break; case 503: #line 3507 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken)yyVals[-2+yyTop]; yyVal = new AnonymousTypeParameter ((Expression)yyVals[0+yyTop], lt.Value, lt.Location); } break; case 504: #line 3512 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken)yyVals[0+yyTop]; yyVal = new AnonymousTypeParameter (new SimpleName (lt.Value, lt.Location), lt.Value, lt.Location); } break; case 505: #line 3518 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; BaseAccess ba = new BaseAccess (lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location); yyVal = new AnonymousTypeParameter (ba, lt.Value, lt.Location); } break; case 506: #line 3524 "cs-parser.jay" { MemberAccess ma = (MemberAccess) yyVals[0+yyTop]; yyVal = new AnonymousTypeParameter (ma, ma.Name, ma.Location); } break; case 507: #line 3529 "cs-parser.jay" { Report.Error (746, lexer.Location, "Invalid anonymous type member declarator. Anonymous type members must be a member assignment, simple name or member access expression"); yyVal = null; } break; case 508: #line 3538 "cs-parser.jay" { yyVal = ""; } break; case 509: #line 3542 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 510: #line 3549 "cs-parser.jay" { if (yyVals[0+yyTop] != null) yyVal = "?"; else yyVal = string.Empty; } break; case 511: #line 3556 "cs-parser.jay" { if (yyVals[-1+yyTop] != null) yyVal = "?" + (string) yyVals[0+yyTop]; else yyVal = yyVals[0+yyTop]; } break; case 513: #line 3567 "cs-parser.jay" { yyVal = (string) yyVals[-1+yyTop] + (string) yyVals[0+yyTop]; } break; case 514: #line 3574 "cs-parser.jay" { yyVal = "[]"; } break; case 515: #line 3578 "cs-parser.jay" { yyVal = "[" + (string) yyVals[-1+yyTop] + "]"; } break; case 516: #line 3582 "cs-parser.jay" { Error_SyntaxError (178, yyToken, "Invalid rank specifier"); yyVal = "[]"; } break; case 517: #line 3590 "cs-parser.jay" { yyVal = ","; } break; case 518: #line 3594 "cs-parser.jay" { yyVal = (string) yyVals[-1+yyTop] + ","; } break; case 519: #line 3601 "cs-parser.jay" { yyVal = null; } break; case 520: #line 3605 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 521: #line 3612 "cs-parser.jay" { yyVal = new ArrayInitializer (0, GetLocation (yyVals[-1+yyTop])); } break; case 522: #line 3616 "cs-parser.jay" { yyVal = new ArrayInitializer ((List<Expression>) yyVals[-2+yyTop], GetLocation (yyVals[-3+yyTop])); } break; case 523: #line 3623 "cs-parser.jay" { var list = new List<Expression> (4); list.Add ((Expression) yyVals[0+yyTop]); yyVal = list; } break; case 524: #line 3629 "cs-parser.jay" { var list = (List<Expression>) yyVals[-2+yyTop]; list.Add ((Expression) yyVals[0+yyTop]); yyVal = list; } break; case 525: #line 3635 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = new List<Expression> (); } break; case 526: #line 3643 "cs-parser.jay" { lexer.TypeOfParsing = true; } break; case 527: #line 3647 "cs-parser.jay" { lexer.TypeOfParsing = false; Expression type = (Expression)yyVals[-1+yyTop]; if (type == TypeManager.system_void_expr) yyVal = new TypeOfVoid (GetLocation (yyVals[-4+yyTop])); else yyVal = new TypeOf (type, GetLocation (yyVals[-4+yyTop])); } break; case 530: #line 3661 "cs-parser.jay" { Error_TypeExpected (lexer.Location); yyVal = null; } break; case 531: #line 3669 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new SimpleName (lt.Value, (int) yyVals[0+yyTop], lt.Location); } break; case 532: #line 3675 "cs-parser.jay" { var lt1 = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var lt2 = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new QualifiedAliasMember (lt1.Value, lt2.Value, (int) yyVals[0+yyTop], lt1.Location); } break; case 533: #line 3682 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new MemberAccess ((Expression) yyVals[-2+yyTop], lt.Value, lt.Location); } break; case 534: #line 3688 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, (int) yyVals[0+yyTop], lt.Location); } break; case 535: #line 3694 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; MemberName name = (MemberName) yyVals[-3+yyTop]; yyVal = new MemberAccess (name.GetTypeExpression (), lt.Value, (int) yyVals[0+yyTop], lt.Location); } break; case 536: #line 3704 "cs-parser.jay" { if (RootContext.MetadataCompatibilityVersion < MetadataVersion.v2) Report.FeatureIsNotSupported (GetLocation (yyVals[0+yyTop]), "generics"); else if (RootContext.Version < LanguageVersion.ISO_2) Report.FeatureIsNotAvailable (GetLocation (yyVals[0+yyTop]), "generics"); yyVal = yyVals[0+yyTop]; } break; case 537: #line 3716 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; if (RootContext.Version == LanguageVersion.ISO_1) Report.FeatureIsNotAvailable (lt.Location, "namespace alias qualifier"); yyVal = lt; } break; case 538: #line 3726 "cs-parser.jay" { yyVal = new SizeOf ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); } break; case 539: #line 3733 "cs-parser.jay" { yyVal = new CheckedExpr ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); } break; case 540: #line 3740 "cs-parser.jay" { yyVal = new UnCheckedExpr ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); } break; case 541: #line 3747 "cs-parser.jay" { Expression deref; var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; deref = new Indirection ((Expression) yyVals[-2+yyTop], lt.Location); yyVal = new MemberAccess (deref, lt.Value); } break; case 542: #line 3758 "cs-parser.jay" { start_anonymous (false, (ParametersCompiled) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 543: #line 3762 "cs-parser.jay" { yyVal = end_anonymous ((ToplevelBlock) yyVals[0+yyTop]); } break; case 544: #line 3769 "cs-parser.jay" { yyVal = ParametersCompiled.Undefined; } break; case 546: #line 3777 "cs-parser.jay" { valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; } break; case 547: #line 3781 "cs-parser.jay" { valid_param_mod = 0; yyVal = yyVals[-1+yyTop]; } break; case 548: #line 3789 "cs-parser.jay" { if (RootContext.Version < LanguageVersion.ISO_2) Report.FeatureIsNotAvailable (GetLocation (yyVals[-3+yyTop]), "default value expression"); yyVal = new DefaultValueExpression ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); } break; case 550: #line 3800 "cs-parser.jay" { yyVal = new Unary (Unary.Operator.LogicalNot, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 551: #line 3804 "cs-parser.jay" { yyVal = new Unary (Unary.Operator.OnesComplement, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 553: #line 3812 "cs-parser.jay" { yyVal = new Cast ((FullNamedExpression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop])); } break; case 554: #line 3816 "cs-parser.jay" { yyVal = new Cast ((FullNamedExpression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop])); } break; case 556: #line 3828 "cs-parser.jay" { yyVal = new Unary (Unary.Operator.UnaryPlus, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 557: #line 3832 "cs-parser.jay" { yyVal = new Unary (Unary.Operator.UnaryNegation, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 558: #line 3836 "cs-parser.jay" { yyVal = new UnaryMutator (UnaryMutator.Mode.PreIncrement, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 559: #line 3840 "cs-parser.jay" { yyVal = new UnaryMutator (UnaryMutator.Mode.PreDecrement, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 560: #line 3844 "cs-parser.jay" { yyVal = new Indirection ((Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 561: #line 3848 "cs-parser.jay" { yyVal = new Unary (Unary.Operator.AddressOf, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 563: #line 3856 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.Multiply, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 564: #line 3861 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.Division, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 565: #line 3866 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.Modulus, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 567: #line 3875 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.Addition, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 568: #line 3880 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.Subtraction, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 569: #line 3884 "cs-parser.jay" { /* Shift/Reduce conflict*/ yyVal = new Binary (Binary.Operator.Subtraction, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 570: #line 3889 "cs-parser.jay" { yyVal = new As ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 571: #line 3893 "cs-parser.jay" { yyVal = new Is ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 573: #line 3901 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.LeftShift, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 574: #line 3906 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.RightShift, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 576: #line 3915 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.LessThan, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 577: #line 3920 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.GreaterThan, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 578: #line 3925 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.LessThanOrEqual, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 579: #line 3930 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.GreaterThanOrEqual, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 581: #line 3939 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.Equality, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 582: #line 3944 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.Inequality, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 584: #line 3953 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.BitwiseAnd, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 586: #line 3962 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.ExclusiveOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 588: #line 3971 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.BitwiseOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 590: #line 3980 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.LogicalAnd, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 592: #line 3989 "cs-parser.jay" { yyVal = new Binary (Binary.Operator.LogicalOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 594: #line 3998 "cs-parser.jay" { if (RootContext.Version < LanguageVersion.ISO_2) Report.FeatureIsNotAvailable (GetLocation (yyVals[-1+yyTop]), "null coalescing operator"); yyVal = new Nullable.NullCoalescingOperator ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 596: #line 4009 "cs-parser.jay" { yyVal = new Conditional (new BooleanExpression ((Expression) yyVals[-4+yyTop]), (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]); } break; case 597: #line 4016 "cs-parser.jay" { yyVal = new SimpleAssign ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]); } break; case 598: #line 4020 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.Multiply, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]); } break; case 599: #line 4025 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.Division, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]); } break; case 600: #line 4030 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.Modulus, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]); } break; case 601: #line 4035 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.Addition, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]); } break; case 602: #line 4040 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.Subtraction, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]); } break; case 603: #line 4045 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.LeftShift, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]); } break; case 604: #line 4050 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.RightShift, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]); } break; case 605: #line 4055 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.BitwiseAnd, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]); } break; case 606: #line 4060 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.BitwiseOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]); } break; case 607: #line 4065 "cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.ExclusiveOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop]); } break; case 608: #line 4073 "cs-parser.jay" { var pars = new List<Parameter> (4); pars.Add ((Parameter) yyVals[0+yyTop]); yyVal = pars; } break; case 609: #line 4080 "cs-parser.jay" { var pars = (List<Parameter>) yyVals[-2+yyTop]; Parameter p = (Parameter)yyVals[0+yyTop]; if (pars[0].GetType () != p.GetType ()) { Report.Error (748, p.Location, "All lambda parameters must be typed either explicitly or implicitly"); } pars.Add (p); yyVal = pars; } break; case 610: #line 4094 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new Parameter ((FullNamedExpression) yyVals[-1+yyTop], lt.Value, (Parameter.Modifier) yyVals[-2+yyTop], null, lt.Location); } break; case 611: #line 4100 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new Parameter ((FullNamedExpression) yyVals[-1+yyTop], lt.Value, Parameter.Modifier.NONE, null, lt.Location); } break; case 612: #line 4106 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new ImplicitLambdaParameter (lt.Value, lt.Location); } break; case 613: #line 4113 "cs-parser.jay" { yyVal = ParametersCompiled.EmptyReadOnlyParameters; } break; case 614: #line 4114 "cs-parser.jay" { var pars_list = (List<Parameter>) yyVals[0+yyTop]; yyVal = new ParametersCompiled (compiler, pars_list.ToArray ()); } break; case 615: #line 4121 "cs-parser.jay" { start_block (lexer.Location); } break; case 616: #line 4125 "cs-parser.jay" { Block b = end_block (lexer.Location); b.AddStatement (new ContextualReturn ((Expression) yyVals[0+yyTop])); yyVal = b; } break; case 617: #line 4130 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 618: #line 4137 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location); start_anonymous (true, new ParametersCompiled (compiler, p), GetLocation (yyVals[-1+yyTop])); } break; case 619: #line 4143 "cs-parser.jay" { yyVal = end_anonymous ((ToplevelBlock) yyVals[0+yyTop]); } break; case 620: #line 4147 "cs-parser.jay" { if (RootContext.Version <= LanguageVersion.ISO_2) Report.FeatureIsNotAvailable (GetLocation (yyVals[0+yyTop]), "lambda expressions"); valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; } break; case 621: #line 4154 "cs-parser.jay" { valid_param_mod = 0; start_anonymous (true, (ParametersCompiled) yyVals[-2+yyTop], GetLocation (yyVals[-4+yyTop])); } break; case 622: #line 4159 "cs-parser.jay" { yyVal = end_anonymous ((ToplevelBlock) yyVals[0+yyTop]); } break; case 629: #line 4181 "cs-parser.jay" { yyVal = new BooleanExpression ((Expression) yyVals[0+yyTop]); } break; case 630: #line 4194 "cs-parser.jay" { lexer.ConstraintsParsing = true; } break; case 631: #line 4198 "cs-parser.jay" { MemberName name = MakeName ((MemberName) yyVals[0+yyTop]); push_current_class (new Class (current_namespace, current_class, name, (Modifiers) yyVals[-4+yyTop], (Attributes) yyVals[-5+yyTop]), yyVals[-3+yyTop]); } break; case 632: #line 4204 "cs-parser.jay" { lexer.ConstraintsParsing = false; current_class.SetParameterInfo ((List<Constraints>) yyVals[0+yyTop]); if (RootContext.Documentation != null) { current_container.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } } break; case 633: #line 4215 "cs-parser.jay" { --lexer.parsing_declaration; if (RootContext.Documentation != null) Lexer.doc_state = XmlCommentState.Allowed; } break; case 634: #line 4221 "cs-parser.jay" { yyVal = pop_current_class (); } break; case 635: #line 4228 "cs-parser.jay" { yyVal = null; } break; case 636: #line 4230 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 637: #line 4234 "cs-parser.jay" { yyVal = (int) 0; } break; case 640: #line 4241 "cs-parser.jay" { var m1 = (Modifiers) yyVals[-1+yyTop]; var m2 = (Modifiers) yyVals[0+yyTop]; if ((m1 & m2) != 0) { Location l = lexer.Location; Report.Error (1004, l, "Duplicate `{0}' modifier", ModifiersExtensions.Name (m2)); } yyVal = m1 | m2; } break; case 641: #line 4255 "cs-parser.jay" { yyVal = Modifiers.NEW; if (current_container == RootContext.ToplevelTypes) Report.Error (1530, GetLocation (yyVals[0+yyTop]), "Keyword `new' is not allowed on namespace elements"); } break; case 642: #line 4260 "cs-parser.jay" { yyVal = Modifiers.PUBLIC; } break; case 643: #line 4261 "cs-parser.jay" { yyVal = Modifiers.PROTECTED; } break; case 644: #line 4262 "cs-parser.jay" { yyVal = Modifiers.INTERNAL; } break; case 645: #line 4263 "cs-parser.jay" { yyVal = Modifiers.PRIVATE; } break; case 646: #line 4264 "cs-parser.jay" { yyVal = Modifiers.ABSTRACT; } break; case 647: #line 4265 "cs-parser.jay" { yyVal = Modifiers.SEALED; } break; case 648: #line 4266 "cs-parser.jay" { yyVal = Modifiers.STATIC; } break; case 649: #line 4267 "cs-parser.jay" { yyVal = Modifiers.READONLY; } break; case 650: #line 4268 "cs-parser.jay" { yyVal = Modifiers.VIRTUAL; } break; case 651: #line 4269 "cs-parser.jay" { yyVal = Modifiers.OVERRIDE; } break; case 652: #line 4270 "cs-parser.jay" { yyVal = Modifiers.EXTERN; } break; case 653: #line 4271 "cs-parser.jay" { yyVal = Modifiers.VOLATILE; } break; case 654: #line 4272 "cs-parser.jay" { yyVal = Modifiers.UNSAFE; } break; case 657: #line 4282 "cs-parser.jay" { current_container.AddBasesForPart (current_class, (List<FullNamedExpression>) yyVals[0+yyTop]); } break; case 658: #line 4288 "cs-parser.jay" { yyVal = null; } break; case 659: #line 4290 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 660: #line 4297 "cs-parser.jay" { var constraints = new List<Constraints> (1); constraints.Add ((Constraints) yyVals[0+yyTop]); yyVal = constraints; } break; case 661: #line 4303 "cs-parser.jay" { var constraints = (List<Constraints>) yyVals[-1+yyTop]; Constraints new_constraint = (Constraints)yyVals[0+yyTop]; foreach (Constraints c in constraints) { if (new_constraint.TypeParameter.Value == c.TypeParameter.Value) { Report.Error (409, new_constraint.Location, "A constraint clause has already been specified for type parameter `{0}'", new_constraint.TypeParameter.Value); } } constraints.Add (new_constraint); yyVal = constraints; } break; case 662: #line 4322 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new Constraints (new SimpleMemberName (lt.Value, lt.Location), (List<FullNamedExpression>) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop])); } break; case 663: #line 4330 "cs-parser.jay" { var constraints = new List<FullNamedExpression> (1); constraints.Add ((FullNamedExpression) yyVals[0+yyTop]); yyVal = constraints; } break; case 664: #line 4336 "cs-parser.jay" { var constraints = (List<FullNamedExpression>) yyVals[-2+yyTop]; var prev = constraints [constraints.Count - 1] as SpecialContraintExpr; if (prev != null && (prev.Constraint & SpecialConstraint.Constructor) != 0) { Report.Error (401, GetLocation (yyVals[-1+yyTop]), "The `new()' constraint must be the last constraint specified"); } prev = yyVals[0+yyTop] as SpecialContraintExpr; if (prev != null) { if ((prev.Constraint & (SpecialConstraint.Class | SpecialConstraint.Struct)) != 0) { Report.Error (449, prev.Location, "The `class' or `struct' constraint must be the first constraint specified"); } else { prev = constraints [0] as SpecialContraintExpr; if (prev != null && (prev.Constraint & SpecialConstraint.Struct) != 0) { Report.Error (451, GetLocation (yyVals[0+yyTop]), "The `new()' constraint cannot be used with the `struct' constraint"); } } } constraints.Add ((FullNamedExpression) yyVals[0+yyTop]); yyVal = constraints; } break; case 665: #line 4362 "cs-parser.jay" { if (yyVals[0+yyTop] is ComposedCast) Report.Error (706, GetLocation (yyVals[0+yyTop]), "Invalid constraint type `{0}'", ((ComposedCast)yyVals[0+yyTop]).GetSignatureForError ()); yyVal = yyVals[0+yyTop]; } break; case 666: #line 4369 "cs-parser.jay" { yyVal = new SpecialContraintExpr (SpecialConstraint.Constructor, GetLocation (yyVals[-2+yyTop])); } break; case 667: #line 4373 "cs-parser.jay" { yyVal = new SpecialContraintExpr (SpecialConstraint.Class, GetLocation (yyVals[0+yyTop])); } break; case 668: #line 4377 "cs-parser.jay" { yyVal = new SpecialContraintExpr (SpecialConstraint.Struct, GetLocation (yyVals[0+yyTop])); } break; case 669: #line 4384 "cs-parser.jay" { yyVal = Variance.None; } break; case 670: #line 4388 "cs-parser.jay" { if (RootContext.MetadataCompatibilityVersion < MetadataVersion.v2) Report.FeatureIsNotSupported (lexer.Location, "generic type variance"); else if (RootContext.Version <= LanguageVersion.V_3) Report.FeatureIsNotAvailable (lexer.Location, "generic type variance"); yyVal = yyVals[0+yyTop]; } break; case 671: #line 4400 "cs-parser.jay" { yyVal = Variance.Covariant; } break; case 672: #line 4404 "cs-parser.jay" { yyVal = Variance.Contravariant; } break; case 673: #line 4424 "cs-parser.jay" { ++lexer.parsing_block; start_block (GetLocation (yyVals[0+yyTop])); } break; case 674: #line 4429 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 675: #line 4436 "cs-parser.jay" { --lexer.parsing_block; yyVal = end_block (GetLocation (yyVals[0+yyTop])); } break; case 676: #line 4441 "cs-parser.jay" { --lexer.parsing_block; yyVal = end_block (lexer.Location); } break; case 677: #line 4450 "cs-parser.jay" { ++lexer.parsing_block; current_block.StartLocation = GetLocation (yyVals[0+yyTop]); } break; case 678: #line 4455 "cs-parser.jay" { --lexer.parsing_block; yyVal = end_block (GetLocation (yyVals[0+yyTop])); } break; case 683: #line 4473 "cs-parser.jay" { if (yyVals[0+yyTop] != null && (Block) yyVals[0+yyTop] != current_block){ current_block.AddStatement ((Statement) yyVals[0+yyTop]); current_block = (Block) yyVals[0+yyTop]; } } break; case 684: #line 4480 "cs-parser.jay" { current_block.AddStatement ((Statement) yyVals[0+yyTop]); } break; case 688: #line 4499 "cs-parser.jay" { if (yyVals[0+yyTop] != null && (Block) yyVals[0+yyTop] != current_block){ current_block.AddStatement ((Statement) yyVals[0+yyTop]); current_block = (Block) yyVals[0+yyTop]; } } break; case 689: #line 4506 "cs-parser.jay" { current_block.AddStatement ((Statement) yyVals[0+yyTop]); } break; case 718: #line 4547 "cs-parser.jay" { Report.Error (1023, GetLocation (yyVals[0+yyTop]), "An embedded statement may not be a declaration or labeled statement"); yyVal = null; } break; case 719: #line 4552 "cs-parser.jay" { Report.Error (1023, GetLocation (yyVals[0+yyTop]), "An embedded statement may not be a declaration or labeled statement"); yyVal = null; } break; case 720: #line 4560 "cs-parser.jay" { yyVal = new EmptyStatement (GetLocation (yyVals[0+yyTop])); } break; case 721: #line 4567 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; LabeledStatement labeled = new LabeledStatement (lt.Value, lt.Location); if (current_block.AddLabel (labeled)) current_block.AddStatement (labeled); } break; case 723: #line 4579 "cs-parser.jay" { if (yyVals[-1+yyTop] != null){ var de = (Tuple<FullNamedExpression, List<object>>) yyVals[-1+yyTop]; yyVal = declare_local_variables (de.Item1, de.Item2, de.Item1.Location); } } break; case 724: #line 4587 "cs-parser.jay" { if (yyVals[-1+yyTop] != null){ var de = (Tuple<FullNamedExpression, List<object>>) yyVals[-1+yyTop]; yyVal = declare_local_constants (de.Item1, de.Item2); } } break; case 725: #line 4604 "cs-parser.jay" { /* FIXME: Do something smart here regarding the composition of the 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 namespace_or_type_name (which is all we need*/ /* really) two shift/reduces appear.*/ /* */ /* So the super-trick is that primary_expression*/ /* can only be either a SimpleName or a MemberAccess. */ /* The MemberAccess case arises when you have a fully qualified type-name like :*/ /* Foo.Bar.Blah i;*/ /* SimpleName is when you have*/ /* Blah i;*/ Expression expr = (Expression) yyVals[-1+yyTop]; string rank_or_nullable = (string) yyVals[0+yyTop]; if (expr is ComposedCast){ yyVal = new ComposedCast ((ComposedCast)expr, rank_or_nullable); } else if (expr is ATypeNameExpression){ /**/ /* So we extract the string corresponding to the SimpleName*/ /* or MemberAccess*/ /**/ if (rank_or_nullable.Length == 0) { SimpleName sn = expr as SimpleName; if (sn != null && sn.Name == "var") yyVal = new VarExpr (sn.Location); else yyVal = yyVals[-1+yyTop]; } else { yyVal = new ComposedCast ((ATypeNameExpression)expr, rank_or_nullable); } } else { Error_ExpectingTypeName (expr); yyVal = TypeManager.system_object_expr; } } break; case 726: #line 4646 "cs-parser.jay" { if ((string) yyVals[0+yyTop] == "") yyVal = yyVals[-1+yyTop]; else yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], (string) yyVals[0+yyTop], lexer.Location); } break; case 727: #line 4653 "cs-parser.jay" { Expression.Error_VoidInvalidInTheContext (GetLocation (yyVals[-1+yyTop]), Report); yyVal = TypeManager.system_void_expr; } break; case 728: #line 4661 "cs-parser.jay" { ATypeNameExpression expr = yyVals[-1+yyTop] as ATypeNameExpression; if (expr != null) { yyVal = new ComposedCast (expr, "*"); } else { Error_ExpectingTypeName ((Expression)yyVals[-1+yyTop]); yyVal = expr; } } break; case 729: #line 4672 "cs-parser.jay" { yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], "*", GetLocation (yyVals[-1+yyTop])); } break; case 730: #line 4676 "cs-parser.jay" { yyVal = new ComposedCast (TypeManager.system_void_expr, "*", GetLocation (yyVals[-1+yyTop])); } break; case 731: #line 4680 "cs-parser.jay" { yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], "*"); } break; case 733: #line 4688 "cs-parser.jay" { if (yyVals[-1+yyTop] != null){ string rank = (string)yyVals[0+yyTop]; if (rank == "") yyVal = yyVals[-1+yyTop]; else yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], rank); } else { yyVal = null; } } break; case 734: #line 4704 "cs-parser.jay" { if (yyVals[-1+yyTop] != null) { VarExpr ve = yyVals[-1+yyTop] as VarExpr; if (ve != null) { if (!((VariableDeclaration) ((List<object>)yyVals[0+yyTop]) [0]).HasInitializer) ve.VariableInitializersCount = 0; else ve.VariableInitializersCount = ((List<object>)yyVals[0+yyTop]).Count; } yyVal = new Tuple<FullNamedExpression, List<object>> ((FullNamedExpression) yyVals[-1+yyTop], (List<object>) yyVals[0+yyTop]); } else yyVal = null; } break; case 735: #line 4722 "cs-parser.jay" { if (yyVals[-1+yyTop] != null) yyVal = new Tuple<FullNamedExpression, List<object>> ((FullNamedExpression) yyVals[-1+yyTop], (List<object>) yyVals[0+yyTop]); else yyVal = null; } break; case 736: #line 4731 "cs-parser.jay" { yyVal = yyVals[-1+yyTop]; } break; case 737: #line 4732 "cs-parser.jay" { yyVal = yyVals[-1+yyTop]; } break; case 738: #line 4736 "cs-parser.jay" { yyVal = yyVals[-1+yyTop]; } break; case 739: #line 4737 "cs-parser.jay" { yyVal = yyVals[-1+yyTop]; } break; case 740: #line 4746 "cs-parser.jay" { ExpressionStatement s = yyVals[0+yyTop] as ExpressionStatement; if (s == null) { Expression.Error_InvalidExpressionStatement (Report, GetLocation (yyVals[0+yyTop])); s = EmptyExpressionStatement.Instance; } yyVal = new StatementExpression (s); } break; case 741: #line 4756 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = null; } break; case 742: #line 4764 "cs-parser.jay" { Expression expr = (Expression) yyVals[0+yyTop]; ExpressionStatement s; s = new OptionalAssign (new SimpleName ("$retval", lexer.Location), expr, lexer.Location); yyVal = new StatementExpression (s); } break; case 743: #line 4772 "cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = new EmptyStatement (GetLocation (yyVals[0+yyTop])); } break; case 746: #line 4786 "cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement) Report.Warning (642, 3, GetLocation (yyVals[0+yyTop]), "Possible mistaken empty statement"); yyVal = new If ((BooleanExpression) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop], GetLocation (yyVals[-4+yyTop])); } break; case 747: #line 4794 "cs-parser.jay" { yyVal = new If ((BooleanExpression) yyVals[-4+yyTop], (Statement) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop], GetLocation (yyVals[-6+yyTop])); if (yyVals[-2+yyTop] is EmptyStatement) Report.Warning (642, 3, GetLocation (yyVals[-2+yyTop]), "Possible mistaken empty statement"); if (yyVals[0+yyTop] is EmptyStatement) Report.Warning (642, 3, GetLocation (yyVals[0+yyTop]), "Possible mistaken empty statement"); } break; case 748: #line 4806 "cs-parser.jay" { if (switch_stack == null) switch_stack = new Stack<Block> (2); switch_stack.Push (current_block); } break; case 749: #line 4813 "cs-parser.jay" { yyVal = new Switch ((Expression) yyVals[-2+yyTop], (List<SwitchSection>) yyVals[0+yyTop], GetLocation (yyVals[-5+yyTop])); current_block = (Block) switch_stack.Pop (); } break; case 750: #line 4823 "cs-parser.jay" { yyVal = yyVals[-1+yyTop]; } break; case 751: #line 4830 "cs-parser.jay" { Report.Warning (1522, 1, lexer.Location, "Empty switch block"); yyVal = new List<SwitchSection> (); } break; case 753: #line 4839 "cs-parser.jay" { var sections = new List<SwitchSection> (4); sections.Add ((SwitchSection) yyVals[0+yyTop]); yyVal = sections; } break; case 754: #line 4846 "cs-parser.jay" { var sections = (List<SwitchSection>) yyVals[-1+yyTop]; sections.Add ((SwitchSection) yyVals[0+yyTop]); yyVal = sections; } break; case 755: #line 4856 "cs-parser.jay" { current_block = current_block.CreateSwitchBlock (lexer.Location); } break; case 756: #line 4860 "cs-parser.jay" { yyVal = new SwitchSection ((List<SwitchLabel>) yyVals[-2+yyTop], current_block.Explicit); } break; case 757: #line 4867 "cs-parser.jay" { var labels = new List<SwitchLabel> (4); labels.Add ((SwitchLabel) yyVals[0+yyTop]); yyVal = labels; } break; case 758: #line 4874 "cs-parser.jay" { var labels = (List<SwitchLabel>) (yyVals[-1+yyTop]); labels.Add ((SwitchLabel) yyVals[0+yyTop]); yyVal = labels; } break; case 759: #line 4884 "cs-parser.jay" { yyVal = new SwitchLabel ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); } break; case 760: #line 4888 "cs-parser.jay" { yyVal = new SwitchLabel (null, GetLocation (yyVals[0+yyTop])); } break; case 765: #line 4902 "cs-parser.jay" { Location l = GetLocation (yyVals[-4+yyTop]); yyVal = new While ((BooleanExpression) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop], l); } break; case 766: #line 4911 "cs-parser.jay" { Location l = GetLocation (yyVals[-6+yyTop]); yyVal = new Do ((Statement) yyVals[-5+yyTop], (BooleanExpression) yyVals[-2+yyTop], l); } break; case 767: #line 4920 "cs-parser.jay" { Location l = lexer.Location; start_block (l); Block assign_block = current_block; if (yyVals[-1+yyTop] is Tuple<FullNamedExpression, List<object>>){ var de = (Tuple<FullNamedExpression, List<object>>) yyVals[-1+yyTop]; var type = de.Item1; foreach (VariableDeclaration decl in de.Item2){ LocalInfo vi; vi = current_block.AddVariable (type, decl.identifier, decl.Location); if (vi == null) continue; Expression expr = decl.GetInitializer (type); LocalVariableReference var; var = new LocalVariableReference (assign_block, decl.identifier, l); if (expr != null) { Assign a = new SimpleAssign (var, expr, decl.Location); assign_block.AddStatement (new StatementExpression (a)); } } /* Note: the $$ below refers to the value of this code block, not of the LHS non-terminal.*/ /* This can be referred to as $5 below.*/ yyVal = null; } else { yyVal = yyVals[-1+yyTop]; } } break; case 768: #line 4960 "cs-parser.jay" { Location l = GetLocation (yyVals[-9+yyTop]); For f = new For ((Statement) yyVals[-5+yyTop], (BooleanExpression) yyVals[-4+yyTop], (Statement) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop], l); current_block.AddStatement (f); yyVal = end_block (lexer.Location); } break; case 769: #line 4972 "cs-parser.jay" { yyVal = new EmptyStatement (lexer.Location); } break; case 773: #line 4982 "cs-parser.jay" { yyVal = null; } break; case 775: #line 4987 "cs-parser.jay" { yyVal = new EmptyStatement (lexer.Location); } break; case 778: #line 4997 "cs-parser.jay" { /* CHANGE: was `null'*/ Statement s = (Statement) yyVals[0+yyTop]; Block b = new Block (current_block, s.loc, lexer.Location); b.AddStatement (s); yyVal = b; } break; case 779: #line 5006 "cs-parser.jay" { Block b = (Block) yyVals[-2+yyTop]; b.AddStatement ((Statement) yyVals[0+yyTop]); yyVal = yyVals[-2+yyTop]; } break; case 780: #line 5016 "cs-parser.jay" { Report.Error (230, GetLocation (yyVals[-5+yyTop]), "Type and identifier are both required in a foreach statement"); yyVal = null; } break; case 781: #line 5022 "cs-parser.jay" { start_block (lexer.Location); Block foreach_block = current_block; var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; Location l = lt.Location; LocalInfo vi = foreach_block.AddVariable ((Expression) yyVals[-4+yyTop], lt.Value, l); if (vi != null) { vi.SetReadOnlyContext (LocalInfo.ReadOnlyContext.Foreach); /* Get a writable reference to this read-only variable.*/ /**/ /* Note that the $$ here refers to the value of _this_ code block,*/ /* not the value of the LHS non-terminal. This can be referred to as $8 below.*/ yyVal = new LocalVariableReference (foreach_block, lt.Value, l, vi, false); } else { yyVal = null; } } break; case 782: #line 5042 "cs-parser.jay" { LocalVariableReference v = (LocalVariableReference) yyVals[-1+yyTop]; Location l = GetLocation (yyVals[-8+yyTop]); if (v != null) { Foreach f = new Foreach ((Expression) yyVals[-6+yyTop], v, (Expression) yyVals[-3+yyTop], (Statement) yyVals[0+yyTop], l); current_block.AddStatement (f); } yyVal = end_block (lexer.Location); } break; case 789: #line 5066 "cs-parser.jay" { yyVal = new Break (GetLocation (yyVals[-1+yyTop])); } break; case 790: #line 5073 "cs-parser.jay" { yyVal = new Continue (GetLocation (yyVals[-1+yyTop])); } break; case 791: #line 5080 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new Goto (lt.Value, lt.Location); } break; case 792: #line 5085 "cs-parser.jay" { yyVal = new GotoCase ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); } break; case 793: #line 5089 "cs-parser.jay" { yyVal = new GotoDefault (GetLocation (yyVals[-2+yyTop])); } break; case 794: #line 5096 "cs-parser.jay" { yyVal = new Return ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); } break; case 795: #line 5103 "cs-parser.jay" { yyVal = new Throw ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); } break; case 796: #line 5110 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; string s = lt.Value; if (s != "yield"){ Report.Error (1003, lt.Location, "; expected"); yyVal = null; } if (RootContext.Version == LanguageVersion.ISO_1){ Report.FeatureIsNotAvailable (lt.Location, "yield statement"); yyVal = null; } current_block.Toplevel.IsIterator = true; yyVal = new Yield ((Expression) yyVals[-1+yyTop], lt.Location); } break; case 797: #line 5125 "cs-parser.jay" { Report.Error (1627, GetLocation (yyVals[-1+yyTop]), "Expression expected after yield return"); yyVal = null; } break; case 798: #line 5130 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; string s = lt.Value; if (s != "yield"){ Report.Error (1003, lt.Location, "; expected"); yyVal = null; } if (RootContext.Version == LanguageVersion.ISO_1){ Report.FeatureIsNotAvailable (lt.Location, "yield statement"); yyVal = null; } current_block.Toplevel.IsIterator = true; yyVal = new YieldBreak (lt.Location); } break; case 801: #line 5154 "cs-parser.jay" { yyVal = new TryCatch ((Block) yyVals[-1+yyTop], (List<Catch>) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop]), false); } break; case 802: #line 5158 "cs-parser.jay" { yyVal = new TryFinally ((Statement) yyVals[-2+yyTop], (Block) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop])); } break; case 803: #line 5162 "cs-parser.jay" { yyVal = new TryFinally (new TryCatch ((Block) yyVals[-3+yyTop], (List<Catch>) yyVals[-2+yyTop], GetLocation (yyVals[-4+yyTop]), true), (Block) yyVals[0+yyTop], GetLocation (yyVals[-4+yyTop])); } break; case 804: #line 5166 "cs-parser.jay" { Report.Error (1524, GetLocation (yyVals[-2+yyTop]), "Expected catch or finally"); yyVal = null; } break; case 805: #line 5174 "cs-parser.jay" { var l = new List<Catch> (2); l.Add ((Catch) yyVals[0+yyTop]); yyVal = l; } break; case 806: #line 5181 "cs-parser.jay" { var l = (List<Catch>) yyVals[-1+yyTop]; Catch c = (Catch) yyVals[0+yyTop]; if (l [0].IsGeneral) { Report.Error (1017, c.loc, "Try statement already has an empty catch block"); } else { if (c.IsGeneral) l.Insert (0, c); else l.Add (c); } yyVal = l; } break; case 807: #line 5199 "cs-parser.jay" { yyVal = null; } break; case 809: #line 5205 "cs-parser.jay" { if (yyVals[0+yyTop] != null) { var cc = (Tuple<FullNamedExpression, Tokenizer.LocatedToken>) yyVals[0+yyTop]; var lt = cc.Item2; if (lt != null){ List<object> one = new List<object> (1); one.Add (new VariableDeclaration (lt, null)); start_block (lexer.Location); current_block = declare_local_variables (cc.Item1, one, lt.Location); } } } break; case 810: #line 5219 "cs-parser.jay" { Expression type = null; string id = null; Block var_block = null; if (yyVals[-2+yyTop] != null){ var cc = (Tuple<FullNamedExpression, Tokenizer.LocatedToken>) yyVals[-2+yyTop]; type = cc.Item1; var lt = cc.Item2; if (lt != null){ id = lt.Value; var_block = end_block (lexer.Location); } } yyVal = new Catch (type, id, (Block) yyVals[0+yyTop], var_block, ((Block) yyVals[0+yyTop]).loc); } break; case 811: #line 5240 "cs-parser.jay" { yyVal = null; } break; case 813: #line 5246 "cs-parser.jay" { yyVal = new Tuple<FullNamedExpression, Tokenizer.LocatedToken> ((FullNamedExpression)yyVals[-2+yyTop], (Tokenizer.LocatedToken) yyVals[-1+yyTop]); } break; case 814: #line 5250 "cs-parser.jay" { Report.Error (1015, GetLocation (yyVals[-1+yyTop]), "A type that derives from `System.Exception', `object', or `string' expected"); yyVal = null; } break; case 815: #line 5258 "cs-parser.jay" { yyVal = new Checked ((Block) yyVals[0+yyTop]); } break; case 816: #line 5265 "cs-parser.jay" { yyVal = new Unchecked ((Block) yyVals[0+yyTop]); } break; case 817: #line 5272 "cs-parser.jay" { RootContext.CheckUnsafeOption (GetLocation (yyVals[0+yyTop]), Report); } break; case 818: #line 5274 "cs-parser.jay" { yyVal = new Unsafe ((Block) yyVals[0+yyTop]); } break; case 819: #line 5283 "cs-parser.jay" { start_block (lexer.Location); } break; case 820: #line 5287 "cs-parser.jay" { Expression type = (Expression) yyVals[-4+yyTop]; var list = (List<KeyValuePair<Tokenizer.LocatedToken, Expression>>) yyVals[-3+yyTop]; Fixed f = new Fixed (type, list.ConvertAll (i => { var v = new KeyValuePair<LocalInfo, Expression> (current_block.AddVariable (type, i.Key.Value, i.Key.Location), i.Value); if (v.Key != null) { v.Key.SetReadOnlyContext (LocalInfo.ReadOnlyContext.Fixed); v.Key.Pinned = true; } return v; }), (Statement) yyVals[0+yyTop], GetLocation (yyVals[-6+yyTop])); current_block.AddStatement (f); yyVal = end_block (lexer.Location); } break; case 821: #line 5307 "cs-parser.jay" { var declarators = new List<KeyValuePair<Tokenizer.LocatedToken, Expression>> (2); if (yyVals[0+yyTop] != null) declarators.Add ((KeyValuePair<Tokenizer.LocatedToken, Expression>)yyVals[0+yyTop]); yyVal = declarators; } break; case 822: #line 5314 "cs-parser.jay" { var declarators = (List<KeyValuePair<Tokenizer.LocatedToken, Expression>>) yyVals[-2+yyTop]; if (yyVals[0+yyTop] != null) declarators.Add ((KeyValuePair<Tokenizer.LocatedToken, Expression>)yyVals[0+yyTop]); yyVal = declarators; } break; case 823: #line 5324 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new KeyValuePair<Tokenizer.LocatedToken, Expression> (lt, (Expression) yyVals[0+yyTop]); } break; case 824: #line 5329 "cs-parser.jay" { Report.Error (210, ((Tokenizer.LocatedToken) yyVals[0+yyTop]).Location, "You must provide an initializer in a fixed or using statement declaration"); yyVal = null; } break; case 825: #line 5337 "cs-parser.jay" { /**/ } break; case 826: #line 5341 "cs-parser.jay" { yyVal = new Lock ((Expression) yyVals[-3+yyTop], (Statement) yyVals[0+yyTop], GetLocation (yyVals[-5+yyTop])); } break; case 827: #line 5348 "cs-parser.jay" { start_block (lexer.Location); Block assign_block = current_block; var de = (Tuple<FullNamedExpression, List<object>>) yyVals[-1+yyTop]; Location l = GetLocation (yyVals[-3+yyTop]); var vars = new Stack<Tuple<LocalVariableReference, Expression>> (); foreach (VariableDeclaration decl in de.Item2) { LocalInfo vi = current_block.AddVariable (de.Item1, decl.identifier, decl.Location); if (vi == null) continue; vi.SetReadOnlyContext (LocalInfo.ReadOnlyContext.Using); Expression expr = decl.GetInitializer (de.Item1); if (expr == null) { Report.Error (210, l, "You must provide an initializer in a fixed or using statement declaration"); continue; } LocalVariableReference var; /* Get a writable reference to this read-only variable.*/ var = new LocalVariableReference (assign_block, decl.identifier, l, vi, false); /* This is so that it is not a warning on using variables*/ vi.Used = true; vars.Push (new Tuple<LocalVariableReference, Expression> (var, expr)); /* Assign a = new SimpleAssign (var, expr, decl.Location);*/ /* assign_block.AddStatement (new StatementExpression (a));*/ } /* Note: the $$ here refers to the value of this code block and not of the LHS non-terminal.*/ /* It can be referred to as $5 below.*/ yyVal = vars; } break; case 828: #line 5387 "cs-parser.jay" { Statement stmt = (Statement) yyVals[0+yyTop]; var vars = (Stack<Tuple<LocalVariableReference, Expression>>) yyVals[-1+yyTop]; Location l = GetLocation (yyVals[-5+yyTop]); while (vars.Count > 0) { var de = vars.Pop (); stmt = new Using (de.Item1, de.Item2, stmt, l); } current_block.AddStatement (stmt); yyVal = end_block (lexer.Location); } break; case 829: #line 5400 "cs-parser.jay" { start_block (lexer.Location); } break; case 830: #line 5404 "cs-parser.jay" { current_block.AddStatement (new UsingTemporary ((Expression) yyVals[-3+yyTop], (Statement) yyVals[0+yyTop], GetLocation (yyVals[-5+yyTop]))); yyVal = end_block (lexer.Location); } break; case 831: #line 5415 "cs-parser.jay" { lexer.query_parsing = false; Linq.AQueryClause from = yyVals[-1+yyTop] as Linq.AQueryClause; from.Tail.Next = (Linq.AQueryClause)yyVals[0+yyTop]; yyVal = from; current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; } break; case 832: #line 5427 "cs-parser.jay" { Linq.AQueryClause from = yyVals[-1+yyTop] as Linq.AQueryClause; from.Tail.Next = (Linq.AQueryClause)yyVals[0+yyTop]; yyVal = from; current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; } break; case 833: #line 5438 "cs-parser.jay" { lexer.query_parsing = false; yyVal = yyVals[-1+yyTop]; current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; } break; case 834: #line 5445 "cs-parser.jay" { yyVal = yyVals[-1+yyTop]; current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; } break; case 835: #line 5454 "cs-parser.jay" { yyVal = new Linq.QueryExpression (current_block, new Linq.QueryStartClause ((Expression)yyVals[0+yyTop])); var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; current_block = new Linq.QueryBlock (compiler, current_block, new SimpleMemberName (lt.Value, lt.Location), GetLocation (yyVals[-3+yyTop])); } break; case 836: #line 5460 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new Linq.QueryExpression (current_block, new Linq.Cast ((FullNamedExpression)yyVals[-3+yyTop], (Expression)yyVals[0+yyTop])); current_block = new Linq.QueryBlock (compiler, current_block, new SimpleMemberName (lt.Value, lt.Location), GetLocation (yyVals[-4+yyTop])); } break; case 837: #line 5469 "cs-parser.jay" { yyVal = new Linq.QueryExpression (current_block, new Linq.QueryStartClause ((Expression)yyVals[0+yyTop])); var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; current_block = new Linq.QueryBlock (compiler, current_block, new SimpleMemberName (lt.Value, lt.Location), GetLocation (yyVals[-3+yyTop])); } break; case 838: #line 5475 "cs-parser.jay" { yyVal = new Linq.QueryExpression (current_block, new Linq.Cast ((FullNamedExpression)yyVals[-3+yyTop], (Expression)yyVals[0+yyTop])); var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; current_block = new Linq.QueryBlock (compiler, current_block, new SimpleMemberName (lt.Value, lt.Location), GetLocation (yyVals[-4+yyTop])); } break; case 839: #line 5484 "cs-parser.jay" { current_block = new Linq.QueryBlock (compiler, current_block, GetLocation (yyVals[-2+yyTop])); } break; case 840: #line 5488 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; var sn = new SimpleMemberName (lt.Value, lt.Location); yyVal = new Linq.SelectMany (current_block.Toplevel, sn, (Expression)yyVals[0+yyTop]); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; ((Linq.QueryBlock)current_block).AddTransparentParameter (compiler, sn); } break; case 841: #line 5499 "cs-parser.jay" { current_block = new Linq.QueryBlock (compiler, current_block, GetLocation (yyVals[-3+yyTop])); } break; case 842: #line 5503 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; var sn = new SimpleMemberName (lt.Value, lt.Location); FullNamedExpression type = (FullNamedExpression)yyVals[-4+yyTop]; yyVal = new Linq.SelectMany (current_block.Toplevel, sn, new Linq.Cast (type, (FullNamedExpression)yyVals[0+yyTop])); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; ((Linq.QueryBlock)current_block).AddTransparentParameter (compiler, sn); } break; case 843: #line 5520 "cs-parser.jay" { Linq.AQueryClause head = (Linq.AQueryClause)yyVals[-1+yyTop]; if (yyVals[0+yyTop] != null) head.Next = (Linq.AQueryClause)yyVals[0+yyTop]; if (yyVals[-2+yyTop] != null) { Linq.AQueryClause clause = (Linq.AQueryClause)yyVals[-2+yyTop]; clause.Tail.Next = head; head = clause; } yyVal = head; } break; case 845: #line 5539 "cs-parser.jay" { current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location); } break; case 846: #line 5543 "cs-parser.jay" { yyVal = new Linq.Select (current_block.Toplevel, (Expression)yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; } break; case 847: #line 5550 "cs-parser.jay" { if (linq_clause_blocks == null) linq_clause_blocks = new Stack<Block> (); current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location); linq_clause_blocks.Push (current_block); } break; case 848: #line 5558 "cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location); } break; case 849: #line 5565 "cs-parser.jay" { yyVal = new Linq.GroupBy (current_block.Toplevel, (Expression)yyVals[-3+yyTop], (ToplevelBlock) linq_clause_blocks.Pop (), (Expression)yyVals[0+yyTop], GetLocation (yyVals[-5+yyTop])); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; } break; case 853: #line 5581 "cs-parser.jay" { ((Linq.AQueryClause)yyVals[-1+yyTop]).Tail.Next = (Linq.AQueryClause)yyVals[0+yyTop]; yyVal = yyVals[-1+yyTop]; } break; case 859: #line 5597 "cs-parser.jay" { current_block = new Linq.QueryBlock (compiler, current_block, GetLocation (yyVals[-2+yyTop])); } break; case 860: #line 5601 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; var sn = new SimpleMemberName (lt.Value, lt.Location); yyVal = new Linq.Let (current_block.Toplevel, current_container, sn, (Expression)yyVals[0+yyTop]); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; ((Linq.QueryBlock)current_block).AddTransparentParameter (compiler, sn); } break; case 861: #line 5615 "cs-parser.jay" { current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location); } break; case 862: #line 5619 "cs-parser.jay" { yyVal = new Linq.Where (current_block.Toplevel, (BooleanExpression)yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; } break; case 863: #line 5629 "cs-parser.jay" { if (linq_clause_blocks == null) linq_clause_blocks = new Stack<Block> (); current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location); linq_clause_blocks.Push (current_block); } break; case 864: #line 5637 "cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location); linq_clause_blocks.Push (current_block); } break; case 865: #line 5645 "cs-parser.jay" { current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop])); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; var lt = (Tokenizer.LocatedToken) yyVals[-7+yyTop]; current_block = new Linq.QueryBlock (compiler, current_block, new SimpleMemberName (lt.Value, lt.Location), lexer.Location); } break; case 866: #line 5654 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-10+yyTop]; var sn = new SimpleMemberName (lt.Value, lt.Location); SimpleMemberName sn2 = null; ToplevelBlock outer_selector = (ToplevelBlock) linq_clause_blocks.Pop (); ToplevelBlock block = (ToplevelBlock) linq_clause_blocks.Pop (); if (yyVals[0+yyTop] == null) { yyVal = new Linq.Join (block, sn, (Expression)yyVals[-7+yyTop], outer_selector, current_block.Toplevel, GetLocation (yyVals[-11+yyTop])); } else { var lt2 = (Tokenizer.LocatedToken) yyVals[0+yyTop]; sn2 = new SimpleMemberName (lt2.Value, lt2.Location); yyVal = new Linq.GroupJoin (block, sn, (Expression)yyVals[-7+yyTop], outer_selector, current_block.Toplevel, sn2, GetLocation (yyVals[-11+yyTop])); } current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop])); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; if (sn2 == null) ((Linq.QueryBlock)current_block).AddTransparentParameter (compiler, sn); else ((Linq.QueryBlock)current_block).AddTransparentParameter (compiler, sn2); } break; case 867: #line 5681 "cs-parser.jay" { if (linq_clause_blocks == null) linq_clause_blocks = new Stack<Block> (); current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location); linq_clause_blocks.Push (current_block); } break; case 868: #line 5689 "cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location); linq_clause_blocks.Push (current_block); } break; case 869: #line 5697 "cs-parser.jay" { current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop])); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; var lt = (Tokenizer.LocatedToken) yyVals[-7+yyTop]; current_block = new Linq.QueryBlock (compiler, current_block, new SimpleMemberName (lt.Value, lt.Location), lexer.Location); } break; case 870: #line 5706 "cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-10+yyTop]; var sn = new SimpleMemberName (lt.Value, lt.Location); SimpleMemberName sn2 = null; ToplevelBlock outer_selector = (ToplevelBlock) linq_clause_blocks.Pop (); ToplevelBlock block = (ToplevelBlock) linq_clause_blocks.Pop (); Linq.Cast cast = new Linq.Cast ((FullNamedExpression)yyVals[-11+yyTop], (Expression)yyVals[-7+yyTop]); if (yyVals[0+yyTop] == null) { yyVal = new Linq.Join (block, sn, cast, outer_selector, current_block.Toplevel, GetLocation (yyVals[-12+yyTop])); } else { var lt2 = (Tokenizer.LocatedToken) yyVals[0+yyTop]; sn2 = new SimpleMemberName (lt2.Value, lt2.Location); yyVal = new Linq.GroupJoin (block, sn, cast, outer_selector, current_block.Toplevel, sn2, GetLocation (yyVals[-12+yyTop])); } current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop])); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; if (sn2 == null) ((Linq.QueryBlock)current_block).AddTransparentParameter (compiler, sn); else ((Linq.QueryBlock)current_block).AddTransparentParameter (compiler, sn2); } break; case 872: #line 5737 "cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 873: #line 5744 "cs-parser.jay" { current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location); } break; case 874: #line 5748 "cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; yyVal = yyVals[0+yyTop]; } break; case 876: #line 5759 "cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location); } break; case 877: #line 5766 "cs-parser.jay" { ((Linq.AQueryClause)yyVals[-3+yyTop]).Next = (Linq.AQueryClause)yyVals[0+yyTop]; yyVal = yyVals[-3+yyTop]; } break; case 879: #line 5775 "cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; current_block = new Linq.QueryBlock (compiler, current_block, lexer.Location); } break; case 880: #line 5782 "cs-parser.jay" { ((Linq.AQueryClause)yyVals[-3+yyTop]).Tail.Next = (Linq.AQueryClause)yyVals[-1+yyTop]; yyVal = yyVals[-3+yyTop]; } break; case 881: #line 5790 "cs-parser.jay" { yyVal = new Linq.OrderByAscending (current_block.Toplevel, (Expression)yyVals[0+yyTop]); } break; case 882: #line 5794 "cs-parser.jay" { yyVal = new Linq.OrderByAscending (current_block.Toplevel, (Expression)yyVals[-1+yyTop]); } break; case 883: #line 5798 "cs-parser.jay" { yyVal = new Linq.OrderByDescending (current_block.Toplevel, (Expression)yyVals[-1+yyTop]); } break; case 884: #line 5805 "cs-parser.jay" { yyVal = new Linq.ThenByAscending (current_block.Toplevel, (Expression)yyVals[0+yyTop]); } break; case 885: #line 5809 "cs-parser.jay" { yyVal = new Linq.ThenByAscending (current_block.Toplevel, (Expression)yyVals[-1+yyTop]); } break; case 886: #line 5813 "cs-parser.jay" { yyVal = new Linq.ThenByDescending (current_block.Toplevel, (Expression)yyVals[-1+yyTop]); } break; case 888: #line 5822 "cs-parser.jay" { /* query continuation block is not linked with query block but with block*/ /* before. This means each query can use same range variable names for*/ /* different identifiers.*/ current_block.SetEndLocation (GetLocation (yyVals[-1+yyTop])); current_block = current_block.Parent; var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; current_block = new Linq.QueryBlock (compiler, current_block, new SimpleMemberName (lt.Value, lt.Location), GetLocation (yyVals[-1+yyTop])); } break; case 889: #line 5835 "cs-parser.jay" { yyVal = new Linq.QueryExpression (current_block, (Linq.AQueryClause)yyVals[0+yyTop]); } break; case 892: #line 5856 "cs-parser.jay" { Evaluator.LoadAliases (current_namespace); push_current_class (new Class (current_namespace, current_class, new MemberName ("Class" + class_count++), Modifiers.PUBLIC, null), null); var baseclass_list = new List<FullNamedExpression> (); baseclass_list.Add (new TypeExpression (Evaluator.InteractiveBaseClass, lexer.Location)); current_container.AddBasesForPart (current_class, baseclass_list); /* (ref object retval)*/ Parameter [] mpar = new Parameter [1]; mpar [0] = new Parameter (TypeManager.system_object_expr, "$retval", Parameter.Modifier.REF, null, Location.Null); ParametersCompiled pars = new ParametersCompiled (compiler, mpar); current_local_parameters = pars; Method method = new Method ( current_class, null, /* generic*/ TypeManager.system_void_expr, Modifiers.PUBLIC | Modifiers.STATIC, new MemberName ("Host"), pars, null /* attributes */); oob_stack.Push (method); ++lexer.parsing_block; start_block (lexer.Location); } break; case 893: #line 5886 "cs-parser.jay" { --lexer.parsing_block; Method method = (Method) oob_stack.Pop (); method.Block = (ToplevelBlock) end_block(lexer.Location); current_container.AddMethod (method); --lexer.parsing_declaration; InteractiveResult = pop_current_class (); current_local_parameters = null; } break; case 894: #line 5897 "cs-parser.jay" { Evaluator.LoadAliases (current_namespace); } break; #line default } yyTop -= yyLen[yyN]; yyState = yyStates[yyTop]; int yyM = yyLhs[yyN]; if (yyState == 0 && yyM == 0) { if (debug != null) debug.shift(0, yyFinal); yyState = yyFinal; if (yyToken < 0) { yyToken = yyLex.advance() ? yyLex.token() : 0; if (debug != null) debug.lex(yyState, yyToken,yyname(yyToken), yyLex.value()); } if (yyToken == 0) { if (debug != null) debug.accept(yyVal); return yyVal; } goto continue_yyLoop; } if (((yyN = yyGindex[yyM]) != 0) && ((yyN += yyState) >= 0) && (yyN < yyTable.Length) && (yyCheck[yyN] == yyState)) yyState = yyTable[yyN]; else yyState = yyDgoto[yyM]; if (debug != null) debug.shift(yyStates[yyTop], yyState); goto continue_yyLoop; continue_yyDiscarded: continue; // implements the named-loop continue: 'continue yyDiscarded' } continue_yyLoop: continue; // implements the named-loop continue: 'continue yyLoop' }
void case_524() #line 3574 "C:\Projects\Junk\mono\mcs\class\Mono.CSharp\..\..\mcs\cs-parser.jay" { var ai = new ArrayInitializer ((List<Expression>) yyVals[-2+yyTop], GetLocation (yyVals[-3+yyTop])); ai.VariableDeclaration = current_variable; if (yyVals[-1+yyTop] != null) { lbag.AddLocation (ai, GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } else { lbag.AddLocation (ai, GetLocation (yyVals[0+yyTop])); } yyVal = ai; }
public bool VerifyArgumentsCompat(ResolveContext ec, ref Arguments arguments, int arg_count, MethodSpec method, bool chose_params_expanded, bool may_fail, Location loc) { AParametersCollection pd = method.Parameters; int param_count = GetApplicableParametersCount (method, pd); int errors = ec.Report.Errors; Parameter.Modifier p_mod = 0; TypeSpec pt = null; int a_idx = 0, a_pos = 0; Argument a = null; ArrayInitializer params_initializers = null; bool has_unsafe_arg = method.ReturnType.IsPointer; for (; a_idx < arg_count; a_idx++, ++a_pos) { a = arguments [a_idx]; if (p_mod != Parameter.Modifier.PARAMS) { p_mod = pd.FixedParameters [a_idx].ModFlags; pt = pd.Types [a_idx]; has_unsafe_arg |= pt.IsPointer; if (p_mod == Parameter.Modifier.PARAMS) { if (chose_params_expanded) { params_initializers = new ArrayInitializer (arg_count - a_idx, a.Expr.Location); pt = TypeManager.GetElementType (pt); } } } // // Types have to be identical when ref or out modifer is used // if (a.Modifier != 0 || (p_mod & ~Parameter.Modifier.PARAMS) != 0) { if ((p_mod & ~Parameter.Modifier.PARAMS) != a.Modifier) break; if (!TypeManager.IsEqual (a.Expr.Type, pt)) break; continue; } else { NamedArgument na = a as NamedArgument; if (na != null) { int name_index = pd.GetParameterIndexByName (na.Name); if (name_index < 0 || name_index >= param_count) { if (DeclaringType != null && TypeManager.IsDelegateType (DeclaringType)) { ec.Report.SymbolRelatedToPreviousError (DeclaringType); ec.Report.Error (1746, na.Location, "The delegate `{0}' does not contain a parameter named `{1}'", TypeManager.CSharpName (DeclaringType), na.Name); } else { ec.Report.SymbolRelatedToPreviousError (best_candidate); ec.Report.Error (1739, na.Location, "The best overloaded method match for `{0}' does not contain a parameter named `{1}'", TypeManager.CSharpSignature (method), na.Name); } } else if (arguments[name_index] != a) { if (DeclaringType != null && TypeManager.IsDelegateType (DeclaringType)) ec.Report.SymbolRelatedToPreviousError (DeclaringType); else ec.Report.SymbolRelatedToPreviousError (best_candidate); ec.Report.Error (1744, na.Location, "Named argument `{0}' cannot be used for a parameter which has positional argument specified", na.Name); } } } if (a.Expr.Type == InternalType.Dynamic) continue; if (delegate_type != null && !Delegate.IsTypeCovariant (a.Expr, pt)) break; Expression conv = Convert.ImplicitConversion (ec, a.Expr, pt, loc); if (conv == null) break; // // Convert params arguments to an array initializer // if (params_initializers != null) { // we choose to use 'a.Expr' rather than 'conv' so that // we don't hide the kind of expression we have (esp. CompoundAssign.Helper) params_initializers.Add (a.Expr); arguments.RemoveAt (a_idx--); --arg_count; continue; } // Update the argument with the implicit conversion a.Expr = conv; } if (a_idx != arg_count) { if (!may_fail && ec.Report.Errors == errors) { if (CustomErrorHandler != null) CustomErrorHandler.NoExactMatch (ec, best_candidate); else Error_InvalidArguments (ec, loc, a_pos, method, a, pd, pt); } return false; } // // Fill not provided arguments required by params modifier // if (params_initializers == null && pd.HasParams && arg_count + 1 == param_count) { if (arguments == null) arguments = new Arguments (1); pt = pd.Types [param_count - 1]; pt = TypeManager.GetElementType (pt); has_unsafe_arg |= pt.IsPointer; params_initializers = new ArrayInitializer (0, loc); } // // Append an array argument with all params arguments // if (params_initializers != null) { arguments.Add (new Argument ( new ArrayCreation (new TypeExpression (pt, loc), "[]", params_initializers, loc).Resolve (ec))); arg_count++; } if (arg_count < param_count) { if (!may_fail) Error_ArgumentCountWrong (ec, arg_count); return false; } if (has_unsafe_arg && !ec.IsUnsafe) { if (!may_fail) UnsafeError (ec, loc); return false; } return true; }
public override object Visit(ArrayInitializer arrayInitializer) { var result = new ArrayInitializerExpression(); var location = LocationsBag.GetLocations(arrayInitializer); result.AddChild(new CSharpTokenNode(Convert(arrayInitializer.Location), Roles.LBrace), Roles.LBrace); var commaLocations = LocationsBag.GetLocations(arrayInitializer.Elements); for (int i = 0; i < arrayInitializer.Count; i++) { var init = arrayInitializer [i]; if (init == null) continue; result.AddChild((Expression)init.Accept(this), Roles.Expression); if (commaLocations != null && i < commaLocations.Count) result.AddChild(new CSharpTokenNode(Convert(commaLocations [i]), Roles.Comma), Roles.Comma); } if (location != null) { if (location.Count == 2) // optional comma result.AddChild(new CSharpTokenNode(Convert(location [0]), Roles.Comma), Roles.Comma); result.AddChild(new CSharpTokenNode(Convert(location [location.Count - 1]), Roles.RBrace), Roles.RBrace); } return result; }
public ArrayInitializer CreateDynamicBinderArguments(ResolveContext rc) { Location loc = Location.Null; var all = new ArrayInitializer(args.Count, loc); MemberAccess binder = DynamicExpressionStatement.GetBinderNamespace(loc); foreach (Argument a in args) { Arguments dargs = new Arguments(2); // CSharpArgumentInfoFlags.None = 0 const string info_flags_enum = "CSharpArgumentInfoFlags"; Expression info_flags = new IntLiteral(rc.BuiltinTypes, 0, loc); if (a.Expr is Constant) { info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "Constant", loc)); } else if (a.ArgType == Argument.AType.Ref) { info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "IsRef", loc)); info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "UseCompileTimeType", loc)); } else if (a.ArgType == Argument.AType.Out) { info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "IsOut", loc)); info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "UseCompileTimeType", loc)); } else if (a.ArgType == Argument.AType.DynamicTypeName) { info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "IsStaticType", loc)); } var arg_type = a.Expr.Type; if (arg_type.BuiltinType != BuiltinTypeSpec.Type.Dynamic && arg_type != InternalType.NullLiteral) { MethodGroupExpr mg = a.Expr as MethodGroupExpr; if (mg != null) { rc.Report.Error(1976, a.Expr.Location, "The method group `{0}' cannot be used as an argument of dynamic operation. Consider using parentheses to invoke the method", mg.Name); } else if (arg_type == InternalType.AnonymousMethod) { rc.Report.Error(1977, a.Expr.Location, "An anonymous method or lambda expression cannot be used as an argument of dynamic operation. Consider using a cast"); } else if (arg_type.Kind == MemberKind.Void || arg_type == InternalType.Arglist || arg_type.IsPointer) { rc.Report.Error(1978, a.Expr.Location, "An expression of type `{0}' cannot be used as an argument of dynamic operation", arg_type.GetSignatureForError()); } info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "UseCompileTimeType", loc)); } string named_value; NamedArgument na = a as NamedArgument; if (na != null) { info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "NamedArgument", loc)); named_value = na.Name; } else { named_value = null; } dargs.Add(new Argument(info_flags)); dargs.Add(new Argument(new StringLiteral(rc.BuiltinTypes, named_value, loc))); all.Add(new Invocation(new MemberAccess(new MemberAccess(binder, "CSharpArgumentInfo", loc), "Create", loc), dargs)); } return(all); }
public virtual object Visit(ArrayInitializer arrayInitializer) { return(null); }
// IMPORTANT NOTE: // The grammar consists of a few LALR(1) conflicts. These issues are, however, correctly handled, due to the fact that the grammar // is defined in a specific order making the already added parser actions have precedence over the other. // // Known conflicts that are correctly handled: // // - ELSE: Shift/Reduce conflict Dangling ELSE problem. Lots of articles are around on the internet. // The shift action is taken here. // // - CLOSE_PARENS: Shift/Reduce conflict. This is due to the fact that the explicit cast expression is like the parenthesized // expression. The shift action is taken here. // // - STAR: Reduce/Reduce conflict, between VariableType -> TypeNameExpression and PrimaryExpression -> TypeNameExpression, // due to the fact variable types can have '*', and look therefore like a binary operator expression. // The first reduce action is taken here. public CSharpGrammar() { // Please let me know if there is a better way of tidying this :s TokenMapping.Add((int)ERROR, Error); #region Definitions to use later var statementList = new GrammarDefinition("StatementList"); var statementListOptional = new GrammarDefinition("StatementListOptional", rule: null | statementList); var blockStatement = new GrammarDefinition("BlockStatement"); var variableDeclarator = new GrammarDefinition("VariableDeclarator"); var variableDeclaratorList = new GrammarDefinition("VariableDeclaratorList"); variableDeclaratorList.Rule = variableDeclarator | variableDeclaratorList + ToElement(COMMA) + variableDeclarator; var variableDeclaration = new GrammarDefinition("VariableDeclaration"); var variableInitializer = new GrammarDefinition("VariableInitializer"); var arrayInitializer = new GrammarDefinition("ArrayInitializer"); var arrayInitializerOptional = new GrammarDefinition("ArrayInitializerOptional", rule: null | arrayInitializer); var identifierInsideBody = new GrammarDefinition("IdentifierInsideBody", rule: ToElement(IDENTIFIER), createNode: node => ToIdentifier(node.Children[0].Result)); var identifierInsideBodyOptional = new GrammarDefinition("IdentifierInsideBodyOptional", rule: null | identifierInsideBody); variableDeclarator.Rule = identifierInsideBody | identifierInsideBody + ToElement(EQUALS) + variableInitializer; variableDeclarator.ComputeResult = node => { var result = new VariableDeclarator((Identifier) node.Children[0].Result); if (node.Children.Count > 1) { result.OperatorToken = (AstToken) node.Children[1].Result; result.Value = (Expression) node.Children[2].Result; } return result; }; var typeReference = new GrammarDefinition("TypeReference"); var identifierExpression = new GrammarDefinition("IdentifierExpression", rule: identifierInsideBody, createNode: node => new IdentifierExpression((Identifier) node.Children[0].Result)); var usingDirectiveListOptional = new GrammarDefinition("UsingDirectiveListOptional"); #endregion #region Type References var namespaceOrTypeExpression = new GrammarDefinition("NamespaceOrTypeExpression"); namespaceOrTypeExpression.Rule = identifierExpression | namespaceOrTypeExpression + ToElement(DOT) + ToElement(IDENTIFIER); namespaceOrTypeExpression.ComputeResult = node => { if (node.Children.Count == 1) return ToTypeReference((IConvertibleToType) node.Children[0].Result); var result = new MemberTypeReference(); result.Target = (TypeReference) node.Children[0].Result; result.AddChild(AstNodeTitles.Accessor, node.Children[1].Result); result.Identifier = ToIdentifier(node.Children[2].Result); return result; }; ComputeResultDelegate createPrimitiveTypeExpression = node => { if (node.Children[0].Result is PrimitiveTypeReference) return node.Children[0].Result; return new PrimitiveTypeReference { Identifier = ToIdentifier(node.Children[0].Result), PrimitiveType = CSharpLanguage.PrimitiveTypeFromString(((AstToken) node.Children[0].Result).Value) }; }; var integralType = new GrammarDefinition("IntegralType", rule: ToElement(SBYTE) | ToElement(BYTE) | ToElement(SHORT) | ToElement(USHORT) | ToElement(INT) | ToElement(UINT) | ToElement(LONG) | ToElement(ULONG) | ToElement(CHAR), createNode: createPrimitiveTypeExpression); var primitiveType = new GrammarDefinition("PrimitiveTypeExpression", rule: ToElement(OBJECT) | ToElement(STRING) | ToElement(BOOL) | ToElement(DECIMAL) | ToElement(FLOAT) | ToElement(DOUBLE) | ToElement(VOID) | integralType, createNode: createPrimitiveTypeExpression); var dimensionSeparators = new GrammarDefinition("DimensionSeparators"); dimensionSeparators.Rule = ToElement(COMMA) | dimensionSeparators + ToElement(COMMA); var rankSpecifier = new GrammarDefinition("RankSpecifier", rule: ToElement(OPEN_BRACKET) + ToElement(CLOSE_BRACKET) | ToElement(OPEN_BRACKET) + dimensionSeparators + ToElement(CLOSE_BRACKET), createNode: node => { var result = new ArrayTypeRankSpecifier(); result.LeftBracket = (AstToken) node.Children[0].Result; if (node.Children.Count == 3) { foreach (var dimensionSeparator in node.Children[1].GetAllNodesFromListDefinition() .Select(x => x.Result)) { result.Dimensions++; result.AddChild(AstNodeTitles.ElementSeparator, dimensionSeparator); } } result.RightBracket = (AstToken) node.Children[node.Children.Count - 1].Result; return result; }); var arrayType = new GrammarDefinition("ArrayType", rule: typeReference + rankSpecifier, createNode: node => new ArrayTypeReference() { BaseType = (TypeReference) node.Children[0].Result, RankSpecifier = (ArrayTypeRankSpecifier) node.Children[1].Result }); var pointerType = new GrammarDefinition("PointerType", rule: typeReference + ToElement(STAR), createNode: node => new PointerTypeReference() { BaseType = (TypeReference) node.Children[0].Result, PointerToken = (AstToken) node.Children[1].Result }); var typeExpression = new GrammarDefinition("TypeExpression", rule: namespaceOrTypeExpression | primitiveType); typeReference.Rule = typeExpression | arrayType | pointerType ; #endregion #region Expressions ComputeResultDelegate createBinaryOperatorExpression = node => { if (node.Children.Count == 1) return node.Children[0].Result; var result = new BinaryOperatorExpression(); result.Left = (Expression) node.Children[0].Result; var operatorToken = (AstToken) (node.Children[1].Result ?? node.Children[1].Children[0].Result); result.Operator = CSharpLanguage.BinaryOperatorFromString(operatorToken.Value); result.OperatorToken = (AstToken) operatorToken; result.Right = (Expression) node.Children[2].Result; return result; }; var expression = new GrammarDefinition("Expression"); var expressionOptional = new GrammarDefinition("ExpressionOptional", rule: null | expression); var primaryExpression = new GrammarDefinition("PrimaryExpression"); var primitiveExpression = new GrammarDefinition("PrimitiveExpression", rule: ToElement(LITERAL) | ToElement(TRUE) | ToElement(FALSE) | ToElement(NULL), createNode: node => { object interpretedValue; node.Children[0].Result.UserData.TryGetValue("InterpretedValue", out interpretedValue); var result = new PrimitiveExpression(interpretedValue, ((AstToken) node.Children[0].Result).Value, node.Children[0].Range); return result; }); var parenthesizedExpression = new GrammarDefinition("ParenthesizedExpression", rule: ToElement(OPEN_PARENS) + expression + ToElement(CLOSE_PARENS) | ToElement(OPEN_PARENS) + Error + ToElement(CLOSE_PARENS), createNode: node => new ParenthesizedExpression { LeftParenthese = (AstToken) node.Children[0].Result, Expression = (Expression) node.Children[1].Result, RightParenthese = (AstToken) node.Children[2].Result, }); var memberAccessorOperator = new GrammarDefinition("MemberAccessorOperator", rule: ToElement(DOT) | ToElement(OP_PTR) | ToElement(INTERR_OPERATOR)); var memberReferenceExpression = new GrammarDefinition("MemberReferenceExpression", rule: primaryExpression + memberAccessorOperator + identifierInsideBody | primaryExpression + memberAccessorOperator + Error, createNode: node => new MemberReferenceExpression { Target = (Expression) ((IConvertibleToExpression) node.Children[0].Result).ToExpression().Remove(), Accessor = CSharpLanguage.AccessorFromString(((AstToken) node.Children[1].Children[0].Result).Value), AccessorToken = (AstToken) node.Children[1].Children[0].Result, Identifier = (Identifier) node.Children[2].Result }); var argument = new GrammarDefinition("Argument", rule: expression | ToElement(REF) + expression | ToElement(OUT) + expression, createNode: node => { if (node.Children.Count > 1) { return new DirectionExpression() { DirectionToken = (AstToken) node.Children[0].Result, Direction = CSharpLanguage.DirectionFromString(((AstToken) node.Children[0].Result).Value), Expression = (Expression) node.Children[1].Result }; } return node.Children[0].Result; }); var argumentList = new GrammarDefinition("ArgumentList"); argumentList.Rule = argument | argumentList + ToElement(COMMA) + argument; var argumentListOptional = new GrammarDefinition("ArgumentListOptional", rule: null | argumentList); var invocationExpression = new GrammarDefinition("InvocationExpression", rule: primaryExpression + ToElement(OPEN_PARENS) + argumentListOptional + ToElement(CLOSE_PARENS), createNode: node => { var result = new InvocationExpression() { Target = (Expression) node.Children[0].Result, LeftParenthese = (AstToken) node.Children[1].Result, }; if (node.Children[2].HasChildren) { foreach (var subNode in node.Children[2].Children[0].GetAllListAstNodes()) { if (subNode is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, subNode); else result.Arguments.Add((Expression) subNode); } } result.RightParenthese = (AstToken) node.Children[3].Result; return result; }); var indexerExpression = new GrammarDefinition("IndexerExpression", rule: primaryExpression + ToElement(OPEN_BRACKET_EXPR) + argumentList + ToElement(CLOSE_BRACKET), createNode: node => { var result = new IndexerExpression() { Target = (Expression) node.Children[0].Result, LeftBracket = (AstToken) node.Children[1].Result, }; foreach (var subNode in node.Children[2].GetAllListAstNodes()) { if (subNode is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, subNode); else result.Indices.Add((Expression) subNode); } result.RightBracket = (AstToken) node.Children[3].Result; return result; }); var createObjectExpression = new GrammarDefinition("CreateObjectExpression", rule: ToElement(NEW) + typeReference + ToElement(OPEN_PARENS) + argumentListOptional + ToElement(CLOSE_PARENS) + arrayInitializerOptional | ToElement(NEW) + namespaceOrTypeExpression + arrayInitializer, createNode: node => { var result = new CreateObjectExpression(); result.NewKeyword = (AstToken) node.Children[0].Result; result.Type = (TypeReference) node.Children[1].Result; if (node.Children.Count == 6) { result.LeftParenthese = (AstToken) node.Children[2].Result; if (node.Children[3].HasChildren) { foreach (var subNode in node.Children[3].Children[0].GetAllListAstNodes()) { if (subNode is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, subNode); else result.Arguments.Add((Expression) subNode); } } result.RightParenthese = (AstToken) node.Children[4].Result; } var initializerNode = node.Children[node.Children.Count - 1]; if (initializerNode.HasChildren) result.Initializer = (ArrayInitializer) initializerNode.Result; return result; }); var createArrayExpression = new GrammarDefinition("CreateArrayExpression", rule: ToElement(NEW) + rankSpecifier + arrayInitializer | ToElement(NEW) + typeReference + rankSpecifier + arrayInitializer | ToElement(NEW) + typeReference + ToElement(OPEN_BRACKET_EXPR) + argumentList + ToElement(CLOSE_BRACKET) + arrayInitializerOptional , createNode: node => { var result = new CreateArrayExpression(); result.NewKeyword = (AstToken) node.Children[0].Result; switch (node.Children.Count) { case 3: { var rankSpecifierNode = (ArrayTypeRankSpecifier) node.Children[1].Result; result.LeftBracket = (AstToken) rankSpecifierNode.LeftBracket.Remove(); result.RightBracket = (AstToken) rankSpecifierNode.RightBracket.Remove(); break; } case 4: { result.Type = (TypeReference) node.Children[1].Result; var rankSpecifierNode = (ArrayTypeRankSpecifier) node.Children[2].Result; result.LeftBracket = (AstToken) rankSpecifierNode.LeftBracket.Remove(); result.RightBracket = (AstToken) rankSpecifierNode.RightBracket.Remove(); break; } case 6: { result.Type = (TypeReference) node.Children[1].Result; result.LeftBracket = (AstToken) node.Children[2].Result; if (node.Children[3].HasChildren) { foreach (var subNode in node.Children[3].Children[0].GetAllListAstNodes()) { if (subNode is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, subNode); else result.Arguments.Add((Expression) subNode); } } result.RightBracket = (AstToken) node.Children[4].Result; break; } } var initializerNode = node.Children[node.Children.Count - 1]; if (initializerNode.HasChildren) result.Initializer = (ArrayInitializer) initializerNode.Result; return result; }); var primitiveTypeExpression = new GrammarDefinition("PrimitiveTypeExpression", rule: primitiveType, createNode: node => ((IConvertibleToExpression) node.Children[0].Result).ToExpression()); var typeNameExpression = new GrammarDefinition("TypeNameExpression", rule: identifierExpression | memberReferenceExpression | primitiveTypeExpression); var thisExpression = new GrammarDefinition("ThisExpression", rule: ToElement(THIS), createNode: node => new ThisReferenceExpression() { ThisKeywordToken = (AstToken) node.Children[0].Result, }); var baseExpression = new GrammarDefinition("BaseExpression", rule: ToElement(BASE), createNode: node => new BaseReferenceExpression() { BaseKeywordToken = (AstToken) node.Children[0].Result, }); var typeofExpression = new GrammarDefinition("TypeOfExpression", rule: ToElement(TYPEOF) + ToElement(OPEN_PARENS) + typeReference + ToElement(CLOSE_PARENS), createNode: node => new GetTypeExpression() { GetTypeKeywordToken = (AstToken) node.Children[0].Result, LeftParenthese = (AstToken) node.Children[1].Result, TargetType = (TypeReference) node.Children[2].Result, RightParenthese = (AstToken) node.Children[3].Result, }); var defaultExpression = new GrammarDefinition("DefaultExpression", rule: ToElement(DEFAULT) + ToElement(OPEN_PARENS) + typeReference + ToElement(CLOSE_PARENS), createNode: node => new DefaultExpression() { KeywordToken = (AstToken) node.Children[0].Result, LeftParenthese = (AstToken) node.Children[1].Result, TargetType = (TypeReference) node.Children[2].Result, RightParenthese = (AstToken) node.Children[3].Result, }); var sizeofExpression = new GrammarDefinition("SizeOfExpression", rule: ToElement(SIZEOF) + ToElement(OPEN_PARENS) + typeReference + ToElement(CLOSE_PARENS), createNode: node => new SizeOfExpression() { SizeofKeyword = (AstToken) node.Children[0].Result, LeftParenthese = (AstToken) node.Children[1].Result, TargetType = (TypeReference) node.Children[2].Result, RightParenthese = (AstToken) node.Children[3].Result, }); var checkedExpression = new GrammarDefinition("CheckedExpression", rule: ToElement(CHECKED) + ToElement(OPEN_PARENS) + expression + ToElement(CLOSE_PARENS), createNode: node => new CheckedExpression() { CheckedKeyword = (AstToken) node.Children[0].Result, LeftParenthese = (AstToken) node.Children[1].Result, TargetExpression = (Expression) node.Children[2].Result, RightParenthese = (AstToken) node.Children[3].Result, }); var uncheckedExpression = new GrammarDefinition("UncheckedExpression", rule: ToElement(UNCHECKED) + ToElement(OPEN_PARENS) + expression + ToElement(CLOSE_PARENS), createNode: node => new UncheckedExpression() { UncheckedKeyword = (AstToken) node.Children[0].Result, LeftParenthese = (AstToken) node.Children[1].Result, TargetExpression = (Expression) node.Children[2].Result, RightParenthese = (AstToken) node.Children[3].Result, }); var stackAllocExpression = new GrammarDefinition("StackAllocExpression", rule: ToElement(STACKALLOC) + typeReference + ToElement(OPEN_BRACKET_EXPR) + expression + ToElement(CLOSE_BRACKET), createNode: node => new StackAllocExpression() { StackAllocKeyword = (AstToken) node.Children[0].Result, Type = (TypeReference) node.Children[1].Result, LeftBracket = (AstToken) node.Children[2].Result, Counter = (Expression) node.Children[3].Result, RightBracket = (AstToken) node.Children[4].Result, }); var explicitAnonymousMethodParameter = new GrammarDefinition("ExplicitAnonymousMethodParameter", rule: typeReference + ToElement(IDENTIFIER), createNode: node => new ParameterDeclaration { ParameterType = (TypeReference)node.Children[0].Result, Declarator = new VariableDeclarator(ToIdentifier(node.Children[1].Result)) }); var explicitAnonymousMethodParameterList = new GrammarDefinition("ExplicitAnonymousMethodParameterList"); explicitAnonymousMethodParameterList.Rule = explicitAnonymousMethodParameter | explicitAnonymousMethodParameterList + ToElement(COMMA) + explicitAnonymousMethodParameter; var explicitAnonymousMethodParameterListOptional = new GrammarDefinition("ExplicitAnonymousMethodParameterListOptional", rule: null | explicitAnonymousMethodParameterList); var explicitAnonymousMethodSignature = new GrammarDefinition("ExplicitAnonymousMethodSignature", rule: ToElement(OPEN_PARENS) + explicitAnonymousMethodParameterListOptional + ToElement(CLOSE_PARENS)); var explicitAnonymousMethodSignatureOptional = new GrammarDefinition("ExplicitAnonymousMethodSignatureOptional", rule: null | explicitAnonymousMethodSignature); var anonymousMethodExpression = new GrammarDefinition("AnonymousMethodExpression", rule: ToElement(DELEGATE) + explicitAnonymousMethodSignatureOptional + blockStatement, createNode: node => { var result = new AnonymousMethodExpression(); result.DelegateKeyword = (AstToken) node.Children[0].Result; if (node.Children[1].HasChildren) { var signature = node.Children[1].Children[0]; result.LeftParenthese = (AstToken) signature.Children[0].Result; if (signature.Children[1].HasChildren) { foreach (var child in signature.Children[1].Children[0].GetAllListAstNodes()) { if (child is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, child); else result.Parameters.Add((ParameterDeclaration) child); } } result.RightParenthese = (AstToken)signature.Children[2].Result; } result.Body = (BlockStatement) node.Children[2].Result; return result; }); var implicitAnonymousMethodParameter = new GrammarDefinition("ImplicitAnonymousMethodParameter", rule: ToElement(IDENTIFIER), createNode: node => new ParameterDeclaration { Declarator = new VariableDeclarator(ToIdentifier(node.Children[0].Result)) }); var implicitAnonymousMethodParameterList = new GrammarDefinition("ImplicitAnonymousMethodParameterList"); implicitAnonymousMethodParameterList.Rule = implicitAnonymousMethodParameter | implicitAnonymousMethodParameterList + ToElement(COMMA) + implicitAnonymousMethodParameter; var implicitAnonymousMethodParameterListOptional = new GrammarDefinition("ImplicitAnonymousMethodParameterListOptional", rule: null | implicitAnonymousMethodParameterList); var implicitAnonymousMethodSignature = new GrammarDefinition("implicitAnonymousMethodSignature", rule: implicitAnonymousMethodParameter | ToElement(OPEN_PARENS_LAMBDA) + implicitAnonymousMethodParameterList + ToElement(CLOSE_PARENS)); var anonymousMethodSignature = new GrammarDefinition("AnonymousMethodSignature", rule: implicitAnonymousMethodSignature); var anonymousFunctionBody = new GrammarDefinition("AnonymousFunctionBody", rule: expression | blockStatement); var lambdaExpression = new GrammarDefinition("LambdaExpression", rule: anonymousMethodSignature + ToElement(ARROW) + anonymousFunctionBody, createNode: node => { var result = new LambdaExpression(); result.Arrow = (AstToken)node.Children[1].Result; result.Body = node.Children[2].Result; return result; }); primaryExpression.Rule = typeNameExpression | primitiveExpression | parenthesizedExpression | invocationExpression | indexerExpression | thisExpression | baseExpression | createObjectExpression | createArrayExpression | typeofExpression | defaultExpression | sizeofExpression | checkedExpression | uncheckedExpression | stackAllocExpression | anonymousMethodExpression ; var preFixUnaryOperator = new GrammarDefinition("PreFixUnaryOperator", rule: ToElement(PLUS) | ToElement(MINUS) | ToElement(STAR) | ToElement(BANG) | ToElement(OP_INC) | ToElement(OP_DEC) | ToElement(BITWISE_AND) | ToElement(TILDE) | ToElement(AWAIT)); var postFixUnaryOperator = new GrammarDefinition("PostFixUnaryOperator", rule: ToElement(OP_INC) | ToElement(OP_DEC)); var castExpression = new GrammarDefinition("CastExpression"); var unaryOperatorExpression = new GrammarDefinition("UnaryOperatorExpression", rule: primaryExpression | castExpression | (preFixUnaryOperator + primaryExpression) | (primaryExpression + postFixUnaryOperator), createNode: node => { if (node.Children.Count == 1) return node.Children[0].Result; var result = new UnaryOperatorExpression(); var isPrefix = node.Children[0].GrammarElement == preFixUnaryOperator; if (isPrefix) { var operatorToken = ((AstToken) node.Children[0].Children[0].Result); result.Operator = CSharpLanguage.UnaryOperatorFromString(operatorToken.Value); result.OperatorToken = operatorToken; } result.Expression = (Expression) node.Children[isPrefix ? 1 : 0].Result; if (!isPrefix) { var operatorToken = (AstToken) node.Children[1].Children[0].Result; result.Operator = CSharpLanguage.UnaryOperatorFromString(operatorToken.Value, false); result.OperatorToken = operatorToken; } return result; }); castExpression.Rule = ToElement(OPEN_PARENS) + typeNameExpression + ToElement(CLOSE_PARENS) + unaryOperatorExpression; castExpression.ComputeResult = node => new ExplicitCastExpression { LeftParenthese = (AstToken) node.Children[0].Result, TargetType = ToTypeReference((IConvertibleToType) node.Children[1].Result), RightParenthese = (AstToken) node.Children[2].Result, TargetExpression = (Expression) node.Children[3].Result }; var multiplicativeOperator = new GrammarDefinition("MultiplicativeOperator", rule: ToElement(STAR) | ToElement(DIV) | ToElement(PERCENT)); var multiplicativeExpression = new GrammarDefinition("MultiplicativeExpression"); multiplicativeExpression.Rule = unaryOperatorExpression | multiplicativeExpression + multiplicativeOperator + unaryOperatorExpression; multiplicativeExpression.ComputeResult = createBinaryOperatorExpression; var additiveOperator = new GrammarDefinition("AdditiveOperator", rule: ToElement(PLUS) | ToElement(MINUS)); var additiveExpression = new GrammarDefinition("AdditiveExpression"); additiveExpression.Rule = multiplicativeExpression | additiveExpression + additiveOperator + multiplicativeExpression; additiveExpression.ComputeResult = createBinaryOperatorExpression; var shiftOperator = new GrammarDefinition("ShiftOperator", rule: ToElement(OP_SHIFT_LEFT) | ToElement(OP_SHIFT_RIGHT)); var shiftExpression = new GrammarDefinition("ShiftExpression"); shiftExpression.Rule = additiveExpression | shiftExpression + shiftOperator + additiveExpression; shiftExpression.ComputeResult = createBinaryOperatorExpression; var relationalOperator = new GrammarDefinition("RelationalOperator", rule: ToElement(OP_GT) | ToElement(OP_GE) | ToElement(OP_LT) | ToElement(OP_LE) | ToElement(IS) | ToElement(AS)); var relationalExpression = new GrammarDefinition("RelationalExpression"); relationalExpression.Rule = shiftExpression | relationalExpression + relationalOperator + shiftExpression; relationalExpression.ComputeResult = node => { if (node.Children.Count == 1) return node.Children[0].Result; var operatorToken = (CSharpAstToken) node.Children[1].Children[0].Result; switch (operatorToken.Code) { case IS: return new TypeCheckExpression() { TargetExpression = (Expression) node.Children[0].Result, IsKeyword = operatorToken, TargetType = ToTypeReference((IConvertibleToType) node.Children[2].Result) }; case AS: return new SafeCastExpression() { TargetExpression = (Expression) node.Children[0].Result, CastKeyword = operatorToken, TargetType = ToTypeReference((IConvertibleToType) node.Children[2].Result) }; default: return createBinaryOperatorExpression(node); } }; var equalityOperator = new GrammarDefinition("equalityOperator", rule: ToElement(OP_EQUALS) | ToElement(OP_NOTEQUALS)); var equalityExpression = new GrammarDefinition("EqualityExpression"); equalityExpression.Rule = relationalExpression | equalityExpression + equalityOperator + relationalExpression; equalityExpression.ComputeResult = createBinaryOperatorExpression; var logicalAndExpression = new GrammarDefinition("LogicalAndExpression"); logicalAndExpression.Rule = equalityExpression | logicalAndExpression + ToElement(BITWISE_AND) + equalityExpression; logicalAndExpression.ComputeResult = createBinaryOperatorExpression; var logicalXorExpression = new GrammarDefinition("LogicalOrExpression"); logicalXorExpression.Rule = logicalAndExpression | logicalXorExpression + ToElement(CARRET) + logicalAndExpression; logicalXorExpression.ComputeResult = createBinaryOperatorExpression; var logicalOrExpression = new GrammarDefinition("LogicalOrExpression"); logicalOrExpression.Rule = logicalXorExpression | logicalOrExpression + ToElement(BITWISE_OR) + logicalXorExpression; logicalOrExpression.ComputeResult = createBinaryOperatorExpression; var conditionalAndExpression = new GrammarDefinition("ConditionalAndExpression"); conditionalAndExpression.Rule = logicalOrExpression | conditionalAndExpression + ToElement(OP_AND) + logicalOrExpression; conditionalAndExpression.ComputeResult = createBinaryOperatorExpression; var conditionalOrExpression = new GrammarDefinition("ConditionalOrExpression"); conditionalOrExpression.Rule = conditionalAndExpression | conditionalOrExpression + ToElement(OP_OR) + conditionalAndExpression; conditionalOrExpression.ComputeResult = createBinaryOperatorExpression; var nullCoalescingExpression = new GrammarDefinition("NullCoalescingExpression"); nullCoalescingExpression.Rule = conditionalOrExpression | nullCoalescingExpression + ToElement(OP_COALESCING) + conditionalOrExpression; nullCoalescingExpression.ComputeResult = createBinaryOperatorExpression; var conditionalExpression = new GrammarDefinition("ConditionalExpression", rule: nullCoalescingExpression | nullCoalescingExpression + ToElement(INTERR) + expression + ToElement(COLON) + expression, createNode: node => node.Children.Count == 1 ? node.Children[0].Result : new ConditionalExpression { Condition = (Expression) node.Children[0].Result, OperatorToken = (AstToken) node.Children[1].Result, TrueExpression = (Expression) node.Children[2].Result, ColonToken = (AstToken) node.Children[3].Result, FalseExpression = (Expression) node.Children[4].Result }); var assignmentOperator = new GrammarDefinition("AssignmentOperator", rule: ToElement(EQUALS) | ToElement(OP_ADD_ASSIGN) | ToElement(OP_SUB_ASSIGN) | ToElement(OP_MULT_ASSIGN) | ToElement(OP_DIV_ASSIGN) | ToElement(OP_AND_ASSIGN) | ToElement(OP_OR_ASSIGN) | ToElement(OP_XOR_ASSIGN) | ToElement(OP_SHIFT_LEFT_ASSIGN) | ToElement(OP_SHIFT_RIGHT_ASSIGN)); var assignmentExpression = new GrammarDefinition("AssignmentExpression", rule: unaryOperatorExpression + assignmentOperator + expression, createNode: node => new AssignmentExpression { Target = (Expression) node.Children[0].Result, Operator = CSharpLanguage.AssignmentOperatorFromString(((AstToken) node.Children[1].Children[0].Result).Value), OperatorToken = (AstToken) node.Children[1].Children[0].Result, Value = (Expression) node.Children[2].Result, }); var fromClause = new GrammarDefinition("FromClause", rule: ToElement(FROM) + identifierInsideBody + ToElement(IN) + expression, createNode: node => new LinqFromClause { FromKeyword = (AstToken) node.Children[0].Result, VariableName = (Identifier) node.Children[1].Result, InKeyword = (AstToken) node.Children[2].Result, DataSource = (Expression) node.Children[3].Result }); var letClause = new GrammarDefinition("LetClause", rule: ToElement(LET) + variableDeclarator, createNode: node => new LinqLetClause() { LetKeyword = (AstToken) node.Children[0].Result, Variable = (VariableDeclarator) node.Children[1].Result }); var whereClause = new GrammarDefinition("WhereClause", rule: ToElement(WHERE) + expression, createNode: node => new LinqWhereClause() { WhereKeyword = (AstToken) node.Children[0].Result, Condition = (Expression) node.Children[1].Result }); var orderingDirection = new GrammarDefinition("OrderingDirection", rule: null | ToElement(ASCENDING) | ToElement(DESCENDING)); var ordering = new GrammarDefinition("Ordering", rule: expression + orderingDirection, createNode: node => { var result = new LinqOrdering(); result.Expression = (Expression) node.Children[0].Result; if (node.Children[1].HasChildren) { var directionNode = node.Children[1].Children[0]; result.DirectionKeyword = (AstToken) directionNode.Result; result.Direction = directionNode.Result != null ? CSharpLanguage.OrderningDirectionFromString(result.DirectionKeyword.Value) : LinqOrderingDirection.None; } return result; }); var orderings = new GrammarDefinition("Orderings"); orderings.Rule = ordering | orderings + ToElement(COMMA) + ordering; var orderByClause = new GrammarDefinition("OrderByClause", rule: ToElement(ORDERBY) + orderings, createNode: node => { var result = new LinqOrderByClause(); result.OrderByKeyword = (AstToken) node.Children[0].Result; foreach (var subNode in node.Children[1].GetAllListAstNodes()) { if (subNode is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, subNode); else result.Ordernings.Add((LinqOrdering) subNode); } return result; }); var groupByClause = new GrammarDefinition("GroupByClause", rule: ToElement(GROUP) + expression + ToElement(BY) + expression, createNode: node => new LinqGroupByClause() { GroupKeyword = (AstToken) node.Children[0].Result, Expression = (Expression) node.Children[1].Result, ByKeyword = (AstToken) node.Children[2].Result, KeyExpression = (Expression) node.Children[3].Result }); var selectClause = new GrammarDefinition("SelectClause", rule: ToElement(SELECT) + expression, createNode: node => new LinqSelectClause() { SelectKeyword = (AstToken) node.Children[0].Result, Target = (Expression) node.Children[1].Result }); var queryBodyClause = new GrammarDefinition("QueryBodyClause", rule: fromClause | letClause | groupByClause | whereClause | orderByClause ); var queryBodyClauses = new GrammarDefinition("QueryBodyClauses"); queryBodyClauses.Rule = queryBodyClause | queryBodyClauses + queryBodyClause; var queryBodyClausesOptional = new GrammarDefinition("QueryBodyClausesOptional", rule: null | queryBodyClauses); var linqExpression = new GrammarDefinition("LinqExpression", rule: fromClause + queryBodyClausesOptional + selectClause, createNode: node => { var result = new LinqExpression(); result.Clauses.Add((LinqClause) node.Children[0].Result); if (node.Children[1].HasChildren) { result.Clauses.AddRange(node.Children[1].Children[0].GetAllListAstNodes().Cast<LinqClause>()); } result.Clauses.Add((LinqClause) node.Children[2].Result); return result; }); expression.Rule = conditionalExpression | linqExpression | lambdaExpression | assignmentExpression; #endregion #region Statements var statement = new GrammarDefinition("Statement"); var embeddedStatement = new GrammarDefinition("EmbeddedStatement"); var emptyStatement = new GrammarDefinition("EmptyStatement", rule: ToElement(SEMICOLON), createNode: node => { var result = new EmptyStatement(); result.AddChild(AstNodeTitles.Semicolon, node.Children[0].Result); return result; }); var labelStatement = new GrammarDefinition("LabelStatement", rule: identifierInsideBody + ToElement(COLON), createNode: node => new LabelStatement((Identifier) node.Children[0].Result) { Colon = (AstToken) node.Children[1].Result }); var expressionStatement = new GrammarDefinition("ExpressionStatement", rule: expression + ToElement(SEMICOLON) | Error + ToElement(SEMICOLON) | Error + ToElement(CLOSE_BRACE) | expression + ToElement(CLOSE_BRACE), // Common mistake in C# is to forget the semicolon at the end of a statement. createNode: node => { var result = new ExpressionStatement(node.Children[0].Result as Expression); var endingToken = (AstToken) node.Children[1].Result; if (endingToken.GetTokenCode() == (int) SEMICOLON) { result.AddChild(AstNodeTitles.Semicolon, node.Children[1].Result); } else { node.Context.SyntaxErrors.Add(new SyntaxError( node.Children[1].Range.End, "';' expected.", MessageSeverity.Error)); node.Context.Lexer.PutBack((AstToken) endingToken); } return result; }); blockStatement.Rule = ToElement(OPEN_BRACE) + statementListOptional + ToElement(CLOSE_BRACE); blockStatement.ComputeResult = node => { var result = new BlockStatement(); result.StartScope = node.Children[0].Result; if (node.Children[1].HasChildren) { result.Statements.AddRange(node.Children[1].Children[0].GetAllListAstNodes<Statement>()); } result.EndScope = node.Children[2].Result; return result; }; var variableDeclarationStatement = new GrammarDefinition("VariableDeclarationStatement", rule: variableDeclaration + ToElement(SEMICOLON), createNode: node => { var result = node.Children[0].Result; result.AddChild(AstNodeTitles.Semicolon, node.Children[1].Result); return result; }); var ifElseStatement = new GrammarDefinition("IfElseStatement", rule: ToElement(IF) + parenthesizedExpression + embeddedStatement | ToElement(IF) + parenthesizedExpression + embeddedStatement + ToElement(ELSE) + embeddedStatement , createNode: node => { var result = new IfElseStatement(); result.IfKeyword = (AstToken) node.Children[0].Result; var parenthesized = (ParenthesizedExpression) node.Children[1].Result; result.LeftParenthese = (AstToken) parenthesized.LeftParenthese.Remove(); result.Condition = (Expression) parenthesized.Expression?.Remove(); result.RightParenthese = (AstToken) parenthesized.RightParenthese.Remove(); result.TrueBlock = (Statement) node.Children[2].Result; if (node.Children.Count > 3) { result.ElseKeyword = (AstToken) node.Children[3].Result; result.FalseBlock = (Statement) node.Children[4].Result; CheckForPossibleMistakenEmptyStatement(node.Children[4]); } else { CheckForPossibleMistakenEmptyStatement(node.Children[2]); } return result; }); var switchLabel = new GrammarDefinition("SwitchLabel", rule: ToElement(CASE) + expression + ToElement(COLON) | ToElement(DEFAULT_COLON) + ToElement(COLON), createNode: node => { var result = new SwitchCaseLabel(); result.CaseKeyword = (AstToken) node.Children[0].Result; if (node.Children.Count > 2) result.Condition = (Expression) node.Children[1].Result; result.Colon = (AstToken) node.Children[node.Children.Count - 1].Result; return result; }); var switchLabels = new GrammarDefinition("SwitchLabels"); switchLabels.Rule = switchLabel | switchLabels + switchLabel; var switchSection = new GrammarDefinition("SwitchSection", rule: switchLabels + statementList, createNode: node => { var result = new SwitchSection(); result.Labels.AddRange(node.Children[0].GetAllListAstNodes<SwitchCaseLabel>()); result.Statements.AddRange(node.Children[1].GetAllListAstNodes<Statement>()); return result; }); var switchSections = new GrammarDefinition("SwitchSections"); switchSections.Rule = switchSection | switchSections + switchSection; var switchBlock = new GrammarDefinition("SwitchBlock", rule: ToElement(OPEN_BRACE) + switchSections + ToElement(CLOSE_BRACE)); var switchStatement = new GrammarDefinition("SwitchStatement", rule: ToElement(SWITCH) + ToElement(OPEN_PARENS) + expression + ToElement(CLOSE_PARENS) + switchBlock, createNode: node => { var result = new SwitchStatement(); result.SwitchKeyword = (AstToken) node.Children[0].Result; result.LeftParenthese = (AstToken) node.Children[1].Result; result.Condition = (Expression) node.Children[2].Result; result.RightParenthese = (AstToken) node.Children[3].Result; var switchBlockNode = node.Children[4]; result.StartScope = switchBlockNode.Children[0].Result; result.Sections.AddRange(switchBlockNode.Children[1].GetAllListAstNodes<SwitchSection>()); result.EndScope = switchBlockNode.Children[2].Result; return result; }); var selectionStatement = new GrammarDefinition("SelectionStatement", rule: ifElseStatement | switchStatement); var whileLoopStatement = new GrammarDefinition("WhileLoopStatement", rule: ToElement(WHILE) + parenthesizedExpression + embeddedStatement, createNode: node => { var bodyNode = node.Children[2]; CheckForPossibleMistakenEmptyStatement(bodyNode); var conditionExpr = (ParenthesizedExpression) node.Children[1].Result; return new WhileLoopStatement { WhileKeyword = (AstToken) node.Children[0].Result, LeftParenthese = (AstToken) conditionExpr.LeftParenthese.Remove(), Condition = (Expression) conditionExpr.Expression.Remove(), RightParenthese = (AstToken) conditionExpr.RightParenthese.Remove(), Body = (Statement) bodyNode.Result }; }); var doLoopStatement = new GrammarDefinition("DoLoopStatement", rule: ToElement(DO) + embeddedStatement + ToElement(WHILE) + parenthesizedExpression + ToElement(SEMICOLON), createNode: node => { var conditionExpr = (ParenthesizedExpression) node.Children[3].Result; return new DoLoopStatement { DoKeyword = (AstToken) node.Children[0].Result, Body = (Statement) node.Children[1].Result, WhileKeyword = (AstToken) node.Children[2].Result, LeftParenthese = (AstToken) conditionExpr.LeftParenthese.Remove(), Condition = (Expression) conditionExpr.Expression.Remove(), RightParenthese = (AstToken) conditionExpr.RightParenthese.Remove(), Semicolon = (AstToken) node.Children[4].Result }; }); var forLoopInitializer = new GrammarDefinition("ForLoopInitializer", rule: variableDeclaration | null // TODO: statement-expression-list ); var forLoopCondition = new GrammarDefinition("ForLoopCondition", rule: expression | null); var forLoopStatement = new GrammarDefinition("ForLoopStatement", rule: ToElement(FOR) + ToElement(OPEN_PARENS) + forLoopInitializer + ToElement(SEMICOLON) + expressionOptional + ToElement(SEMICOLON) + expressionOptional // TODO: statement-expression-list + ToElement(CLOSE_PARENS) + embeddedStatement, createNode: node => { var result = new ForLoopStatement(); result.ForKeyword = (AstToken) node.Children[0].Result; result.LeftParenthese = (AstToken) node.Children[1].Result; if (node.Children[2].HasChildren) { var declaration = node.Children[2].Children[0].Result as VariableDeclarationStatement; if (declaration != null) { result.Initializers.Add(declaration); } else { result.Initializers.AddRange(node.Children[2].GetAllListAstNodes<Expression>() .Select(x => new ExpressionStatement(x))); } } result.AddChild(AstNodeTitles.Semicolon, node.Children[3].Result); if (node.Children[4].HasChildren) result.Condition = (Expression) node.Children[4].Result; result.AddChild(AstNodeTitles.Semicolon, node.Children[5].Result); if (node.Children[6].HasChildren) { result.Iterators.AddRange(node.Children[6].Children[0].GetAllListAstNodes<Expression>() .Select(x => new ExpressionStatement(x))); } result.RightParenthese = (AstToken) node.Children[7].Result; var bodyNode = node.Children[8]; CheckForPossibleMistakenEmptyStatement(bodyNode); result.Body = (Statement) bodyNode.Result; return result; }); var foreachLoopStatement = new GrammarDefinition("ForEachLoopStatement", rule: ToElement(FOREACH) + ToElement(OPEN_PARENS) + typeReference + identifierInsideBody + ToElement(IN) + expression + ToElement(CLOSE_PARENS) + embeddedStatement, createNode: node => { var bodyNode = node.Children[7]; CheckForPossibleMistakenEmptyStatement(bodyNode); return new ForeachLoopStatement { ForeachKeyword = (AstToken) node.Children[0].Result, LeftParenthese = (AstToken) node.Children[1].Result, Type = (TypeReference) node.Children[2].Result, Identifier = (Identifier) node.Children[3].Result, InKeyword = (AstToken) node.Children[4].Result, Target = (Expression) node.Children[5].Result, RightParenthese = (AstToken) node.Children[6].Result, Body = (Statement) bodyNode.Result }; }); var loopStatement = new GrammarDefinition("LoopStatement", rule: whileLoopStatement | doLoopStatement | forLoopStatement | foreachLoopStatement); var lockStatement = new GrammarDefinition("LockStatement", rule: ToElement(LOCK) + ToElement(OPEN_PARENS) + expression + ToElement(CLOSE_PARENS) + statement, createNode: node => { var bodyNode = node.Children[4]; CheckForPossibleMistakenEmptyStatement(bodyNode); return new LockStatement { LockKeyword = (AstToken) node.Children[0].Result, LeftParenthese = (AstToken) node.Children[1].Result, LockObject = (Expression) node.Children[2].Result, RightParenthese = (AstToken) node.Children[3].Result, Body = (Statement) bodyNode.Result }; }); var resourceAcquisition = new GrammarDefinition("ResourceAcquisition", rule: variableDeclaration | expression); var usingStatement = new GrammarDefinition("UsingStatement", rule: ToElement(USING) + ToElement(OPEN_PARENS) + resourceAcquisition + ToElement(CLOSE_PARENS) + statement, createNode: node => { var bodyNode = node.Children[4]; CheckForPossibleMistakenEmptyStatement(bodyNode); return new UsingStatement() { UsingKeyword = (AstToken) node.Children[0].Result, LeftParenthese = (AstToken) node.Children[1].Result, DisposableObject = node.Children[2].Result, RightParenthese = (AstToken) node.Children[3].Result, Body = (Statement) bodyNode.Result }; }); var breakStatement = new GrammarDefinition("BreakStatement", rule: ToElement(BREAK) + ToElement(SEMICOLON), createNode: node => new BreakStatement() { Keyword = (AstToken) node.Children[0].Result, Semicolon = (AstToken) node.Children[1].Result }); var continueStatement = new GrammarDefinition("ContinueStatement", rule: ToElement(CONTINUE) + ToElement(SEMICOLON), createNode: node => new BreakStatement() { Keyword = (AstToken) node.Children[0].Result, Semicolon = (AstToken) node.Children[1].Result }); var returnStatement = new GrammarDefinition("ReturnStatement", rule: ToElement(RETURN) + expressionOptional + ToElement(SEMICOLON), createNode: node => { var result = new ReturnStatement(); result.ReturnKeyword = (AstToken) node.Children[0].Result; if (node.Children[1].HasChildren) result.Value = (Expression) node.Children[1].Result; result.AddChild(AstNodeTitles.Semicolon, node.Children[2].Result); return result; }); var throwStatement = new GrammarDefinition("ThrowStatement", rule: ToElement(THROW) + expressionOptional + ToElement(SEMICOLON), createNode: node => { var result = new ThrowStatement(); result.ThrowKeyword = (AstToken) node.Children[0].Result; if (node.Children[1].HasChildren) result.Expression = (Expression) node.Children[1].Result; result.AddChild(AstNodeTitles.Semicolon, node.Children[2].Result); return result; }); var gotoStatement = new GrammarDefinition("GotoStatement", rule: ToElement(GOTO) + identifierInsideBody + ToElement(SEMICOLON), // TODO: goto case and goto default statements. createNode: node => { var result = new GotoStatement(); result.GotoKeyword = (AstToken) node.Children[0].Result; result.LabelIdentifier = (Identifier) node.Children[1].Result; result.AddChild(AstNodeTitles.Semicolon, node.Children[2].Result); return result; }); var jumpStatement = new GrammarDefinition("JumpStatement", rule: breakStatement | continueStatement | gotoStatement | returnStatement | throwStatement); var yieldStatement = new GrammarDefinition("YieldStatement", rule: ToElement(YIELD) + ToElement(RETURN) + expression + ToElement(SEMICOLON), createNode: node => new YieldStatement() { YieldKeyword = (AstToken) node.Children[0].Result, ReturnKeyword = (AstToken) node.Children[1].Result, Value = (Expression) node.Children[2].Result }); var yieldBreakStatement = new GrammarDefinition("YieldBreakStatement", rule: ToElement(YIELD) + ToElement(BREAK) + ToElement(SEMICOLON), createNode: node => new YieldBreakStatement() { Keyword = (AstToken) node.Children[0].Result, BreakKeyword = (AstToken) node.Children[1].Result }); var specificCatchClause = new GrammarDefinition("SpecificCatchClause", rule: ToElement(CATCH) + ToElement(OPEN_PARENS) + namespaceOrTypeExpression + identifierInsideBodyOptional + ToElement(CLOSE_PARENS) + blockStatement, createNode: node => { var result = new CatchClause(); result.CatchKeyword = (AstToken) node.Children[0].Result; result.LeftParenthese = (AstToken) node.Children[1].Result; result.ExceptionType = (TypeReference) node.Children[2].Result; if (node.Children[3].HasChildren) result.ExceptionIdentifier = (Identifier) node.Children[3].Result; result.RightParenthese = (AstToken) node.Children[4].Result; result.Body = (BlockStatement) node.Children[5].Result; return result; }); var generalCatchClause = new GrammarDefinition("GeneralCatchClause", rule: ToElement(CATCH) + blockStatement, createNode: node => new CatchClause { CatchKeyword = (AstToken) node.Children[0].Result, Body = (BlockStatement) node.Children[1].Result }); var catchClause = new GrammarDefinition("CatchClause", rule: specificCatchClause | generalCatchClause); var catchClauses = new GrammarDefinition("CatchClauses"); catchClauses.Rule = catchClause | catchClauses + catchClause; var finallyClause = new GrammarDefinition("FinallyClause", rule: ToElement(FINALLY) + blockStatement); var tryCatchStatement = new GrammarDefinition("TryCatchStatement", rule: ToElement(TRY) + blockStatement + catchClauses | ToElement(TRY) + blockStatement + finallyClause | ToElement(TRY) + blockStatement + catchClauses + finallyClause, createNode: node => { var result = new TryCatchStatement(); result.TryKeyword = (AstToken) node.Children[0].Result; result.TryBlock = (BlockStatement) node.Children[1].Result; ParserNode finallyClauseNode = null; if (node.Children[2].GrammarElement == finallyClause) { finallyClauseNode = node.Children[2]; } else { result.CatchClauses.AddRange(node.Children[2].GetAllListAstNodes<CatchClause>()); } if (node.Children.Count == 4) finallyClauseNode = node.Children[3]; if (finallyClauseNode != null) { result.FinallyKeyword = (AstToken) finallyClauseNode.Children[0].Result; result.FinallyBlock = (BlockStatement) finallyClauseNode.Children[1].Result; } return result; }); var unsafeStatement = new GrammarDefinition("UnsafeStatement", rule: ToElement(UNSAFE) + blockStatement, createNode: node => new UnsafeStatement() { Keyword = (AstToken) node.Children[0].Result, Body = (BlockStatement) node.Children[1].Result }); var fixedStatement = new GrammarDefinition("FixedStatement", rule: ToElement(FIXED) + ToElement(OPEN_PARENS) + variableDeclaration + ToElement(CLOSE_PARENS) + embeddedStatement, createNode: node => { var result = new FixedStatement(); result.Keyword = (AstToken) node.Children[0].Result; result.LeftParenthese = (AstToken) node.Children[1].Result; result.VariableDeclaration = (VariableDeclarationStatement) node.Children[2].Result; result.RightParenthese = (AstToken) node.Children[3].Result; var bodyNode = node.Children[4]; result.Body = (Statement) bodyNode.Result; CheckForPossibleMistakenEmptyStatement(bodyNode); return result; }); embeddedStatement.Rule = emptyStatement | expressionStatement | blockStatement | selectionStatement | loopStatement | jumpStatement | lockStatement | usingStatement | yieldStatement | yieldBreakStatement | tryCatchStatement | unsafeStatement | fixedStatement ; statement.Rule = variableDeclarationStatement | labelStatement | embeddedStatement; ; #endregion #region Members var customAttribute = new GrammarDefinition("CustomAttribute", rule: namespaceOrTypeExpression | namespaceOrTypeExpression + ToElement(OPEN_PARENS) + argumentListOptional + ToElement(CLOSE_PARENS), createNode: node => { var result = new CustomAttribute(); result.Type = ((IConvertibleToType) node.Children[0].Result).ToTypeReference(); if (node.Children.Count > 1) { result.LeftParenthese = (AstToken) node.Children[1].Result; if (node.Children[2].HasChildren) { foreach (var child in node.Children[2].Children[0].GetAllListAstNodes()) { if (child is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, child); else result.Arguments.Add((Expression) child); } } result.RightParenthese = (AstToken) node.Children[3].Result; } return result; }); var customAttributeList = new GrammarDefinition("CustomAttributeList"); customAttributeList.Rule = customAttribute | customAttributeList + ToElement(COMMA) + customAttribute; var customAttributePrefix = new GrammarDefinition("CustomAttributePrefix", rule: ToElement(ASSEMBLY) | ToElement(MODULE)); var customAttributePrefixOptional = new GrammarDefinition("CustomAttributePrefixOptional", rule: null | customAttributePrefix + ToElement(COLON)); var customAttributeSection = new GrammarDefinition("CustomAttributeSection", rule: ToElement(OPEN_BRACKET_EXPR) // HACK: use expression brackets instead to avoid conflicts. + customAttributePrefixOptional + customAttributeList + ToElement(CLOSE_BRACKET), createNode: node => { var result = new CustomAttributeSection(); result.LeftBracket = (AstToken) node.Children[0].Result; if (node.Children[1].Result != null) { result.VariantKeyword = (AstToken) node.Children[1].Result; result.Variant = CSharpLanguage.SectionVariantFromString(result.VariantKeyword.Value); } foreach (var child in node.Children[2].GetAllListAstNodes()) { if (child is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, child); else result.Attributes.Add((CustomAttribute) child); } result.RightBracket = (AstToken) node.Children[3].Result; return result; }); var customAttributeSectionList = new GrammarDefinition("CustomAttributeSectionList"); customAttributeSectionList.Rule = customAttributeSection | customAttributeSectionList + customAttributeSection; var customAttributeSectionListOptional = new GrammarDefinition("CustomAttributeSectionListOptional", rule: null | customAttributeSectionList); var modifier = new GrammarDefinition("Modifier", rule: ToElement(PRIVATE) | ToElement(PROTECTED) | ToElement(INTERNAL) | ToElement(PUBLIC) | ToElement(STATIC) | ToElement(ABSTRACT) | ToElement(OVERRIDE) | ToElement(PARTIAL) | ToElement(CONST) | ToElement(READONLY) | ToElement(VIRTUAL) | ToElement(SEALED) | ToElement(UNSAFE) | ToElement(FIXED) | ToElement(ASYNC) | ToElement(EXTERN), createNode: node => new ModifierElement(((AstToken) node.Children[0].Result).Value, node.Children[0].Range) { Modifier = CSharpLanguage.ModifierFromString(((AstToken) node.Children[0].Result).Value) }); var modifierList = new GrammarDefinition("ModifierList"); modifierList.Rule = modifier | modifierList + modifier; var modifierListOptional = new GrammarDefinition("ModifierListOptional", rule: null | modifierList); var fieldDeclaration = new GrammarDefinition("FieldDeclaration", rule: customAttributeSectionListOptional + modifierListOptional + typeReference + variableDeclaratorList + ToElement(SEMICOLON), createNode: node => { var result = new FieldDeclaration(); if (node.Children[0].HasChildren) result.CustomAttributeSections.AddRange(node.Children[0].Children[0].GetAllListAstNodes<CustomAttributeSection>()); if (node.Children[1].HasChildren) result.ModifierElements.AddRange(node.Children[1].Children[0].GetAllListAstNodes<ModifierElement>()); result.FieldType = (TypeReference) node.Children[2].Result; foreach (var subNode in node.Children[3].GetAllListAstNodes()) { if (subNode is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, subNode); else result.Declarators.Add((VariableDeclarator) subNode); } result.AddChild(AstNodeTitles.Semicolon, node.Children[4].Result); return result; }); var parameterModifier = new GrammarDefinition("ParameterModifier", rule: null | ToElement(THIS) | ToElement(REF) | ToElement(OUT) | ToElement(PARAMS)); var parameterDeclaration = new GrammarDefinition("ParameterDeclaration", rule: customAttributeSectionListOptional + parameterModifier + typeReference + variableDeclarator, createNode: node => { var result = new ParameterDeclaration(); if (node.Children[0].HasChildren) { result.CustomAttributeSections.AddRange( node.Children[0].Children[0].GetAllListAstNodes<CustomAttributeSection>()); } result.ParameterModifierToken = (AstToken) (node.Children[1].HasChildren ? node.Children[1].Children[0].Result : null); result.ParameterType = (TypeReference) node.Children[2].Result; result.Declarator = (VariableDeclarator) node.Children[3].Result; return result; }); var parameterDeclarationList = new GrammarDefinition("ParameterDeclarationList"); parameterDeclarationList.Rule = parameterDeclaration | parameterDeclarationList + ToElement(COMMA) + parameterDeclaration; var optionalParameterDeclarationList = new GrammarDefinition("OptionalParameterDeclarationList", rule: null | parameterDeclarationList); var constructorInitializerVariant = new GrammarDefinition("ConstructorInitializerVariant", rule: ToElement(THIS) | ToElement(BASE)); var constructorInitializer = new GrammarDefinition("ConstructorInitializer", rule: constructorInitializerVariant + ToElement(OPEN_PARENS) + argumentListOptional + ToElement(CLOSE_PARENS), createNode: node => { var result = new Members.ConstructorInitializer(); result.VariantToken = (AstToken) node.Children[0].Children[0].Result; result.LeftParenthese = (AstToken) node.Children[1].Result; if (node.Children[2].HasChildren) { foreach (var subNode in node.Children[2].Children[0].GetAllListAstNodes()) { if (subNode is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, subNode); else result.Arguments.Add((Expression) subNode); } } result.RightParenthese = (AstToken) node.Children[3].Result; return result; }); var optionalConstructorInitializerList = new GrammarDefinition("OptionalConstructorInitializer", rule: null | ToElement(COLON) + constructorInitializer); var constructorDeclaration = new GrammarDefinition("ConstructorDeclaration", rule: customAttributeSectionListOptional + modifierListOptional + ToElement(IDENTIFIER) + ToElement(OPEN_PARENS) + optionalParameterDeclarationList + ToElement(CLOSE_PARENS) + optionalConstructorInitializerList + blockStatement, createNode: node => { var result = new Members.ConstructorDeclaration(); if (node.Children[0].HasChildren) result.CustomAttributeSections.AddRange(node.Children[0].Children[0].GetAllListAstNodes<CustomAttributeSection>()); if (node.Children[1].HasChildren) result.ModifierElements.AddRange(node.Children[1].Children[0].GetAllListAstNodes<ModifierElement>()); result.Identifier = ToIdentifier(node.Children[2].Result); result.LeftParenthese = (AstToken) node.Children[3].Result; if (node.Children[4].HasChildren) { foreach (var subNode in node.Children[4].Children[0].GetAllListAstNodes()) { if (subNode is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, subNode); else result.Parameters.Add((ParameterDeclaration) subNode); } } result.RightParenthese = (AstToken) node.Children[5].Result; if (node.Children[6].HasChildren) { result.Colon = (AstToken) node.Children[6].Children[0].Result; result.Initializer = (Members.ConstructorInitializer) node.Children[6].Children[1].Result; } result.Body = (BlockStatement) node.Children[7].Result; return result; }); var conversionOperator = new GrammarDefinition("ConversionOperator", rule: ToElement(IMPLICIT) | ToElement(EXPLICIT)); var conversionOperatorDeclaration = new GrammarDefinition("ConversionOperatorDeclaration", rule: customAttributeSectionListOptional + modifierListOptional + conversionOperator + ToElement(OPERATOR) + ToElement(IDENTIFIER) + ToElement(OPEN_PARENS) + optionalParameterDeclarationList + ToElement(CLOSE_PARENS) + blockStatement, createNode: node => { var result = new OperatorDeclaration(); if (node.Children[0].HasChildren) result.CustomAttributeSections.AddRange(node.Children[0].Children[0].GetAllListAstNodes<CustomAttributeSection>()); if (node.Children[1].HasChildren) result.ModifierElements.AddRange(node.Children[1].Children[0].GetAllListAstNodes<ModifierElement>()); result.Identifier = ToIdentifier(node.Children[2].Result); result.OperatorType = CSharpLanguage.OperatorDeclarationTypeFromString(result.Identifier.Name); result.OperatorKeyword = (AstToken) node.Children[3].Result; result.ReturnType = ToTypeReference(ToIdentifier(node.Children[4].Result)); result.LeftParenthese = (AstToken)node.Children[5].Result; if (node.Children[6].HasChildren) { foreach (var subNode in node.Children[6].Children[0].GetAllListAstNodes()) { if (subNode is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, subNode); else result.Parameters.Add((ParameterDeclaration)subNode); } } result.RightParenthese = (AstToken) node.Children[7].Result; result.Body = (BlockStatement) node.Children[8].Result; return result; }); var overloadableOperator = new GrammarDefinition("OverloadableOperator", rule: ToElement(PLUS) | ToElement(MINUS) | ToElement(STAR) | ToElement(DIV) | ToElement(PERCENT) | ToElement(BITWISE_AND) | ToElement(BITWISE_OR) | ToElement(CARRET) | ToElement(OP_EQUALS) | ToElement(OP_NOTEQUALS) | ToElement(OP_GT) | ToElement(OP_GE) | ToElement(OP_LT) | ToElement(OP_LE) | ToElement(OP_SHIFT_LEFT) | ToElement(OP_SHIFT_RIGHT) | ToElement(TRUE) | ToElement(FALSE) | ToElement(BANG) | ToElement(TILDE) | ToElement(OP_INC) | ToElement(OP_DEC)); var arithmeticOperatorDeclaration = new GrammarDefinition("ArithmeticOperatorDeclaration", rule: customAttributeSectionListOptional + modifierListOptional + typeReference + ToElement(OPERATOR) + overloadableOperator + ToElement(OPEN_PARENS) + optionalParameterDeclarationList + ToElement(CLOSE_PARENS) + blockStatement, createNode: node => { var result = new OperatorDeclaration(); if (node.Children[0].HasChildren) result.CustomAttributeSections.AddRange(node.Children[0].Children[0].GetAllListAstNodes<CustomAttributeSection>()); if (node.Children[1].HasChildren) result.ModifierElements.AddRange(node.Children[1].Children[0].GetAllListAstNodes<ModifierElement>()); result.ReturnType = (TypeReference) node.Children[2].Result; result.OperatorKeyword = (AstToken)node.Children[3].Result; result.Identifier = ToIdentifier(node.Children[4].Result); result.LeftParenthese = (AstToken)node.Children[5].Result; if (node.Children[6].HasChildren) { foreach (var subNode in node.Children[6].Children[0].GetAllListAstNodes()) { if (subNode is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, subNode); else result.Parameters.Add((ParameterDeclaration)subNode); } } result.RightParenthese = (AstToken)node.Children[7].Result; result.OperatorType = CSharpLanguage.OperatorDeclarationTypeFromString(result.Identifier.Name); if (result.Parameters.Count == 2) { if (result.OperatorType == OperatorDeclarationType.Positive) result.OperatorType = OperatorDeclarationType.Add; else if (result.OperatorType == OperatorDeclarationType.Negative) result.OperatorType = OperatorDeclarationType.Subtract; } result.Body = (BlockStatement)node.Children[8].Result; return result; }); var operatorDeclaration = new GrammarDefinition("OperatorDeclaration", rule: conversionOperatorDeclaration | arithmeticOperatorDeclaration); var methodDeclarationBody = new GrammarDefinition("MethodDeclarationBody", rule: ToElement(SEMICOLON) | blockStatement); var methodDeclaration = new GrammarDefinition("MethodDeclaration", rule: customAttributeSectionListOptional + modifierListOptional + typeReference + ToElement(IDENTIFIER) + ToElement(OPEN_PARENS) + optionalParameterDeclarationList + ToElement(CLOSE_PARENS) + methodDeclarationBody, createNode: node => { var result = new MethodDeclaration(); if (node.Children[0].HasChildren) result.CustomAttributeSections.AddRange(node.Children[0].Children[0].GetAllListAstNodes<CustomAttributeSection>()); if (node.Children[1].HasChildren) result.ModifierElements.AddRange(node.Children[1].Children[0].GetAllListAstNodes<ModifierElement>()); result.ReturnType = (TypeReference) node.Children[2].Result; result.Identifier = ToIdentifier(node.Children[3].Result); result.LeftParenthese = (AstToken) node.Children[4].Result; if (node.Children[5].HasChildren) { foreach (var subNode in node.Children[5].Children[0].GetAllListAstNodes()) { if (subNode is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, subNode); else result.Parameters.Add((ParameterDeclaration) subNode); } } result.RightParenthese = (AstToken) node.Children[6].Result; var body = node.Children[7].Result; if (body is AstToken) result.AddChild(AstNodeTitles.Semicolon, (AstToken) body); else result.Body = (BlockStatement) body; return result; }); var eventDeclaration = new GrammarDefinition("EventDeclaration", rule: customAttributeSectionListOptional + modifierListOptional + ToElement(EVENT) + typeReference + variableDeclaratorList + ToElement(SEMICOLON), createNode: node => { var result = new EventDeclaration(); if (node.Children[0].HasChildren) result.CustomAttributeSections.AddRange(node.Children[0].Children[0].GetAllListAstNodes<CustomAttributeSection>()); if (node.Children[1].HasChildren) result.ModifierElements.AddRange(node.Children[1].Children[0].GetAllListAstNodes<ModifierElement>()); result.EventKeyword = (AstToken) node.Children[2].Result; result.EventType = (TypeReference) node.Children[3].Result; foreach (var subNode in node.Children[4].GetAllListAstNodes()) { if (subNode is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, subNode); else result.Declarators.Add((VariableDeclarator) subNode); } result.AddChild(AstNodeTitles.Semicolon, node.Children[5].Result); return result; }); var accessorKeyword = new GrammarDefinition("AccessorKeyword", rule: ToElement(GET) | ToElement(SET)); var accessorBody = new GrammarDefinition("AccessorBody", rule: ToElement(SEMICOLON) | blockStatement); var accessorDeclaration = new GrammarDefinition("AccessorDeclaration", rule: customAttributeSectionListOptional + modifierListOptional + accessorKeyword + accessorBody, createNode: node => { var result = new AccessorDeclaration(); if (node.Children[0].HasChildren) result.CustomAttributeSections.AddRange(node.Children[0].Children[0].GetAllListAstNodes<CustomAttributeSection>()); if (node.Children[1].HasChildren) result.ModifierElements.AddRange(node.Children[1].Children[0].GetAllListAstNodes<ModifierElement>()); result.AccessorKeyword = (AstToken) node.Children[2].Children[0].Result; var bodyNode = node.Children[3].Children[0].Result; if (bodyNode is AstToken) result.AddChild(AstNodeTitles.Semicolon, bodyNode); else result.Body = (BlockStatement) bodyNode; return result; }); var accessorDeclarationList = new GrammarDefinition("AccessorDeclarationList"); accessorDeclarationList.Rule = accessorDeclaration | accessorDeclaration + accessorDeclaration; var propertyDeclaration = new GrammarDefinition("PropertyDeclaration", rule: customAttributeSectionListOptional + modifierListOptional + typeReference + ToElement(IDENTIFIER) + ToElement(OPEN_BRACE) + accessorDeclarationList + ToElement(CLOSE_BRACE), createNode: node => { var result = new PropertyDeclaration(); if (node.Children[0].HasChildren) result.CustomAttributeSections.AddRange(node.Children[0].Children[0].GetAllListAstNodes<CustomAttributeSection>()); if (node.Children[1].HasChildren) result.ModifierElements.AddRange(node.Children[1].Children[0].GetAllListAstNodes<ModifierElement>()); result.PropertyType = (TypeReference) node.Children[2].Result; result.Identifier = ToIdentifier(node.Children[3].Result); result.StartScope = node.Children[4].Result; foreach (var accessor in node.Children[5].Children) { var declaration = (AccessorDeclaration) accessor.Result; // TODO: detect duplicate accessor declarations. switch (declaration.AccessorKeyword.Value) { case "get": result.Getter = declaration; break; case "set": result.Setter = declaration; break; } } result.EndScope = node.Children[6].Result; return result; }); var memberDeclaration = new GrammarDefinition("MemberDeclaration"); var memberDeclarationList = new GrammarDefinition("MemberDeclarationList"); memberDeclarationList.Rule = memberDeclaration | memberDeclarationList + memberDeclaration; var memberDeclarationListOptional = new GrammarDefinition("MemberDeclarationListOptional"); memberDeclarationListOptional.Rule = null | memberDeclarationList; var baseTypeList = new GrammarDefinition("BaseTypeList"); baseTypeList.Rule = typeReference | baseTypeList + ToElement(COMMA) + typeReference; var optionalBaseTypeList = new GrammarDefinition("OptionalBaseTypeList"); optionalBaseTypeList.Rule = null | ToElement(COLON) + baseTypeList; var typeVariantKeyword = new GrammarDefinition("TypeVariantKeyword", rule: ToElement(CLASS) | ToElement(STRUCT) | ToElement(INTERFACE) | ToElement(ENUM)); var typeDeclaration = new GrammarDefinition("TypeDeclaration", rule: customAttributeSectionListOptional + modifierListOptional + typeVariantKeyword + ToElement(IDENTIFIER) + optionalBaseTypeList + ToElement(OPEN_BRACE) + memberDeclarationListOptional + ToElement(CLOSE_BRACE), createNode: node => { var result = new TypeDeclaration(); if (node.Children[0].HasChildren) result.CustomAttributeSections.AddRange(node.Children[0].Children[0].GetAllListAstNodes<CustomAttributeSection>()); if (node.Children[1].HasChildren) result.ModifierElements.AddRange(node.Children[1].Children[0].GetAllListAstNodes<ModifierElement>()); var variantToken = (AstToken) node.Children[2].Children[0].Result; result.TypeVariant = CSharpLanguage.TypeVariantFromString(variantToken.Value); result.TypeVariantToken = variantToken; result.Identifier = ToIdentifier(node.Children[3].Result); if (node.Children[4].HasChildren) { result.AddChild(AstNodeTitles.Colon, node.Children[4].Children[0].Result); foreach (var child in node.Children[4].Children[1].GetAllListAstNodes()) { if (child is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, child); else result.BaseTypes.Add((TypeReference) child); } } result.StartScope = node.Children[5].Result; if (node.Children[6].HasChildren) { result.Members.AddRange(node.Children[6].Children[0].GetAllListAstNodes<MemberDeclaration>()); } result.EndScope = node.Children[7].Result; return result; }); memberDeclaration.Rule = methodDeclaration | constructorDeclaration | operatorDeclaration | propertyDeclaration | eventDeclaration | fieldDeclaration | typeDeclaration ; var typeOrNamespaceDeclarationList = new GrammarDefinition("TypeOrNamespaceDeclarationList"); var typeOrNamespaceDeclarationListOptional = new GrammarDefinition("TypeOrNamespaceDeclarationListOptional", rule: null | typeOrNamespaceDeclarationList); var namespaceDeclaration = new GrammarDefinition("NamespaceDeclaration", rule: ToElement(NAMESPACE) + typeNameExpression + ToElement(OPEN_BRACE) + usingDirectiveListOptional + typeOrNamespaceDeclarationListOptional + ToElement(CLOSE_BRACE), createNode: node => { var result = new NamespaceDeclaration(); result.Keyword = (AstToken) node.Children[0].Result; result.Identifier = ((IConvertibleToIdentifier) node.Children[1].Result).ToIdentifier(); result.StartScope = node.Children[2].Result; if (node.Children[3].HasChildren) { result.UsingDirectives.AddRange(node.Children[3].Children[0].GetAllListAstNodes<UsingDirective>()); } if (node.Children[4].HasChildren) { foreach (var subNode in node.Children[4].Children[0].GetAllListAstNodes()) { var type = subNode as TypeDeclaration; if (type != null) result.Types.Add(type); else result.Namespaces.Add((NamespaceDeclaration) subNode); } } result.EndScope = node.Children[5].Result; return result; }); var typeOrNamespaceDeclaration = new GrammarDefinition("TypeOrNamespaceDeclaration", rule: namespaceDeclaration | typeDeclaration); typeOrNamespaceDeclarationList.Rule = typeOrNamespaceDeclaration | typeOrNamespaceDeclarationList + typeOrNamespaceDeclaration; #endregion #region Initialize definitions var variableInitializerList = new GrammarDefinition("VariableInitializerList"); variableInitializerList.Rule = variableInitializer | variableInitializerList + ToElement(COMMA) + variableInitializer; var variableInitializerListOptional = new GrammarDefinition("VariableInitializerListOptional", rule: null | variableInitializerList); arrayInitializer.Rule = ToElement(OPEN_BRACE) + variableInitializerListOptional + ToElement(CLOSE_BRACE) | ToElement(OPEN_BRACE) + variableInitializerList + ToElement(COMMA) + ToElement(CLOSE_BRACE); arrayInitializer.ComputeResult = node => { var result = new ArrayInitializer(); result.OpeningBrace = node.Children[0].Result; ParserNode initializersNode = null; if (node.Children.Count == 4) { initializersNode = node.Children[1]; } else { if (node.Children[1].HasChildren) initializersNode = node.Children[1].Children[0]; } if (initializersNode != null) { foreach (var element in initializersNode.GetAllListAstNodes()) { if (element is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, element); else result.Elements.Add((Expression) element); } } if (node.Children.Count == 4) result.AddChild(AstNodeTitles.ElementSeparator, node.Children[2].Result); result.ClosingBrace = node.Children[node.Children.Count - 1].Result; return result; }; variableInitializer.Rule = expression | arrayInitializer ; var variableType = new GrammarDefinition("VariableType"); variableType.Rule = typeNameExpression | variableType + rankSpecifier | variableType + ToElement(STAR); variableType.ComputeResult = node => { var type = ToTypeReference((IConvertibleToType) node.Children[0].Result); if (node.Children.Count > 1) { var specifier = node.Children[1].Result as ArrayTypeRankSpecifier; if (specifier != null) { type = new ArrayTypeReference(type, specifier); } else { type = new PointerTypeReference(type) { PointerToken = (AstToken) node.Children[1].Result }; } } return type; }; // Types are recognized as expressions to prevent a conflict in the grammar. // TODO: also support array and pointer types. variableDeclaration.Rule = variableType + variableDeclaratorList; variableDeclaration.ComputeResult = node => { var result = new VariableDeclarationStatement(); result.VariableType = ToTypeReference((IConvertibleToType)node.Children[0].Result); foreach (var subNode in node.Children[1].GetAllListAstNodes()) { if (subNode is AstToken) result.AddChild(AstNodeTitles.ElementSeparator, subNode); else result.Declarators.Add((VariableDeclarator) subNode); } return result; }; statementList.Rule = statement | statementList + statement; #endregion #region Root compilation unit var usingNamespaceDirective = new GrammarDefinition("UsingNamespaceDirective", rule: ToElement(USING) + namespaceOrTypeExpression + ToElement(SEMICOLON), createNode: node => { var result = new UsingNamespaceDirective(); result.UsingKeyword = (AstToken) node.Children[0].Result; result.NamespaceIdentifier = ((IConvertibleToIdentifier) node.Children[1].Result).ToIdentifier(); result.AddChild(AstNodeTitles.Semicolon, node.Children[2].Result); return result; }); var usingAliasDirective = new GrammarDefinition("UsingAliasDirective", rule: ToElement(USING) + ToElement(IDENTIFIER) + ToElement(EQUALS) + typeReference + ToElement(SEMICOLON), createNode: node => { var result = new UsingAliasDirective { UsingKeyword = (AstToken) node.Children[0].Result, AliasIdentifier = ToIdentifier(node.Children[1].Result), OperatorToken = (AstToken) node.Children[2].Result, TypeImport = (TypeReference) node.Children[3].Result }; result.AddChild(AstNodeTitles.Semicolon, node.Children[4].Result); return result; }); var usingDirective = new GrammarDefinition("UsingNamespaceDirective", rule: usingNamespaceDirective | usingAliasDirective); var usingDirectiveList = new GrammarDefinition("UsingDirectiveList"); usingDirectiveList.Rule = usingDirective | usingDirectiveList + usingDirective; usingDirectiveListOptional.Rule = null | usingDirectiveList; var compilationUnit = new GrammarDefinition("CompilationUnit", rule: usingDirectiveListOptional + typeOrNamespaceDeclarationListOptional, createNode: node => { var result = new CompilationUnit(); if (node.Children[0].HasChildren) { result.UsingDirectives.AddRange(node.Children[0].Children[0].GetAllListAstNodes<UsingDirective>()); } if (node.Children[1].HasChildren) { foreach (var subNode in node.Children[1].Children[0].GetAllListAstNodes()) { var typeDecl = subNode as TypeDeclaration; if (typeDecl == null) result.Namespaces.Add((NamespaceDeclaration) subNode); else result.Types.Add(typeDecl); } } return result; }); #endregion RootDefinitions.Add(DefaultRoot = compilationUnit); RootDefinitions.Add(MemberDeclarationRule = memberDeclaration); RootDefinitions.Add(StatementRule = statement); }
public void Visit(ArrayInitializer x) { }
void case_525() #line 3796 "cs-parser.jay" { var ai = new ArrayInitializer (0, GetLocation (yyVals[-1+yyTop])); ai.VariableDeclaration = current_variable; lbag.AddLocation (ai, GetLocation (yyVals[0+yyTop])); yyVal = ai; }
public override CSObject Evaluate(CSState state, CSObject curObj) { if (ChildCount != 6) { CSLog.E(this, "new operator has invalid # of children..."); return(null); } if (NewType == null || NewType._type == null) { CSLog.E(this, "new operator does not have a proper type..."); return(null); } object newInstance = null; System.Type type = NewType._type; if (IsArray) { System.Type innerType = type.GetElementType(); int count = ArrayIndex.EvaluateIndex(null, null); if (ArrayInitializer != null) { object[] elements = ArrayInitializer.EvaluateElements(state, curObj, innerType); int len = elements.Length; int allocCount = (len > count? len : count); newInstance = System.Activator.CreateInstance(type, allocCount); System.Array array = newInstance as System.Array; for (int i = 0; i < len; ++i) { array.SetValue(elements[i], i); } } else { if (count < 0) { throw new System.ArgumentException("array needs an initializer or count"); } else { newInstance = System.Activator.CreateInstance(type, count); } } } else { object[] parameters = null; if (NewParameters != null && NewParameters.ChildCount > 0) { CSNode[] pchildren = NewParameters._children; int pCount = pchildren.Length; parameters = new object[pCount]; for (int i = 0; i < pCount; ++i) { parameters[i] = pchildren[i].Evaluate(state, curObj).Value; } } if (parameters == null) { newInstance = System.Activator.CreateInstance(type); } else { newInstance = System.Activator.CreateInstance(type, parameters); } CSDictionaryInitializerNode dictInitializer = DictionaryInitializer; if (dictInitializer != null) { IDictionary dict = newInstance as IDictionary; if (dict == null) { throw new System.InvalidOperationException("you cannot use a dictionary initializer on non dictionary object"); } System.Type keyType = typeof(object); System.Type valueType = typeof(object); System.Type[] genericTypes = NewType._type.GetGenericArguments(); if (genericTypes != null) { if (genericTypes.Length > 2) { keyType = genericTypes[0]; valueType = genericTypes[1]; } } int len = dictInitializer.Count; for (int i = 0; i < len; ++i) { KeyValuePair <object, object> element = dictInitializer.Evaluate(state, curObj, i, keyType, valueType); dict.Add(element.Key, element.Value); } } CSClassInitializerNode classInitializer = ClassInitializer; if (classInitializer != null) { int len = classInitializer.Count; for (int i = 0; i < len; ++i) { KeyValuePair <string, object> element = classInitializer.Evaluate(state, curObj, i, newInstance); ReflectionUtil.Set(newInstance, element.Key, element.Value); } } CSArrayInitializerNode arrayInitializer = ArrayInitializer; IList list = newInstance as IList; if (ArrayInitializer != null) { if (list == null) { CSLog.E("array initializer cannot used for : " + type.ToString()); } else { System.Type elementType = ReflectionUtil.GetIListElementType(NewType._type); if (elementType == null) { CSLog.E("array initializer cannot used for : " + type.ToString()); } object[] elements = ArrayInitializer.EvaluateElements(state, curObj, elementType); int len = elements.Length; for (int i = 0; i < len; ++i) { list.Add(elements[i]); } } } } CSObject obj = CSObject.TempVariableObject(this, type, newInstance); return(obj); }
public AbstractType Visit(ArrayInitializer x) { return(Visit((AssocArrayExpression)x)); }
void case_517() { var ai = new ArrayInitializer (0, GetLocation (yyVals[-1+yyTop])); ai.VariableDeclaration = current_variable; lbag.AddLocation (ai, GetLocation (yyVals[0+yyTop])); yyVal = ai; }
EXPR ParseExpr(bool isArithExpr) { EXPR e = null; if (tokens[i].type == TokenType.byte_lit) { e = new bytelit() { value = (byte)tokens[i].val }; i++; } else if (tokens[i].type == TokenType.int_lit) { e = new intlit() { value = (int)tokens[i].val }; i++; } else if (tokens[i].type == TokenType.string_lit) { e = new stringlit() { value = tokens[i].val as string }; i++; } else if (tokens[i].type == TokenType.symbol && (char)tokens[i].val == '<') { i++; List<string> fargs = new List<string>(); while (i < tokens.Length && !(tokens[i].type == TokenType.symbol && (char)tokens[i].val == '>')) { if (tokens[i].type == TokenType.word) { fargs.Add(tokens[i].val as string); } i++; } i++; bool lnfc = infnc; infnc = true; STMT[] body = ParseBody(); infnc = lnfc; e = new LambdaExpr() { args = fargs.ToArray(), body = body }; } else if (tokens[i].type == TokenType.word && tokens[i].val as string == "array" && tokens[i + 1].type == TokenType.symbol && (char)tokens[i + 1].val == '[') { i += 2; EXPR count = ParseExpr(isArithExpr); i++; e = new ArrayInitializer() { count = count }; } else if (tokens[i].type == TokenType.word && tokens[i + 1].type == TokenType.symbol && (char)tokens[i + 1].val == '[') { string varname = tokens[i].val as string; i += 2; EXPR index = ParseExpr(isArithExpr); i++; if (tokens[i].type == TokenType.symbol && (char)tokens[i].val == '=') { i++; EXPR val = ParseExpr(isArithExpr); e = new ArrayStrElem() { varname = varname, index = index, value = val }; } else { e = new ArrayGetElem() { varname = varname, index = index }; } } else if (i + 1 < tokens.Length && tokens[i + 1].type == TokenType.symbol && (char)tokens[i + 1].val == '(') { string fname = tokens[i].val as string; i += 2; List<EXPR> args = new List<EXPR>(); while (!(tokens[i].type == TokenType.symbol && (char)tokens[i].val == ')')) { EXPR ex = ParseExpr(isArithExpr); if (ex != null) { args.Add(ex); } else { i++; } } i++; e = new fcall() { fname = fname, args = args.ToArray() }; } else if (tokens[i].type == TokenType.word && tokens[i].val as string == "asm") { i++; string asm = tokens[i].val as string; i++; return new asm() { asmtxt = asm }; } else if (tokens[i].type == TokenType.word) { string vname = tokens[i].val as string; if (vname.StartsWith("@")) { e = new getvarptr() { varname = vname.Substring(1) }; } else { e = new getvar() { varname = vname }; } i++; } if (tokens[i].IsArithOp() && !isArithExpr) { List<EXPR> finalexpr = new List<EXPR>(); Stack<Token> stk = new Stack<Token>(); finalexpr.Add(e); bool lastwasop = false; int parentCount = 0; while (true) { if (tokens[i].type == TokenType.symbol && (char)tokens[i].val == ')' && parentCount > 0) { while (stk.Count > 0 && (char)stk.Peek().val != '(') { finalexpr.Add(stk.Pop().ToArith()); } stk.Pop(); i++; parentCount--; } else if (tokens[i].IsArithOp()) { if (stk.Count > 0 && tokens[i].ArithOpPriority() < stk.Peek().ArithOpPriority()) { if ((char)stk.Peek().val != '(') finalexpr.Add(stk.Pop().ToArith()); else parentCount++; } stk.Push(tokens[i]); lastwasop = true; i++; } else { if (lastwasop) { finalexpr.Add(ParseExpr(true)); lastwasop = false; } else { break; } } } while (stk.Count > 0) { finalexpr.Add(stk.Pop().ToArith()); } e = new arith_expr() { exprs = finalexpr.ToArray() }; } return e; }
protected internal Expression VisitArrayInitializer(ArrayInitializer arrayInitializer) { return(arrayInitializer.Update(arrayInitializer.Initializers)); }
/// <summary> /// IExpressionリスト取得 /// </summary> /// <param name="operation">IOperationインスタンス</param> /// <param name="container">イベントコンテナ</param> /// <returns>IExpressionリスト</returns> public static List <IExpression> GetExpressionList(IOperation operation, EventContainer container) { List <IExpression> result = new List <IExpression>(); AbstractOperation instance = null; switch (operation) { // 式系 case ISimpleAssignmentOperation param: instance = new SimpleAssignment(param, container); break; case IInvocationOperation param: instance = new Invocation(param, container); break; case IBinaryOperation param: instance = new Binary(param, container); break; case IIncrementOrDecrementOperation param: instance = new Increment(param, container); break; case ICompoundAssignmentOperation param: instance = new CompoundAssignment(param, container); break; case IConversionOperation param: result.AddRange(GetExpressionList(param.Operand, container)); break; // 参照系 case IInstanceReferenceOperation param: instance = new InstanceReference(param, container); break; case IFieldReferenceOperation param: instance = new FieldReference(param, container); break; case IPropertyReferenceOperation param: instance = new PropertyReference(param, container); break; case ILocalReferenceOperation param: instance = new LocalReference(param, container); break; case IParameterReferenceOperation param: instance = new ParameterReference(param, container); break; case IArrayElementReferenceOperation param: instance = new ArrayElementReference(param, container); break; case IArgumentOperation param: instance = new Argument(param, container); break; // 生成系 case IObjectCreationOperation param: instance = new ObjectCreation(param, container); break; case IArrayCreationOperation param: instance = new ArrayCreation(param, container); break; case IArrayInitializerOperation param: instance = new ArrayInitializer(param, container); break; case IVariableDeclaratorOperation param: instance = new VariableDeclarator(param, container); break; // 直値 case ILiteralOperation param: instance = new Literal(param, container); break; // Switch Case系 case IDefaultCaseClauseOperation param: instance = new DefalutCase(param, container); break; case IDeclarationPatternOperation param: instance = new DeclarationPattern(param, container); break; //If系 case IIsPatternOperation param: instance = new IsPattern(param, container); break; case IIsTypeOperation param: instance = new IsType(param, container); break; default: Console.Write($" [{operation.Kind} is none] "); break; } // リスト追加 if (instance != null) { result.AddRange(instance.Expressions); } return(result); }
/** the generated parser. Maintains a state and a value stack, currently with fixed maximum size. @param yyLex scanner. @return result of the last reduction, if any. @throws yyException on irrecoverable parse error. */ internal Object yyparse (yyParser.yyInput yyLex) { if (yyMax <= 0) yyMax = 256; // initial size int yyState = 0; // state stack ptr int [] yyStates = new int[yyMax]; // state stack Object yyVal = null; // value stack ptr Object [] yyVals = new Object[yyMax]; // value stack int yyToken = -1; // current input int yyErrorFlag = 0; // #tks to shift /*yyLoop:*/ for (int yyTop = 0;; ++ yyTop) { if (yyTop >= yyStates.Length) { // dynamically increase int[] i = new int[yyStates.Length+yyMax]; yyStates.CopyTo (i, 0); yyStates = i; Object[] o = new Object[yyVals.Length+yyMax]; yyVals.CopyTo (o, 0); yyVals = o; } yyStates[yyTop] = yyState; yyVals[yyTop] = yyVal; if (debug != null) debug.push(yyState, yyVal); /*yyDiscarded:*/ for (;;) { // discarding a token does not change stack int yyN; if ((yyN = yyDefRed[yyState]) == 0) { // else [default] reduce (yyN) if (yyToken < 0) { yyToken = yyLex.advance() ? yyLex.token() : 0; if (debug != null) debug.lex(yyState, yyToken, yyname(yyToken), yyLex.value()); } if ((yyN = yySindex[yyState]) != 0 && ((yyN += yyToken) >= 0) && (yyN < yyTable.Length) && (yyCheck[yyN] == yyToken)) { if (debug != null) debug.shift(yyState, yyTable[yyN], yyErrorFlag-1); yyState = yyTable[yyN]; // shift to yyN yyVal = yyLex.value(); yyToken = -1; if (yyErrorFlag > 0) -- yyErrorFlag; goto continue_yyLoop; } if ((yyN = yyRindex[yyState]) != 0 && (yyN += yyToken) >= 0 && yyN < yyTable.Length && yyCheck[yyN] == yyToken) yyN = yyTable[yyN]; // reduce (yyN) else switch (yyErrorFlag) { case 0: yyExpectingState = yyState; // yyerror(String.Format ("syntax error, got token `{0}'", yyname (yyToken)), yyExpecting(yyState)); if (debug != null) debug.error("syntax error"); if (yyToken == 0 /*eof*/ || yyToken == eof_token) throw new yyParser.yyUnexpectedEof (); goto case 1; case 1: case 2: yyErrorFlag = 3; do { if ((yyN = yySindex[yyStates[yyTop]]) != 0 && (yyN += Token.yyErrorCode) >= 0 && yyN < yyTable.Length && yyCheck[yyN] == Token.yyErrorCode) { if (debug != null) debug.shift(yyStates[yyTop], yyTable[yyN], 3); yyState = yyTable[yyN]; yyVal = yyLex.value(); goto continue_yyLoop; } if (debug != null) debug.pop(yyStates[yyTop]); } while (-- yyTop >= 0); if (debug != null) debug.reject(); throw new yyParser.yyException("irrecoverable syntax error"); case 3: if (yyToken == 0) { if (debug != null) debug.reject(); throw new yyParser.yyException("irrecoverable syntax error at end-of-file"); } if (debug != null) debug.discard(yyState, yyToken, yyname(yyToken), yyLex.value()); yyToken = -1; goto continue_yyDiscarded; // leave stack alone } } int yyV = yyTop + 1-yyLen[yyN]; if (debug != null) debug.reduce(yyState, yyStates[yyV-1], yyN, YYRules.getRule (yyN), yyLen[yyN]); yyVal = yyDefault(yyV > yyTop ? null : yyVals[yyV]); switch (yyN) { case 1: #line 391 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Lexer.check_incorrect_doc_comment (); } break; case 2: #line 394 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Lexer.CompleteOnEOF = false; } break; case 6: #line 401 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] != null) { Attributes attrs = (Attributes) yyVals[0+yyTop]; report.Error (1730, attrs.Attrs [0].Location, "Assembly and module attributes must precede all other elements except using clauses and extern alias declarations"); } } break; case 7: #line 409 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { module.AddAttributes ((Attributes) yyVals[0+yyTop], current_namespace); } break; case 8: #line 413 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyToken == Token.EXTERN_ALIAS) report.Error (439, lexer.Location, "An extern alias declaration must precede all other elements"); else Error_SyntaxError (yyToken); } break; case 13: #line 433 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; string s = lt.Value; if (s != "alias"){ syntax_error (lt.Location, "`alias' expected"); } else if (lang_version == LanguageVersion.ISO_1) { FeatureIsNotAvailable (lt.Location, "external alias"); } else { lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; current_namespace.AddUsingExternalAlias (lt.Value, lt.Location, report); } } break; case 14: #line 446 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { syntax_error (GetLocation (yyVals[-1+yyTop]), "`alias' expected"); /* TODO: better*/ } break; case 17: #line 458 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; } break; case 18: #line 463 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; } break; case 19: #line 471 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; 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"); } current_namespace.AddUsingAlias (lt.Value, (MemberName) yyVals[-1+yyTop], GetLocation (yyVals[-4+yyTop])); } break; case 20: #line 481 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = null; } break; case 21: #line 489 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_namespace.AddUsing ((MemberName) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); } break; case 22: #line 501 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Attributes attrs = (Attributes) yyVals[-2+yyTop]; MemberName name = (MemberName) yyVals[0+yyTop]; if (attrs != null) { bool valid_global_attrs = true; if ((current_namespace.DeclarationFound || current_namespace != file.NamespaceContainer)) { valid_global_attrs = false; } else { foreach (var a in attrs.Attrs) { if (a.ExplicitTarget == "assembly" || a.ExplicitTarget == "module") continue; valid_global_attrs = false; break; } } if (!valid_global_attrs) report.Error (1671, name.Location, "A namespace declaration cannot have modifiers or attributes"); } module.AddAttributes (attrs, current_namespace); current_namespace = new NamespaceContainer (name, module, current_namespace, file); module.AddTypesContainer (current_namespace); current_class = current_namespace.SlaveDeclSpace; current_container = current_class.PartialContainer; } break; case 23: #line 530 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; } break; case 24: #line 535 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] != null) lbag.AddLocation (current_namespace, GetLocation (yyVals[-9+yyTop]), GetLocation (yyVals[-6+yyTop]), GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); else lbag.AddLocation (current_namespace, GetLocation (yyVals[-9+yyTop]), GetLocation (yyVals[-6+yyTop]), GetLocation (yyVals[-1+yyTop])); current_namespace = current_namespace.Parent; current_class = current_namespace.SlaveDeclSpace; current_container = current_class.PartialContainer; } break; case 25: #line 549 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new MemberName (lt.Value, lt.Location); } break; case 26: #line 554 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new MemberName ((MemberName) yyVals[-2+yyTop], lt.Value, lt.Location); } break; case 27: #line 559 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = new MemberName ("<invalid>", lexer.Location); } break; case 32: #line 577 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { MemberName name = (MemberName) yyVals[0+yyTop]; if (name.TypeArguments != null) syntax_error (lexer.Location, "namespace name expected"); yyVal = name; } break; case 41: #line 609 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] != null) { TypeContainer ds = (TypeContainer)yyVals[0+yyTop]; if ((ds.ModFlags & (Modifiers.PRIVATE | Modifiers.PROTECTED)) != 0){ report.Error (1527, ds.Location, "Namespace elements cannot be explicitly declared as private, protected or protected internal"); } /* Here is a trick, for explicit attributes we don't know where they belong to until*/ /* we parse succeeding declaration hence we parse them as normal and re-attach them*/ /* when we know whether they are global (assembly:, module:) or local (type:).*/ if (ds.OptAttributes != null) { ds.OptAttributes.ConvertGlobalAttributes (ds, current_namespace, !current_namespace.DeclarationFound && current_namespace == file.NamespaceContainer); } } current_namespace.DeclarationFound = true; } break; case 42: #line 628 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_namespace.DeclarationFound = true; } break; case 50: #line 659 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var sect = (List<Attribute>) yyVals[0+yyTop]; yyVal = new Attributes (sect); } break; case 51: #line 664 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Attributes attrs = yyVals[-1+yyTop] as Attributes; var sect = (List<Attribute>) yyVals[0+yyTop]; if (attrs == null) attrs = new Attributes (sect); else attrs.AddAttributes (sect); yyVal = attrs; } break; case 52: #line 677 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_attribute_section = true; } break; case 53: #line 681 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_attribute_section = false; yyVal = yyVals[0+yyTop]; } break; case 54: #line 689 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_attr_target = (string) yyVals[-1+yyTop]; if (current_attr_target == "assembly" || current_attr_target == "module") { Lexer.check_incorrect_doc_comment (); } } break; case 55: #line 696 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { /* when attribute target is invalid*/ if (current_attr_target == string.Empty) yyVal = new List<Attribute> (0); else yyVal = yyVals[-2+yyTop]; current_attr_target = null; lexer.parsing_attribute_section = false; } break; case 56: #line 707 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[-2+yyTop]; } break; case 57: #line 714 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = CheckAttributeTarget (lt.Value, lt.Location); } break; case 58: #line 718 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = "event"; } break; case 59: #line 719 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = "return"; } break; case 60: #line 721 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyToken == Token.IDENTIFIER) { Error_SyntaxError (yyToken); yyVal = null; } else { string name = GetTokenName (yyToken); yyVal = CheckAttributeTarget (name, GetLocation (yyVals[0+yyTop])); } } break; case 61: #line 734 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new List<Attribute> (4) { (Attribute) yyVals[0+yyTop] }; } break; case 62: #line 738 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var attrs = (List<Attribute>) yyVals[-2+yyTop]; attrs.Add ((Attribute) yyVals[0+yyTop]); yyVal = attrs; } break; case 63: #line 748 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ++lexer.parsing_block; } break; case 64: #line 752 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; MemberName mname = (MemberName) yyVals[-2+yyTop]; if (mname.IsGeneric) { report.Error (404, lexer.Location, "'<' unexpected: attributes cannot be generic"); } Arguments [] arguments = (Arguments []) yyVals[0+yyTop]; ATypeNameExpression expr = mname.GetTypeExpression (); yyVal = new Attribute (current_attr_target, expr, arguments, mname.Location, lexer.IsEscapedIdentifier (mname)); } break; case 66: #line 771 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = null; } break; case 67: #line 773 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[-1+yyTop]; } break; case 68: #line 780 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = null; } break; case 69: #line 782 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Arguments a = new Arguments (4); a.Add ((Argument) yyVals[0+yyTop]); yyVal = new Arguments [] { a, null }; } break; case 70: #line 788 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Arguments a = new Arguments (4); a.Add ((Argument) yyVals[0+yyTop]); yyVal = new Arguments [] { null, a }; } break; case 71: #line 794 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Arguments[] o = (Arguments[]) yyVals[-2+yyTop]; if (o [1] != null) { report.Error (1016, ((Argument) yyVals[0+yyTop]).Expr.Location, "Named attribute arguments must appear after the positional arguments"); o [0] = new Arguments (4); } Arguments args = ((Arguments) o [0]); if (args.Count > 0 && !(yyVals[0+yyTop] is NamedArgument) && args [args.Count - 1] is NamedArgument) Error_NamedArgumentExpected ((NamedArgument) args [args.Count - 1]); args.Add ((Argument) yyVals[0+yyTop]); } break; case 72: #line 808 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Arguments[] o = (Arguments[]) yyVals[-2+yyTop]; if (o [1] == null) { o [1] = new Arguments (4); } ((Arguments) o [1]).Add ((Argument) yyVals[0+yyTop]); } break; case 73: #line 820 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Argument ((Expression) yyVals[0+yyTop]); } break; case 75: #line 828 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ++lexer.parsing_block; } break; case 76: #line 832 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; yyVal = new NamedArgument (lt.Value, lt.Location, (Expression) yyVals[0+yyTop]); } break; case 77: #line 841 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (lang_version <= LanguageVersion.V_3) FeatureIsNotAvailable (GetLocation (yyVals[-3+yyTop]), "named argument"); /* Avoid boxing in common case (no modifier)*/ var arg_mod = yyVals[-1+yyTop] == null ? Argument.AType.None : (Argument.AType) yyVals[-1+yyTop]; var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; yyVal = new NamedArgument (lt.Value, lt.Location, (Expression) yyVals[0+yyTop], arg_mod); } break; case 78: #line 854 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = null; } break; case 79: #line 856 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Argument.AType.Ref; } break; case 80: #line 860 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Argument.AType.Out; } break; case 83: #line 872 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_modifiers = true; } break; case 84: #line 876 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_modifiers = true; } break; case 97: #line 895 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (1519, lexer.Location, "Unexpected symbol `{0}' in class, struct, or interface member declaration", GetSymbolName (yyToken)); yyVal = null; lexer.parsing_generic_declaration = false; } break; case 98: #line 908 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.ConstraintsParsing = true; } break; case 99: #line 912 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { MemberName name = MakeName ((MemberName) yyVals[0+yyTop]); push_current_class (new Struct (current_namespace, current_class, name, (Modifiers) yyVals[-4+yyTop], (Attributes) yyVals[-5+yyTop]), yyVals[-3+yyTop]); } break; case 100: #line 918 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.ConstraintsParsing = false; current_class.SetParameterInfo ((List<Constraints>) yyVals[0+yyTop]); if (doc_support) current_container.DocComment = Lexer.consume_doc_comment (); lbag.AddMember (current_class, mod_locations, GetLocation (yyVals[-5+yyTop])); lexer.parsing_modifiers = true; } break; case 101: #line 931 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; } break; case 102: #line 936 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_declaration; if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; } break; case 103: #line 942 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lbag.AppendToMember (current_class, GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); yyVal = pop_current_class (); } break; case 104: #line 947 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); } break; case 105: #line 956 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; var mod = (Modifiers) yyVals[-3+yyTop]; current_field = new Const (current_class, (FullNamedExpression) yyVals[-1+yyTop], mod, new MemberName (lt.Value, lt.Location), (Attributes) yyVals[-4+yyTop]); current_container.AddConstant ((Const) current_field); if ((mod & Modifiers.STATIC) != 0) { report.Error (504, current_field.Location, "The constant `{0}' cannot be marked static", current_field.GetSignatureForError ()); } yyVal = current_field; } break; case 106: #line 969 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) { current_field.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } current_field.Initializer = (ConstInitializer) yyVals[-2+yyTop]; lbag.AddMember (current_field, mod_locations, GetLocation (yyVals[-6+yyTop]), GetLocation (yyVals[0+yyTop])); current_field = null; } break; case 117: #line 1003 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 118: #line 1007 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new SimpleName("dynamic",new Location(0,0)); } break; case 119: #line 1013 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_generic_declaration = false; var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; FullNamedExpression type = yyVals[0+yyTop] as FullNamedExpression; if(type == null){ report.Error (10008, GetLocation (yyVals[0+yyTop]), "Could not resolve type expression"); } current_field = new RoleField (current_class, type, Modifiers.PRIVATE | Modifiers.ROLE, new MemberName (lt.Value, lt.Location),null); current_container.AddField (current_field); yyVal = current_field; if (doc_support) { current_field.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } lbag.AddMember (current_field, mod_locations, GetLocation (yyVals[-1+yyTop])); yyVal = current_field; current_role = current_field; current_field = null; } break; case 120: #line 1039 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_role = null; } break; case 121: #line 1045 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = null; } break; case 122: #line 1047 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { TypeParameter tparam = null; var simple = current_role.TypeExpression as SimpleName; if((simple != null && simple.Name != "dynamic") || (simple.Type != null && simple.Type.BuiltinType != BuiltinTypeSpec.Type.Dynamic)){ if(current_class.IsGeneric){ for(int i = 0; tparam == null && i<current_class.TypeParameters.Length;i++){ if(simple.Name == current_class.TypeParameters[i].Name){ tparam = current_class.TypeParameters[i]; } } } if(tparam == null) { report.Error (10009, GetLocation (yyVals[0+yyTop]), "Contracts can only be used for none typed roles"); } } var contractName = GetCurrentRoleContractName(); MemberName name = MakeName (new MemberName(contractName)); var inter = new Interface (current_namespace, current_class, name, Modifiers.PUBLIC, null); if(tparam != null) { tparam.Type.RolePlayerContract = inter.Type; var ns = current_namespace.NS; var className = new MemberName (ns.MemberName, new MemberName("><_extensionContainerFor" + GetCurrentRoleContractName(),GetLocation (yyVals[0+yyTop]))); current_extensionContainer = new Class (current_namespace, current_class.Parent, className, Modifiers.PUBLIC | Modifiers.STATIC, null); } RoleContracts.Add(contractName,inter); push_current_class (inter, null); lbag.AddMember (current_class, mod_locations, GetLocation (yyVals[0+yyTop])); } break; case 123: #line 1081 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_declaration; if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; lbag.AppendToMember (current_class, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); if(current_extensionContainer != null) { var cls = current_class; var container = current_container; current_container = current_class.Module; push_current_class((Class)current_extensionContainer, null); lbag.AddMember (current_extensionContainer, mod_locations, GetLocation (yyVals[-4+yyTop])); lbag.AppendToMember (current_extensionContainer, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); pop_current_class(); current_class = cls; current_container = container; current_extensionContainer = null; } yyVal = pop_current_class (); } break; case 124: #line 1104 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_field.AddDeclarator ((FieldDeclarator) yyVals[0+yyTop]); } break; case 125: #line 1108 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_field.AddDeclarator ((FieldDeclarator) yyVals[0+yyTop]); } break; case 126: #line 1115 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (ConstInitializer) yyVals[0+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop])); } break; case 127: #line 1124 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ++lexer.parsing_block; } break; case 128: #line 1128 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; yyVal = new ConstInitializer (current_field, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); } break; case 129: #line 1133 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (145, lexer.Location, "A const field requires a value to be provided"); yyVal = null; } break; case 132: #line 1148 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_generic_declaration = false; FullNamedExpression type = (FullNamedExpression) yyVals[-1+yyTop]; if (type.Type != null && type.Type.Kind == MemberKind.Void) report.Error (670, GetLocation (yyVals[-1+yyTop]), "Fields cannot have void type"); var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; current_field = new Field (current_class, type, (Modifiers) yyVals[-2+yyTop], new MemberName (lt.Value, lt.Location), (Attributes) yyVals[-3+yyTop]); current_container.AddField (current_field); yyVal = current_field; } break; case 133: #line 1163 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) { current_field.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } lbag.AddMember (current_field, mod_locations, GetLocation (yyVals[0+yyTop])); yyVal = current_field; current_field = null; } break; case 134: #line 1176 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (lang_version < LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "fixed size buffers"); var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; current_field = new FixedField (current_class, (FullNamedExpression) yyVals[-1+yyTop], (Modifiers) yyVals[-3+yyTop], new MemberName (lt.Value, lt.Location), (Attributes) yyVals[-4+yyTop]); current_container.AddField (current_field); } break; case 135: #line 1187 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) { current_field.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } current_field.Initializer = (ConstInitializer) yyVals[-2+yyTop]; lbag.AddMember (current_field, mod_locations, GetLocation (yyVals[0+yyTop])); yyVal = current_field; current_field = null; } break; case 136: #line 1202 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (1641, GetLocation (yyVals[-1+yyTop]), "A fixed size buffer field must have the array size specifier after the field name"); } break; case 138: #line 1210 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ++lexer.parsing_block; current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters; start_block (GetLocation (yyVals[0+yyTop])); } break; case 139: #line 1216 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; current_field.Initializer = (Expression) yyVals[0+yyTop]; end_block (lexer.Location); current_local_parameters = null; } break; case 142: #line 1231 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_field.AddDeclarator ((FieldDeclarator) yyVals[0+yyTop]); } break; case 143: #line 1235 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_field.AddDeclarator ((FieldDeclarator) yyVals[0+yyTop]); } break; case 144: #line 1242 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), null); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } break; case 145: #line 1248 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ++lexer.parsing_block; } break; case 146: #line 1252 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; yyVal = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (Expression) yyVals[0+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop])); } break; case 149: #line 1267 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_field.AddDeclarator ((FieldDeclarator) yyVals[0+yyTop]); } break; case 150: #line 1271 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_field.AddDeclarator ((FieldDeclarator) yyVals[0+yyTop]); } break; case 151: #line 1278 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (ConstInitializer) yyVals[0+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop])); } break; case 152: #line 1287 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ++lexer.parsing_block; } break; case 153: #line 1291 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; yyVal = new ConstInitializer (current_field, (Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 154: #line 1297 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (443, lexer.Location, "Value or constant expected"); yyVal = null; } break; case 157: #line 1307 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { /* It has to be here for the parent to safely restore artificial block*/ Error_SyntaxError (yyToken); yyVal = null; } break; case 158: #line 1316 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) Lexer.doc_state = XmlCommentState.NotAllowed; /* Add it early in the case of body being eof for full ast*/ Method m = (Method) yyVals[0+yyTop]; async_block = (m.ModFlags & Modifiers.ASYNC) != 0; current_container.AddMethod (m); } break; case 159: #line 1327 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Method method = (Method) yyVals[-2+yyTop]; method.Block = (ToplevelBlock) yyVals[0+yyTop]; async_block = false; if (method.Block == null) { method.ParameterInfo.CheckParameters (method); if ((method.ModFlags & Modifiers.ASYNC) != 0) { report.Error (1994, method.Location, "`{0}': The async modifier can only be used with methods that have a body", method.GetSignatureForError ()); } } else { if (current_container.Kind == MemberKind.Interface) { report.Error (531, method.Location, "`{0}': interface members cannot have a definition", method.GetSignatureForError ()); } } current_local_parameters = null; if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; } break; case 160: #line 1355 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) Lexer.doc_state = XmlCommentState.NotAllowed; /* Add it early in the case of body being eof for full ast*/ Method m = (Method) yyVals[0+yyTop]; async_block = (m.ModFlags & Modifiers.ASYNC) != 0; current_container.AddMethod (m); } break; case 161: #line 1365 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { try{ Method method = (Method) yyVals[-2+yyTop]; method.Block = (ToplevelBlock) yyVals[0+yyTop]; async_block = false; if (method.Block == null) { method.ParameterInfo.CheckParameters (method); if ((method.ModFlags & Modifiers.ASYNC) != 0) { report.Error (1994, method.Location, "`{0}': The async modifier can only be used with methods that have a body", method.GetSignatureForError ()); } } else { if (current_container.Kind == MemberKind.Interface) { report.Error (531, method.Location, "`{0}': interface members cannot have a definition", method.GetSignatureForError ()); } } current_local_parameters = null; if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; } finally { isInteraction = false; interactionInitializationDone = false; } } break; case 162: #line 1399 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { isInteraction = true; interactionInitializationDone = false; } break; case 163: #line 1405 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = ParameterModifierType.All; } break; case 164: #line 1409 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.ConstraintsParsing = true; } break; case 165: #line 1413 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.ConstraintsParsing = false; valid_param_mod = 0; MemberName name = (MemberName) yyVals[-6+yyTop]; current_local_parameters = (ParametersCompiled) yyVals[-3+yyTop]; GenericMethod generic = null; if (name.TypeArguments != null) { generic = new GenericMethod (current_namespace, current_class, name, (FullNamedExpression) yyVals[-7+yyTop], current_local_parameters); generic.SetParameterInfo ((List<Constraints>) yyVals[0+yyTop]); } else if (yyVals[0+yyTop] != null) { report.Error (80, GetLocation (yyVals[0+yyTop]), "Constraints are not allowed on non-generic declarations"); } var modifiers = Modifiers.PUBLIC; var method = Method.Create (current_class, generic, (FullNamedExpression) yyVals[-7+yyTop], modifiers, name, current_local_parameters, (Attributes) yyVals[-10+yyTop], yyVals[0+yyTop] != null); if (doc_support) method.DocComment = Lexer.consume_doc_comment (); lbag.AddMember (method, mod_locations, GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-2+yyTop])); yyVal = method; } break; case 166: #line 1444 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) Lexer.doc_state = XmlCommentState.NotAllowed; isRoleMethod = true; /* Add it early in the case of body being eof for full ast*/ var m = (Method) yyVals[0+yyTop]; async_block = (m.ModFlags & Modifiers.ASYNC) != 0; current_container.AddMethod (m); } break; case 167: #line 1454 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var method = (Method) yyVals[-2+yyTop]; method.Block = (ToplevelBlock) yyVals[0+yyTop]; async_block = false; if (method.Block == null) { method.ParameterInfo.CheckParameters (method); if ((method.ModFlags & Modifiers.ASYNC) != 0) { report.Error (1994, method.Location, "`{0}': The async modifier can only be used with methods that have a body", method.GetSignatureForError ()); } } else { if (current_container.Kind == MemberKind.Interface) { report.Error (531, method.Location, "`{0}': interface members cannot have a definition", method.GetSignatureForError ()); } } current_local_parameters = null; if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; isRoleMethod = false; } break; case 168: #line 1483 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.PRIVATE | Modifiers.ROLE; } break; case 169: #line 1487 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { { yyVal = Modifiers.PRIVATE | Modifiers.ROLE |Modifiers.ENTRY; } } break; case 170: #line 1499 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { isInteraction = false; valid_param_mod = ParameterModifierType.All; } break; case 171: #line 1504 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.ConstraintsParsing = true; } break; case 172: #line 1508 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.ConstraintsParsing = false; valid_param_mod = 0; MemberName name = (MemberName) yyVals[-6+yyTop]; current_local_parameters = (ParametersCompiled) yyVals[-3+yyTop]; var tempParameters = current_local_parameters.FixedParameters; var roleArgLocation = GetLocation (yyVals[-9+yyTop]); var realParameters = new Parameter[tempParameters.Length+1]; realParameters[0] = new Self(GetCurrentRoleContractName(), current_role.TypeExpression,"self",Parameter.Modifier.NONE,null,roleArgLocation); Array.Copy(tempParameters,0,realParameters,1,tempParameters.Length); current_local_parameters = new ParametersCompiled(realParameters); GenericMethod generic = null; if (name.TypeArguments != null) { generic = new GenericMethod (current_namespace, current_class, name, (FullNamedExpression) yyVals[-7+yyTop], current_local_parameters); generic.SetParameterInfo ((List<Constraints>) yyVals[0+yyTop]); } else if (yyVals[0+yyTop] != null) { report.Error (80, GetLocation (yyVals[0+yyTop]), "Constraints are not allowed on non-generic declarations"); } var typeExpr = (FullNamedExpression) yyVals[-7+yyTop]; var method = Method.Create (current_class, generic, typeExpr, (Modifiers)yyVals[-8+yyTop] | Modifiers.ROLE, name, current_local_parameters, (Attributes) yyVals[-9+yyTop], yyVals[0+yyTop] != null); lbag.AddMember (method, mod_locations, GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-2+yyTop])); if (doc_support) method.DocComment = Lexer.consume_doc_comment (); yyVal = method; } break; case 173: #line 1547 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { isInteraction = false; valid_param_mod = ParameterModifierType.All; } break; case 174: #line 1552 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.ConstraintsParsing = true; } break; case 175: #line 1556 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.ConstraintsParsing = false; valid_param_mod = 0; MemberName name = (MemberName) yyVals[-6+yyTop]; current_local_parameters = (ParametersCompiled) yyVals[-3+yyTop]; GenericMethod generic = null; if (name.TypeArguments != null) { generic = new GenericMethod (current_namespace, current_class, name, (FullNamedExpression) yyVals[-7+yyTop], current_local_parameters); generic.SetParameterInfo ((List<Constraints>) yyVals[0+yyTop]); } else if (yyVals[0+yyTop] != null) { report.Error (80, GetLocation (yyVals[0+yyTop]), "Constraints are not allowed on non-generic declarations"); } var modifiers = (Modifiers) yyVals[-8+yyTop]; if((Modifiers.INTERACTION & modifiers) != 0){ modifiers = (modifiers ^ Modifiers.INTERACTION) | Modifiers.PUBLIC; isInteraction = true; } else { isInteraction = false; } var method = Method.Create (current_class, generic, (FullNamedExpression) yyVals[-7+yyTop], modifiers, name, current_local_parameters, (Attributes) yyVals[-9+yyTop], yyVals[0+yyTop] != null); if(current_container.Kind == MemberKind.Interface && current_extensionContainer != null){ var parameters = new List<Parameter>(); var typeExpression = new TypeExpression (compiler.BuiltinTypes.Object, GetLocation (yyVals[-9+yyTop])); var parameter = new Parameter(typeExpression, "self", Parameter.Modifier.This, null, GetLocation(yyVals[-9+yyTop])); parameters.Add(parameter); parameters.Add(new Parameter(typeExpression, "ctx", Parameter.Modifier.NONE, null, GetLocation(yyVals[-9+yyTop]))); var clone = current_local_parameters.Clone(); for(var i = 0; i < clone.Count; i++){ parameters.Add(clone[i]); } var parameterTypeExpressions = parameters.Select(p=>p.TypeExpression).ToList(); var key = current_namespace.NS.Name + "," + name.Name + "," + string.Join(",",parameterTypeExpressions.Select(p => p.ToString())); if(roleExtensionMethodDummies.Add(key)){ var returnType = (FullNamedExpression) yyVals[-7+yyTop]; var parametersCompiled = new ParametersCompiled(parameters.ToArray(),false); var dummy = Method.Create (current_extensionContainer, generic, (FullNamedExpression) yyVals[-7+yyTop], Modifiers.PUBLIC | Modifiers.STATIC, name, parametersCompiled, (Attributes) yyVals[-9+yyTop], yyVals[0+yyTop] != null); var location = GetLocation(yyVals[-9+yyTop]); var parameterName = new SimpleName("self", null, location); var getTypeAccess = new MemberAccess(parameterName, "GetType", null, location); var getTypeExpression = new Invocation(getTypeAccess, new Arguments(0)); var argCount = parameterTypeExpressions.Count-1; var argumentsForGetMethod = new Arguments(2); var stringLiteral = new StringLiteral(compiler.BuiltinTypes,name.Name,location); argumentsForGetMethod.Add(new Argument(stringLiteral)); var typeName = new SimpleName("Type", null, location); var types = parameterTypeExpressions.Skip(2) .Select(t =>(Expression)(t.Type != null ? new TypeOf(t.Type,location) : new TypeOf(t,location)) ).ToList(); var initializer = new ArrayInitializer(types,location); var parameterTypes = new ImplicitlyTypedArrayCreation ( new ComposedTypeSpecifier (1, location), initializer, location); lbag.AddLocation (parameterTypes, location, location); argumentsForGetMethod.Add(new Argument(parameterTypes)); var getMethodExpression = new Invocation(new MemberAccess(getTypeExpression,"GetMethod"),argumentsForGetMethod); var argumentsForMethod = new Arguments(2); var delegatedArguments = parameters.Skip(2).Select(p => (Expression)new Cast( new TypeExpression(compiler.BuiltinTypes.Object,location), new SimpleName(p.Name,location), location)).ToList(); argumentsForMethod.Add(new Argument(new SimpleName("self", null, location))); if(delegatedArguments.Any()){ initializer = new ArrayInitializer(delegatedArguments,location); argumentsForMethod.Add(new Argument(new ImplicitlyTypedArrayCreation( new ComposedTypeSpecifier (1, location), initializer, location))); } else { argumentsForMethod.Add(new Argument(new ArrayCreation(new TypeExpression(compiler.BuiltinTypes.Object,location),new ArrayInitializer(0,location)))); } var invocation = new Invocation(new MemberAccess(getMethodExpression,"Invoke"),argumentsForMethod); Statement statement = new StatementExpression(invocation); var retType = (returnType as TypeExpression); if(retType != null && retType.Type.Name != "Void"){ var cast = new Cast(returnType,invocation,location); statement = new Return(cast,location); } dummy.Block = new ToplevelBlock (compiler, parametersCompiled, GetLocation(yyVals[-9+yyTop])); /*var exceptionExpression = new New(new MemberName("InvalidOperationException",GetLocation($1)).GetTypeExpression(),new Arguments(0),GetLocation($1));*/ dummy.Block.AddStatement( statement); lbag.AddMember(dummy,mod_locations, GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-2+yyTop])); ((Class)current_extensionContainer).AddMethod(dummy); } } if (doc_support) method.DocComment = Lexer.consume_doc_comment (); lbag.AddMember (method, mod_locations, GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-2+yyTop])); yyVal = method; } break; case 176: #line 1666 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_generic_declaration = true; } break; case 177: #line 1671 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_generic_declaration = false; valid_param_mod = ParameterModifierType.All; } break; case 178: #line 1676 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.ConstraintsParsing = true; } break; case 179: #line 1680 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.ConstraintsParsing = false; valid_param_mod = 0; MemberName name = (MemberName) yyVals[-6+yyTop]; current_local_parameters = (ParametersCompiled) yyVals[-3+yyTop]; if (yyVals[-1+yyTop] != null && name.TypeArguments == null) report.Error (80, lexer.Location, "Constraints are not allowed on non-generic declarations"); GenericMethod generic = null; if (name.TypeArguments != null) { generic = new GenericMethod (current_namespace, current_class, name, new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[-8+yyTop])), current_local_parameters); generic.SetParameterInfo ((List<Constraints>) yyVals[-1+yyTop]); } var modifiers = (Modifiers) yyVals[-10+yyTop]; modifiers |= Modifiers.PARTIAL; var method = Method.Create (current_class, generic, new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[-8+yyTop])), modifiers, name, current_local_parameters, (Attributes) yyVals[-11+yyTop], yyVals[-1+yyTop] != null); if (doc_support) method.DocComment = Lexer.consume_doc_comment (); StoreModifierLocation (Modifiers.PARTIAL, GetLocation (yyVals[-9+yyTop])); lbag.AddMember (method, mod_locations, GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-2+yyTop])); yyVal = method; } break; case 180: #line 1717 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { MemberName name = (MemberName) yyVals[-3+yyTop]; report.Error (1585, name.Location, "Member modifier `{0}' must precede the member type and name", ModifiersExtensions.Name ((Modifiers) yyVals[-4+yyTop])); var method = Method.Create (current_class, null, (FullNamedExpression) yyVals[-5+yyTop], 0, name, (ParametersCompiled) yyVals[-1+yyTop], (Attributes) yyVals[-7+yyTop], false); current_local_parameters = (ParametersCompiled) yyVals[-1+yyTop]; if (doc_support) method.DocComment = Lexer.consume_doc_comment (); yyVal = method; } break; case 182: #line 1736 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = null; } break; case 183: #line 1740 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = ParametersCompiled.EmptyReadOnlyParameters; } break; case 185: #line 1746 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var pars_list = (List<Parameter>) yyVals[0+yyTop]; yyVal = new ParametersCompiled (pars_list.ToArray ()); } break; case 186: #line 1751 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var pars_list = (List<Parameter>) yyVals[-2+yyTop]; pars_list.Add ((Parameter) yyVals[0+yyTop]); yyVal = new ParametersCompiled (pars_list.ToArray ()); } break; case 187: #line 1758 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var pars_list = (List<Parameter>) yyVals[-2+yyTop]; pars_list.Add (new ArglistParameter (GetLocation (yyVals[0+yyTop]))); yyVal = new ParametersCompiled (pars_list.ToArray (), true); } break; case 188: #line 1764 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[-2+yyTop] != null) report.Error (231, ((Parameter) yyVals[-2+yyTop]).Location, "A params parameter must be the last parameter in a formal parameter list"); yyVal = new ParametersCompiled (new Parameter[] { (Parameter) yyVals[-2+yyTop] } ); } break; case 189: #line 1771 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[-2+yyTop] != null) report.Error (231, ((Parameter) yyVals[-2+yyTop]).Location, "A params parameter must be the last parameter in a formal parameter list"); var pars_list = (List<Parameter>) yyVals[-4+yyTop]; pars_list.Add (new ArglistParameter (GetLocation (yyVals[-2+yyTop]))); yyVal = new ParametersCompiled (pars_list.ToArray (), true); } break; case 190: #line 1781 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (257, GetLocation (yyVals[-2+yyTop]), "An __arglist parameter must be the last parameter in a formal parameter list"); yyVal = new ParametersCompiled (new Parameter [] { new ArglistParameter (GetLocation (yyVals[-2+yyTop])) }, true); } break; case 191: #line 1787 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (257, GetLocation (yyVals[-2+yyTop]), "An __arglist parameter must be the last parameter in a formal parameter list"); var pars_list = (List<Parameter>) yyVals[-4+yyTop]; pars_list.Add (new ArglistParameter (GetLocation (yyVals[-2+yyTop]))); yyVal = new ParametersCompiled (pars_list.ToArray (), true); } break; case 192: #line 1796 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new ParametersCompiled (new Parameter[] { (Parameter) yyVals[0+yyTop] } ); } break; case 193: #line 1800 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new ParametersCompiled (new Parameter [] { new ArglistParameter (GetLocation (yyVals[0+yyTop])) }, true); } break; case 194: #line 1804 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = ParametersCompiled.EmptyReadOnlyParameters; } break; case 195: #line 1812 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { parameters_bucket.Clear (); Parameter p = (Parameter) yyVals[0+yyTop]; parameters_bucket.Add (p); default_parameter_used = p.HasDefaultValue; yyVal = parameters_bucket; } break; case 196: #line 1821 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var pars = (List<Parameter>) yyVals[-2+yyTop]; Parameter p = (Parameter) yyVals[0+yyTop]; if (p != null) { if (p.HasExtensionMethodModifier) report.Error (1100, p.Location, "The parameter modifier `this' can only be used on the first parameter"); else if (!p.HasDefaultValue && default_parameter_used) report.Error (1737, p.Location, "Optional parameter cannot precede required parameters"); default_parameter_used |= p.HasDefaultValue; pars.Add (p); lbag.AddLocation (p, GetLocation (yyVals[-1+yyTop])); } yyVal = yyVals[-2+yyTop]; } break; case 197: #line 1845 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new Parameter ((FullNamedExpression) yyVals[-1+yyTop], lt.Value, (Parameter.Modifier) yyVals[-2+yyTop], (Attributes) yyVals[-3+yyTop], lt.Location); } break; case 198: #line 1853 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; report.Error (1552, lt.Location, "Array type specifier, [], must appear before parameter name"); yyVal = new Parameter ((FullNamedExpression) yyVals[-3+yyTop], lt.Value, (Parameter.Modifier) yyVals[-4+yyTop], (Attributes) yyVals[-5+yyTop], lt.Location); } break; case 199: #line 1862 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); Location l = GetLocation (yyVals[0+yyTop]); yyVal = new Parameter ((FullNamedExpression) yyVals[-1+yyTop], null, (Parameter.Modifier) yyVals[-2+yyTop], (Attributes) yyVals[-3+yyTop], l); } break; case 200: #line 1872 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ++lexer.parsing_block; } break; case 201: #line 1876 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; if (lang_version <= LanguageVersion.V_3) { FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "optional parameter"); } Parameter.Modifier mod = (Parameter.Modifier) yyVals[-5+yyTop]; if (mod != Parameter.Modifier.NONE) { switch (mod) { case Parameter.Modifier.REF: case Parameter.Modifier.OUT: report.Error (1741, GetLocation (yyVals[-5+yyTop]), "Cannot specify a default value for the `{0}' parameter", Parameter.GetModifierSignature (mod)); break; case Parameter.Modifier.This: report.Error (1743, GetLocation (yyVals[-5+yyTop]), "Cannot specify a default value for the `{0}' parameter", Parameter.GetModifierSignature (mod)); break; default: throw new NotImplementedException (mod.ToString ()); } mod = Parameter.Modifier.NONE; } if ((valid_param_mod & ParameterModifierType.DefaultValue) == 0) report.Error (1065, GetLocation (yyVals[-2+yyTop]), "Optional parameter is not valid in this context"); var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; yyVal = new Parameter ((FullNamedExpression) yyVals[-4+yyTop], lt.Value, mod, (Attributes) yyVals[-6+yyTop], lt.Location); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop])); if (yyVals[0+yyTop] != null) ((Parameter) yyVal).DefaultValue = new DefaultParameterValueExpression ((Expression) yyVals[0+yyTop]); } break; case 202: #line 1915 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Parameter.Modifier.NONE; } break; case 204: #line 1921 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 205: #line 1925 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Parameter.Modifier p2 = (Parameter.Modifier)yyVals[0+yyTop]; Parameter.Modifier mod = (Parameter.Modifier)yyVals[-1+yyTop] | p2; if (((Parameter.Modifier)yyVals[-1+yyTop] & p2) == p2) { Error_DuplicateParameterModifier (lexer.Location, p2); } else { switch (mod & ~Parameter.Modifier.This) { case Parameter.Modifier.REF: report.Error (1101, lexer.Location, "The parameter modifiers `this' and `ref' cannot be used altogether"); break; case Parameter.Modifier.OUT: report.Error (1102, lexer.Location, "The parameter modifiers `this' and `out' cannot be used altogether"); break; default: report.Error (1108, lexer.Location, "A parameter cannot have specified more than one modifier"); break; } } yyVal = mod; } break; case 206: #line 1949 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if ((valid_param_mod & ParameterModifierType.Ref) == 0) Error_ParameterModifierNotValid ("ref", GetLocation (yyVals[0+yyTop])); yyVal = Parameter.Modifier.REF; } break; case 207: #line 1956 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if ((valid_param_mod & ParameterModifierType.Out) == 0) Error_ParameterModifierNotValid ("out", GetLocation (yyVals[0+yyTop])); yyVal = Parameter.Modifier.OUT; } break; case 208: #line 1963 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if ((valid_param_mod & ParameterModifierType.This) == 0) Error_ParameterModifierNotValid ("this", GetLocation (yyVals[0+yyTop])); if (lang_version <= LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[0+yyTop]), "extension methods"); yyVal = Parameter.Modifier.This; } break; case 209: #line 1976 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new ParamsParameter ((FullNamedExpression) yyVals[-1+yyTop], lt.Value, (Attributes) yyVals[-3+yyTop], lt.Location); } break; case 210: #line 1981 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (1751, GetLocation (yyVals[-4+yyTop]), "Cannot specify a default value for a parameter array"); var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new ParamsParameter ((FullNamedExpression) yyVals[-3+yyTop], lt.Value, (Attributes) yyVals[-5+yyTop], lt.Location); } break; case 211: #line 1988 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = null; } break; case 212: #line 1996 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if ((valid_param_mod & ParameterModifierType.Params) == 0) report.Error (1670, (GetLocation (yyVals[0+yyTop])), "The `params' modifier is not allowed in current context"); } break; case 213: #line 2001 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Parameter.Modifier mod = (Parameter.Modifier)yyVals[0+yyTop]; if ((mod & Parameter.Modifier.This) != 0) { report.Error (1104, GetLocation (yyVals[-1+yyTop]), "The parameter modifiers `this' and `params' cannot be used altogether"); } else { report.Error (1611, GetLocation (yyVals[-1+yyTop]), "The params parameter cannot be declared as ref or out"); } } break; case 214: #line 2010 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_DuplicateParameterModifier (GetLocation (yyVals[-1+yyTop]), Parameter.Modifier.PARAMS); } break; case 215: #line 2017 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if ((valid_param_mod & ParameterModifierType.Arglist) == 0) report.Error (1669, GetLocation (yyVals[0+yyTop]), "__arglist is not valid in this context"); } break; case 216: #line 2028 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) tmpComment = Lexer.consume_doc_comment (); } break; case 217: #line 2033 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var type = (FullNamedExpression) yyVals[-3+yyTop]; current_property = new Property (current_class, type, (Modifiers) yyVals[-4+yyTop], (MemberName) yyVals[-2+yyTop], (Attributes) yyVals[-5+yyTop]); if (type.Type != null && type.Type.Kind == MemberKind.Void) report.Error (547, GetLocation (yyVals[-3+yyTop]), "`{0}': property or indexer cannot have void type", current_property.GetSignatureForError ()); current_container.AddProperty ((Property)current_property); lbag.AddMember (current_property, mod_locations, GetLocation (yyVals[0+yyTop])); lexer.PropertyParsing = true; } break; case 218: #line 2047 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.PropertyParsing = false; if (doc_support) current_property.DocComment = ConsumeStoredComment (); } break; case 219: #line 2054 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lbag.AppendToMember (current_property, GetLocation (yyVals[0+yyTop])); current_property = null; } break; case 220: #line 2064 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = ParameterModifierType.Params | ParameterModifierType.DefaultValue; } break; case 221: #line 2068 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = 0; var type = (FullNamedExpression) yyVals[-6+yyTop]; Indexer indexer = new Indexer (current_class, type, (MemberName) yyVals[-5+yyTop], (Modifiers) yyVals[-7+yyTop], (ParametersCompiled) yyVals[-2+yyTop], (Attributes) yyVals[-8+yyTop]); current_property = indexer; current_container.AddIndexer (indexer); lbag.AddMember (current_property, mod_locations, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); if (type.Type != null && type.Type.Kind == MemberKind.Void) report.Error (620, GetLocation (yyVals[-6+yyTop]), "`{0}': indexer return type cannot be `void'", indexer.GetSignatureForError ()); if (indexer.ParameterInfo.IsEmpty) { report.Error (1551, GetLocation (yyVals[-4+yyTop]), "Indexers must have at least one parameter"); } if (doc_support) { tmpComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } lexer.PropertyParsing = true; } break; case 222: #line 2093 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.PropertyParsing = false; } break; case 223: #line 2097 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (current_property.AccessorFirst != null && current_property.AccessorFirst.Block == null) ((Indexer) current_property).ParameterInfo.CheckParameters (current_property); if (doc_support) current_property.DocComment = ConsumeStoredComment (); lbag.AppendToMember (current_property, GetLocation (yyVals[-1+yyTop])); current_property = null; } break; case 228: #line 2116 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyToken == Token.CLOSE_BRACE) { report.Error (548, lexer.Location, "`{0}': property or indexer must have at least one accessor", current_property.GetSignatureForError ()); } else { if (yyToken == Token.SEMICOLON) report.Error (1597, lexer.Location, "Semicolon after method or accessor block is not valid"); else report.Error (1014, GetLocation (yyVals[0+yyTop]), "A get or set accessor expected"); } } break; case 229: #line 2130 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[-1+yyTop] != ModifierNone && lang_version == LanguageVersion.ISO_1) { FeatureIsNotAvailable (GetLocation (yyVals[-1+yyTop]), "access modifiers on properties"); } if (current_property.Get != null) { report.Error (1007, GetLocation (yyVals[0+yyTop]), "Property accessor already defined"); } if (current_property is Indexer) { current_property.Get = new Indexer.GetIndexerMethod (current_property, (Modifiers) yyVals[-1+yyTop], ((Indexer)current_property).ParameterInfo.Clone (), (Attributes) yyVals[-2+yyTop], GetLocation (yyVals[0+yyTop])); } else { current_property.Get = new Property.GetMethod (current_property, (Modifiers) yyVals[-1+yyTop], (Attributes) yyVals[-2+yyTop], GetLocation (yyVals[0+yyTop])); } current_local_parameters = current_property.Get.ParameterInfo; lbag.AddMember (current_property.Get, mod_locations); lexer.PropertyParsing = false; } break; case 230: #line 2152 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] != null) { current_property.Get.Block = (ToplevelBlock) yyVals[0+yyTop]; if (current_container.Kind == MemberKind.Interface) { report.Error (531, current_property.Get.Block.StartLocation, "`{0}': interface members cannot have a definition", current_property.Get.GetSignatureForError ()); } } current_local_parameters = null; lexer.PropertyParsing = true; if (doc_support) if (Lexer.doc_state == XmlCommentState.Error) Lexer.doc_state = XmlCommentState.NotAllowed; } break; case 231: #line 2173 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[-1+yyTop] != ModifierNone && lang_version == LanguageVersion.ISO_1) { FeatureIsNotAvailable (GetLocation (yyVals[-1+yyTop]), "access modifiers on properties"); } if (current_property.Set != null) { report.Error (1007, GetLocation (yyVals[0+yyTop]), "Property accessor already defined"); } if (current_property is Indexer) { current_property.Set = new Indexer.SetIndexerMethod (current_property, (Modifiers) yyVals[-1+yyTop], ParametersCompiled.MergeGenerated (compiler, ((Indexer)current_property).ParameterInfo, true, new Parameter ( current_property.TypeExpression, "value", Parameter.Modifier.NONE, null, GetLocation (yyVals[0+yyTop])), null), (Attributes) yyVals[-2+yyTop], GetLocation (yyVals[0+yyTop])); } else { current_property.Set = new Property.SetMethod (current_property, (Modifiers) yyVals[-1+yyTop], ParametersCompiled.CreateImplicitParameter (current_property.TypeExpression, GetLocation (yyVals[0+yyTop])), (Attributes) yyVals[-2+yyTop], GetLocation (yyVals[0+yyTop])); } current_local_parameters = current_property.Set.ParameterInfo; lbag.AddMember (current_property.Set, mod_locations); lexer.PropertyParsing = false; } break; case 232: #line 2200 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] != null) { current_property.Set.Block = (ToplevelBlock) yyVals[0+yyTop]; if (current_container.Kind == MemberKind.Interface) { report.Error (531, current_property.Set.Block.StartLocation, "`{0}': interface members cannot have a definition", current_property.Set.GetSignatureForError ()); } } current_local_parameters = null; lexer.PropertyParsing = true; if (doc_support && Lexer.doc_state == XmlCommentState.Error) Lexer.doc_state = XmlCommentState.NotAllowed; } break; case 234: #line 2222 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { /* TODO: lbag*/ yyVal = null; } break; case 235: #line 2227 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (1043, yyToken, "Invalid accessor body"); yyVal = null; } break; case 236: #line 2238 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.ConstraintsParsing = true; } break; case 237: #line 2242 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { MemberName name = MakeName ((MemberName) yyVals[0+yyTop]); push_current_class (new Interface (current_namespace, current_class, name, (Modifiers) yyVals[-4+yyTop], (Attributes) yyVals[-5+yyTop]), yyVals[-3+yyTop]); lbag.AddMember (current_class, mod_locations, GetLocation (yyVals[-2+yyTop])); } break; case 238: #line 2249 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.ConstraintsParsing = false; current_class.SetParameterInfo ((List<Constraints>) yyVals[0+yyTop]); if (doc_support) { current_container.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } lexer.parsing_modifiers = true; } break; case 239: #line 2262 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_declaration; if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; } break; case 240: #line 2268 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lbag.AppendToMember (current_class, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop])); yyVal = pop_current_class (); } break; case 241: #line 2273 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); } break; case 244: #line 2285 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_modifiers = true; } break; case 245: #line 2289 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_modifiers = true; } break; case 246: #line 2296 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (525, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain fields or constants"); } break; case 247: #line 2300 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (525, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain fields or constants"); } break; case 252: #line 2308 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (567, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain operators"); } break; case 253: #line 2312 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (526, GetLocation (yyVals[0+yyTop]), "Interfaces cannot contain contructors"); } break; case 254: #line 2316 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (524, GetLocation (yyVals[0+yyTop]), "Interfaces cannot declare classes, structs, interfaces, delegates, or enumerations"); } break; case 255: #line 2323 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { } break; case 256: #line 2326 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { OperatorDeclaration decl = (OperatorDeclaration) yyVals[-2+yyTop]; if (decl != null) { Operator op = new Operator ( current_class, decl.optype, decl.ret_type, (Modifiers) yyVals[-3+yyTop], current_local_parameters, (ToplevelBlock) yyVals[0+yyTop], (Attributes) yyVals[-4+yyTop], decl.location); if (op.Block == null) op.ParameterInfo.CheckParameters (op); if (doc_support) { op.DocComment = tmpComment; Lexer.doc_state = XmlCommentState.Allowed; } /* Note again, checking is done in semantic analysis*/ current_container.AddOperator (op); lbag.AddMember (op, mod_locations, lbag.GetLocations (decl)); } current_local_parameters = null; } break; case 258: #line 2354 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = null; } break; case 260: #line 2360 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (590, GetLocation (yyVals[0+yyTop]), "User-defined operators cannot return void"); yyVal = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[0+yyTop])); } break; case 261: #line 2368 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = ParameterModifierType.DefaultValue; } break; case 262: #line 2372 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = 0; Location loc = GetLocation (yyVals[-5+yyTop]); Operator.OpType op = (Operator.OpType) yyVals[-4+yyTop]; current_local_parameters = (ParametersCompiled)yyVals[-1+yyTop]; int p_count = current_local_parameters.Count; if (p_count == 1) { if (op == Operator.OpType.Addition) op = Operator.OpType.UnaryPlus; else if (op == Operator.OpType.Subtraction) op = Operator.OpType.UnaryNegation; } if (IsUnaryOperator (op)) { if (p_count == 2) { report.Error (1020, loc, "Overloadable binary operator expected"); } else if (p_count != 1) { report.Error (1535, loc, "Overloaded unary operator `{0}' takes one parameter", Operator.GetName (op)); } } 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"); } } if (doc_support) { tmpComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.NotAllowed; } yyVal = new OperatorDeclaration (op, (FullNamedExpression) yyVals[-6+yyTop], loc); lbag.AddLocation (yyVal, GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 264: #line 2416 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.LogicalNot; } break; case 265: #line 2417 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.OnesComplement; } break; case 266: #line 2418 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.Increment; } break; case 267: #line 2419 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.Decrement; } break; case 268: #line 2420 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.True; } break; case 269: #line 2421 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.False; } break; case 270: #line 2423 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.Addition; } break; case 271: #line 2424 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.Subtraction; } break; case 272: #line 2426 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.Multiply; } break; case 273: #line 2427 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.Division; } break; case 274: #line 2428 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.Modulus; } break; case 275: #line 2429 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.BitwiseAnd; } break; case 276: #line 2430 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.BitwiseOr; } break; case 277: #line 2431 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.ExclusiveOr; } break; case 278: #line 2432 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.LeftShift; } break; case 279: #line 2433 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.RightShift; } break; case 280: #line 2434 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.Equality; } break; case 281: #line 2435 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.Inequality; } break; case 282: #line 2436 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.GreaterThan; } break; case 283: #line 2437 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.LessThan; } break; case 284: #line 2438 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.GreaterThanOrEqual; } break; case 285: #line 2439 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Operator.OpType.LessThanOrEqual; } break; case 286: #line 2444 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = ParameterModifierType.DefaultValue; } break; case 287: #line 2448 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = 0; Location loc = GetLocation (yyVals[-5+yyTop]); current_local_parameters = (ParametersCompiled)yyVals[-1+yyTop]; if (doc_support) { tmpComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.NotAllowed; } yyVal = new OperatorDeclaration (Operator.OpType.Implicit, (FullNamedExpression) yyVals[-4+yyTop], loc); lbag.AddLocation (yyVal, GetLocation (yyVals[-6+yyTop]), GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 288: #line 2463 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = ParameterModifierType.DefaultValue; } break; case 289: #line 2467 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = 0; Location loc = GetLocation (yyVals[-5+yyTop]); current_local_parameters = (ParametersCompiled)yyVals[-1+yyTop]; if (doc_support) { tmpComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.NotAllowed; } yyVal = new OperatorDeclaration (Operator.OpType.Explicit, (FullNamedExpression) yyVals[-4+yyTop], loc); lbag.AddLocation (yyVal, GetLocation (yyVals[-6+yyTop]), GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 290: #line 2482 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters; yyVal = new OperatorDeclaration (Operator.OpType.Implicit, null, GetLocation (yyVals[-1+yyTop])); } break; case 291: #line 2488 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters; yyVal = new OperatorDeclaration (Operator.OpType.Explicit, null, GetLocation (yyVals[-1+yyTop])); } break; case 292: #line 2498 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Constructor c = (Constructor) yyVals[-1+yyTop]; c.Block = (ToplevelBlock) yyVals[0+yyTop]; if (doc_support) c.DocComment = ConsumeStoredComment (); current_container.AddConstructor (c); current_local_parameters = null; if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; current_method = null; } break; case 293: #line 2518 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) { tmpComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } valid_param_mod = ParameterModifierType.All; } break; case 294: #line 2527 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = 0; current_local_parameters = (ParametersCompiled) yyVals[-1+yyTop]; /**/ /* start block here, so possible anonymous methods inside*/ /* constructor initializer can get correct parent block*/ /**/ start_block (lexer.Location); } break; case 295: #line 2538 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-6+yyTop]; var mods = (Modifiers) yyVals[-7+yyTop]; ConstructorInitializer ci = (ConstructorInitializer) yyVals[0+yyTop]; Constructor c = new Constructor (current_class, lt.Value, mods, (Attributes) yyVals[-8+yyTop], current_local_parameters, ci, lt.Location); current_method = c; if (lt.Value != current_container.MemberName.Name) { report.Error (1520, c.Location, "Class, struct, or interface method must have a return type"); } else if ((mods & Modifiers.STATIC) != 0) { if ((mods & Modifiers.AccessibilityMask) != 0){ report.Error (515, c.Location, "`{0}': static constructor cannot have an access modifier", c.GetSignatureForError ()); } if (ci != null) { report.Error (514, c.Location, "`{0}': static constructor cannot have an explicit `this' or `base' constructor call", c.GetSignatureForError ()); } } lbag.AddMember (c, mod_locations, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop])); yyVal = c; } break; case 297: #line 2569 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block = null; yyVal = null; } break; case 300: #line 2579 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ++lexer.parsing_block; } break; case 301: #line 2583 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; yyVal = new ConstructorBaseInitializer ((Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-4+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 302: #line 2589 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ++lexer.parsing_block; } break; case 303: #line 2593 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; yyVal = new ConstructorThisInitializer ((Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-4+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 304: #line 2599 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = null; } break; case 305: #line 2607 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) { tmpComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.NotAllowed; } current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters; } break; case 306: #line 2616 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; 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){ report.Error (575, lt.Location, "Only class types can contain destructor"); } Destructor d = new Destructor (current_class, (Modifiers) yyVals[-6+yyTop], ParametersCompiled.EmptyReadOnlyParameters, (Attributes) yyVals[-7+yyTop], lt.Location); if (doc_support) d.DocComment = ConsumeStoredComment (); d.Block = (ToplevelBlock) yyVals[0+yyTop]; current_container.AddMethod (d); lbag.AddMember (d, mod_locations, GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[-1+yyTop])); current_local_parameters = null; } break; case 307: #line 2641 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_event_field = new EventField (current_class, (FullNamedExpression) yyVals[-1+yyTop], (Modifiers) yyVals[-3+yyTop], (MemberName) yyVals[0+yyTop], (Attributes) yyVals[-4+yyTop]); current_container.AddEvent (current_event_field); if (current_event_field.MemberName.Left != null) { report.Error (71, current_event_field.Location, "`{0}': An explicit interface implementation of an event must use property syntax", current_event_field.GetSignatureForError ()); } yyVal = current_event_field; } break; case 308: #line 2655 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) { current_event_field.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } lbag.AddMember (current_event_field, mod_locations, GetLocation (yyVals[-6+yyTop]), GetLocation (yyVals[0+yyTop])); current_event_field = null; } break; case 309: #line 2668 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_event = new EventProperty (current_class, (FullNamedExpression) yyVals[-2+yyTop], (Modifiers) yyVals[-4+yyTop], (MemberName) yyVals[-1+yyTop], (Attributes) yyVals[-5+yyTop]); current_container.AddEvent (current_event); lbag.AddMember (current_event, mod_locations, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[0+yyTop])); lexer.EventParsing = true; } break; case 310: #line 2676 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (current_container.Kind == MemberKind.Interface) report.Error (69, GetLocation (yyVals[-2+yyTop]), "Event in interface cannot have add or remove accessors"); lexer.EventParsing = false; } break; case 311: #line 2683 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) { current_event.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } lbag.AppendToMember (current_event, GetLocation (yyVals[-1+yyTop])); current_event = null; current_local_parameters = null; } break; case 313: #line 2698 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ++lexer.parsing_block; } break; case 314: #line 2702 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; current_event_field.Initializer = (Expression) yyVals[0+yyTop]; } break; case 317: #line 2715 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_event_field.AddDeclarator ((FieldDeclarator) yyVals[0+yyTop]); } break; case 318: #line 2719 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_event_field.AddDeclarator ((FieldDeclarator) yyVals[0+yyTop]); } break; case 319: #line 2726 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), null); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } break; case 320: #line 2732 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ++lexer.parsing_block; } break; case 321: #line 2736 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; yyVal = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (Expression) yyVals[0+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop])); } break; case 322: #line 2745 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (current_container.Kind == MemberKind.Interface) { report.Error (68, lexer.Location, "`{0}': event in interface cannot have an initializer", current_event_field.GetSignatureForError ()); } if ((current_event_field.ModFlags & Modifiers.ABSTRACT) != 0) { report.Error (74, lexer.Location, "`{0}': abstract event cannot have an initializer", current_event_field.GetSignatureForError ()); } } break; case 323: #line 2757 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 326: #line 2766 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (65, lexer.Location, "`{0}': event property must have both add and remove accessors", current_event.GetSignatureForError ()); } break; case 327: #line 2771 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (65, lexer.Location, "`{0}': event property must have both add and remove accessors", current_event.GetSignatureForError ()); } break; case 328: #line 2776 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (1055, GetLocation (yyVals[0+yyTop]), "An add or remove accessor expected"); yyVal = null; } break; case 329: #line 2784 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[-1+yyTop] != ModifierNone) { report.Error (1609, GetLocation (yyVals[-1+yyTop]), "Modifiers cannot be placed on event accessor declarations"); } current_event.Add = new EventProperty.AddDelegateMethod (current_event, (Attributes) yyVals[-2+yyTop], GetLocation (yyVals[0+yyTop])); current_local_parameters = current_event.Add.ParameterInfo; lbag.AddMember (current_event.Add, mod_locations); lexer.EventParsing = false; } break; case 330: #line 2796 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.EventParsing = true; current_event.Add.Block = (ToplevelBlock) yyVals[0+yyTop]; if (current_container.Kind == MemberKind.Interface) { report.Error (531, current_event.Add.Block.StartLocation, "`{0}': interface members cannot have a definition", current_event.Add.GetSignatureForError ()); } current_local_parameters = null; } break; case 331: #line 2812 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[-1+yyTop] != ModifierNone) { report.Error (1609, GetLocation (yyVals[-1+yyTop]), "Modifiers cannot be placed on event accessor declarations"); } current_event.Remove = new EventProperty.RemoveDelegateMethod (current_event, (Attributes) yyVals[-2+yyTop], GetLocation (yyVals[0+yyTop])); current_local_parameters = current_event.Remove.ParameterInfo; lbag.AddMember (current_event.Remove, mod_locations); lexer.EventParsing = false; } break; case 332: #line 2824 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.EventParsing = true; current_event.Remove.Block = (ToplevelBlock) yyVals[0+yyTop]; if (current_container.Kind == MemberKind.Interface) { report.Error (531, current_event.Remove.Block.StartLocation, "`{0}': interface members cannot have a definition", current_event.Remove.GetSignatureForError ()); } current_local_parameters = null; } break; case 333: #line 2840 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (73, lexer.Location, "An add or remove accessor must have a body"); yyVal = null; } break; case 335: #line 2852 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) enumTypeComment = Lexer.consume_doc_comment (); } break; case 336: #line 2857 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; MemberName name = (MemberName) yyVals[-3+yyTop]; if (name.IsGeneric) { report.Error (1675, name.Location, "Enums cannot have type parameters"); } push_current_class (new Enum (current_namespace, current_class, (TypeExpression) yyVals[-2+yyTop], (Modifiers) yyVals[-5+yyTop], MakeName (name), (Attributes) yyVals[-6+yyTop]), null); } break; case 337: #line 2869 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { /* here will be evaluated after CLOSE_BLACE is consumed.*/ if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; } break; case 338: #line 2875 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) current_class.DocComment = enumTypeComment; --lexer.parsing_declaration; /* if (doc_support)*/ /* em.DocComment = ev.DocComment;*/ lbag.AddMember (current_class, mod_locations, GetLocation (yyVals[-9+yyTop]), GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-1+yyTop])); yyVal = pop_current_class (); } break; case 340: #line 2892 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var te = yyVals[0+yyTop] as TypeExpression; if (te == null || !EnumSpec.IsValidUnderlyingType (te.Type)) { Enum.Error_1008 (GetLocation (yyVals[0+yyTop]), report); yyVal = null; } else { yyVal = yyVals[0+yyTop]; } } break; case 341: #line 2902 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_TypeExpected (GetLocation (yyVals[-1+yyTop])); yyVal = null; } break; case 344: #line 2912 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lbag.AddLocation (yyVals[-1+yyTop], GetLocation (yyVals[0+yyTop])); } break; case 346: #line 2920 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lbag.AddLocation (yyVals[-2+yyTop], GetLocation (yyVals[-1+yyTop])); yyVal = yyVals[0+yyTop]; } break; case 347: #line 2928 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; var em = new EnumMember ((Enum) current_class, new MemberName (lt.Value, lt.Location), (Attributes) yyVals[-1+yyTop]); ((Enum) current_class).AddEnumMember (em); if (doc_support) { em.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } yyVal = em; } break; case 348: #line 2941 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ++lexer.parsing_block; if (doc_support) { tmpComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.NotAllowed; } } break; case 349: #line 2949 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; var em = new EnumMember ((Enum) current_class, new MemberName (lt.Value, lt.Location), (Attributes) yyVals[-4+yyTop]); em.Initializer = new ConstInitializer (em, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); ((Enum) current_class).AddEnumMember (em); if (doc_support) em.DocComment = ConsumeStoredComment (); yyVal = em; } break; case 350: #line 2970 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out | ParameterModifierType.Params | ParameterModifierType.DefaultValue; } break; case 351: #line 2974 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = 0; MemberName name = MakeName ((MemberName) yyVals[-4+yyTop]); ParametersCompiled p = (ParametersCompiled) yyVals[-1+yyTop]; Delegate del = new Delegate (current_namespace, current_class, (FullNamedExpression) yyVals[-5+yyTop], (Modifiers) yyVals[-7+yyTop], name, p, (Attributes) yyVals[-8+yyTop]); p.CheckParameters (del); current_container.AddDelegate (del); current_delegate = del; lexer.ConstraintsParsing = true; } break; case 352: #line 2990 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.ConstraintsParsing = false; } break; case 353: #line 2994 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (doc_support) { current_delegate.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } current_delegate.SetParameterInfo ((List<Constraints>) yyVals[-2+yyTop]); lbag.AddMember (current_delegate, mod_locations, GetLocation (yyVals[-10+yyTop]), GetLocation (yyVals[-7+yyTop]), GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[0+yyTop])); yyVal = current_delegate; current_delegate = null; } break; case 355: #line 3012 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (lang_version < LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[0+yyTop]), "nullable types"); yyVal = ComposedTypeSpecifier.CreateNullable (GetLocation (yyVals[0+yyTop])); } break; case 357: #line 3023 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt1 = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var lt2 = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberName (lt1.Value, lt2.Value, (TypeArguments) yyVals[0+yyTop], lt1.Location); } break; case 359: #line 3034 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberName ((MemberName) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop])); } break; case 360: #line 3043 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberName (lt.Value, (TypeArguments)yyVals[0+yyTop], lt.Location); } break; case 362: #line 3055 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (lang_version < LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "generics"); yyVal = yyVals[-1+yyTop]; } break; case 363: #line 3062 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_TypeExpected (lexer.Location); yyVal = new TypeArguments (); } break; case 364: #line 3070 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { TypeArguments type_args = new TypeArguments (); type_args.Add ((FullNamedExpression) yyVals[0+yyTop]); yyVal = type_args; } break; case 365: #line 3076 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { TypeArguments type_args = (TypeArguments) yyVals[-2+yyTop]; type_args.Add ((FullNamedExpression) yyVals[0+yyTop]); yyVal = type_args; } break; case 366: #line 3088 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_generic_declaration = true; } break; case 367: #line 3092 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_generic_declaration = false; var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new MemberName (lt.Value, (TypeArguments)yyVals[0+yyTop], lt.Location); } break; case 368: #line 3101 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { MemberName mn = (MemberName)yyVals[0+yyTop]; if (mn.TypeArguments != null) syntax_error (mn.Location, string.Format ("Member `{0}' cannot declare type arguments", mn.GetSignatureForError ())); } break; case 370: #line 3112 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_generic_declaration = false; var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberName ((MemberName) yyVals[-2+yyTop], lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location); } break; case 371: #line 3121 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_generic_declaration = false; yyVal = new MemberName (TypeContainer.DefaultIndexerName, GetLocation (yyVals[0+yyTop])); } break; case 372: #line 3126 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_generic_declaration = false; yyVal = new MemberName ((MemberName) yyVals[-1+yyTop], TypeContainer.DefaultIndexerName, null, GetLocation (yyVals[-1+yyTop])); } break; case 373: #line 3134 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new MemberName (lt.Value, (TypeArguments) yyVals[-1+yyTop], lt.Location); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 374: #line 3140 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt1 = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; var lt2 = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new MemberName (lt1.Value, lt2.Value, (TypeArguments) yyVals[-1+yyTop], lt1.Location); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 375: #line 3148 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new MemberName ((MemberName) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[-1+yyTop], lt.Location); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 377: #line 3158 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (lang_version < LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "generics"); yyVal = yyVals[-1+yyTop]; lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 378: #line 3169 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { TypeArguments type_args = new TypeArguments (); type_args.Add ((FullNamedExpression)yyVals[0+yyTop]); yyVal = type_args; } break; case 379: #line 3175 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { TypeArguments type_args = (TypeArguments) yyVals[-2+yyTop]; type_args.Add ((FullNamedExpression)yyVals[0+yyTop]); yyVal = type_args; lbag.AddLocation (yyVals[0+yyTop], GetLocation (yyVals[0+yyTop])); } break; case 380: #line 3185 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken)yyVals[0+yyTop]; yyVal = new TypeParameterName (lt.Value, (Attributes)yyVals[-2+yyTop], (Variance) yyVals[-1+yyTop], lt.Location); } break; case 381: #line 3190 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (GetTokenName (yyToken) == "type") report.Error (81, GetLocation (yyVals[0+yyTop]), "Type parameter declaration must be an identifier not a type"); else Error_SyntaxError (yyToken); yyVal = new TypeParameterName ("", null, lexer.Location); } break; case 383: #line 3206 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[0+yyTop])); } break; case 384: #line 3213 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_generic_declaration = true; } break; case 386: #line 3224 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Expression.Error_VoidInvalidInTheContext (GetLocation (yyVals[0+yyTop]), report); yyVal = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[0+yyTop])); } break; case 388: #line 3233 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Expression.Error_VoidInvalidInTheContext (GetLocation (yyVals[0+yyTop]), report); yyVal = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[0+yyTop])); } break; case 390: #line 3242 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (1536, GetLocation (yyVals[0+yyTop]), "Invalid parameter type `void'"); yyVal = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[0+yyTop])); } break; case 392: #line 3251 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], (ComposedTypeSpecifier) yyVals[0+yyTop]); } break; case 393: #line 3258 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { MemberName name = (MemberName) yyVals[-1+yyTop]; if (yyVals[0+yyTop] != null) { yyVal = new ComposedCast (name.GetTypeExpression (), (ComposedTypeSpecifier) yyVals[0+yyTop]); } else { if (name.Left == null && name.Name == "var") yyVal = new VarExpr (name.Location); else yyVal = name.GetTypeExpression (); } } break; case 394: #line 3271 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new ComposedCast (((MemberName) yyVals[-1+yyTop]).GetTypeExpression (), (ComposedTypeSpecifier) yyVals[0+yyTop]); } break; case 395: #line 3275 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] != null) yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], (ComposedTypeSpecifier) yyVals[0+yyTop]); } break; case 396: #line 3280 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], (ComposedTypeSpecifier) yyVals[0+yyTop]); } break; case 397: #line 3284 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new ComposedCast (new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[-1+yyTop])), (ComposedTypeSpecifier) yyVals[0+yyTop]); } break; case 398: #line 3291 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var types = new List<FullNamedExpression> (2); types.Add ((FullNamedExpression) yyVals[0+yyTop]); yyVal = types; } break; case 399: #line 3297 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var types = (List<FullNamedExpression>) yyVals[-2+yyTop]; types.Add ((FullNamedExpression) yyVals[0+yyTop]); yyVal = types; } break; case 400: #line 3306 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] is ComposedCast) { report.Error (1521, GetLocation (yyVals[0+yyTop]), "Invalid base type `{0}'", ((ComposedCast)yyVals[0+yyTop]).GetSignatureForError ()); } yyVal = yyVals[0+yyTop]; } break; case 401: #line 3313 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_TypeExpected (lexer.Location); yyVal = null; } break; case 402: #line 3324 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Object, GetLocation (yyVals[0+yyTop])); } break; case 403: #line 3325 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.String, GetLocation (yyVals[0+yyTop])); } break; case 404: #line 3326 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Bool, GetLocation (yyVals[0+yyTop])); } break; case 405: #line 3327 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Decimal, GetLocation (yyVals[0+yyTop])); } break; case 406: #line 3328 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Float, GetLocation (yyVals[0+yyTop])); } break; case 407: #line 3329 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Double, GetLocation (yyVals[0+yyTop])); } break; case 409: #line 3334 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.SByte, GetLocation (yyVals[0+yyTop])); } break; case 410: #line 3335 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Byte, GetLocation (yyVals[0+yyTop])); } break; case 411: #line 3336 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Short, GetLocation (yyVals[0+yyTop])); } break; case 412: #line 3337 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.UShort, GetLocation (yyVals[0+yyTop])); } break; case 413: #line 3338 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Int, GetLocation (yyVals[0+yyTop])); } break; case 414: #line 3339 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.UInt, GetLocation (yyVals[0+yyTop])); } break; case 415: #line 3340 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Long, GetLocation (yyVals[0+yyTop])); } break; case 416: #line 3341 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.ULong, GetLocation (yyVals[0+yyTop])); } break; case 417: #line 3342 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TypeExpression (compiler.BuiltinTypes.Char, GetLocation (yyVals[0+yyTop])); } break; case 418: #line 3352 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { checkForInteraction((Expression)yyVals[0+yyTop]); } break; case 439: #line 3382 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new SimpleName (lt.Value, (TypeArguments)yyVals[0+yyTop], lt.Location); } break; case 440: #line 3386 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new CompletionSimpleName (MemberName.MakeName (lt.Value, null), lt.Location); } break; case 444: #line 3396 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new NullLiteral (GetLocation (yyVals[0+yyTop])); } break; case 445: #line 3400 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new BoolLiteral (compiler.BuiltinTypes, true, GetLocation (yyVals[0+yyTop])); } break; case 446: #line 3401 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new BoolLiteral (compiler.BuiltinTypes, false, GetLocation (yyVals[0+yyTop])); } break; case 451: #line 3427 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new ParenthesizedExpression ((Expression) yyVals[-1+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 452: #line 3432 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new ParenthesizedExpression ((Expression) yyVals[-1+yyTop]); } break; case 453: #line 3439 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop])); } break; case 454: #line 3445 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop])); } break; case 455: #line 3451 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberAccess (new BaseThis (GetLocation (yyVals[-3+yyTop])), lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop])); } break; case 456: #line 3457 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt1 = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var lt2 = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new QualifiedAliasMember (lt1.Value, lt2.Value, (TypeArguments) yyVals[0+yyTop], lt1.Location); } break; case 457: #line 3463 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new CompletionMemberAccess ((Expression) yyVals[-2+yyTop], null,GetLocation (yyVals[0+yyTop])); } break; case 458: #line 3466 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new CompletionMemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, lt.Location); } break; case 459: #line 3471 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new CompletionMemberAccess ((Expression) yyVals[-2+yyTop], null, lexer.Location); } break; case 460: #line 3474 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new CompletionMemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, lt.Location); } break; case 461: #line 3482 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { isInteractionArgumentList = isInteraction; } break; case 462: #line 3486 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { isInteractionArgumentList = false; } break; case 463: #line 3490 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var instance = (Expression) yyVals[-5+yyTop]; var arguments = (Arguments) yyVals[-2+yyTop]; yyVal = new Invocation (instance,arguments); lbag.AddLocation (yyVal, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); } break; case 464: #line 3500 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = null; } break; case 466: #line 3506 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[-1+yyTop] == null) { yyVal = CollectionOrObjectInitializers.Empty; /* TODO: lbag*/ } else { yyVal = new CollectionOrObjectInitializers ((List<Expression>) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } } break; case 467: #line 3516 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new CollectionOrObjectInitializers ((List<Expression>) yyVals[-2+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 468: #line 3523 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = null; } break; case 469: #line 3525 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 470: #line 3532 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var a = new List<Expression> (); a.Add ((Expression) yyVals[0+yyTop]); yyVal = a; } break; case 471: #line 3538 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var a = (List<Expression>)yyVals[-2+yyTop]; a.Add ((Expression) yyVals[0+yyTop]); yyVal = a; } break; case 472: #line 3543 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = yyVals[-1+yyTop]; } break; case 473: #line 3551 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new ElementInitializer (lt.Value, (Expression)yyVals[0+yyTop], lt.Location); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } break; case 474: #line 3557 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new CompletionElementInitializer (null, GetLocation (yyVals[0+yyTop])); } break; case 475: #line 3560 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { CompletionSimpleName csn = yyVals[-1+yyTop] as CompletionSimpleName; if (csn == null) yyVal = new CollectionElementInitializer ((Expression)yyVals[-1+yyTop]); else yyVal = new CompletionElementInitializer (csn.Prefix, csn.Location); } break; case 476: #line 3568 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[-1+yyTop] == null) yyVal = null; else yyVal = new CollectionElementInitializer ((List<Expression>)yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); } break; case 477: #line 3575 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (1920, GetLocation (yyVals[-1+yyTop]), "An element initializer cannot be empty"); yyVal = null; } break; case 480: #line 3587 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = null; } break; case 482: #line 3593 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Arguments list = new Arguments (4); list.Add ((Argument) yyVals[0+yyTop]); yyVal = list; } break; case 483: #line 3599 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Arguments list = (Arguments) yyVals[-2+yyTop]; if (list [list.Count - 1] is NamedArgument) Error_NamedArgumentExpected ((NamedArgument) list [list.Count - 1]); list.Add ((Argument) yyVals[0+yyTop]); yyVal = list; } break; case 484: #line 3608 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Arguments list = (Arguments) yyVals[-2+yyTop]; NamedArgument a = (NamedArgument) yyVals[0+yyTop]; for (int i = 0; i < list.Count; ++i) { NamedArgument na = list [i] as NamedArgument; if (na != null && na.Name == a.Name) report.Error (1740, na.Location, "Named argument `{0}' specified multiple times", na.Name); } list.Add (a); yyVal = list; } break; case 485: #line 3622 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (839, GetLocation (yyVals[0+yyTop]), "An argument is missing"); yyVal = yyVals[-1+yyTop]; } break; case 486: #line 3627 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (839, GetLocation (yyVals[-1+yyTop]), "An argument is missing"); yyVal = null; } break; case 487: #line 3635 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Argument ((Expression) yyVals[0+yyTop]); } break; case 491: #line 3648 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Argument ((Expression) yyVals[0+yyTop], Argument.AType.Ref); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } break; case 492: #line 3653 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Argument ((Expression) yyVals[0+yyTop], Argument.AType.Out); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } break; case 493: #line 3658 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Argument (new Arglist ((Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop]))); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 494: #line 3663 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Argument (new Arglist (GetLocation (yyVals[-2+yyTop]))); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 496: #line 3675 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new ElementAccess ((Expression) yyVals[-3+yyTop], (Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 497: #line 3683 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var list = new List<Expression> (4); list.Add ((Expression) yyVals[0+yyTop]); yyVal = list; } break; case 498: #line 3689 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var list = (List<Expression>) yyVals[-2+yyTop]; list.Add ((Expression) yyVals[0+yyTop]); yyVal = list; } break; case 499: #line 3694 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = yyVals[-1+yyTop]; } break; case 500: #line 3702 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Arguments args = new Arguments (4); args.Add ((Argument) yyVals[0+yyTop]); yyVal = args; } break; case 501: #line 3708 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Arguments args = (Arguments) yyVals[-2+yyTop]; if (args [args.Count - 1] is NamedArgument && !(yyVals[0+yyTop] is NamedArgument)) Error_NamedArgumentExpected ((NamedArgument) args [args.Count - 1]); args.Add ((Argument) yyVals[0+yyTop]); yyVal = args; } break; case 502: #line 3720 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Argument ((Expression) yyVals[0+yyTop]); } break; case 504: #line 3728 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if(isRoleMethod) { report.Error (10077, lexer.Location, "Can't use this explicitly in role methods. Use self or role name to refer to the role"); } yyVal = new This (GetLocation (yyVals[0+yyTop])); } break; case 505: #line 3739 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new ElementAccess (new BaseThis (GetLocation (yyVals[-3+yyTop])), (Arguments) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 506: #line 3744 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = new ElementAccess (null, null, GetLocation (yyVals[-1+yyTop])); } break; case 507: #line 3752 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new UnaryMutator (UnaryMutator.Mode.PostIncrement, (Expression) yyVals[-1+yyTop], GetLocation (yyVals[0+yyTop])); } break; case 508: #line 3759 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new UnaryMutator (UnaryMutator.Mode.PostDecrement, (Expression) yyVals[-1+yyTop], GetLocation (yyVals[0+yyTop])); } break; case 509: #line 3766 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] != null) { if (lang_version <= LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[-5+yyTop]), "object initializers"); yyVal = new NewInitialize ((FullNamedExpression) yyVals[-4+yyTop], (Arguments) yyVals[-2+yyTop], (CollectionOrObjectInitializers) yyVals[0+yyTop], GetLocation (yyVals[-5+yyTop])); } else { yyVal = new New ((FullNamedExpression) yyVals[-4+yyTop], (Arguments) yyVals[-2+yyTop], GetLocation (yyVals[-5+yyTop])); } lbag.AddLocation (yyVal, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); } break; case 510: #line 3779 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (lang_version <= LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "collection initializers"); yyVal = new NewInitialize ((FullNamedExpression) yyVals[-1+yyTop], null, (CollectionOrObjectInitializers) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); } break; case 511: #line 3791 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new ArrayCreation ((FullNamedExpression) yyVals[-5+yyTop], (List<Expression>) yyVals[-3+yyTop], new ComposedTypeSpecifier (((List<Expression>) yyVals[-3+yyTop]).Count, GetLocation (yyVals[-4+yyTop])) { Next = (ComposedTypeSpecifier) yyVals[-1+yyTop] }, (ArrayInitializer) yyVals[0+yyTop], GetLocation (yyVals[-6+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop])); } break; case 512: #line 3799 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] == null) report.Error (1586, GetLocation (yyVals[-3+yyTop]), "Array creation must have array size or array initializer"); yyVal = new ArrayCreation ((FullNamedExpression) yyVals[-2+yyTop], (ComposedTypeSpecifier) yyVals[-1+yyTop], (ArrayInitializer) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop])); } break; case 513: #line 3806 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (lang_version <= LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[-2+yyTop]), "implicitly typed arrays"); yyVal = new ImplicitlyTypedArrayCreation ((ComposedTypeSpecifier) yyVals[-1+yyTop], (ArrayInitializer) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); } break; case 514: #line 3813 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (178, GetLocation (yyVals[-1+yyTop]), "Invalid rank specifier, expecting `,' or `]'"); yyVal = new ArrayCreation ((FullNamedExpression) yyVals[-5+yyTop], null, GetLocation (yyVals[-6+yyTop])); } break; case 515: #line 3818 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (1526, yyToken, "Unexpected symbol"); yyVal = new ArrayCreation ((FullNamedExpression) yyVals[-1+yyTop], null, GetLocation (yyVals[-2+yyTop])); } break; case 516: #line 3825 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ++lexer.parsing_type; } break; case 517: #line 3829 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_type; yyVal = yyVals[0+yyTop]; } break; case 518: #line 3837 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (lang_version <= LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[-3+yyTop]), "anonymous types"); yyVal = new NewAnonymousType ((List<AnonymousTypeParameter>) yyVals[-1+yyTop], current_container, GetLocation (yyVals[-3+yyTop])); /* TODO: lbag comma location*/ lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 521: #line 3854 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = null; } break; case 523: #line 3860 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var a = new List<AnonymousTypeParameter> (4); a.Add ((AnonymousTypeParameter) yyVals[0+yyTop]); yyVal = a; } break; case 524: #line 3866 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var a = (List<AnonymousTypeParameter>) yyVals[-2+yyTop]; a.Add ((AnonymousTypeParameter) yyVals[0+yyTop]); yyVal = a; } break; case 525: #line 3875 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken)yyVals[-2+yyTop]; yyVal = new AnonymousTypeParameter ((Expression)yyVals[0+yyTop], lt.Value, lt.Location); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } break; case 526: #line 3881 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken)yyVals[0+yyTop]; yyVal = new AnonymousTypeParameter (new SimpleName (lt.Value, lt.Location), lt.Value, lt.Location); } break; case 527: #line 3887 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { MemberAccess ma = (MemberAccess) yyVals[0+yyTop]; yyVal = new AnonymousTypeParameter (ma, ma.Name, ma.Location); } break; case 528: #line 3892 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (746, lexer.Location, "Invalid anonymous type member declarator. Anonymous type members must be a member assignment, simple name or member access expression"); yyVal = null; } break; case 532: #line 3907 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ((ComposedTypeSpecifier) yyVals[-1+yyTop]).Next = (ComposedTypeSpecifier) yyVals[0+yyTop]; yyVal = yyVals[-1+yyTop]; } break; case 533: #line 3915 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = ComposedTypeSpecifier.CreateArrayDimension (1, GetLocation (yyVals[-1+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 534: #line 3920 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = ComposedTypeSpecifier.CreateArrayDimension ((int)yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 535: #line 3928 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = 2; } break; case 536: #line 3932 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = ((int) yyVals[-1+yyTop]) + 1; } break; case 537: #line 3939 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = null; } break; case 538: #line 3943 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 539: #line 3950 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var ai = new ArrayInitializer (0, GetLocation (yyVals[-1+yyTop])); ai.VariableDeclaration = current_variable; lbag.AddLocation (ai, GetLocation (yyVals[0+yyTop])); yyVal = ai; } break; case 540: #line 3957 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var ai = new ArrayInitializer ((List<Expression>) yyVals[-2+yyTop], GetLocation (yyVals[-3+yyTop])); ai.VariableDeclaration = current_variable; if (yyVals[-1+yyTop] != null) { lbag.AddLocation (ai, GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } else { lbag.AddLocation (ai, GetLocation (yyVals[0+yyTop])); } yyVal = ai; } break; case 541: #line 3971 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var list = new List<Expression> (4); list.Add ((Expression) yyVals[0+yyTop]); yyVal = list; } break; case 542: #line 3977 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var list = (List<Expression>) yyVals[-2+yyTop]; list.Add ((Expression) yyVals[0+yyTop]); yyVal = list; } break; case 543: #line 3986 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.TypeOfParsing = true; } break; case 544: #line 3990 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.TypeOfParsing = false; yyVal = new TypeOf ((FullNamedExpression) yyVals[-1+yyTop], GetLocation (yyVals[-4+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 547: #line 4001 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_TypeExpected (lexer.Location); yyVal = null; } break; case 548: #line 4009 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new SimpleName (lt.Value, (int) yyVals[0+yyTop], lt.Location); } break; case 549: #line 4015 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt1 = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var lt2 = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new QualifiedAliasMember (lt1.Value, lt2.Value, (int) yyVals[0+yyTop], lt1.Location); } break; case 550: #line 4022 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new MemberAccess ((Expression) yyVals[-2+yyTop], lt.Value, lt.Location); } break; case 551: #line 4028 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberAccess ((Expression) yyVals[-3+yyTop], lt.Value, (int) yyVals[0+yyTop], lt.Location); } break; case 552: #line 4034 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var te = ((MemberName) yyVals[-3+yyTop]).GetTypeExpression (); if (te.HasTypeArguments) Error_TypeExpected (GetLocation (yyVals[0+yyTop])); var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberAccess (te, lt.Value, (int) yyVals[0+yyTop], lt.Location); } break; case 553: #line 4046 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (lang_version < LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[0+yyTop]), "generics"); yyVal = yyVals[0+yyTop]; } break; case 554: #line 4056 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; if (lang_version == LanguageVersion.ISO_1) FeatureIsNotAvailable (lt.Location, "namespace alias qualifier"); yyVal = lt; } break; case 555: #line 4067 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new SizeOf ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 556: #line 4075 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new CheckedExpr ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 557: #line 4083 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new UnCheckedExpr ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 558: #line 4091 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberAccess (new Indirection ((Expression) yyVals[-3+yyTop], GetLocation (yyVals[-2+yyTop])), lt.Value, (TypeArguments) yyVals[0+yyTop], lt.Location); } break; case 559: #line 4099 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { start_anonymous (false, (ParametersCompiled) yyVals[0+yyTop], false, GetLocation (yyVals[-1+yyTop])); } break; case 560: #line 4103 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = end_anonymous ((ParametersBlock) yyVals[0+yyTop]); } break; case 561: #line 4107 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { start_anonymous (false, (ParametersCompiled) yyVals[0+yyTop], true, GetLocation (yyVals[-2+yyTop])); } break; case 562: #line 4111 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = end_anonymous ((ParametersBlock) yyVals[0+yyTop]); } break; case 563: #line 4118 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = ParametersCompiled.Undefined; } break; case 565: #line 4126 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; } break; case 566: #line 4130 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = 0; yyVal = yyVals[-1+yyTop]; } break; case 567: #line 4138 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (lang_version < LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[-3+yyTop]), "default value expression"); yyVal = new DefaultValueExpression ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 569: #line 4150 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Unary (Unary.Operator.LogicalNot, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 570: #line 4154 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Unary (Unary.Operator.OnesComplement, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 571: #line 4158 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Cast ((FullNamedExpression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } break; case 572: #line 4163 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (!async_block) { report.Error (1992, GetLocation (yyVals[-1+yyTop]), "The `await' operator can only be used when its containing method or lambda expression is marked with the `async' modifier"); } else { current_block.ParametersBlock.IsAsync = true; } yyVal = new Await ((Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 574: #line 4182 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Unary (Unary.Operator.UnaryPlus, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 575: #line 4186 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Unary (Unary.Operator.UnaryNegation, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 576: #line 4190 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new UnaryMutator (UnaryMutator.Mode.PreIncrement, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 577: #line 4194 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new UnaryMutator (UnaryMutator.Mode.PreDecrement, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 578: #line 4198 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Indirection ((Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 579: #line 4202 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Unary (Unary.Operator.AddressOf, (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 581: #line 4210 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.Multiply, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 582: #line 4215 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.Division, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 583: #line 4220 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.Modulus, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 585: #line 4229 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.Addition, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 586: #line 4234 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.Subtraction, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 587: #line 4238 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { /* Shift/Reduce conflict*/ yyVal = new Binary (Binary.Operator.Subtraction, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 588: #line 4243 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new As ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 589: #line 4247 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Is ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 591: #line 4255 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.LeftShift, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 592: #line 4260 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.RightShift, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 594: #line 4269 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.LessThan, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 595: #line 4274 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.GreaterThan, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 596: #line 4279 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.LessThanOrEqual, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 597: #line 4284 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.GreaterThanOrEqual, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 599: #line 4293 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.Equality, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 600: #line 4298 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.Inequality, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 602: #line 4307 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.BitwiseAnd, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 604: #line 4316 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.ExclusiveOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 606: #line 4325 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.BitwiseOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 608: #line 4334 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.LogicalAnd, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 610: #line 4343 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Binary (Binary.Operator.LogicalOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 612: #line 4352 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (lang_version < LanguageVersion.ISO_2) FeatureIsNotAvailable (GetLocation (yyVals[-1+yyTop]), "null coalescing operator"); yyVal = new Nullable.NullCoalescingOperator ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 614: #line 4363 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Conditional (new BooleanExpression ((Expression) yyVals[-4+yyTop]), (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop])); } break; case 615: #line 4371 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var potentialRolePlayer = yyVals[0+yyTop] as Expression; var memberExpression = yyVals[-2+yyTop] as MemberAccess; var simpleNameForRole = memberExpression != null ? memberExpression.LeftExpression as SimpleName : yyVals[-2+yyTop] as SimpleName; if(simpleNameForRole != null){ var role = FindField(simpleNameForRole.Name, GetLocation(yyVals[-2+yyTop])); var isRole = role != null && role.IsRole; if(current_method as Constructor != null){ /*might be assigning to a role*/ yyVal = new RoleAssign ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } else if(isRole) { report.Error (10000, GetLocation(potentialRolePlayer), "Roles can only be assigned to players in constructor"); } else{ yyVal = new SimpleAssign ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } } else { yyVal = new SimpleAssign ((Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } } break; case 616: #line 4391 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.Multiply, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 617: #line 4396 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.Division, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 618: #line 4401 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.Modulus, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 619: #line 4406 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.Addition, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 620: #line 4411 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.Subtraction, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 621: #line 4416 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.LeftShift, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 622: #line 4421 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.RightShift, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 623: #line 4426 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.BitwiseAnd, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 624: #line 4431 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.BitwiseOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 625: #line 4436 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new CompoundAssign ( Binary.Operator.ExclusiveOr, (Expression) yyVals[-2+yyTop], (Expression) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 626: #line 4444 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var pars = new List<Parameter> (4); pars.Add ((Parameter) yyVals[0+yyTop]); yyVal = pars; } break; case 627: #line 4451 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var pars = (List<Parameter>) yyVals[-2+yyTop]; Parameter p = (Parameter)yyVals[0+yyTop]; if (pars[0].GetType () != p.GetType ()) { report.Error (748, p.Location, "All lambda parameters must be typed either explicitly or implicitly"); } pars.Add (p); yyVal = pars; } break; case 628: #line 4465 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new Parameter ((FullNamedExpression) yyVals[-1+yyTop], lt.Value, (Parameter.Modifier) yyVals[-2+yyTop], null, lt.Location); } break; case 629: #line 4471 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new Parameter ((FullNamedExpression) yyVals[-1+yyTop], lt.Value, Parameter.Modifier.NONE, null, lt.Location); } break; case 630: #line 4477 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; yyVal = new ImplicitLambdaParameter (lt.Value, lt.Location); } break; case 631: #line 4484 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = ParametersCompiled.EmptyReadOnlyParameters; } break; case 632: #line 4485 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var pars_list = (List<Parameter>) yyVals[0+yyTop]; yyVal = new ParametersCompiled (pars_list.ToArray ()); } break; case 635: #line 4497 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { start_block (lexer.Location); } break; case 636: #line 4501 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Block b = end_block (lexer.Location); b.AddStatement (new ContextualReturn ((Expression) yyVals[0+yyTop])); yyVal = b; } break; case 638: #line 4511 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = EmptyExpression.Null; } break; case 639: #line 4519 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location); start_anonymous (true, new ParametersCompiled (p), false, lt.Location); } break; case 640: #line 4525 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = end_anonymous ((ParametersBlock) yyVals[0+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop])); } break; case 641: #line 4530 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location); start_anonymous (true, new ParametersCompiled (p), true, lt.Location); } break; case 642: #line 4536 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = end_anonymous ((ParametersBlock) yyVals[0+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop])); } break; case 643: #line 4541 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; } break; case 644: #line 4545 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = 0; start_anonymous (true, (ParametersCompiled) yyVals[-2+yyTop], false, GetLocation (yyVals[-4+yyTop])); } break; case 645: #line 4550 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = end_anonymous ((ParametersBlock) yyVals[0+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-2+yyTop])); } break; case 646: #line 4555 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; } break; case 647: #line 4559 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = 0; start_anonymous (true, (ParametersCompiled) yyVals[-2+yyTop], true, GetLocation (yyVals[-5+yyTop])); } break; case 648: #line 4564 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = end_anonymous ((ParametersBlock) yyVals[0+yyTop]); lbag.AddLocation (yyVal, GetLocation (yyVals[-7+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-2+yyTop])); } break; case 654: #line 4580 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new ArglistAccess (GetLocation (yyVals[0+yyTop])); } break; case 655: #line 4587 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new RefValueExpr ((Expression) yyVals[-3+yyTop], (FullNamedExpression) yyVals[-1+yyTop], GetLocation (yyVals[-5+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 656: #line 4592 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new RefTypeExpr ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 657: #line 4597 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new MakeRefExpr ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 659: #line 4609 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new BooleanExpression ((Expression) yyVals[0+yyTop]); } break; case 660: #line 4622 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.ConstraintsParsing = true; } break; case 661: #line 4626 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { MemberName name = MakeName ((MemberName) yyVals[0+yyTop]); Class c = new Class (current_namespace, current_class, name, (Modifiers) yyVals[-4+yyTop], (Attributes) yyVals[-5+yyTop]); if (((c.ModFlags & Modifiers.STATIC) != 0) && lang_version == LanguageVersion.ISO_1) { FeatureIsNotAvailable (c.Location, "static classes"); } push_current_class (c, yyVals[-3+yyTop]); } break; case 662: #line 4637 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.ConstraintsParsing = false; current_class.SetParameterInfo ((List<Constraints>) yyVals[0+yyTop]); lbag.AddMember (current_class, mod_locations, GetLocation (yyVals[-5+yyTop])); if (doc_support) { current_container.DocComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } lexer.parsing_modifiers = true; } break; case 663: #line 4651 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_declaration; if (doc_support) Lexer.doc_state = XmlCommentState.Allowed; } break; case 664: #line 4657 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lbag.AppendToMember (current_class, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); yyVal = pop_current_class (); } break; case 665: #line 4665 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = null; } break; case 666: #line 4667 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 667: #line 4672 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { mod_locations = null; yyVal = ModifierNone; lexer.parsing_modifiers = false; } break; case 668: #line 4678 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.parsing_modifiers = false; } break; case 670: #line 4686 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var m1 = (Modifiers) yyVals[-1+yyTop]; var m2 = (Modifiers) yyVals[0+yyTop]; if ((m1 & m2) != 0) { report.Error (1004, lexer.Location - ModifiersExtensions.Name (m2).Length, "Duplicate `{0}' modifier", ModifiersExtensions.Name (m2)); } else if ((m2 & Modifiers.AccessibilityMask) != 0 && (m1 & Modifiers.AccessibilityMask) != 0 && ((m2 | m1 & Modifiers.AccessibilityMask) != (Modifiers.PROTECTED | Modifiers.INTERNAL))) { report.Error (107, lexer.Location - ModifiersExtensions.Name (m2).Length, "More than one protection modifier specified"); } yyVal = m1 | m2; } break; case 671: #line 4705 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.NEW; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); if (current_container == module) report.Error (1530, GetLocation (yyVals[0+yyTop]), "Keyword `new' is not allowed on namespace elements"); } break; case 672: #line 4713 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.PUBLIC; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 673: #line 4718 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.PROTECTED; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 674: #line 4723 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.INTERNAL; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 675: #line 4728 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.PRIVATE; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 676: #line 4733 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.ABSTRACT; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 677: #line 4738 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.SEALED; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 678: #line 4743 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.STATIC; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 679: #line 4748 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.READONLY; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 680: #line 4753 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.VIRTUAL; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 681: #line 4758 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.OVERRIDE; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 682: #line 4763 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.EXTERN; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 683: #line 4768 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.VOLATILE; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 684: #line 4773 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.UNSAFE; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); if (!settings.Unsafe) Error_UnsafeCodeNotAllowed (GetLocation (yyVals[0+yyTop])); } break; case 685: #line 4780 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Modifiers.ASYNC; StoreModifierLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 687: #line 4789 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_container.AddBasesForPart (current_class, (List<FullNamedExpression>) yyVals[0+yyTop]); } break; case 689: #line 4797 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 690: #line 4801 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = null; } break; case 691: #line 4809 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var constraints = new List<Constraints> (1); constraints.Add ((Constraints) yyVals[0+yyTop]); yyVal = constraints; } break; case 692: #line 4815 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var constraints = (List<Constraints>) yyVals[-1+yyTop]; Constraints new_constraint = (Constraints)yyVals[0+yyTop]; foreach (Constraints c in constraints) { if (new_constraint.TypeParameter.Value == c.TypeParameter.Value) { report.Error (409, new_constraint.Location, "A constraint clause has already been specified for type parameter `{0}'", new_constraint.TypeParameter.Value); } } constraints.Add (new_constraint); yyVal = constraints; } break; case 693: #line 4834 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; yyVal = new Constraints (new SimpleMemberName (lt.Value, lt.Location), (List<FullNamedExpression>) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop])); } break; case 694: #line 4842 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var constraints = new List<FullNamedExpression> (1); constraints.Add ((FullNamedExpression) yyVals[0+yyTop]); yyVal = constraints; } break; case 695: #line 4848 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var constraints = (List<FullNamedExpression>) yyVals[-2+yyTop]; var prev = constraints [constraints.Count - 1] as SpecialContraintExpr; if (prev != null && (prev.Constraint & SpecialConstraint.Constructor) != 0) { report.Error (401, GetLocation (yyVals[-1+yyTop]), "The `new()' constraint must be the last constraint specified"); } prev = yyVals[0+yyTop] as SpecialContraintExpr; if (prev != null) { if ((prev.Constraint & (SpecialConstraint.Class | SpecialConstraint.Struct)) != 0) { report.Error (449, prev.Location, "The `class' or `struct' constraint must be the first constraint specified"); } else { prev = constraints [0] as SpecialContraintExpr; if (prev != null && (prev.Constraint & SpecialConstraint.Struct) != 0) { report.Error (451, GetLocation (yyVals[0+yyTop]), "The `new()' constraint cannot be used with the `struct' constraint"); } } } constraints.Add ((FullNamedExpression) yyVals[0+yyTop]); yyVal = constraints; } break; case 696: #line 4874 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] is ComposedCast) report.Error (706, GetLocation (yyVals[0+yyTop]), "Invalid constraint type `{0}'", ((ComposedCast)yyVals[0+yyTop]).GetSignatureForError ()); yyVal = yyVals[0+yyTop]; } break; case 697: #line 4881 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new SpecialContraintExpr (SpecialConstraint.Constructor, GetLocation (yyVals[-2+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 698: #line 4886 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new SpecialContraintExpr (SpecialConstraint.Class, GetLocation (yyVals[0+yyTop])); } break; case 699: #line 4890 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new SpecialContraintExpr (SpecialConstraint.Struct, GetLocation (yyVals[0+yyTop])); } break; case 700: #line 4897 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Variance.None; } break; case 701: #line 4901 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (lang_version <= LanguageVersion.V_3) FeatureIsNotAvailable (lexer.Location, "generic type variance"); yyVal = yyVals[0+yyTop]; } break; case 702: #line 4911 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Variance.Covariant; } break; case 703: #line 4915 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = Variance.Contravariant; } break; case 704: #line 4935 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ++lexer.parsing_block; start_block (GetLocation (yyVals[0+yyTop])); } break; case 705: #line 4940 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 706: #line 4947 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; yyVal = end_block (GetLocation (yyVals[0+yyTop])); } break; case 707: #line 4952 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; yyVal = end_block (lexer.Location); } break; case 708: #line 4961 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ++lexer.parsing_block; current_block.StartLocation = GetLocation (yyVals[0+yyTop]); } break; case 709: #line 4966 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; yyVal = end_block (GetLocation (yyVals[0+yyTop])); } break; case 714: #line 4984 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block.AddStatement ((Statement) yyVals[0+yyTop]); } break; case 715: #line 4988 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block.AddStatement ((Statement) yyVals[0+yyTop]); } break; case 717: #line 4993 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = null; } break; case 720: #line 5012 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block.AddStatement ((Statement) yyVals[0+yyTop]); } break; case 721: #line 5016 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block.AddStatement ((Statement) yyVals[0+yyTop]); } break; case 750: #line 5057 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (1023, GetLocation (yyVals[0+yyTop]), "An embedded statement may not be a declaration or labeled statement"); yyVal = null; } break; case 751: #line 5062 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (1023, GetLocation (yyVals[0+yyTop]), "An embedded statement may not be a declaration or labeled statement"); yyVal = null; } break; case 752: #line 5067 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = new EmptyStatement (GetLocation (yyVals[0+yyTop])); } break; case 753: #line 5075 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { /* Uses lexer.Location because semicolon location is not kept in quick mode*/ yyVal = new EmptyStatement (lexer.Location); } break; case 754: #line 5083 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; LabeledStatement labeled = new LabeledStatement (lt.Value, current_block, lt.Location); current_block.AddLabel (labeled); current_block.AddStatement (labeled); } break; case 757: #line 5096 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[-1+yyTop] is VarExpr) yyVals[-1+yyTop] = new SimpleName ("var", ((VarExpr) yyVals[-1+yyTop]).Location); yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], (ComposedTypeSpecifier) yyVals[0+yyTop]); } break; case 758: #line 5112 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { /* 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 namespace_or_type_name (which is all we need*/ /* really) two shift/reduces appear.*/ /* */ /* So the super-trick is that primary_expression*/ /* can only be either a SimpleName or a MemberAccess. */ /* The MemberAccess case arises when you have a fully qualified type-name like :*/ /* Foo.Bar.Blah i;*/ /* SimpleName is when you have*/ /* Blah i;*/ Expression expr = (Expression) yyVals[-1+yyTop]; if (yyVals[0+yyTop] == null) { SimpleName sn = expr as SimpleName; if (sn != null && sn.Name == "var") yyVal = new VarExpr (sn.Location); else yyVal = yyVals[-1+yyTop]; } else if (expr is ATypeNameExpression) { yyVal = new ComposedCast ((ATypeNameExpression)expr, (ComposedTypeSpecifier) yyVals[0+yyTop]); } else { Error_ExpectingTypeName (expr); yyVal = null; } } break; case 759: #line 5142 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ATypeNameExpression expr = yyVals[-1+yyTop] as ATypeNameExpression; if (expr != null) { yyVal = new ComposedCast (expr, (ComposedTypeSpecifier) yyVals[0+yyTop]); } else { Error_ExpectingTypeName ((Expression)yyVals[-1+yyTop]); yyVal = expr; } } break; case 760: #line 5153 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] == null) yyVal = yyVals[-1+yyTop]; else yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], (ComposedTypeSpecifier) yyVals[0+yyTop]); } break; case 761: #line 5160 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new ComposedCast ((FullNamedExpression) yyVals[-1+yyTop], (ComposedTypeSpecifier) yyVals[0+yyTop]); } break; case 762: #line 5164 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new ComposedCast (new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[-1+yyTop])), (ComposedTypeSpecifier) yyVals[0+yyTop]); } break; case 763: #line 5168 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Expression.Error_VoidInvalidInTheContext (GetLocation (yyVals[0+yyTop]), report); yyVal = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation (yyVals[0+yyTop])); } break; case 765: #line 5177 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ((ComposedTypeSpecifier) yyVals[-1+yyTop]).Next = (ComposedTypeSpecifier) yyVals[0+yyTop]; yyVal = yyVals[-1+yyTop]; } break; case 766: #line 5185 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = ComposedTypeSpecifier.CreatePointer (GetLocation (yyVals[0+yyTop])); } break; case 768: #line 5193 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (async_block) { report.Error (4003, GetLocation (yyVals[0+yyTop]), "`await' cannot be used as an identifier within an async method or lambda expression"); yyVal = Tokenizer.LocatedToken.Create ("await", GetLocation (yyVals[0+yyTop])); } } break; case 769: #line 5203 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; var li = new LocalVariable (current_block, lt.Value, lt.Location); current_block.AddLocalName (li); current_variable = new BlockVariableDeclaration ((FullNamedExpression) yyVals[-1+yyTop], li); } break; case 770: #line 5210 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = current_variable; current_variable = null; lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 771: #line 5216 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.Constant, lt.Location); current_block.AddLocalName (li); current_variable = new BlockConstantDeclaration ((FullNamedExpression) yyVals[-1+yyTop], li); } break; case 772: #line 5223 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = current_variable; current_variable = null; lbag.AddLocation (yyVal, GetLocation (yyVals[-6+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 774: #line 5233 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_variable.Initializer = (Expression) yyVals[0+yyTop]; /* TODO: lbag*/ } break; case 775: #line 5238 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyToken == Token.OPEN_BRACKET_EXPR) { report.Error (650, lexer.Location, "Syntax error, bad array declarator. To declare a managed array the rank specifier precedes the variable's identifier. To declare a fixed size buffer field, use the fixed keyword before the field type"); } else { Error_SyntaxError (yyToken); } } break; case 779: #line 5256 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { foreach (var d in current_variable.Declarators) { if (d.Initializer == null) Error_MissingInitializer (d.Variable.Location); } } break; case 782: #line 5271 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; var li = new LocalVariable (current_variable.Variable, lt.Value, lt.Location); var d = new BlockVariableDeclaration.Declarator (li, null); current_variable.AddDeclarator (d); current_block.AddLocalName (li); lbag.AddLocation (d, GetLocation (yyVals[-1+yyTop])); } break; case 783: #line 5280 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var li = new LocalVariable (current_variable.Variable, lt.Value, lt.Location); var d = new BlockVariableDeclaration.Declarator (li, (Expression) yyVals[0+yyTop]); current_variable.AddDeclarator (d); current_block.AddLocalName (li); lbag.AddLocation (d, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); } break; case 784: #line 5292 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (145, lexer.Location, "A const field requires a value to be provided"); } break; case 785: #line 5296 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_variable.Initializer = (Expression) yyVals[0+yyTop]; } break; case 790: #line 5313 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.Constant, lt.Location); var d = new BlockVariableDeclaration.Declarator (li, (Expression) yyVals[0+yyTop]); current_variable.AddDeclarator (d); current_block.AddLocalName (li); lbag.AddLocation (d, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); } break; case 792: #line 5326 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new StackAlloc ((Expression) yyVals[-3+yyTop], (Expression) yyVals[-1+yyTop], GetLocation (yyVals[-4+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 793: #line 5331 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (1575, GetLocation (yyVals[-1+yyTop]), "A stackalloc expression requires [] after type"); yyVal = new StackAlloc ((Expression) yyVals[0+yyTop], null, GetLocation (yyVals[-1+yyTop])); } break; case 794: #line 5339 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[-1+yyTop]; lbag.AddStatement (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 795: #line 5343 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[-1+yyTop]; } break; case 796: #line 5347 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[-1+yyTop]; } break; case 797: #line 5348 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[-1+yyTop]; } break; case 798: #line 5357 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ExpressionStatement s = yyVals[0+yyTop] as ExpressionStatement; if (s == null) { Expression.Error_InvalidExpressionStatement (report, GetLocation (yyVals[0+yyTop])); yyVal = new StatementExpression (EmptyExpressionStatement.Instance); } else { yyVal = new StatementExpression (s); } } break; case 799: #line 5370 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Expression expr = (Expression) yyVals[0+yyTop]; ExpressionStatement s; s = new OptionalAssign (new SimpleName ("$retval", lexer.Location), expr, lexer.Location); yyVal = new StatementExpression (s); } break; case 800: #line 5378 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = new EmptyStatement (GetLocation (yyVals[0+yyTop])); } break; case 803: #line 5392 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); yyVal = new If ((BooleanExpression) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop], GetLocation (yyVals[-4+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); } break; case 804: #line 5401 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new If ((BooleanExpression) yyVals[-4+yyTop], (Statement) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop], GetLocation (yyVals[-6+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); if (yyVals[-2+yyTop] is EmptyStatement) Warning_EmptyStatement (GetLocation (yyVals[-2+yyTop])); if (yyVals[0+yyTop] is EmptyStatement) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); } break; case 805: #line 5414 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { start_block (GetLocation (yyVals[0+yyTop])); } break; case 806: #line 5418 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Switch ((Expression) yyVals[-5+yyTop], (ExplicitBlock) current_block.Explicit, (List<SwitchSection>) yyVals[-1+yyTop], GetLocation (yyVals[-7+yyTop])); end_block (GetLocation (yyVals[0+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-6+yyTop]), GetLocation (yyVals[-4+yyTop])); } break; case 807: #line 5427 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Warning (1522, 1, current_block.StartLocation, "Empty switch block"); yyVal = new List<SwitchSection> (); } break; case 809: #line 5436 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var sections = new List<SwitchSection> (4); sections.Add ((SwitchSection) yyVals[0+yyTop]); yyVal = sections; } break; case 810: #line 5443 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var sections = (List<SwitchSection>) yyVals[-1+yyTop]; sections.Add ((SwitchSection) yyVals[0+yyTop]); yyVal = sections; } break; case 811: #line 5450 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = new List<SwitchSection> (); } break; case 812: #line 5458 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block = current_block.CreateSwitchBlock (lexer.Location); } break; case 813: #line 5462 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new SwitchSection ((List<SwitchLabel>) yyVals[-2+yyTop], current_block); } break; case 814: #line 5469 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var labels = new List<SwitchLabel> (2); labels.Add ((SwitchLabel) yyVals[0+yyTop]); yyVal = labels; } break; case 815: #line 5476 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var labels = (List<SwitchLabel>) (yyVals[-1+yyTop]); labels.Add ((SwitchLabel) yyVals[0+yyTop]); yyVal = labels; } break; case 816: #line 5486 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new SwitchLabel ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); lbag.AddLocation (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 817: #line 5491 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new SwitchLabel (null, GetLocation (yyVals[0+yyTop])); } break; case 822: #line 5505 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); yyVal = new While ((BooleanExpression) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop], GetLocation (yyVals[-4+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); } break; case 823: #line 5517 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Do ((Statement) yyVals[-5+yyTop], (BooleanExpression) yyVals[-2+yyTop], GetLocation (yyVals[-6+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 824: #line 5525 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { start_block (GetLocation (yyVals[0+yyTop])); current_block.IsCompilerGenerated = true; } break; case 825: #line 5530 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 826: #line 5541 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); For f = new For ((Statement) yyVals[-6+yyTop], (BooleanExpression) yyVals[-4+yyTop], (Statement) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop], GetLocation (yyVals[-9+yyTop])); current_block.AddStatement (f); lbag.AddStatement (f, current_block.StartLocation, GetLocation (yyVals[-5+yyTop]), GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); yyVal = end_block (GetLocation (yyVals[-5+yyTop])); } break; case 827: #line 5553 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = end_block (current_block.StartLocation); } break; case 828: #line 5560 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new EmptyStatement (lexer.Location); } break; case 830: #line 5566 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; var li = new LocalVariable (current_block, lt.Value, lt.Location); current_block.AddLocalName (li); current_variable = new BlockVariableDeclaration ((FullNamedExpression) yyVals[-1+yyTop], li); } break; case 831: #line 5573 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = current_variable; current_variable = null; } break; case 833: #line 5581 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = null; } break; case 835: #line 5586 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new EmptyStatement (lexer.Location); } break; case 839: #line 5597 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var sl = yyVals[-2+yyTop] as StatementList; if (sl == null) { sl = new StatementList ((Statement) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop]); lbag.AddStatement (sl, GetLocation (yyVals[-1+yyTop])); } else { sl.Add ((Statement) yyVals[0+yyTop]); lbag.AppendTo (sl, GetLocation (yyVals[-1+yyTop])); } yyVal = sl; } break; case 840: #line 5613 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (230, GetLocation (yyVals[-5+yyTop]), "Type and identifier are both required in a foreach statement"); yyVal = null; } break; case 841: #line 5618 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { start_block (GetLocation (yyVals[-5+yyTop])); current_block.IsCompilerGenerated = true; var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.ForeachVariable | LocalVariable.Flags.Used, lt.Location); current_block.AddLocalName (li); yyVal = li; } break; case 842: #line 5628 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); Foreach f = new Foreach ((Expression) yyVals[-6+yyTop], (LocalVariable) yyVals[-1+yyTop], (Expression) yyVals[-3+yyTop], (Statement) yyVals[0+yyTop], GetLocation (yyVals[-8+yyTop])); current_block.AddStatement (f); lbag.AddStatement (f, GetLocation (yyVals[-7+yyTop]), GetLocation (yyVals[-4+yyTop]), GetLocation (yyVals[-2+yyTop])); yyVal = end_block (GetLocation (yyVals[-2+yyTop])); } break; case 849: #line 5651 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Break (GetLocation (yyVals[-1+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 850: #line 5659 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Continue (GetLocation (yyVals[-1+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 851: #line 5667 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new Goto (lt.Value, lt.Location); lbag.AddStatement (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 852: #line 5673 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new GotoCase ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 853: #line 5678 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new GotoDefault (GetLocation (yyVals[-2+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 854: #line 5686 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Return ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 855: #line 5694 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Throw ((Expression) yyVals[-1+yyTop], GetLocation (yyVals[-2+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[0+yyTop])); } break; case 856: #line 5702 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; string s = lt.Value; if (s != "yield"){ report.Error (1003, lt.Location, "; expected"); } else if (yyVals[-1+yyTop] == null) { report.Error (1627, GetLocation (yyVals[0+yyTop]), "Expression expected after yield return"); } else if (lang_version == LanguageVersion.ISO_1){ FeatureIsNotAvailable (lt.Location, "iterators"); } current_block.ParametersBlock.TopBlock.IsIterator = true; yyVal = new Yield ((Expression) yyVals[-1+yyTop], lt.Location); lbag.AddStatement (yyVal, GetLocation (yyVals[-2+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 857: #line 5718 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; string s = lt.Value; if (s != "yield"){ report.Error (1003, lt.Location, "; expected"); } else if (lang_version == LanguageVersion.ISO_1){ FeatureIsNotAvailable (lt.Location, "iterators"); } current_block.ParametersBlock.TopBlock.IsIterator = true; yyVal = new YieldBreak (lt.Location); lbag.AddStatement (yyVal, GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } break; case 860: #line 5740 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TryCatch ((Block) yyVals[-1+yyTop], (List<Catch>) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop]), false); } break; case 861: #line 5744 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TryFinally ((Statement) yyVals[-2+yyTop], (Block) yyVals[0+yyTop], GetLocation (yyVals[-3+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-1+yyTop])); } break; case 862: #line 5749 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new TryFinally (new TryCatch ((Block) yyVals[-3+yyTop], (List<Catch>) yyVals[-2+yyTop], GetLocation (yyVals[-4+yyTop]), true), (Block) yyVals[0+yyTop], GetLocation (yyVals[-4+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-1+yyTop])); } break; case 863: #line 5754 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { report.Error (1524, GetLocation (yyVals[-2+yyTop]), "Expected catch or finally"); yyVal = null; } break; case 864: #line 5762 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var l = new List<Catch> (2); l.Add ((Catch) yyVals[0+yyTop]); yyVal = l; } break; case 865: #line 5769 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var l = (List<Catch>) yyVals[-1+yyTop]; Catch c = (Catch) yyVals[0+yyTop]; if (l [0].IsGeneral) { report.Error (1017, c.loc, "Try statement already has an empty catch block"); } else { if (c.IsGeneral) l.Insert (0, c); else l.Add (c); } yyVal = l; } break; case 868: #line 5793 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Catch ((Block) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 869: #line 5797 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { start_block (GetLocation (yyVals[-3+yyTop])); var c = new Catch (current_block, GetLocation (yyVals[-4+yyTop])); c.TypeExpression = (FullNamedExpression) yyVals[-2+yyTop]; if (yyVals[-1+yyTop] != null) { var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; c.Variable = new LocalVariable (current_block, lt.Value, lt.Location); current_block.AddLocalName (c.Variable); } lbag.AddLocation (c, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[0+yyTop])); yyVal = c; } break; case 870: #line 5812 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[-1+yyTop]; } break; case 871: #line 5816 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyToken == Token.CLOSE_PARENS) { report.Error (1015, lexer.Location, "A type that derives from `System.Exception', `object', or `string' expected"); } else { Error_SyntaxError (yyToken); } yyVal = new Catch (null, GetLocation (yyVals[-2+yyTop])); } break; case 872: #line 5830 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Checked ((Block) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 873: #line 5837 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Unchecked ((Block) yyVals[0+yyTop], GetLocation (yyVals[-1+yyTop])); } break; case 874: #line 5844 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (!settings.Unsafe) Error_UnsafeCodeNotAllowed (GetLocation (yyVals[0+yyTop])); } break; case 875: #line 5847 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Unsafe ((Block) yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); } break; case 876: #line 5854 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); yyVal = new Lock ((Expression) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop], GetLocation (yyVals[-4+yyTop])); lbag.AddStatement (yyVal, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); } break; case 877: #line 5865 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { start_block (GetLocation (yyVals[-2+yyTop])); current_block.IsCompilerGenerated = true; var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; 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) yyVals[-1+yyTop], li); } break; case 878: #line 5875 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = current_variable; current_variable = null; } break; case 879: #line 5880 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); Fixed f = new Fixed ((Fixed.VariableDeclaration) yyVals[-1+yyTop], (Statement) yyVals[0+yyTop], GetLocation (yyVals[-9+yyTop])); current_block.AddStatement (f); yyVal = end_block (GetLocation (yyVals[-2+yyTop])); } break; case 880: #line 5892 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { start_block (GetLocation (yyVals[-2+yyTop])); current_block.IsCompilerGenerated = true; var lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; 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) yyVals[-1+yyTop], li); } break; case 881: #line 5902 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = current_variable; current_variable = null; } break; case 882: #line 5907 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); Using u = new Using ((Using.VariableDeclaration) yyVals[-1+yyTop], (Statement) yyVals[0+yyTop], GetLocation (yyVals[-9+yyTop])); current_block.AddStatement (u); yyVal = end_block (GetLocation (yyVals[-2+yyTop])); } break; case 883: #line 5916 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[0+yyTop] is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE) Warning_EmptyStatement (GetLocation (yyVals[0+yyTop])); Using u = new Using ((Expression) yyVals[-2+yyTop], (Statement) yyVals[0+yyTop], GetLocation (yyVals[-4+yyTop])); lbag.AddStatement (u, GetLocation (yyVals[-3+yyTop]), GetLocation (yyVals[-1+yyTop])); yyVal = u; } break; case 884: #line 5928 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_MissingInitializer (lexer.Location); } break; case 885: #line 5932 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_variable.Initializer = (Expression) yyVals[0+yyTop]; yyVal = current_variable; } break; case 886: #line 5943 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.query_parsing = false; Linq.AQueryClause from = yyVals[-1+yyTop] as Linq.AQueryClause; from.Tail.Next = (Linq.AQueryClause)yyVals[0+yyTop]; yyVal = from; current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; } break; case 887: #line 5955 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Linq.AQueryClause from = yyVals[-1+yyTop] as Linq.AQueryClause; from.Tail.Next = (Linq.AQueryClause)yyVals[0+yyTop]; yyVal = from; current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; } break; case 888: #line 5966 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { lexer.query_parsing = false; yyVal = yyVals[-1+yyTop]; current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; } break; case 889: #line 5973 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[-1+yyTop]; current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; } break; case 890: #line 5982 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block = new Linq.QueryBlock (current_block, lexer.Location); var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var rv = new Linq.RangeVariable (lt.Value, lt.Location); yyVal = new Linq.QueryExpression (new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)yyVals[0+yyTop], rv, GetLocation (yyVals[-3+yyTop]))); } break; case 891: #line 5990 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block = new Linq.QueryBlock (current_block, lexer.Location); var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var rv = new Linq.RangeVariable (lt.Value, lt.Location); yyVal = new Linq.QueryExpression ( new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)yyVals[0+yyTop], rv, GetLocation (yyVals[-4+yyTop])) { IdentifierType = (FullNamedExpression)yyVals[-3+yyTop] } ); } break; case 892: #line 6005 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block = new Linq.QueryBlock (current_block, lexer.Location); var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var rv = new Linq.RangeVariable (lt.Value, lt.Location); yyVal = new Linq.QueryExpression (new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)yyVals[0+yyTop], rv, GetLocation (yyVals[-3+yyTop]))); } break; case 893: #line 6013 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block = new Linq.QueryBlock (current_block, lexer.Location); var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var rv = new Linq.RangeVariable (lt.Value, lt.Location); yyVal = new Linq.QueryExpression ( new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)yyVals[0+yyTop], rv, GetLocation (yyVals[-4+yyTop])) { IdentifierType = (FullNamedExpression)yyVals[-3+yyTop] } ); } break; case 894: #line 6028 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block = new Linq.QueryBlock (current_block, lexer.Location); } break; case 895: #line 6032 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; var sn = new Linq.RangeVariable (lt.Value, lt.Location); yyVal = new Linq.SelectMany ((Linq.QueryBlock)current_block, sn, (Expression)yyVals[0+yyTop], GetLocation (yyVals[-4+yyTop])); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; ((Linq.QueryBlock)current_block).AddRangeVariable (sn); } break; case 896: #line 6043 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block = new Linq.QueryBlock (current_block, lexer.Location); } break; case 897: #line 6047 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; var sn = new Linq.RangeVariable (lt.Value, lt.Location); yyVal = new Linq.SelectMany ((Linq.QueryBlock)current_block, sn, (Expression)yyVals[0+yyTop], GetLocation (yyVals[-5+yyTop])) { IdentifierType = (FullNamedExpression)yyVals[-4+yyTop] }; current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; ((Linq.QueryBlock)current_block).AddRangeVariable (sn); } break; case 898: #line 6064 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Linq.AQueryClause head = (Linq.AQueryClause)yyVals[-1+yyTop]; if (yyVals[0+yyTop] != null) head.Next = (Linq.AQueryClause)yyVals[0+yyTop]; if (yyVals[-2+yyTop] != null) { Linq.AQueryClause clause = (Linq.AQueryClause)yyVals[-2+yyTop]; clause.Tail.Next = head; head = clause; } yyVal = head; } break; case 900: #line 6080 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { Error_SyntaxError (yyToken); yyVal = null; } break; case 901: #line 6088 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block = new Linq.QueryBlock (current_block, lexer.Location); } break; case 902: #line 6092 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Linq.Select ((Linq.QueryBlock)current_block, (Expression)yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; } break; case 903: #line 6099 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (linq_clause_blocks == null) linq_clause_blocks = new Stack<Linq.QueryBlock> (); current_block = new Linq.QueryBlock (current_block, lexer.Location); linq_clause_blocks.Push ((Linq.QueryBlock)current_block); } break; case 904: #line 6107 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; current_block = new Linq.QueryBlock (current_block, lexer.Location); } break; case 905: #line 6114 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Linq.GroupBy ((Linq.QueryBlock)current_block, (Expression)yyVals[-3+yyTop], linq_clause_blocks.Pop (), (Expression)yyVals[0+yyTop], GetLocation (yyVals[-5+yyTop])); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; } break; case 909: #line 6130 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ((Linq.AQueryClause)yyVals[-1+yyTop]).Tail.Next = (Linq.AQueryClause)yyVals[0+yyTop]; yyVal = yyVals[-1+yyTop]; } break; case 915: #line 6146 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block = new Linq.QueryBlock (current_block, lexer.Location); } break; case 916: #line 6150 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var lt = (Tokenizer.LocatedToken) yyVals[-3+yyTop]; var sn = new Linq.RangeVariable (lt.Value, lt.Location); yyVal = new Linq.Let ((Linq.QueryBlock) current_block, sn, (Expression)yyVals[0+yyTop], GetLocation (yyVals[-4+yyTop])); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; ((Linq.QueryBlock)current_block).AddRangeVariable (sn); } break; case 917: #line 6164 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block = new Linq.QueryBlock (current_block, lexer.Location); } break; case 918: #line 6168 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Linq.Where ((Linq.QueryBlock)current_block, (Expression)yyVals[0+yyTop], GetLocation (yyVals[-2+yyTop])); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; } break; case 919: #line 6178 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (linq_clause_blocks == null) linq_clause_blocks = new Stack<Linq.QueryBlock> (); current_block = new Linq.QueryBlock (current_block, lexer.Location); linq_clause_blocks.Push ((Linq.QueryBlock) current_block); } break; case 920: #line 6186 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; current_block = new Linq.QueryBlock (current_block, lexer.Location); linq_clause_blocks.Push ((Linq.QueryBlock) current_block); } break; case 921: #line 6194 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop])); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; current_block = new Linq.QueryBlock (current_block, lexer.Location); } break; case 922: #line 6202 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop])); current_block.SetEndLocation (lexer.Location); var outer_selector = linq_clause_blocks.Pop (); var block = linq_clause_blocks.Pop (); var lt = (Tokenizer.LocatedToken) yyVals[-10+yyTop]; var sn = new Linq.RangeVariable (lt.Value, lt.Location); Linq.RangeVariable into; if (yyVals[0+yyTop] == null) { into = sn; yyVal = new Linq.Join (block, sn, (Expression)yyVals[-7+yyTop], outer_selector, (Linq.QueryBlock) current_block, GetLocation (yyVals[-11+yyTop])); } else { /**/ /* Set equals right side parent to beginning of linq query, it is not accessible therefore cannot cause name collisions*/ /**/ var parent = block.Parent; while (parent is Linq.QueryBlock) { parent = parent.Parent; } current_block.Parent = parent; ((Linq.QueryBlock)current_block).AddRangeVariable (sn); lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; into = new Linq.RangeVariable (lt.Value, lt.Location); yyVal = new Linq.GroupJoin (block, sn, (Expression)yyVals[-7+yyTop], outer_selector, (Linq.QueryBlock) current_block, into, GetLocation (yyVals[-11+yyTop])); } current_block = block.Parent; ((Linq.QueryBlock)current_block).AddRangeVariable (into); } break; case 923: #line 6238 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (linq_clause_blocks == null) linq_clause_blocks = new Stack<Linq.QueryBlock> (); current_block = new Linq.QueryBlock (current_block, lexer.Location); linq_clause_blocks.Push ((Linq.QueryBlock) current_block); } break; case 924: #line 6246 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; current_block = new Linq.QueryBlock (current_block, lexer.Location); linq_clause_blocks.Push ((Linq.QueryBlock) current_block); } break; case 925: #line 6254 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop])); current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; current_block = new Linq.QueryBlock (current_block, lexer.Location); } break; case 926: #line 6262 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block.AddStatement (new ContextualReturn ((Expression) yyVals[-1+yyTop])); current_block.SetEndLocation (lexer.Location); var outer_selector = linq_clause_blocks.Pop (); var block = linq_clause_blocks.Pop (); var lt = (Tokenizer.LocatedToken) yyVals[-10+yyTop]; var sn = new Linq.RangeVariable (lt.Value, lt.Location); Linq.RangeVariable into; if (yyVals[0+yyTop] == null) { into = sn; yyVal = new Linq.Join (block, sn, (Expression)yyVals[-7+yyTop], outer_selector, (Linq.QueryBlock) current_block, GetLocation (yyVals[-12+yyTop])) { IdentifierType = (FullNamedExpression)yyVals[-11+yyTop] }; } else { /**/ /* Set equals right side parent to beginning of linq query, it is not accessible therefore cannot cause name collisions*/ /**/ var parent = block.Parent; while (parent is Linq.QueryBlock) { parent = parent.Parent; } current_block.Parent = parent; ((Linq.QueryBlock)current_block).AddRangeVariable (sn); lt = (Tokenizer.LocatedToken) yyVals[0+yyTop]; into = new Linq.RangeVariable (lt.Value, lt.Location); /* TODO:*/ yyVal = new Linq.GroupJoin (block, sn, (Expression)yyVals[-7+yyTop], outer_selector, (Linq.QueryBlock) current_block, into, GetLocation (yyVals[-12+yyTop])) { IdentifierType = (FullNamedExpression)yyVals[-11+yyTop] }; } current_block = block.Parent; ((Linq.QueryBlock)current_block).AddRangeVariable (into); } break; case 928: #line 6306 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[0+yyTop]; } break; case 929: #line 6313 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block = new Linq.QueryBlock (current_block, lexer.Location); } break; case 930: #line 6317 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; yyVal = yyVals[0+yyTop]; } break; case 932: #line 6328 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; current_block = new Linq.QueryBlock (current_block, lexer.Location); } break; case 933: #line 6335 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ((Linq.AQueryClause)yyVals[-3+yyTop]).Next = (Linq.AQueryClause)yyVals[0+yyTop]; yyVal = yyVals[-3+yyTop]; } break; case 935: #line 6344 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_block.SetEndLocation (lexer.Location); current_block = current_block.Parent; current_block = new Linq.QueryBlock ((Linq.QueryBlock) current_block, lexer.Location); } break; case 936: #line 6351 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { ((Linq.AQueryClause)yyVals[-3+yyTop]).Tail.Next = (Linq.AQueryClause)yyVals[0+yyTop]; yyVal = yyVals[-3+yyTop]; } break; case 937: #line 6359 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Linq.OrderByAscending ((Linq.QueryBlock) current_block, (Expression)yyVals[0+yyTop]); } break; case 938: #line 6363 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Linq.OrderByAscending ((Linq.QueryBlock) current_block, (Expression)yyVals[-1+yyTop]); } break; case 939: #line 6367 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Linq.OrderByDescending ((Linq.QueryBlock) current_block, (Expression)yyVals[-1+yyTop]); } break; case 940: #line 6374 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Linq.ThenByAscending ((Linq.QueryBlock) current_block, (Expression)yyVals[0+yyTop]); } break; case 941: #line 6378 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Linq.ThenByAscending ((Linq.QueryBlock) current_block, (Expression)yyVals[-1+yyTop]); } break; case 942: #line 6382 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new Linq.ThenByDescending ((Linq.QueryBlock) current_block, (Expression)yyVals[-1+yyTop]); } break; case 944: #line 6391 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { /* query continuation block is not linked with query block but with block*/ /* before. This means each query can use same range variable names for*/ /* different identifiers.*/ current_block.SetEndLocation (GetLocation (yyVals[-1+yyTop])); current_block = current_block.Parent; current_block = new Linq.QueryBlock (current_block, lexer.Location); if (linq_clause_blocks == null) linq_clause_blocks = new Stack<Linq.QueryBlock> (); linq_clause_blocks.Push ((Linq.QueryBlock) current_block); } break; case 945: #line 6407 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var current_block = linq_clause_blocks.Pop (); var lt = (Tokenizer.LocatedToken) yyVals[-2+yyTop]; var rv = new Linq.RangeVariable (lt.Value, lt.Location); yyVal = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, null, rv, GetLocation (yyVals[-3+yyTop])) { next = (Linq.AQueryClause)yyVals[0+yyTop] }; } break; case 948: #line 6434 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { current_container = new Class (current_namespace, current_class, new MemberName ("<InteractiveExpressionClass>"), Modifiers.PUBLIC, null); current_class = current_container; /* (ref object retval)*/ Parameter [] mpar = new Parameter [1]; mpar [0] = new Parameter (new TypeExpression (compiler.BuiltinTypes.Object, Location.Null), "$retval", Parameter.Modifier.REF, null, Location.Null); ParametersCompiled pars = new ParametersCompiled (mpar); var mods = Modifiers.PUBLIC | Modifiers.STATIC; if (settings.Unsafe) mods |= Modifiers.UNSAFE; current_local_parameters = pars; Method method = new Method ( current_class, null, /* generic*/ new TypeExpression (compiler.BuiltinTypes.Void, Location.Null), mods, new MemberName ("Host"), pars, null /* attributes */); current_container.AddMethod (method); oob_stack.Push (method); ++lexer.parsing_block; start_block (lexer.Location); } break; case 949: #line 6464 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { --lexer.parsing_block; Method method = (Method) oob_stack.Pop (); method.Block = (ToplevelBlock) end_block(lexer.Location); InteractiveResult = (Class) pop_current_class (); current_local_parameters = null; } break; case 957: #line 6496 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { module.DocumentationBuilder.ParsedName = (MemberName) yyVals[0+yyTop]; } break; case 958: #line 6503 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { module.DocumentationBuilder.ParsedParameters = (List<DocumentationParameter>)yyVals[0+yyTop]; } break; case 959: #line 6507 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { module.DocumentationBuilder.ParsedBuiltinType = (TypeExpression)yyVals[-1+yyTop]; module.DocumentationBuilder.ParsedParameters = (List<DocumentationParameter>)yyVals[0+yyTop]; yyVal = null; } break; case 960: #line 6513 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { module.DocumentationBuilder.ParsedBuiltinType = (TypeExpression)yyVals[-3+yyTop]; module.DocumentationBuilder.ParsedParameters = (List<DocumentationParameter>)yyVals[0+yyTop]; var lt = (Tokenizer.LocatedToken) yyVals[-1+yyTop]; yyVal = new MemberName (lt.Value); } break; case 961: #line 6520 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new MemberName ((MemberName) yyVals[-2+yyTop], new MemberName (MemberCache.IndexerNameAlias)); } break; case 962: #line 6524 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; } break; case 963: #line 6528 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { module.DocumentationBuilder.ParsedParameters = (List<DocumentationParameter>)yyVals[-1+yyTop]; yyVal = new MemberName ((MemberName) yyVals[-6+yyTop], new MemberName (MemberCache.IndexerNameAlias)); } break; case 964: #line 6533 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var p = (List<DocumentationParameter>)yyVals[0+yyTop] ?? new List<DocumentationParameter> (1); p.Add (new DocumentationParameter ((FullNamedExpression) yyVals[-1+yyTop])); module.DocumentationBuilder.ParsedParameters = p; module.DocumentationBuilder.ParsedOperator = Operator.OpType.Explicit; yyVal = null; } break; case 965: #line 6541 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var p = (List<DocumentationParameter>)yyVals[0+yyTop] ?? new List<DocumentationParameter> (1); p.Add (new DocumentationParameter ((FullNamedExpression) yyVals[-1+yyTop])); module.DocumentationBuilder.ParsedParameters = p; module.DocumentationBuilder.ParsedOperator = Operator.OpType.Implicit; yyVal = null; } break; case 966: #line 6549 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var p = (List<DocumentationParameter>)yyVals[0+yyTop] ?? new List<DocumentationParameter> (1); module.DocumentationBuilder.ParsedParameters = p; module.DocumentationBuilder.ParsedOperator = (Operator.OpType) yyVals[-1+yyTop]; yyVal = null; } break; case 968: #line 6560 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new MemberName (((MemberName) yyVals[-2+yyTop]), (MemberName) yyVals[0+yyTop]); } break; case 970: #line 6568 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; } break; case 971: #line 6572 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = yyVals[-1+yyTop]; } break; case 972: #line 6579 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { yyVal = new List<DocumentationParameter> (0); } break; case 974: #line 6587 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var parameters = new List<DocumentationParameter> (); parameters.Add ((DocumentationParameter) yyVals[0+yyTop]); yyVal = parameters; } break; case 975: #line 6593 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { var parameters = yyVals[-2+yyTop] as List<DocumentationParameter>; parameters.Add ((DocumentationParameter) yyVals[0+yyTop]); yyVal = parameters; } break; case 976: #line 6602 "D:\GitHub\M\Marvin\mcs\cs-parser.jay" { if (yyVals[-1+yyTop] != null) yyVal = new DocumentationParameter ((Parameter.Modifier) yyVals[-1+yyTop], (FullNamedExpression) yyVals[0+yyTop]); else yyVal = new DocumentationParameter ((FullNamedExpression) yyVals[0+yyTop]); } break; #line default } yyTop -= yyLen[yyN]; yyState = yyStates[yyTop]; int yyM = yyLhs[yyN]; if (yyState == 0 && yyM == 0) { if (debug != null) debug.shift(0, yyFinal); yyState = yyFinal; if (yyToken < 0) { yyToken = yyLex.advance() ? yyLex.token() : 0; if (debug != null) debug.lex(yyState, yyToken,yyname(yyToken), yyLex.value()); } if (yyToken == 0) { if (debug != null) debug.accept(yyVal); return yyVal; } goto continue_yyLoop; } if (((yyN = yyGindex[yyM]) != 0) && ((yyN += yyState) >= 0) && (yyN < yyTable.Length) && (yyCheck[yyN] == yyState)) yyState = yyTable[yyN]; else yyState = yyDgoto[yyM]; if (debug != null) debug.shift(yyStates[yyTop], yyState); goto continue_yyLoop; continue_yyDiscarded: continue; // implements the named-loop continue: 'continue yyDiscarded' } continue_yyLoop: continue; // implements the named-loop continue: 'continue yyLoop' } }
public void Visit(ArrayInitializer x) { }
IExpression NonVoidInitializer(IBlockNode Scope = null) { TrackerVariables.IsParsingInitializer = true; #region ArrayInitializer if (laKind == OpenSquareBracket) { Step(); // ArrayMemberInitializations var ae = new ArrayInitializer() { Location=t.Location}; LastParsedObject = ae; var inits=new List<ArrayMemberInitializer>(); bool IsInit = true; while (IsInit || laKind == (Comma)) { if (!IsInit) Step(); IsInit = false; // Allow empty post-comma expression IF the following token finishes the initializer expression // int[] a=[1,2,3,4,]; if (laKind == CloseSquareBracket) break; // ArrayMemberInitialization var ami = new ArrayMemberInitializer() { Left = NonVoidInitializer(Scope) }; LastParsedObject = ami; bool HasBeenAssExpr = !(t.Kind == (CloseSquareBracket) || t.Kind == (CloseCurlyBrace)); // AssignExpression : NonVoidInitializer if (HasBeenAssExpr && laKind == (Colon)) { Step(); ami.Specialization = NonVoidInitializer(Scope); } inits.Add(ami); } ae.ArrayMemberInitializations = inits.ToArray(); Expect(CloseSquareBracket); ae.EndLocation = t.EndLocation; // auto i=[1,2,3].idup; // in this case, this entire thing is meant to be an AssignExpression but not a dedicated initializer.. if (laKind == Dot) { Step(); var ae2 = new PostfixExpression_Access(); LastParsedObject = ae2; ae2.PostfixForeExpression = ae; ae2.TemplateOrIdentifier = Type(); //TODO: Is it really a type!? ae2.EndLocation = t.EndLocation; if (!IsEOF) TrackerVariables.IsParsingInitializer = false; return ae2; } if (!IsEOF) TrackerVariables.IsParsingInitializer = false; return ae; } #endregion // StructInitializer if (laKind == OpenCurlyBrace) { // StructMemberInitializations var ae = new StructInitializer() { Location = la.Location }; LastParsedObject = ae; var inits = new List<StructMemberInitializer>(); bool IsInit = true; while (IsInit || laKind == (Comma)) { Step(); IsInit = false; // Allow empty post-comma expression IF the following token finishes the initializer expression // int[] a=[1,2,3,4,]; if (laKind == CloseCurlyBrace) break; // Identifier : NonVoidInitializer var sinit = new StructMemberInitializer(); LastParsedObject = sinit; if (laKind == Identifier && Lexer.CurrentPeekToken.Kind == Colon) { Step(); sinit.MemberName = t.Value; Step(); } sinit.Specialization = NonVoidInitializer(Scope); inits.Add(sinit); } ae.StructMemberInitializers = inits.ToArray(); Expect(CloseCurlyBrace); ae.EndLocation = t.EndLocation; if (!IsEOF) TrackerVariables.IsParsingInitializer = false; return ae; } else { var expr= AssignExpression(Scope); if (!IsEOF) TrackerVariables.IsParsingInitializer = false; return expr; } }
public virtual object Visit (ArrayInitializer arrayInitializer) { return null; }
public ISymbolValue Visit(ArrayInitializer x) { return Visit((AssocArrayExpression)x); }
public ArrayInitializer CreateDynamicBinderArguments (ResolveContext rc) { Location loc = Location.Null; var all = new ArrayInitializer (args.Count, loc); MemberAccess binder = DynamicExpressionStatement.GetBinderNamespace (rc, loc); foreach (Argument a in args) { Arguments dargs = new Arguments (2); // CSharpArgumentInfoFlags.None = 0 const string info_flags_enum = "CSharpArgumentInfoFlags"; Expression info_flags = new IntLiteral (rc.BuiltinTypes, 0, loc); if (a.Expr is Constant) { info_flags = new Binary (Binary.Operator.BitwiseOr, info_flags, new MemberAccess (new MemberAccess (binder, info_flags_enum, loc), "Constant", loc)); } else if (a.ArgType == Argument.AType.Ref) { info_flags = new Binary (Binary.Operator.BitwiseOr, info_flags, new MemberAccess (new MemberAccess (binder, info_flags_enum, loc), "IsRef", loc)); info_flags = new Binary (Binary.Operator.BitwiseOr, info_flags, new MemberAccess (new MemberAccess (binder, info_flags_enum, loc), "UseCompileTimeType", loc)); } else if (a.ArgType == Argument.AType.Out) { info_flags = new Binary (Binary.Operator.BitwiseOr, info_flags, new MemberAccess (new MemberAccess (binder, info_flags_enum, loc), "IsOut", loc)); info_flags = new Binary (Binary.Operator.BitwiseOr, info_flags, new MemberAccess (new MemberAccess (binder, info_flags_enum, loc), "UseCompileTimeType", loc)); } else if (a.ArgType == Argument.AType.DynamicTypeName) { info_flags = new Binary (Binary.Operator.BitwiseOr, info_flags, new MemberAccess (new MemberAccess (binder, info_flags_enum, loc), "IsStaticType", loc)); } TypeSpec arg_type; if (rc.FileType == SourceFileType.PlayScript && a.Expr is ArrayInitializer || a.Expr is AsObjectInitializer) { if (a.Expr is ArrayInitializer) { arg_type = rc.Module.PredefinedTypes.AsArray.Resolve(); } else { arg_type = rc.Module.PredefinedTypes.AsObject.Resolve(); } } else { arg_type = a.Expr.Type; } if (arg_type.BuiltinType != BuiltinTypeSpec.Type.Dynamic && arg_type != InternalType.NullLiteral) { MethodGroupExpr mg = a.Expr as MethodGroupExpr; bool wasConverted = false; // In PlayScript, we try to implicity convert to dynamic, which handles conversions of method groups to delegates, and // anon methods to delegates. if (rc.FileType == SourceFileType.PlayScript && (mg != null || arg_type == InternalType.AnonymousMethod)) { var expr = Convert.ImplicitConversion (rc, a.Expr, rc.BuiltinTypes.Dynamic, loc); if (expr != null) { a.Expr = expr; arg_type = rc.BuiltinTypes.Dynamic; wasConverted = true; } } // Failed.. check the C# error if (!wasConverted) { if (mg != null) { rc.Report.Error (1976, a.Expr.Location, "The method group `{0}' cannot be used as an argument of dynamic operation. Consider using parentheses to invoke the method", mg.Name); } else if (arg_type == InternalType.AnonymousMethod) { rc.Report.Error (1977, a.Expr.Location, "An anonymous method or lambda expression cannot be used as an argument of dynamic operation. Consider using a cast"); } else if (arg_type.Kind == MemberKind.Void || arg_type == InternalType.Arglist || arg_type.IsPointer) { rc.Report.Error (1978, a.Expr.Location, "An expression of type `{0}' cannot be used as an argument of dynamic operation", arg_type.GetSignatureForError ()); } } info_flags = new Binary (Binary.Operator.BitwiseOr, info_flags, new MemberAccess (new MemberAccess (binder, info_flags_enum, loc), "UseCompileTimeType", loc)); } string named_value; NamedArgument na = a as NamedArgument; if (na != null) { info_flags = new Binary (Binary.Operator.BitwiseOr, info_flags, new MemberAccess (new MemberAccess (binder, info_flags_enum, loc), "NamedArgument", loc)); named_value = na.Name; } else { named_value = null; } dargs.Add (new Argument (info_flags)); dargs.Add (new Argument (new StringLiteral (rc.BuiltinTypes, named_value, loc))); all.Add (new Invocation (new MemberAccess (new MemberAccess (binder, "CSharpArgumentInfo", loc), "Create", loc), dargs)); } return all; }
public ISymbolValue Visit(ArrayInitializer x) { return(Visit((AssocArrayExpression)x)); }
void case_526() #line 3803 "cs-parser.jay" { var ai = new ArrayInitializer ((List<Expression>) yyVals[-2+yyTop], GetLocation (yyVals[-3+yyTop])); ai.VariableDeclaration = current_variable; if (yyVals[-1+yyTop] != null) { lbag.AddLocation (ai, GetLocation (yyVals[-1+yyTop]), GetLocation (yyVals[0+yyTop])); } else { lbag.AddLocation (ai, GetLocation (yyVals[0+yyTop])); } yyVal = ai; }
public override DocumentRange CalculateRange() => ArrayInitializer.GetDocumentRange();
public override object Visit (ArrayInitializer arrayInitializer) { var result = new ArrayInitializerExpression (); var location = LocationsBag.GetLocations (arrayInitializer); var commaLocations = LocationsBag.GetLocations (arrayInitializer.Elements); for (int i = 0; i < arrayInitializer.Count; i++) { result.AddChild((Expression)arrayInitializer[i].Accept(this), ArrayInitializerExpression.Roles.Expression); } return result; }
public void VisitArrayInitializer(ArrayInitializer initializer) { Formatter.StartNode(initializer); Formatter.OpenBrace(Parameters.ArrayInitializerBraceStyle); WriteCommaSeparatedNodes(initializer.Elements, true); Formatter.CloseBrace(Parameters.ArrayInitializerBraceStyle); Formatter.EndNode(); }
public ArrayInitializer CreateDynamicBinderArguments (ResolveContext rc) { Location loc = Location.Null; var all = new ArrayInitializer (args.Count, loc); MemberAccess binder = DynamicExpressionStatement.GetBinderNamespace (loc); foreach (Argument a in args) { Arguments dargs = new Arguments (2); // CSharpArgumentInfoFlags.None = 0 const string info_flags_enum = "CSharpArgumentInfoFlags"; Expression info_flags = new IntLiteral (0, loc); var constant = a.Expr as Constant; if (constant != null && constant.IsLiteral) { info_flags = new Binary (Binary.Operator.BitwiseOr, info_flags, new MemberAccess (new MemberAccess (binder, info_flags_enum, loc), "Constant", loc), loc); } else if (a.ArgType == Argument.AType.Ref) { info_flags = new Binary (Binary.Operator.BitwiseOr, info_flags, new MemberAccess (new MemberAccess (binder, info_flags_enum, loc), "IsRef", loc), loc); } else if (a.ArgType == Argument.AType.Out) { info_flags = new Binary (Binary.Operator.BitwiseOr, info_flags, new MemberAccess (new MemberAccess (binder, info_flags_enum, loc), "IsOut", loc), loc); } else if (a.ArgType == Argument.AType.DynamicTypeName) { info_flags = new Binary (Binary.Operator.BitwiseOr, info_flags, new MemberAccess (new MemberAccess (binder, info_flags_enum, loc), "IsStaticType", loc), loc); } var arg_type = a.Expr.Type; if (arg_type != InternalType.Dynamic) { MethodGroupExpr mg = a.Expr as MethodGroupExpr; if (mg != null) { rc.Report.Error (1976, a.Expr.Location, "The method group `{0}' cannot be used as an argument of dynamic operation. Consider using parentheses to invoke the method", mg.Name); } else if (arg_type == InternalType.AnonymousMethod) { rc.Report.Error (1977, a.Expr.Location, "An anonymous method or lambda expression cannot be used as an argument of dynamic operation. Consider using a cast"); } else if (arg_type == TypeManager.void_type || arg_type == InternalType.Arglist || arg_type.IsPointer) { rc.Report.Error (1978, a.Expr.Location, "An expression of type `{0}' cannot be used as an argument of dynamic operation", TypeManager.CSharpName (arg_type)); } info_flags = new Binary (Binary.Operator.BitwiseOr, info_flags, new MemberAccess (new MemberAccess (binder, info_flags_enum, loc), "UseCompileTimeType", loc), loc); } string named_value; NamedArgument na = a as NamedArgument; if (na != null) { info_flags = new Binary (Binary.Operator.BitwiseOr, info_flags, new MemberAccess (new MemberAccess (binder, info_flags_enum, loc), "NamedArgument", loc), loc); named_value = na.Name; } else { named_value = null; } dargs.Add (new Argument (info_flags)); dargs.Add (new Argument (new StringLiteral (named_value, loc))); all.Add (new Invocation (new MemberAccess (new MemberAccess (binder, "CSharpArgumentInfo", loc), "Create", loc), dargs)); } return all; }
public override object Visit (ArrayInitializer arrayInitializer) { var result = new ArrayInitializerExpression (); var location = LocationsBag.GetLocations (arrayInitializer); result.AddChild (new CSharpTokenNode (Convert (arrayInitializer.Location), "[".Length), ArrayInitializerExpression.Roles.LBracket); var commaLocations = LocationsBag.GetLocations (arrayInitializer.Elements); for (int i = 0; i < arrayInitializer.Count; i++) { result.AddChild ((AstNode)arrayInitializer[i].Accept (this), ArrayInitializerExpression.Roles.Initializer); if (commaLocations != null && i < commaLocations.Count) result.AddChild (new CSharpTokenNode (Convert (commaLocations[i]), ",".Length), ArrayInitializerExpression.Roles.Comma); } if (location != null) { if (location.Count == 2) // optional comma result.AddChild (new CSharpTokenNode (Convert (location[1]), ",".Length), ArrayInitializerExpression.Roles.Comma); result.AddChild (new CSharpTokenNode (Convert (location[location.Count - 1]), "]".Length), ArrayInitializerExpression.Roles.RBracket); } return result; }
public Expression CreateCallSiteBinder(ResolveContext ec, Arguments args) { Arguments binder_args = new Arguments (member != null ? 5 : 3); bool is_member_access = member is MemberAccess; CSharpBinderFlags call_flags; if (!is_member_access && member is SimpleName) { call_flags = CSharpBinderFlags.InvokeSimpleName; is_member_access = true; } else { call_flags = 0; } binder_args.Add (new Argument (new BinderFlags (call_flags, this))); if (is_member_access) binder_args.Add (new Argument (new StringLiteral (member.Name, member.Location))); if (member != null && member.HasTypeArguments) { TypeArguments ta = member.TypeArguments; if (ta.Resolve (ec)) { var targs = new ArrayInitializer (ta.Count, loc); foreach (TypeSpec t in ta.Arguments) targs.Add (new TypeOf (new TypeExpression (t, loc), loc)); binder_args.Add (new Argument (new ImplicitlyTypedArrayCreation ("[]", targs, loc))); } } else if (is_member_access) { binder_args.Add (new Argument (new NullLiteral (loc))); } binder_args.Add (new Argument (new TypeOf (new TypeExpression (ec.CurrentType, loc), loc))); Expression real_args; if (args == null) { // Cannot be null because .NET trips over real_args = new ArrayCreation ( new MemberAccess (GetBinderNamespace (loc), "CSharpArgumentInfo", loc), "[]", new ArrayInitializer (0, loc), loc); } else { real_args = new ImplicitlyTypedArrayCreation ("[]", args.CreateDynamicBinderArguments (ec), loc); } binder_args.Add (new Argument (real_args)); return new Invocation (GetBinder (is_member_access ? "InvokeMember" : "Invoke", loc), binder_args); }
public ArrayInitializer CreateDynamicBinderArguments(ResolveContext rc) { Location loc = Location.Null; var all = new ArrayInitializer(args.Count, loc); MemberAccess binder = DynamicExpressionStatement.GetBinderNamespace(rc, loc); foreach (Argument a in args) { Arguments dargs = new Arguments(2); // CSharpArgumentInfoFlags.None = 0 const string info_flags_enum = "CSharpArgumentInfoFlags"; Expression info_flags = new IntLiteral(rc.BuiltinTypes, 0, loc); if (a.Expr is Constant) { info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "Constant", loc)); } else if (a.ArgType == Argument.AType.Ref) { info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "IsRef", loc)); info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "UseCompileTimeType", loc)); } else if (a.ArgType == Argument.AType.Out) { info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "IsOut", loc)); info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "UseCompileTimeType", loc)); } else if (a.ArgType == Argument.AType.DynamicTypeName) { info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "IsStaticType", loc)); } TypeSpec arg_type; if (rc.FileType == SourceFileType.PlayScript && a.Expr is ArrayInitializer || a.Expr is AsObjectInitializer) { if (a.Expr is ArrayInitializer) { arg_type = rc.Module.PredefinedTypes.AsArray.Resolve(); } else { arg_type = rc.Module.PredefinedTypes.AsExpandoObject.Resolve(); } } else { arg_type = a.Expr.Type; } if (arg_type.BuiltinType != BuiltinTypeSpec.Type.Dynamic && arg_type != InternalType.NullLiteral) { MethodGroupExpr mg = a.Expr as MethodGroupExpr; bool wasConverted = false; // In PlayScript, we try to implicity convert to dynamic, which handles conversions of method groups to delegates, and // anon methods to delegates. if (rc.FileType == SourceFileType.PlayScript && (mg != null || arg_type == InternalType.AnonymousMethod)) { var expr = Convert.ImplicitConversion(rc, a.Expr, rc.BuiltinTypes.Dynamic, loc); if (expr != null) { a.Expr = expr; arg_type = rc.BuiltinTypes.Dynamic; wasConverted = true; } } // Failed.. check the C# error if (!wasConverted) { if (mg != null) { rc.Report.Error(1976, a.Expr.Location, "The method group `{0}' cannot be used as an argument of dynamic operation. Consider using parentheses to invoke the method", mg.Name); } else if (arg_type == InternalType.AnonymousMethod) { rc.Report.Error(1977, a.Expr.Location, "An anonymous method or lambda expression cannot be used as an argument of dynamic operation. Consider using a cast"); } else if (arg_type.Kind == MemberKind.Void || arg_type == InternalType.Arglist || arg_type.IsPointer) { rc.Report.Error(1978, a.Expr.Location, "An expression of type `{0}' cannot be used as an argument of dynamic operation", arg_type.GetSignatureForError()); } } info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "UseCompileTimeType", loc)); } string named_value; NamedArgument na = a as NamedArgument; if (na != null) { info_flags = new Binary(Binary.Operator.BitwiseOr, info_flags, new MemberAccess(new MemberAccess(binder, info_flags_enum, loc), "NamedArgument", loc)); named_value = na.Name; } else { named_value = null; } dargs.Add(new Argument(info_flags)); dargs.Add(new Argument(new StringLiteral(rc.BuiltinTypes, named_value, loc))); all.Add(new Invocation(new MemberAccess(new MemberAccess(binder, "CSharpArgumentInfo", loc), "Create", loc), dargs)); } return(all); }
public Expression CreateExpressionTree (BlockContext ec, Location loc) { var initializers = new ArrayInitializer (Count, loc); foreach (Parameter p in FixedParameters) { // // Each parameter expression is stored to local variable // to save some memory when referenced later. // StatementExpression se = new StatementExpression (p.CreateExpressionTreeVariable (ec), Location.Null); if (se.Resolve (ec)) { ec.CurrentBlock.AddScopeStatement (new TemporaryVariableReference.Declarator (p.ExpressionTreeVariableReference ())); ec.CurrentBlock.AddScopeStatement (se); } initializers.Add (p.ExpressionTreeVariableReference ()); } return new ArrayCreation ( Parameter.ResolveParameterExpressionType (ec, loc), initializers, loc); }
void case_523() #line 3567 "C:\Projects\Junk\mono\mcs\class\Mono.CSharp\..\..\mcs\cs-parser.jay" { var ai = new ArrayInitializer (0, GetLocation (yyVals[-1+yyTop])); ai.VariableDeclaration = current_variable; lbag.AddLocation (ai, GetLocation (yyVals[0+yyTop])); yyVal = ai; }