示例#1
0
        public static int Main(string[] args)
        {
            // Hack to make sure everything's initialized
            DescriptorProtoFile.Descriptor.ToString();
            ExtensionRegistry extensionRegistry = ExtensionRegistry.CreateInstance();

            CSharpOptions.RegisterAllExtensions(extensionRegistry);

            CodeGeneratorRequest request;
            var response = new CodeGeneratorResponse.Builder();

            try
            {
                using (var input = Console.OpenStandardInput())
                {
                    request = CodeGeneratorRequest.ParseFrom(input, extensionRegistry);
                }
                Run(request, response);
            }
            catch (Exception e)
            {
                response.Error += e.ToString();
            }

            using (var output = Console.OpenStandardOutput())
            {
                response.Build().WriteTo(output);
                output.Flush();
            }
            return(0);
        }
示例#2
0
        internal static void Run(CodeGeneratorRequest request, CodeGeneratorResponse.Builder response)
        {
            var arguments = new List <string>();

            foreach (var arg in request.Parameter.Split(' '))
            {
                var timmedArg = (arg ?? "").Trim();
                if (!string.IsNullOrEmpty(timmedArg))
                {
                    arguments.Add(timmedArg);
                }
            }
            // Adding fake input file to make TryValidate happy.
            arguments.Add(System.Reflection.Assembly.GetExecutingAssembly().Location);

            GeneratorOptions options = new GeneratorOptions
            {
                Arguments = arguments
            };
            IList <string> validationFailures;

            if (!options.TryValidate(out validationFailures))
            {
                response.Error += new InvalidOptionsException(validationFailures).Message;
                return;
            }

            Generator generator = Generator.CreateGenerator(options);

            generator.Generate(request, response);
        }
示例#3
0
 private static void ShowSchemaInfo(CodeGeneratorRequest req)
 {
     if (req.requestedFiles.IsValid())
     {
         if (req.requestedFiles.Count() != 0)
         {
             Console.WriteLine("Requested files:");
             foreach (var file in req.requestedFiles)
             {
                 Console.WriteLine("{0}: {1}", file.id, file.filename);
                 if (file.imports.IsValid())
                 {
                     foreach (var imp in file.imports)
                     {
                         Console.WriteLine("\t{0}: {1}", imp.id, imp.name);
                     }
                 }
             }
             Console.WriteLine();
         }
     }
     if (req.nodes.IsValid())
     {
         if (req.nodes.Count() != 0)
         {
             Console.WriteLine("Nodes:");
             foreach (var node in req.nodes)
             {
                 string name = node.displayName.ToString();
                 Console.WriteLine("  {2}: {0} ({1})", name, name.Substring((int)node.displayNamePrefixLength), node.Union);
             }
             Console.WriteLine();
         }
     }
 }
        internal static void Run(CodeGeneratorRequest request, CodeGeneratorResponse.Builder response)
        {
            var arguments = new List<string>();
            foreach (var arg in request.Parameter.Split(' '))
            {
                var timmedArg = (arg ?? "").Trim();
                if (!string.IsNullOrEmpty(timmedArg))
                {
                    arguments.Add(timmedArg);
                }
            }
            // Adding fake input file to make TryValidate happy.
            arguments.Add(System.Reflection.Assembly.GetExecutingAssembly().Location);

            GeneratorOptions options = new GeneratorOptions
            {
                Arguments = arguments
            };
            IList<string> validationFailures;
            if (!options.TryValidate(out validationFailures))
            {
                response.Error += new InvalidOptionsException(validationFailures).Message;
                return;
            }

            Generator generator = Generator.CreateGenerator(options);
            generator.Generate(request, response);
        }
示例#5
0
        private static void ParseCode(CodeGeneratorRequest request, CodeGeneratorResponse response)
        {
            var pluginList = FindAllPlugin();

            foreach (var plugin in pluginList)
            {
                plugin.Process(request, response);
            }
        }
        public static void Main(string[] args)
        {
            // protoc communicates with the plug-in through stdin and stdout
            using Stream input  = Console.OpenStandardInput();
            using Stream output = Console.OpenStandardOutput();
            ProtocGenDebugJson    plugIn   = new ProtocGenDebugJson();
            CodeGeneratorRequest  request  = CodeGeneratorRequest.Parser.ParseFrom(input);
            CodeGeneratorResponse response = plugIn.HandleRequest(request);

            response.WriteTo(output);
        }
