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); }
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); }
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); }
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); }
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); }
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); } } }
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); } } }
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));
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); }
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); }
public CSharpCodeGenerator(CodeGeneratorRequest request) : this(request, "Schema") { }
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); }
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); }