From 9a23ded94729ceeea2f87cb7e8460eaaaf1c8269 Mon Sep 17 00:00:00 2001 From: dcodeIO Date: Fri, 14 Apr 2017 13:34:18 +0200 Subject: [PATCH] Other: ext/descriptor support for various standard options, see #757 --- bench/data/static_pbjs.js | 4 +- cli/lib/tsd-jsdoc/publish.js | 2 +- ext/descriptor/README.md | 16 +++--- ext/descriptor/index.d.ts | 41 ++++++++++---- ext/descriptor/index.js | 92 ++++++++++++++++++++++++-------- ext/descriptor/test.js | 12 +++-- src/parse.js | 3 ++ tests/data/convert.js | 10 ++-- tests/data/mapbox/vector_tile.js | 4 +- tests/data/test.js | 36 ++++++------- 10 files changed, 149 insertions(+), 71 deletions(-) diff --git a/bench/data/static_pbjs.js b/bench/data/static_pbjs.js index 4f28cc258..e10a538a0 100644 --- a/bench/data/static_pbjs.js +++ b/bench/data/static_pbjs.js @@ -130,7 +130,7 @@ $root.Test = (function() { if (message.long != null && message.hasOwnProperty("long")) writer.uint32(8).int64(message.long); if (message["enum"] != null && message.hasOwnProperty("enum")) - writer.uint32(16).uint32(message["enum"]); + writer.uint32(16).int32(message["enum"]); if (message.sint32 != null && message.hasOwnProperty("sint32")) writer.uint32(24).sint32(message.sint32); return writer; @@ -147,7 +147,7 @@ $root.Test = (function() { message.long = reader.int64(); break; case 2: - message["enum"] = reader.uint32(); + message["enum"] = reader.int32(); break; case 3: message.sint32 = reader.sint32(); diff --git a/cli/lib/tsd-jsdoc/publish.js b/cli/lib/tsd-jsdoc/publish.js index f1bb51331..cb4c6eca4 100644 --- a/cli/lib/tsd-jsdoc/publish.js +++ b/cli/lib/tsd-jsdoc/publish.js @@ -241,7 +241,7 @@ function getTypeOf(element) { // begins writing the definition of the specified element function begin(element, is_interface) { - writeComment(element.comment, is_interface || isInterface(element) || isClassLike(element) || isNamespace(element) || element.isEnum); + writeComment(element.comment, is_interface || isInterface(element) || isClassLike(element) || isNamespace(element) || element.isEnum || element.scope === "global"); if (element.scope !== "global" || options.module) return; write("export "); diff --git a/ext/descriptor/README.md b/ext/descriptor/README.md index c169c3f60..52ff8e1a9 100644 --- a/ext/descriptor/README.md +++ b/ext/descriptor/README.md @@ -36,22 +36,22 @@ The extension adds `.fromDescriptor(descriptor[, syntax])` and `#toDescriptor([s | Descriptor type | protobuf.js type | Remarks |--------------------------|------------------|--------- | FileDescriptorSet | Root | -| FileDescriptorProto | Root | except dependencies, sourceCodeInfo -| FileOptions | Root | not supported +| FileDescriptorProto | Root | except dependencies +| FileOptions | Root | | DescriptorProto | Type | -| MessageOptions | Type | not supported -| FieldDescriptorProto | Field | except defaultValue +| MessageOptions | Type | +| FieldDescriptorProto | Field | | FieldOptions | Field | | OneofDescriptorProto | OneOf | -| OneofOptions | OneOf | not supported +| OneofOptions | OneOf | | EnumDescriptorProto | Enum | | EnumValueDescriptorProto | Enum | -| EnumOptions | Enum | only allowAlias +| EnumOptions | Enum | | EnumValueOptions | Enum | not supported | ServiceDescriptorProto | Service | -| ServiceOptions | Service | not supported +| ServiceOptions | Service | | MethodDescriptorProto | Method | -| MethodOptions | Method | not supported +| MethodOptions | Method | | UninterpretedOption | | not supported | SourceCodeInfo | | not supported | GeneratedCodeInfo | | not supported diff --git a/ext/descriptor/index.d.ts b/ext/descriptor/index.d.ts index 93fd5bed9..5c2a2f66b 100644 --- a/ext/descriptor/index.d.ts +++ b/ext/descriptor/index.d.ts @@ -46,26 +46,29 @@ type ReservedRangeProperties = { end?: number; }; -type FieldOptionsProperties = { - packed?: boolean; -}; - type FieldDescriptorProtoProperties = { name?: string; number?: number; - label?: FieldDescriptorProtoLabel; - type?: FieldDescriptorProtoType; + label?: FieldDescriptorProto_Label; + type?: FieldDescriptorProto_Type; typeName?: string; extendee?: string; - defaultValue?: any; + defaultValue?: string; oneofIndex?: number; jsonName?: any; options?: FieldOptionsProperties; }; -type FieldDescriptorProtoLabel = number; +type FieldDescriptorProto_Label = number; -type FieldDescriptorProtoType = number; +type FieldDescriptorProto_Type = number; + +type FieldOptionsProperties = { + packed?: boolean; + jstype?: FieldOptions_JSType; +}; + +type FieldOptions_JSType = number; type EnumDescriptorProtoProperties = { name?: string; @@ -102,23 +105,43 @@ type MethodDescriptorProtoProperties = { clientStreaming?: boolean; serverStreaming?: boolean; }; + export const FileDescriptorSet: $protobuf.Type; + export const FileDescriptorProto: $protobuf.Type; + export const DescriptorProto: $protobuf.Type; + export const FieldDescriptorProto: $protobuf.Type; + export const OneofDescriptorProto: $protobuf.Type; + export const EnumDescriptorProto: $protobuf.Type; + export const ServiceDescriptorProto: $protobuf.Type; + export const EnumValueDescriptorProto: $protobuf.Type; + export const MethodDescriptorProto: $protobuf.Type; + export const FileOptions: $protobuf.Type; + export const MessageOptions: $protobuf.Type; + export const FieldOptions: $protobuf.Type; + export const OneofOptions: $protobuf.Type; + export const EnumOptions: $protobuf.Type; + export const EnumValueOptions: $protobuf.Type; + export const ServiceOptions: $protobuf.Type; + export const MethodOptions: $protobuf.Type; + export const UninterpretedOption: $protobuf.Type; + export const SourceCodeInfo: $protobuf.Type; + export const GeneratedCodeInfo: $protobuf.Type; diff --git a/ext/descriptor/index.js b/ext/descriptor/index.js index 1e3dbdb8a..219fb5772 100644 --- a/ext/descriptor/index.js +++ b/ext/descriptor/index.js @@ -1,5 +1,5 @@ "use strict"; -var $protobuf = require("../.."); +var $protobuf = require("../.."); // requires the full library (uses parser exports) module.exports = exports = $protobuf.descriptor = $protobuf.Root.fromJSON(require("../../google/protobuf/descriptor.json")).lookup(".google.protobuf"); var Namespace = $protobuf.Namespace, @@ -73,6 +73,12 @@ Root.fromDescriptor = function fromDescriptor(descriptor) { if (fileDescriptor.extension) for (i = 0; i < fileDescriptor.extension.length; ++i) filePackage.add(Field.fromDescriptor(fileDescriptor.extension[i])); + var opts = fromDescriptorOptions(fileDescriptor.options, exports.FileOptions); + if (opts) { + var ks = Object.keys(opts); + for (i = 0; i < ks.length; ++i) + filePackage.setOption(ks[i], opts[ks[i]]); + } } } @@ -114,6 +120,9 @@ function Root_toDescriptorRecursive(ns, files, syntax) { else if (nested instanceof /* plain */ Namespace) Root_toDescriptorRecursive(nested, files, syntax); // requires new file + // Keep package-level options + file.options = toDescriptorOptions(ns.options, exports.FileOptions); + // And keep the file only if there is at least one nested object if (file.messageType.length + file.enumType.length + file.extension.length + file.service.length) files.push(file); @@ -180,7 +189,7 @@ Type.fromDescriptor = function fromDescriptor(descriptor, syntax) { descriptor = exports.DescriptorProto.decode(descriptor); // Create the message type - var type = new Type(descriptor.name.length ? descriptor.name : "Type" + unnamedMessageIndex++), + var type = new Type(descriptor.name.length ? descriptor.name : "Type" + unnamedMessageIndex++, fromDescriptorOptions(descriptor.options, exports.MessageOptions)), i; /* Oneofs */ if (descriptor.oneofDecl) @@ -273,8 +282,7 @@ Type.prototype.toDescriptor = function toDescriptor(syntax) { /* Ranges */ else descriptor.reservedRange.push(exports.DescriptorProto.ReservedRange.create({ start: this.reserved[i][0], end: this.reserved[i][1] })); - if (this.options && this.options.map_entry) - descriptor.options = exports.MessageOptions.create({ map_entry: true }); + descriptor.options = toDescriptorOptions(this.options, exports.MessageOptions); return descriptor; }; @@ -392,10 +400,25 @@ Field.fromDescriptor = function fromDescriptor(descriptor, syntax) { descriptor.extendee.length ? descriptor.extendee : undefined ); - if (descriptor.options) - field.options = fromDescriptorOptions(descriptor.options, exports.FieldOptions); - if (descriptor.defaultValue && descriptor.defaultValue.length) - field.setOption("default", descriptor.defaultValue); + field.options = fromDescriptorOptions(descriptor.options, exports.FieldOptions); + + if (descriptor.defaultValue && descriptor.defaultValue.length) { + var defaultValue = descriptor.defaultValue; + switch (defaultValue) { + case "true": case "TRUE": + defaultValue = true; + break; + case "false": case "FALSE": + defaultValue = false; + break; + default: + var match = $protobuf.parse.numberRe.exec(defaultValue); + if (match) + defaultValue = parseInt(defaultValue); + break; + } + field.setOption("default", defaultValue); + } if (packableDescriptorType(descriptor.type)) { if (syntax === "proto3") { // defaults to packed=true (internal preset is packed=true) @@ -522,7 +545,7 @@ Enum.fromDescriptor = function fromDescriptor(descriptor) { return new Enum( descriptor.name && descriptor.name.length ? descriptor.name : "Enum" + unnamedEnumIndex++, values, - descriptor.options && descriptor.options.allowAlias ? { allowAlias: true } : undefined + fromDescriptorOptions(descriptor.options, exports.EnumOptions) ); }; @@ -540,7 +563,8 @@ Enum.prototype.toDescriptor = function toDescriptor() { return exports.EnumDescriptorProto.create({ name: this.name, - value: values + value: values, + options: toDescriptorOptions(this.options, exports.EnumOptions) }); }; @@ -572,6 +596,7 @@ OneOf.fromDescriptor = function fromDescriptor(descriptor) { return new OneOf( // unnamedOneOfIndex is global, not per type, because we have no ref to a type here descriptor.name && descriptor.name.length ? descriptor.name : "oneof" + unnamedOneofIndex++ + // fromDescriptorOptions(descriptor.options, exports.OneofOptions) - only uninterpreted_option ); }; @@ -583,6 +608,7 @@ OneOf.fromDescriptor = function fromDescriptor(descriptor) { OneOf.prototype.toDescriptor = function toDescriptor() { return exports.OneofDescriptorProto.create({ name: this.name + // options: toDescriptorOptions(this.options, exports.OneofOptions) - only uninterpreted_option }); }; @@ -612,7 +638,7 @@ Service.fromDescriptor = function fromDescriptor(descriptor) { if (typeof descriptor.length === "number") descriptor = exports.ServiceDescriptorProto.decode(descriptor); - var service = new Service(descriptor.name && descriptor.name.length ? descriptor.name : "Service" + unnamedServiceIndex++); + var service = new Service(descriptor.name && descriptor.name.length ? descriptor.name : "Service" + unnamedServiceIndex++, fromDescriptorOptions(descriptor.options, exports.ServiceOptions)); if (descriptor.method) for (var i = 0; i < descriptor.method.length; ++i) service.add(Method.fromDescriptor(descriptor.method[i])); @@ -634,7 +660,8 @@ Service.prototype.toDescriptor = function toDescriptor() { return exports.ServiceDescriptorProto.create({ name: this.name, - methods: methods + methods: methods, + options: toDescriptorOptions(this.options, exports.ServiceOptions) }); }; @@ -674,7 +701,8 @@ Method.fromDescriptor = function fromDescriptor(descriptor) { descriptor.inputType, descriptor.outputType, Boolean(descriptor.clientStreaming), - Boolean(descriptor.serverStreaming) + Boolean(descriptor.serverStreaming), + fromDescriptorOptions(descriptor.options, exports.MethodOptions) ); }; @@ -689,7 +717,8 @@ Method.prototype.toDescriptor = function toDescriptor() { inputType: this.resolvedRequestType ? this.resolvedRequestType.fullName : this.requestType, outputType: this.resolvedResponseType ? this.resolvedResponseType.fullName : this.responseType, clientStreaming: this.requestStream, - serverStreaming: this.responseStream + serverStreaming: this.responseStream, + options: toDescriptorOptions(this.options, exports.MethodOptions) }); }; @@ -769,20 +798,34 @@ function toDescriptorType(type, resolvedType) { // Converts descriptor options to an options object function fromDescriptorOptions(options, type) { + if (!options) + return undefined; var out = []; - for (var i = 0, key; i < type.fieldsArray.length; ++i) - if ((key = type._fieldsArray[i].name) !== "uninterpretedOption") - if (options.hasOwnProperty(key)) // eslint-disable-line no-prototype-builtins - out.push(key, options[key]); + for (var i = 0, field, key, val; i < type.fieldsArray.length; ++i) + if ((key = (field = type._fieldsArray[i]).name) !== "uninterpretedOption") + if (options.hasOwnProperty(key)) { // eslint-disable-line no-prototype-builtins + val = options[key]; + if (field.resolvedType instanceof Enum && typeof val === "number" && field.resolvedType.valuesById[val] !== undefined) + val = field.resolvedType.valuesById[val]; + out.push(underScore(key), val); + } return out.length ? $protobuf.util.toObject(out) : undefined; } // Converts an options object to descriptor options function toDescriptorOptions(options, type) { + if (!options) + return undefined; var out = []; - for (var i = 0, key; i < type.fieldsArray.length; ++i) - if ((key = type._fieldsArray[i].name) !== "default") - out.push(key, options[key]); + for (var i = 0, ks = Object.keys(options), key, val; i < ks.length; ++i) { + val = options[key = ks[i]]; + if (key === "default") + continue; + var field = type.fields[key]; + if (!field && !(field = type.fields[key = $protobuf.parse.camelCase(key)])) + continue; + out.push(key, val); + } return out.length ? type.fromObject($protobuf.util.toObject(out)) : undefined; } @@ -805,6 +848,13 @@ function shortname(from, to) { return toPath.slice(j).join("."); } +// copied here from cli/targets/proto.js +function underScore(str) { + return str.substring(0,1) + + str.substring(1) + .replace(/([A-Z])(?=[a-z]|$)/g, function($0, $1) { return "_" + $1.toLowerCase(); }); +} + // --- exports --- /** diff --git a/ext/descriptor/test.js b/ext/descriptor/test.js index fcf5273e9..ed38e9ecc 100644 --- a/ext/descriptor/test.js +++ b/ext/descriptor/test.js @@ -27,7 +27,8 @@ var proto = require("../../google/protobuf/descriptor.json")/*{ } }*/; -var root = protobuf.Root.fromJSON(proto).resolveAll(); +// var root = protobuf.Root.fromJSON(proto).resolveAll(); +var root = protobuf.loadSync("tests/data/google/protobuf/descriptor.proto").resolveAll(); // console.log("Original proto", JSON.stringify(root, null, 2)); @@ -41,12 +42,13 @@ var root2 = protobuf.Root.fromDescriptor(buf, "proto2").resolveAll(); // console.log("\nDecoded proto", JSON.stringify(root2, null, 2)); var diff = require("deep-diff").diff(root.toJSON(), root2.toJSON()); -if (diff) +if (diff) { diff.forEach(function(diff) { console.log(diff.kind + " @ " + diff.path.join(".")); - console.log("lhs:", diff.lhs); - console.log("rhs:", diff.rhs); + console.log("lhs:", typeof diff.lhs, diff.lhs); + console.log("rhs:", typeof diff.rhs, diff.rhs); console.log(); }); -else + process.exit(1); +} else console.log("no differences"); diff --git a/src/parse.js b/src/parse.js index 7b851d809..025c81021 100644 --- a/src/parse.js +++ b/src/parse.js @@ -35,6 +35,9 @@ function camelCase(str) { .replace(camelCaseRe, function($0, $1) { return $1.toUpperCase(); }); } +parse.camelCase = camelCase; +parse.numberRe = numberRe; + /** * Result object returned from {@link parse}. * @typedef ParserResult diff --git a/tests/data/convert.js b/tests/data/convert.js index 7d7e63aa4..d4b9b1056 100644 --- a/tests/data/convert.js +++ b/tests/data/convert.js @@ -135,11 +135,11 @@ $root.Message = (function() { for (var i = 0; i < message.bytesRepeated.length; ++i) writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.bytesRepeated[i]); if (message.enumVal != null && message.hasOwnProperty("enumVal")) - writer.uint32(/* id 7, wireType 0 =*/56).uint32(message.enumVal); + writer.uint32(/* id 7, wireType 0 =*/56).int32(message.enumVal); if (message.enumRepeated != null && message.enumRepeated.length) { writer.uint32(/* id 8, wireType 2 =*/66).fork(); for (var i = 0; i < message.enumRepeated.length; ++i) - writer.uint32(message.enumRepeated[i]); + writer.int32(message.enumRepeated[i]); writer.ldelim(); } if (message.int64Map != null && message.hasOwnProperty("int64Map")) @@ -203,7 +203,7 @@ $root.Message = (function() { message.bytesRepeated.push(reader.bytes()); break; case 7: - message.enumVal = reader.uint32(); + message.enumVal = reader.int32(); break; case 8: if (!(message.enumRepeated && message.enumRepeated.length)) @@ -211,9 +211,9 @@ $root.Message = (function() { if ((tag & 7) === 2) { var end2 = reader.uint32() + reader.pos; while (reader.pos < end2) - message.enumRepeated.push(reader.uint32()); + message.enumRepeated.push(reader.int32()); } else - message.enumRepeated.push(reader.uint32()); + message.enumRepeated.push(reader.int32()); break; case 9: reader.skip().pos++; diff --git a/tests/data/mapbox/vector_tile.js b/tests/data/mapbox/vector_tile.js index 53934f80d..c031a994c 100644 --- a/tests/data/mapbox/vector_tile.js +++ b/tests/data/mapbox/vector_tile.js @@ -626,7 +626,7 @@ $root.vector_tile = (function() { writer.ldelim(); } if (message.type != null && message.hasOwnProperty("type")) - writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.type); + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.type); if (message.geometry != null && message.geometry.length) { writer.uint32(/* id 4, wireType 2 =*/34).fork(); for (var i = 0; i < message.geometry.length; ++i) @@ -675,7 +675,7 @@ $root.vector_tile = (function() { message.tags.push(reader.uint32()); break; case 3: - message.type = reader.uint32(); + message.type = reader.int32(); break; case 4: if (!(message.geometry && message.geometry.length)) diff --git a/tests/data/test.js b/tests/data/test.js index d85e90dab..53836f781 100644 --- a/tests/data/test.js +++ b/tests/data/test.js @@ -229,7 +229,7 @@ $root.jspb = (function() { if (!writer) writer = $Writer.create(); if (message.outerEnum != null && message.hasOwnProperty("outerEnum")) - writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.outerEnum); + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.outerEnum); return writer; }; @@ -259,7 +259,7 @@ $root.jspb = (function() { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.outerEnum = reader.uint32(); + message.outerEnum = reader.int32(); break; default: reader.skipType(tag & 7); @@ -2999,7 +2999,7 @@ $root.jspb = (function() { if (message.intField != null && message.hasOwnProperty("intField")) writer.uint32(/* id 3, wireType 0 =*/24).int64(message.intField); if (message.enumField != null && message.hasOwnProperty("enumField")) - writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.enumField); + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.enumField); if (message.emptyField != null && message.hasOwnProperty("emptyField")) writer.uint32(/* id 6, wireType 2 =*/50).string(message.emptyField); if (message.bytesField != null && message.hasOwnProperty("bytesField")) @@ -3042,7 +3042,7 @@ $root.jspb = (function() { message.intField = reader.int64(); break; case 4: - message.enumField = reader.uint32(); + message.enumField = reader.int32(); break; case 6: message.emptyField = reader.string(); @@ -6177,7 +6177,7 @@ $root.jspb = (function() { writer.uint32(/* id 5, wireType 2 =*/42).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 1 =*/17).double(message.mapStringDouble[keys[i]]).ldelim(); if (message.mapStringEnum != null && message.hasOwnProperty("mapStringEnum")) for (var keys = Object.keys(message.mapStringEnum), i = 0; i < keys.length; ++i) - writer.uint32(/* id 6, wireType 2 =*/50).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 0 =*/16).uint32(message.mapStringEnum[keys[i]]).ldelim(); + writer.uint32(/* id 6, wireType 2 =*/50).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 0 =*/16).int32(message.mapStringEnum[keys[i]]).ldelim(); if (message.mapStringMsg != null && message.hasOwnProperty("mapStringMsg")) for (var keys = Object.keys(message.mapStringMsg), i = 0; i < keys.length; ++i) { writer.uint32(/* id 7, wireType 2 =*/58).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); @@ -6273,7 +6273,7 @@ $root.jspb = (function() { message.mapStringEnum = {}; key = reader.string(); reader.pos++; - message.mapStringEnum[key] = reader.uint32(); + message.mapStringEnum[key] = reader.int32(); break; case 7: reader.skip().pos++; @@ -9072,9 +9072,9 @@ $root.google = (function() { if (message.number != null && message.hasOwnProperty("number")) writer.uint32(/* id 3, wireType 0 =*/24).int32(message.number); if (message.label != null && message.hasOwnProperty("label")) - writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.label); + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.label); if (message.type != null && message.hasOwnProperty("type")) - writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.type); + writer.uint32(/* id 5, wireType 0 =*/40).int32(message.type); if (message.typeName != null && message.hasOwnProperty("typeName")) writer.uint32(/* id 6, wireType 2 =*/50).string(message.typeName); if (message.defaultValue != null && message.hasOwnProperty("defaultValue")) @@ -9120,10 +9120,10 @@ $root.google = (function() { message.number = reader.int32(); break; case 4: - message.label = reader.uint32(); + message.label = reader.int32(); break; case 5: - message.type = reader.uint32(); + message.type = reader.int32(); break; case 6: message.typeName = reader.string(); @@ -10771,7 +10771,7 @@ $root.google = (function() { if (message.javaOuterClassname != null && message.hasOwnProperty("javaOuterClassname")) writer.uint32(/* id 8, wireType 2 =*/66).string(message.javaOuterClassname); if (message.optimizeFor != null && message.hasOwnProperty("optimizeFor")) - writer.uint32(/* id 9, wireType 0 =*/72).uint32(message.optimizeFor); + writer.uint32(/* id 9, wireType 0 =*/72).int32(message.optimizeFor); if (message.javaMultipleFiles != null && message.hasOwnProperty("javaMultipleFiles")) writer.uint32(/* id 10, wireType 0 =*/80).bool(message.javaMultipleFiles); if (message.goPackage != null && message.hasOwnProperty("goPackage")) @@ -10841,7 +10841,7 @@ $root.google = (function() { message.javaStringCheckUtf8 = reader.bool(); break; case 9: - message.optimizeFor = reader.uint32(); + message.optimizeFor = reader.int32(); break; case 11: message.goPackage = reader.string(); @@ -11482,7 +11482,7 @@ $root.google = (function() { if (!writer) writer = $Writer.create(); if (message.ctype != null && message.hasOwnProperty("ctype")) - writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.ctype); + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.ctype); if (message.packed != null && message.hasOwnProperty("packed")) writer.uint32(/* id 2, wireType 0 =*/16).bool(message.packed); if (message.deprecated != null && message.hasOwnProperty("deprecated")) @@ -11490,7 +11490,7 @@ $root.google = (function() { if (message.lazy != null && message.hasOwnProperty("lazy")) writer.uint32(/* id 5, wireType 0 =*/40).bool(message.lazy); if (message.jstype != null && message.hasOwnProperty("jstype")) - writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.jstype); + writer.uint32(/* id 6, wireType 0 =*/48).int32(message.jstype); if (message.weak != null && message.hasOwnProperty("weak")) writer.uint32(/* id 10, wireType 0 =*/80).bool(message.weak); if (message.uninterpretedOption != null && message.uninterpretedOption.length) @@ -11525,13 +11525,13 @@ $root.google = (function() { var tag = reader.uint32(); switch (tag >>> 3) { case 1: - message.ctype = reader.uint32(); + message.ctype = reader.int32(); break; case 2: message.packed = reader.bool(); break; case 6: - message.jstype = reader.uint32(); + message.jstype = reader.int32(); break; case 5: message.lazy = reader.bool(); @@ -12682,7 +12682,7 @@ $root.google = (function() { if (message.deprecated != null && message.hasOwnProperty("deprecated")) writer.uint32(/* id 33, wireType 0 =*/264).bool(message.deprecated); if (message.idempotencyLevel != null && message.hasOwnProperty("idempotencyLevel")) - writer.uint32(/* id 34, wireType 0 =*/272).uint32(message.idempotencyLevel); + writer.uint32(/* id 34, wireType 0 =*/272).int32(message.idempotencyLevel); if (message.uninterpretedOption != null && message.uninterpretedOption.length) for (var i = 0; i < message.uninterpretedOption.length; ++i) $root.google.protobuf.UninterpretedOption.encode(message.uninterpretedOption[i], writer.uint32(/* id 999, wireType 2 =*/7994).fork()).ldelim(); @@ -12718,7 +12718,7 @@ $root.google = (function() { message.deprecated = reader.bool(); break; case 34: - message.idempotencyLevel = reader.uint32(); + message.idempotencyLevel = reader.int32(); break; case 999: if (!(message.uninterpretedOption && message.uninterpretedOption.length))