示例#7
0
 public void Process(CodeGeneratorRequest request, CodeGeneratorResponse response)
 {
     foreach (var protofile in request.ProtoFile)
     {
         try{
             CheckByEachFile(protofile);
         }
         catch (Exception ex) {
             response.Error += "file:" + protofile.Name + ":" + ex.Message;
         }
     }
 }
        /// <summary>
        /// Handles a request from code generation that <c>protoc</c> passed to the plug-in,
        /// by generating a response message.
        /// </summary>
        /// <param name="request">The request from <c>protoc</c></param>
        /// <returns>The response to <c>protoc</c></returns>
        public CodeGeneratorResponse HandleRequest(CodeGeneratorRequest request)
        {
            JsonFormatter         jsonFormatter = new JsonFormatter(requestJsonFormatSettings);
            CodeGeneratorResponse response      = new CodeGeneratorResponse();

            response.File.Add(new CodeGeneratorResponse.Types.File()
            {
                Name    = requestFileName,
                Content = jsonFormatter.Format(request)
            });
            return(response);
        }
        static void Main(string[] args)
        {
            if (args.Length != 0)
            {
                throw new ArgumentException("protoc-gen-delphi does not expect program arguments");
            }
            // protoc communicates with the plug-in through stdin and stdout
            using Stream input  = Console.OpenStandardInput();
            using Stream output = Console.OpenStandardOutput();
            CodeGeneratorRequest  request  = CodeGeneratorRequest.Parser.ParseFrom(input);
            ProtocGenDelphi       plugIn   = new ProtocGenDelphi();
            CodeGeneratorResponse response = plugIn.HandleRequest(request);

            response.WriteTo(output);
        }
        /// <summary>
        /// Handles a request from code generation that <c>protoc</c> passed to the plug-in,
        /// by generating a response message.
        /// </summary>
        /// <param name="request">The request from <c>protoc</c></param>
        /// <returns>The response to <c>protoc</c></returns>
        public CodeGeneratorResponse HandleRequest(CodeGeneratorRequest request)
        {
            if (request.Parameter.Length != 0)
            {
                ApplyOptions(request.Parameter.Split(","));
            }
            CodeGeneratorResponse response = new CodeGeneratorResponse();

            FileDescriptorProto lookupProtoFile(string name) => request.ProtoFile.First(file => file.Name == name);

            // Generate one source code file for each .proto file
            foreach (string protoFileName in request.FileToGenerate)
            {
                response.File.Add(GenerateSourceFile(lookupProtoFile(protoFileName), lookupProtoFile));
            }
            return(response);
        }
示例#11
0
        public void Generate(CodeGeneratorRequest request, CodeGeneratorResponse.Builder response)
        {
            IList <FileDescriptor> descriptors = ConvertDescriptors(options.FileOptions, request.ProtoFileList);

            // Combine with options from command line
            foreach (FileDescriptor descriptor in descriptors)
            {
                descriptor.ConfigureWithDefaultOptions(options.FileOptions);
            }

            bool duplicates = false;
            Dictionary <string, bool> names = new Dictionary <string, bool>(StringComparer.OrdinalIgnoreCase);

            foreach (FileDescriptor descriptor in descriptors)
            {
                string file = GetOutputFile(descriptor, false);
                if (names.ContainsKey(file))
                {
                    duplicates = true;
                    break;
                }
                names.Add(file, true);
            }

            //ROK - Changed to dictionary from HashSet to allow 2.0 compile
            var filesToGenerate = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase);

            foreach (var item in request.FileToGenerateList)
            {
                filesToGenerate[item] = null;
            }
            foreach (FileDescriptor descriptor in descriptors)
            {
                // Optionally exclude descriptors in google.protobuf
                if (descriptor.CSharpOptions.IgnoreGoogleProtobuf && descriptor.Package == "google.protobuf")
                {
                    continue;
                }
                if (filesToGenerate.ContainsKey(descriptor.Name))
                {
                    Generate(descriptor, duplicates, response);
                }
            }
        }
