Example #1
0
		private void ParseEvent()											
		{
			uint mask = ~(uint)Modifier.EventMods;
			if (((uint)curmods & mask) != (uint)Modifier.Empty)
				ReportError("Event contains illegal modifiers");

            EventNode node = new EventNode(curtok);

            ClassNode cl = typeStack.Peek();

			cl.Events.Add(node);

			if (curAttributes.Count > 0)
			{
				node.Attributes = curAttributes;
				curAttributes = new NodeCollection<AttributeNode>();
			}

			node.Modifiers = curmods;
			curmods = Modifier.Empty;

            if ((node.Modifiers & Modifier.Unsafe) != Modifier.Empty)
            {
                //unsafe modifier -> unsafe type.
                isUnsafe++;
                node.IsUnsafeDeclared = true;
            }

            //the event is declared in an unsafe type ?
            node.IsUnsafe = isUnsafe > 0;

            CheckStaticClass(cl, node.Modifiers, true); ;

			Advance(); // advance over event keyword

			node.Type = ParseType();

			if (curtok.ID != TokenID.Ident)
				ReportError("Expected event member name.");

			while (curtok.ID == TokenID.Ident)
			{
                node.Names.Add(ParseQualifiedIdentifier(true, false, true));
			}

            //TODO: Omer - Add all of the events in that line to the name table once Robin fixes the code.

            switch (curtok.ID)
            {
                case TokenID.Semi:
                    AssertAndAdvance(TokenID.Semi);
                    break;
                case TokenID.Equal:
                    Advance();
                    node.Value = ParseConstExpr();
                    AssertAndAdvance(TokenID.Semi);
                    break;
                case TokenID.LCurly:
                    Advance(); // over lcurly

                    ParsePossibleAttributes(false);

                    if (curtok.ID != TokenID.Ident)
                    {
                        ReportError("Event accessor requires add or remove clause.");
                    }

                    string curAccessor = strings[curtok.Data];
                    Advance(); // over ident
                    if (curAccessor == "add")
                    {
                        node.AddBlock = new AccessorNode(false, curtok);
                        node.AddBlock.Kind = "add";
                        node.AddBlock.IsUnsafe = isUnsafe > 0;
                        ApplyAttributes( node.AddBlock );
                        ParseBlock( node.AddBlock.StatementBlock );

                        ParsePossibleAttributes(false);
                        if (curtok.ID == TokenID.Ident && strings[curtok.Data] == "remove")
                        {
                            node.RemoveBlock = new AccessorNode( false, curtok );
                            node.RemoveBlock.IsUnsafe = isUnsafe > 0;
                            node.RemoveBlock.Kind = "remove";
                            ApplyAttributes( node.RemoveBlock );
                            Advance(); // over ident
                            ParseBlock( node.RemoveBlock.StatementBlock );
                        }
                        else
                        {
                            ReportError("Event accessor expected remove clause.");
                        }
                    }
                    else if (curAccessor == "remove")
                    {
                        node.RemoveBlock = new AccessorNode(false, curtok);
                        node.RemoveBlock.IsUnsafe = isUnsafe > 0;
                        node.RemoveBlock.Kind = "remove";
                        ApplyAttributes( node.RemoveBlock );
                        ParseBlock( node.RemoveBlock.StatementBlock );

                        ParsePossibleAttributes(false);
                        if (curtok.ID == TokenID.Ident && strings[curtok.Data] == "add")
                        {
                            node.AddBlock = new AccessorNode(false, curtok);
                            node.AddBlock.IsUnsafe = isUnsafe > 0;
                            node.AddBlock.Kind = "remove";
                            Advance(); // over ident
                            ApplyAttributes(node.AddBlock);
                            ParseBlock(node.AddBlock.StatementBlock);
                        }
                        else
                        {
                            ReportError("Event accessor expected add clause.");
                        }
                    }
                    else
                    {
                        ReportError("Event accessor requires add or remove clause.");
                    }

                    AssertAndAdvance(TokenID.RCurly);

                    break;
            }

            if ((node.Modifiers & Modifier.Unsafe) != Modifier.Empty)
            {
                //unsafe modifier -> unsafe type.
                isUnsafe--;
            }


		}
        public virtual object VisitEventDeclaration(EventNode eventDeclaration, object data)
        {
            stackMap.Push(eventDeclaration);
            eventDeclaration.Attributes.AcceptVisitor(this, data);

            if (eventDeclaration.AddBlock != null)
            {
                eventDeclaration.AddBlock.AcceptVisitor(this, data);
            }

            if (eventDeclaration.RemoveBlock != null)
            {
                eventDeclaration.RemoveBlock.AcceptVisitor(this, data);
            }

            eventDeclaration.Type.AcceptVisitor(this, data);

            if (eventDeclaration.Value != null)
            {
                eventDeclaration.Value.AcceptVisitor(this, data);
            }

            stackMap.Pop();
            return null;

        }