private void DumpEnumDescriptor(EnumDescriptorProto field, ProtoExtensionDefs extensions, StringBuilder sb, int level) { AddEnumDescriptorLookup(field); var levelspace = new string('\t', level); sb.AppendLine($"{levelspace}enum {field.name} {{"); foreach (var option in DumpOptions(field.options, extensions)) { sb.AppendLine($"{levelspace}\toption {option.Key} = {option.Value};"); } foreach (var enumValue in field.value) { var options = DumpOptions(enumValue.options, extensions); var parameters = string.Empty; if (options.Count > 0) { parameters = $" [{string.Join(", ", options.Select(kvp => $"{kvp.Key} = {kvp.Value}"))}]"; } sb.AppendLine($"{levelspace}\t{enumValue.name} = {enumValue.number}{parameters};"); } sb.AppendLine($"{levelspace}}}"); sb.AppendLine(); }
private string BuildDescriptorDeclaration(FieldDescriptorProto field, ProtoExtensionDefs extensions, bool emitFieldLabel = true) { PushDescriptorName(field); var type = ResolveType(field); var options = new Dictionary <string, string>(); if (!string.IsNullOrEmpty(field.default_value)) { var default_value = field.default_value; if (field.type == FieldDescriptorProto.Type.TYPE_STRING) { default_value = $"\"{default_value}\""; } options.Add("default", default_value); } else if (field.type == FieldDescriptorProto.Type.TYPE_ENUM && field.label != FieldDescriptorProto.Label.LABEL_REPEATED) { options.Add("default", ResolveOrDeferEnumDefaultValue(type)); } var fieldOptions = DumpOptions(field.options, extensions); foreach (var pair in fieldOptions) { options[pair.Key] = pair.Value; } var parameters = string.Empty; if (options.Count > 0) { parameters = $" [{string.Join(", ", options.Select(kvp => $"{kvp.Key} = {kvp.Value}"))}]"; } PopDescriptorName(); var descriptorDeclarationBuilder = new StringBuilder(); if (emitFieldLabel) { descriptorDeclarationBuilder.Append(GetLabel(field.label)); descriptorDeclarationBuilder.Append(" "); } descriptorDeclarationBuilder.Append($"{type} {field.name} = {field.number}{parameters};"); return(descriptorDeclarationBuilder.ToString()); }
private Dictionary <string, string> DumpOptions(dynamic options, ProtoExtensionDefs protobufExtensions) { var options_kv = new Dictionary <string, string>(); if (options == null) { return(options_kv); } var optionsType = options.GetType(); // generate precompiled options var propertySearchBindingFlags = BindingFlags.Public | BindingFlags.Instance; foreach (PropertyInfo propInfo in optionsType.GetProperties(propertySearchBindingFlags)) { var propertySpecifiedSuffix = "Specified"; var propName = propInfo.Name; if (propName.EndsWith(propertySpecifiedSuffix)) { continue; } var specifiedProp = optionsType.GetProperty(propName + propertySpecifiedSuffix, propertySearchBindingFlags); if (specifiedProp != null) { var isSpecified = specifiedProp.GetValue(options); if (!isSpecified) { continue; } } string name; string value = GetValueForProp(propInfo, options, false, out name); if (value != null) { options_kv.Add(name, value); } } // generate reflected options (extensions to this type) var extend = ((IExtensible)options).GetExtensionObject(false); var extensions = new List <Type>(); if (extend != null && protobufExtensions.TryGetValue(options.GetType().FullName, out extensions)) { foreach (var extension in extensions) { var ms = extend.BeginQuery(); var deserialized = RuntimeTypeModel.Default.Deserialize(ms, null, extension); foreach (var fieldInfo in extension.GetFields(BindingFlags.Instance | BindingFlags.Public)) { string name; var value = GetValueForProp(fieldInfo, deserialized, true, out name); if (value != null) { options_kv.Add(name, value); } } extend.EndQuery(ms); } } return(options_kv); }