示例#12
0
        public void Generate(CodeGeneratorRequest request, CodeGeneratorResponse.Builder response)
        {
            IList<FileDescriptor> descriptors = ConvertDescriptors(options.FileOptions, request.ProtoFileList);

            // Combine with options from command line
            foreach (FileDescriptor descriptor in descriptors)
            {
                descriptor.ConfigureWithDefaultOptions(options.FileOptions);
            }

            bool duplicates = false;
            Dictionary<string, bool> names = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
            foreach (FileDescriptor descriptor in descriptors)
            {
                string file = GetOutputFile(descriptor, false);
                if (names.ContainsKey(file))
                {
                    duplicates = true;
                    break;
                }
                names.Add(file, true);
            }

            //ROK - Changed to dictionary from HashSet to allow 2.0 compile
            var filesToGenerate = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
            foreach (var item in request.FileToGenerateList)
            {
                filesToGenerate[item] = null;
            }
            foreach (FileDescriptor descriptor in descriptors)
            {
                // Optionally exclude descriptors in google.protobuf
                if (descriptor.CSharpOptions.IgnoreGoogleProtobuf && descriptor.Package == "google.protobuf")
                {
                    continue;
                }
                if (filesToGenerate.ContainsKey(descriptor.Name))
                {
                    Generate(descriptor, duplicates, response);
                }
            }
        }
示例#13
0
 public CSharpCodeGenerator(CodeGeneratorRequest request, string defaultNamespace)
 {
     _request = request;
     this.DefaultNamespace = defaultNamespace;
     _generator            = SyntaxGenerator.GetGenerator(new AdhocWorkspace(), LanguageNames.CSharp);
 }
 public void ProducesExpectedResponse(CodeGeneratorRequest request, CodeGeneratorResponse expectedResponse) => Assert.Equal(expectedResponse, new ProtocGenDebugJson().HandleRequest(request));
示例#15
0
        public static List <FileModel> BuildModel(CodeGeneratorRequest codeGeneratorRequest)
        {
            var result = new List <FileModel>();

            foreach (var fileDescriptorProto in codeGeneratorRequest.ProtoFile)
            {
                var fileModel = new FileModel(fileDescriptorProto);
                result.Add(fileModel);

                foreach (var messageDescriptorProto in fileDescriptorProto.MessageType)
                {
                    var messageModel = new MessageModel(messageDescriptorProto, fileModel);
                    fileModel.Messages.Add(messageModel);
                }
            }

            foreach (var fileModel in result)
            {
                foreach (var messageModel in fileModel.Messages)
                {
                    foreach (var field in messageModel.DescriptorProto.Field)
                    {
                        if (field.Label.HasFlag(FieldDescriptorProto.Types.Label.Repeated))
                        {
                            continue;
                        }

                        if (field.Options != null && field.Options.Deprecated)
                        {
                            continue;
                        }

                        switch (field.Type)
                        {
                        case FieldDescriptorProto.Types.Type.Bool:
                        case FieldDescriptorProto.Types.Type.String:
                        case FieldDescriptorProto.Types.Type.Message:
                            break;

                        default:
                            continue;
                        }
                        MessageModel referencedMessageType = null;
                        if (field.Type == FieldDescriptorProto.Types.Type.Message)
                        {
                            if (!field.TypeName.StartsWith("."))
                            {
                                throw new NotSupportedException($"Invalid type name: {field.TypeName}");
                            }

                            referencedMessageType = result.SelectMany(x => x.Messages)
                                                    .SingleOrDefault(x => x.Qualifier == field.TypeName.Substring(1));

                            if (referencedMessageType == null)
                            {
                                throw new NotSupportedException($"Invalid type name: {field.TypeName}");
                            }
                        }

                        var propertyModel = new PropertyModel(messageModel, field, referencedMessageType);
                        messageModel.Properties.Add(propertyModel);
                    }
                }
            }

            return(result);
        }
