public override AstNode?VisitMessageDefinition(MessageDefinitionContext context)
        {
            var message = new MessageDefinition
            {
                IsCustom = context.customModifier != null
            };

            ProcessMessage(message, context);
            return(message);
        }
        private void ProcessMessage(MessageDefinition message, MessageDefinitionContext context)
        {
            try
            {
                _hasDefinitions = true;
                _currentMessage = message;
                _currentMessage.ParseContext = context;
                _currentMessage.Options      = _currentMemberOptions;

                var nameContext = context.GetRuleContext <MessageNameContext>(0);
                message.Name = GetId(nameContext.name);

                ProcessTypeModifiers(message, context.typeModifier().Select(i => i.type));

                foreach (var typeParamToken in nameContext._typeParams)
                {
                    var paramId = GetId(typeParamToken);

                    if (message.GenericParameters.Contains(paramId))
                    {
                        _contracts.AddError(typeParamToken, "Duplicate generic parameter: '{0}'", paramId);
                    }

                    message.GenericParameters.Add(paramId);
                }

                ProcessAttributes(message.Attributes, context.GetRuleContext <AttributesContext>(0));
                Visit(context.GetRuleContext <ParameterListContext>(0));
                Visit(context.GetRuleContext <BaseTypeListContext>(0));
                Visit(context.GetRuleContext <TypeParamConstraintListContext>(0));

                _contracts.Messages.Add(_currentMessage);
            }
            finally
            {
                _currentMessage = null;
            }
        }