public override void Visit(Node node)
        {
            var name = node.Children.Single(t => t.NodeType.Equals(NodeType.Identifier)).NodeValue;

            var embMsg = node.Children.Where(t => t.NodeType.Equals(NodeType.Message));
            var messages = new List<MessageDefinition>();
            foreach (var msg in embMsg)
            {
                var msgVisitor = new MessageVisitor(Errors);
                msg.Accept(msgVisitor);
                messages.Add(msgVisitor.Message);
            }

            var embEnum = node.Children.Where(t => t.NodeType.Equals(NodeType.Enum));
            var enums = new List<EnumDefinition>();
            foreach (var en in embEnum)
            {
                var enumVisitor = new EnumVisitor(Errors);
                en.Accept(enumVisitor);
                enums.Add(enumVisitor.EnumDefinition);
            }

            var fieldNodes = node.Children.Where(t => t.NodeType.Equals(NodeType.Field));
            var fields = new List<Field>();
            foreach (var field in fieldNodes)
            {
                var fieldVisitor = new FieldVisitor(Errors);
                field.Accept(fieldVisitor);
                fields.Add(fieldVisitor.Field);
            }

            Message = new MessageDefinition(name, fields, null, null, null, enums, messages);
        }
        public void Visit(Node node)
        {
            if (!node.NodeType.Equals(NodeType.Root))
                throw new InvalidOperationException("Cannot use BuilderVisitor on non-root Node");

            var syntaxNode = node.Children.SingleOrDefault(t => t.NodeType.Equals(NodeType.Syntax));
            var syntaxVisitor = new SyntaxVisitor(Errors);
            syntaxNode?.Accept(syntaxVisitor);
            FileDescriptor.Syntax = syntaxVisitor.Syntax;

            var packageNode = node.Children.SingleOrDefault(t => t.NodeType.Equals(NodeType.Package));
            var packageVisitor = new PackageVisitor(Errors);
            packageNode?.Accept(packageVisitor);
            FileDescriptor.Package = packageVisitor.Package;

            var optionNodes = node.Children.Where(t => t.NodeType.Equals(NodeType.Option));
            foreach (var option in optionNodes)
            {
                var optionVisitor = new OptionVisitor(Errors);
                option.Accept(optionVisitor);
                FileDescriptor.Options.Add(optionVisitor.Option);
            }

            var importNodes = node.Children.Where(t => t.NodeType.Equals(NodeType.Import));
            foreach (var import in importNodes)
            {
                var importVisitor = new ImportVisitor(Errors);
                import.Accept(importVisitor);
                FileDescriptor.Imports.Add(importVisitor.Import);
            }

            var messageNodes = node.Children.Where(t => t.NodeType.Equals(NodeType.Message));
            foreach (var option in messageNodes)
            {
                var messageVisitor = new MessageVisitor(Errors);
                option.Accept(messageVisitor);
                FileDescriptor.Messages.Add(messageVisitor.Message);
            }

            var enumNodes = node.Children.Where(t => t.NodeType.Equals(NodeType.Enum));
            foreach (var option in enumNodes)
            {
                var enumVisitor = new EnumVisitor(Errors);
                option.Accept(enumVisitor);
                FileDescriptor.Enumerations.Add(enumVisitor.EnumDefinition);
            }

            var serviceNodes = node.Children.Where(t => t.NodeType.Equals(NodeType.Service));
            foreach (var service in serviceNodes)
            {
                var serviceVisitor = new ServiceVisitor(Errors);
                service.Accept(serviceVisitor);
                FileDescriptor.Services.Add(serviceVisitor.Service);
            }
        }