示例#16
0
        public void Process(CodeGeneratorRequest request, CodeGeneratorResponse response)
        {
            if (request.ProtoFile.Count == 0)
            {
                return;
            }
            string ns            = "";
            bool   genericEnable = false;

            foreach (var protofile in request.ProtoFile)
            {
                protofile.Options.CustomOptions.TryGetBool(DotBPEOptions.GENERIC_OBJECTFACTORY, out genericEnable);
                if (genericEnable)
                {
                    ns = Utils.GetFileNamespace(protofile);
                    if (string.IsNullOrEmpty(ns))
                    {
                        response.Error = protofile.Name + " don't set namespace";
                        return;
                    }
                    break;
                }
            }
            if (!genericEnable)
            {
                return;
            }

            StringBuilder sb = new StringBuilder();

            sb.AppendLine("// Generated by the protocol buffer compiler.  DO NOT EDIT!");
            sb.AppendLine($"// source: ProtobufObjectfactory");
            //还可以生成注释

            sb.AppendLine("#region Designer generated code");

            sb.AppendLine("");
            sb.AppendLine("using System; ");
            sb.AppendLine("using System.Collections.Generic; ");
            sb.AppendLine("using System.Text; ");
            sb.AppendLine("using Google.Protobuf; ");
            sb.AppendLine("using Google.Protobuf.Reflection; ");
            sb.AppendLine("");

            sb.AppendLine("namespace " + ns + " {");
            //生成代码

            sb.AppendLine("public class ProtobufObjectFactory {");

            sb.AppendLine("public static IMessage GetRequestTemplate(int serviceId,int messageId)");
            sb.AppendLine("{");
            foreach (var protofile in request.ProtoFile)
            {
                try{
                    GenerateByEachFile(protofile, response, sb, 1);
                }
                catch (Exception ex) {
                    response.Error += "file:" + protofile.Name + ":" + ex.Message + ex.StackTrace;
                }
            }
            sb.AppendLine("return null;");
            sb.AppendLine("}");


            sb.AppendLine("public static IMessage GetResponseTemplate(int serviceId,int messageId)");
            sb.AppendLine("{");
            foreach (var protofile in request.ProtoFile)
            {
                try{
                    GenerateByEachFile(protofile, response, sb, 2);
                }
                catch (Exception ex) {
                    response.Error += "file:" + protofile.Name + ":" + ex.Message + ex.StackTrace;
                }
            }
            sb.AppendLine("return null;");
            sb.AppendLine("}");


            sb.AppendLine("}");
            sb.AppendLine("}");
            sb.AppendLine("#endregion");

            //生成文件
            var nfile = new CodeGeneratorResponse.Types.File
            {
                Name    = "ProtobufObjectfactory.cs",
                Content = sb.ToString()
            };

            response.File.Add(nfile);
        }
示例#17
0
 public CSharpCodeGenerator(CodeGeneratorRequest request)
     : this(request, "Schema")
 {
 }
