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); } }