コード例 #1
0
        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();
        }
コード例 #2
0
        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());
        }
コード例 #3
0
        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);
        }