示例#18
0
        public static CodeGeneratorResponse Generate(CodeGeneratorRequest request)
        {
            var response = new CodeGeneratorResponse();

            var fileModels = ModelBuilder.BuildModel(request);

            foreach (var fileModel in fileModels)
            {
                var implCode   = "";
                var headerCode = BuildContent(headerWriter =>
                {
                    implCode = BuildContent(implWriter =>
                    {
                        GenerateFile(fileModel, headerWriter, implWriter);
                    });
                });

                response.File.Add(new CodeGeneratorResponse.Types.File
                {
                    Name    = fileModel.IncludeFile,
                    Content = headerCode
                });

                response.File.Add(new CodeGeneratorResponse.Types.File
                {
                    Name    = fileModel.ImplFile,
                    Content = implCode
                });
            }

            var additionalHeaders = new List <string>();

            foreach (var fileModel in fileModels)
            {
                var headerContent = BuildContent(header =>
                {
                    header.WriteLine($"#ifndef {fileModel.HeaderPragmaName}_CREATOR");
                    header.WriteLine($"#define {fileModel.HeaderPragmaName}_CREATOR");
                    header.WriteLine("#include <QObject>");
                    header.WriteLine("#include <QVariant>");
                    header.WriteLine($"#include \"{fileModel.IncludeFile}\"");

                    foreach (var nameSpace in fileModel.NamespaceComponents)
                    {
                        header.WriteLine($"namespace {nameSpace} {{");
                    }

                    header.WriteLine($"class {fileModel.CppCreatorTypeName} : public QObject {{");
                    header.WriteLineIndented("Q_OBJECT");
                    header.WriteLine("public:");
                    using (header.Indent())
                    {
                        header.WriteLine($"{fileModel.CppCreatorTypeName}(QObject* parent = nullptr) : QObject(parent)");
                        header.WriteLine("{");
                        header.WriteLine("}");
                        foreach (var message in fileModel.Messages)
                        {
                            header.WriteLine($"Q_INVOKABLE QVariant create{message.ProtobufTypeName}()");
                            header.WriteLine("{");
                            header.WriteLineIndented($"return QVariant::fromValue(new {message.CppTypeName}());");
                            header.WriteLine("}");
                        }
                    }
                    header.WriteLine("};");

                    foreach (var _ in fileModel.NamespaceComponents)
                    {
                        header.WriteLine("}");
                    }

                    header.WriteLine($"#endif // {fileModel.HeaderPragmaName}_CREATOR");
                });
                response.File.Add(new CodeGeneratorResponse.Types.File
                {
                    Name    = fileModel.FileNameBase + "-qt-creator.pb.h",
                    Content = headerContent
                });
                additionalHeaders.Add(fileModel.FileNameBase + "-qt-creator.pb.h");
            }

            var pri = BuildContent(writer =>
            {
                writer.WriteLine("INCLUDEPATH += $$PWD");

                var headerFiles = new List <string>();
                var sourceFiles = new List <string>();

                headerFiles.AddRange(fileModels.Select(x => x.IncludeFile));
                headerFiles.AddRange(additionalHeaders);
                sourceFiles.AddRange(fileModels.Select(x => x.ImplFile));

                writer.WriteLine("HEADERS += \\");
                using (writer.Indent())
                {
                    for (var x = 0; x < headerFiles.Count; x++)
                    {
                        writer.WriteLine($"$$PWD/{headerFiles[x]}{((x == headerFiles.Count - 1) ? "" : " \\")}");
                    }
                }
                writer.WriteLine("SOURCES += \\");
                using (writer.Indent())
                {
                    for (var x = 0; x < sourceFiles.Count; x++)
                    {
                        writer.WriteLine($"$$PWD/{sourceFiles[x]}{((x == sourceFiles.Count - 1) ? "" : " \\")}");
                    }
                }
            });

            response.File.Add(new CodeGeneratorResponse.Types.File
            {
                Name    = "qt.pri",
                Content = pri
            });

            return(response);
        }
示例#19
0
        public void Process(CodeGeneratorRequest request, CodeGeneratorResponse response)
        {
            if (request.ProtoFile.Count == 0)
            {
                return;
            }
            string ns            = "";
            bool   genericEnable = false;

            foreach (var protofile in request.ProtoFile)
            {
                protofile.Options.CustomOptions.TryGetBool(DotBPEOptions.GENERIC_HTTPAPIROUTES, out genericEnable);
                if (genericEnable)
                {
                    ns = Utils.GetFileNamespace(protofile);
                    if (string.IsNullOrEmpty(ns))
                    {
                        response.Error = protofile.Name + " don't set namespace";
                        return;
                    }
                    break;
                }
            }
            if (!genericEnable)
            {
                return;
            }


            StringBuilder sb = new StringBuilder();

            sb.AppendLine("// Generated by the protocol buffer compiler.  DO NOT EDIT!");
            sb.AppendLine($"// source: ProtobufObjectfactory");
            //还可以生成注释

            sb.AppendLine("#region Designer generated code");

            sb.AppendLine("");
            sb.AppendLine("using DotBPE.Protobuf;");
            sb.AppendLine("using System.Collections.Generic;");

            sb.AppendLine("");

            sb.AppendLine("namespace " + ns + " {");
            //生成代码

            sb.AppendLine("    public static class HttpApiOptions {");


            sb.AppendLine("        public static List<HttpApiOption> GetList()");
            sb.AppendLine("        {");

            sb.AppendLine("            var list = new List<HttpApiOption>();");


            foreach (var protofile in request.ProtoFile)
            {
                try
                {
                    ProcessByEachFile(protofile, sb);
                }
                catch (Exception ex)
                {
                    response.Error += "file:" + protofile.Name + ":" + ex.Message + ex.StackTrace;
                }
            }
            sb.AppendLine("            return list;");
            sb.AppendLine("        }");


            sb.AppendLine("    }");
            sb.AppendLine("}");
            sb.AppendLine("#endregion");

            //生成文件
            var nfile = new CodeGeneratorResponse.Types.File
            {
                Name    = "HttpApiOptions.cs",
                Content = sb.ToString()
            };

            response.File.Add(nfile);
        }