From 633c5d7f6aa4d97f3a5cf17302af5ef1bcaac051 Mon Sep 17 00:00:00 2001 From: "Philip K. Warren" Date: Fri, 2 Apr 2021 15:11:01 -0500 Subject: [PATCH 1/3] Fix get/set conflicting method names. Update the typescript generator to add a suffix '$' to methods which conflict on the Message base class ('getExtension'/'setExtension'/'getJsPbMessageId'/'setJsPbMessageId'). This will keep the typescript definitions in sync with the generated JS code from the protoc compiler. Fixes #271. --- .../proto/examplecom/getter_name_grpc_pb.d.ts | 1 + .../proto/examplecom/getter_name_grpc_pb.js | 1 + .../proto/examplecom/getter_name_pb.d.ts | 31 +++ .../proto/examplecom/getter_name_pb.js | 224 ++++++++++++++++++ .../proto/examplecom/getter_name_grpc_pb.d.ts | 1 + .../proto/examplecom/getter_name_grpc_pb.js | 1 + .../proto/examplecom/getter_name_pb.d.ts | 31 +++ .../proto/examplecom/getter_name_pb.js | 224 ++++++++++++++++++ .../proto/examplecom/getter_name_pb.d.ts | 31 +++ .../proto/examplecom/getter_name_pb.js | 224 ++++++++++++++++++ .../examplecom/getter_name_pb_service.d.ts | 3 + .../examplecom/getter_name_pb_service.js | 3 + .../proto/examplecom/getter_name_pb.d.ts | 31 +++ .../proto/examplecom/getter_name_pb.js | 224 ++++++++++++++++++ proto/examplecom/getter_name.proto | 8 + src/ts/message.ts | 14 +- test/integration/getterName.ts | 19 ++ 17 files changed, 1067 insertions(+), 4 deletions(-) create mode 100644 examples/generated-grpc-js-node/proto/examplecom/getter_name_grpc_pb.d.ts create mode 100644 examples/generated-grpc-js-node/proto/examplecom/getter_name_grpc_pb.js create mode 100644 examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.d.ts create mode 100644 examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.js create mode 100644 examples/generated-grpc-node/proto/examplecom/getter_name_grpc_pb.d.ts create mode 100644 examples/generated-grpc-node/proto/examplecom/getter_name_grpc_pb.js create mode 100644 examples/generated-grpc-node/proto/examplecom/getter_name_pb.d.ts create mode 100644 examples/generated-grpc-node/proto/examplecom/getter_name_pb.js create mode 100644 examples/generated-grpc-web/proto/examplecom/getter_name_pb.d.ts create mode 100644 examples/generated-grpc-web/proto/examplecom/getter_name_pb.js create mode 100644 examples/generated-grpc-web/proto/examplecom/getter_name_pb_service.d.ts create mode 100644 examples/generated-grpc-web/proto/examplecom/getter_name_pb_service.js create mode 100644 examples/generated/proto/examplecom/getter_name_pb.d.ts create mode 100644 examples/generated/proto/examplecom/getter_name_pb.js create mode 100644 proto/examplecom/getter_name.proto create mode 100644 test/integration/getterName.ts diff --git a/examples/generated-grpc-js-node/proto/examplecom/getter_name_grpc_pb.d.ts b/examples/generated-grpc-js-node/proto/examplecom/getter_name_grpc_pb.d.ts new file mode 100644 index 00000000..51b4d695 --- /dev/null +++ b/examples/generated-grpc-js-node/proto/examplecom/getter_name_grpc_pb.d.ts @@ -0,0 +1 @@ +// GENERATED CODE -- NO SERVICES IN PROTO diff --git a/examples/generated-grpc-js-node/proto/examplecom/getter_name_grpc_pb.js b/examples/generated-grpc-js-node/proto/examplecom/getter_name_grpc_pb.js new file mode 100644 index 00000000..97b3a246 --- /dev/null +++ b/examples/generated-grpc-js-node/proto/examplecom/getter_name_grpc_pb.js @@ -0,0 +1 @@ +// GENERATED CODE -- NO SERVICES IN PROTO \ No newline at end of file diff --git a/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.d.ts b/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.d.ts new file mode 100644 index 00000000..f131f5e0 --- /dev/null +++ b/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.d.ts @@ -0,0 +1,31 @@ +// package: examplecom +// file: proto/examplecom/getter_name.proto + +import * as jspb from "google-protobuf"; + +export class GetterNameConflictMessage extends jspb.Message { + getExtension$(): string; + setExtension$(value: string): void; + + getJsPbMessageId$(): Uint8Array | string; + getJsPbMessageId_asU8(): Uint8Array; + getJsPbMessageId_asB64(): string; + setJsPbMessageId$(value: Uint8Array | string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetterNameConflictMessage.AsObject; + static toObject(includeInstance: boolean, msg: GetterNameConflictMessage): GetterNameConflictMessage.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetterNameConflictMessage, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetterNameConflictMessage; + static deserializeBinaryFromReader(message: GetterNameConflictMessage, reader: jspb.BinaryReader): GetterNameConflictMessage; +} + +export namespace GetterNameConflictMessage { + export type AsObject = { + extension: string, + jsPbMessageId: Uint8Array | string, + } +} + diff --git a/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.js b/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.js new file mode 100644 index 00000000..61d31181 --- /dev/null +++ b/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.js @@ -0,0 +1,224 @@ +// source: proto/examplecom/getter_name.proto +/** + * @fileoverview + * @enhanceable + * @suppress {missingRequire} reports error on implicit type usages. + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! +/* eslint-disable */ +// @ts-nocheck + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = Function('return this')(); + +goog.exportSymbol('proto.examplecom.GetterNameConflictMessage', null, global); +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.examplecom.GetterNameConflictMessage = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.examplecom.GetterNameConflictMessage, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.examplecom.GetterNameConflictMessage.displayName = 'proto.examplecom.GetterNameConflictMessage'; +} + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.examplecom.GetterNameConflictMessage.prototype.toObject = function(opt_includeInstance) { + return proto.examplecom.GetterNameConflictMessage.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.examplecom.GetterNameConflictMessage} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.examplecom.GetterNameConflictMessage.toObject = function(includeInstance, msg) { + var f, obj = { + extension: jspb.Message.getFieldWithDefault(msg, 1, ""), + jsPbMessageId: msg.getJsPbMessageId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.examplecom.GetterNameConflictMessage} + */ +proto.examplecom.GetterNameConflictMessage.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.examplecom.GetterNameConflictMessage; + return proto.examplecom.GetterNameConflictMessage.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.examplecom.GetterNameConflictMessage} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.examplecom.GetterNameConflictMessage} + */ +proto.examplecom.GetterNameConflictMessage.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setExtension$(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setJsPbMessageId$(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.examplecom.GetterNameConflictMessage.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.examplecom.GetterNameConflictMessage.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.examplecom.GetterNameConflictMessage} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.examplecom.GetterNameConflictMessage.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getExtension$(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getJsPbMessageId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } +}; + + +/** + * optional string extension = 1; + * @return {string} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getExtension$ = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.setExtension$ = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional bytes js_pb_message_id = 2; + * @return {!(string|Uint8Array)} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId$ = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes js_pb_message_id = 2; + * This is a type-conversion wrapper around `getJsPbMessageId$()` + * @return {string} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getJsPbMessageId$())); +}; + + +/** + * optional bytes js_pb_message_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getJsPbMessageId$()` + * @return {!Uint8Array} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getJsPbMessageId$())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.setJsPbMessageId$ = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +goog.object.extend(exports, proto.examplecom); diff --git a/examples/generated-grpc-node/proto/examplecom/getter_name_grpc_pb.d.ts b/examples/generated-grpc-node/proto/examplecom/getter_name_grpc_pb.d.ts new file mode 100644 index 00000000..51b4d695 --- /dev/null +++ b/examples/generated-grpc-node/proto/examplecom/getter_name_grpc_pb.d.ts @@ -0,0 +1 @@ +// GENERATED CODE -- NO SERVICES IN PROTO diff --git a/examples/generated-grpc-node/proto/examplecom/getter_name_grpc_pb.js b/examples/generated-grpc-node/proto/examplecom/getter_name_grpc_pb.js new file mode 100644 index 00000000..97b3a246 --- /dev/null +++ b/examples/generated-grpc-node/proto/examplecom/getter_name_grpc_pb.js @@ -0,0 +1 @@ +// GENERATED CODE -- NO SERVICES IN PROTO \ No newline at end of file diff --git a/examples/generated-grpc-node/proto/examplecom/getter_name_pb.d.ts b/examples/generated-grpc-node/proto/examplecom/getter_name_pb.d.ts new file mode 100644 index 00000000..f131f5e0 --- /dev/null +++ b/examples/generated-grpc-node/proto/examplecom/getter_name_pb.d.ts @@ -0,0 +1,31 @@ +// package: examplecom +// file: proto/examplecom/getter_name.proto + +import * as jspb from "google-protobuf"; + +export class GetterNameConflictMessage extends jspb.Message { + getExtension$(): string; + setExtension$(value: string): void; + + getJsPbMessageId$(): Uint8Array | string; + getJsPbMessageId_asU8(): Uint8Array; + getJsPbMessageId_asB64(): string; + setJsPbMessageId$(value: Uint8Array | string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetterNameConflictMessage.AsObject; + static toObject(includeInstance: boolean, msg: GetterNameConflictMessage): GetterNameConflictMessage.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetterNameConflictMessage, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetterNameConflictMessage; + static deserializeBinaryFromReader(message: GetterNameConflictMessage, reader: jspb.BinaryReader): GetterNameConflictMessage; +} + +export namespace GetterNameConflictMessage { + export type AsObject = { + extension: string, + jsPbMessageId: Uint8Array | string, + } +} + diff --git a/examples/generated-grpc-node/proto/examplecom/getter_name_pb.js b/examples/generated-grpc-node/proto/examplecom/getter_name_pb.js new file mode 100644 index 00000000..61d31181 --- /dev/null +++ b/examples/generated-grpc-node/proto/examplecom/getter_name_pb.js @@ -0,0 +1,224 @@ +// source: proto/examplecom/getter_name.proto +/** + * @fileoverview + * @enhanceable + * @suppress {missingRequire} reports error on implicit type usages. + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! +/* eslint-disable */ +// @ts-nocheck + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = Function('return this')(); + +goog.exportSymbol('proto.examplecom.GetterNameConflictMessage', null, global); +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.examplecom.GetterNameConflictMessage = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.examplecom.GetterNameConflictMessage, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.examplecom.GetterNameConflictMessage.displayName = 'proto.examplecom.GetterNameConflictMessage'; +} + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.examplecom.GetterNameConflictMessage.prototype.toObject = function(opt_includeInstance) { + return proto.examplecom.GetterNameConflictMessage.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.examplecom.GetterNameConflictMessage} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.examplecom.GetterNameConflictMessage.toObject = function(includeInstance, msg) { + var f, obj = { + extension: jspb.Message.getFieldWithDefault(msg, 1, ""), + jsPbMessageId: msg.getJsPbMessageId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.examplecom.GetterNameConflictMessage} + */ +proto.examplecom.GetterNameConflictMessage.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.examplecom.GetterNameConflictMessage; + return proto.examplecom.GetterNameConflictMessage.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.examplecom.GetterNameConflictMessage} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.examplecom.GetterNameConflictMessage} + */ +proto.examplecom.GetterNameConflictMessage.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setExtension$(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setJsPbMessageId$(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.examplecom.GetterNameConflictMessage.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.examplecom.GetterNameConflictMessage.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.examplecom.GetterNameConflictMessage} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.examplecom.GetterNameConflictMessage.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getExtension$(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getJsPbMessageId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } +}; + + +/** + * optional string extension = 1; + * @return {string} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getExtension$ = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.setExtension$ = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional bytes js_pb_message_id = 2; + * @return {!(string|Uint8Array)} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId$ = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes js_pb_message_id = 2; + * This is a type-conversion wrapper around `getJsPbMessageId$()` + * @return {string} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getJsPbMessageId$())); +}; + + +/** + * optional bytes js_pb_message_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getJsPbMessageId$()` + * @return {!Uint8Array} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getJsPbMessageId$())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.setJsPbMessageId$ = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +goog.object.extend(exports, proto.examplecom); diff --git a/examples/generated-grpc-web/proto/examplecom/getter_name_pb.d.ts b/examples/generated-grpc-web/proto/examplecom/getter_name_pb.d.ts new file mode 100644 index 00000000..f131f5e0 --- /dev/null +++ b/examples/generated-grpc-web/proto/examplecom/getter_name_pb.d.ts @@ -0,0 +1,31 @@ +// package: examplecom +// file: proto/examplecom/getter_name.proto + +import * as jspb from "google-protobuf"; + +export class GetterNameConflictMessage extends jspb.Message { + getExtension$(): string; + setExtension$(value: string): void; + + getJsPbMessageId$(): Uint8Array | string; + getJsPbMessageId_asU8(): Uint8Array; + getJsPbMessageId_asB64(): string; + setJsPbMessageId$(value: Uint8Array | string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetterNameConflictMessage.AsObject; + static toObject(includeInstance: boolean, msg: GetterNameConflictMessage): GetterNameConflictMessage.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetterNameConflictMessage, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetterNameConflictMessage; + static deserializeBinaryFromReader(message: GetterNameConflictMessage, reader: jspb.BinaryReader): GetterNameConflictMessage; +} + +export namespace GetterNameConflictMessage { + export type AsObject = { + extension: string, + jsPbMessageId: Uint8Array | string, + } +} + diff --git a/examples/generated-grpc-web/proto/examplecom/getter_name_pb.js b/examples/generated-grpc-web/proto/examplecom/getter_name_pb.js new file mode 100644 index 00000000..61d31181 --- /dev/null +++ b/examples/generated-grpc-web/proto/examplecom/getter_name_pb.js @@ -0,0 +1,224 @@ +// source: proto/examplecom/getter_name.proto +/** + * @fileoverview + * @enhanceable + * @suppress {missingRequire} reports error on implicit type usages. + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! +/* eslint-disable */ +// @ts-nocheck + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = Function('return this')(); + +goog.exportSymbol('proto.examplecom.GetterNameConflictMessage', null, global); +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.examplecom.GetterNameConflictMessage = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.examplecom.GetterNameConflictMessage, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.examplecom.GetterNameConflictMessage.displayName = 'proto.examplecom.GetterNameConflictMessage'; +} + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.examplecom.GetterNameConflictMessage.prototype.toObject = function(opt_includeInstance) { + return proto.examplecom.GetterNameConflictMessage.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.examplecom.GetterNameConflictMessage} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.examplecom.GetterNameConflictMessage.toObject = function(includeInstance, msg) { + var f, obj = { + extension: jspb.Message.getFieldWithDefault(msg, 1, ""), + jsPbMessageId: msg.getJsPbMessageId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.examplecom.GetterNameConflictMessage} + */ +proto.examplecom.GetterNameConflictMessage.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.examplecom.GetterNameConflictMessage; + return proto.examplecom.GetterNameConflictMessage.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.examplecom.GetterNameConflictMessage} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.examplecom.GetterNameConflictMessage} + */ +proto.examplecom.GetterNameConflictMessage.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setExtension$(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setJsPbMessageId$(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.examplecom.GetterNameConflictMessage.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.examplecom.GetterNameConflictMessage.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.examplecom.GetterNameConflictMessage} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.examplecom.GetterNameConflictMessage.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getExtension$(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getJsPbMessageId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } +}; + + +/** + * optional string extension = 1; + * @return {string} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getExtension$ = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.setExtension$ = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional bytes js_pb_message_id = 2; + * @return {!(string|Uint8Array)} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId$ = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes js_pb_message_id = 2; + * This is a type-conversion wrapper around `getJsPbMessageId$()` + * @return {string} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getJsPbMessageId$())); +}; + + +/** + * optional bytes js_pb_message_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getJsPbMessageId$()` + * @return {!Uint8Array} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getJsPbMessageId$())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.setJsPbMessageId$ = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +goog.object.extend(exports, proto.examplecom); diff --git a/examples/generated-grpc-web/proto/examplecom/getter_name_pb_service.d.ts b/examples/generated-grpc-web/proto/examplecom/getter_name_pb_service.d.ts new file mode 100644 index 00000000..36718076 --- /dev/null +++ b/examples/generated-grpc-web/proto/examplecom/getter_name_pb_service.d.ts @@ -0,0 +1,3 @@ +// package: examplecom +// file: proto/examplecom/getter_name.proto + diff --git a/examples/generated-grpc-web/proto/examplecom/getter_name_pb_service.js b/examples/generated-grpc-web/proto/examplecom/getter_name_pb_service.js new file mode 100644 index 00000000..36718076 --- /dev/null +++ b/examples/generated-grpc-web/proto/examplecom/getter_name_pb_service.js @@ -0,0 +1,3 @@ +// package: examplecom +// file: proto/examplecom/getter_name.proto + diff --git a/examples/generated/proto/examplecom/getter_name_pb.d.ts b/examples/generated/proto/examplecom/getter_name_pb.d.ts new file mode 100644 index 00000000..f131f5e0 --- /dev/null +++ b/examples/generated/proto/examplecom/getter_name_pb.d.ts @@ -0,0 +1,31 @@ +// package: examplecom +// file: proto/examplecom/getter_name.proto + +import * as jspb from "google-protobuf"; + +export class GetterNameConflictMessage extends jspb.Message { + getExtension$(): string; + setExtension$(value: string): void; + + getJsPbMessageId$(): Uint8Array | string; + getJsPbMessageId_asU8(): Uint8Array; + getJsPbMessageId_asB64(): string; + setJsPbMessageId$(value: Uint8Array | string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetterNameConflictMessage.AsObject; + static toObject(includeInstance: boolean, msg: GetterNameConflictMessage): GetterNameConflictMessage.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetterNameConflictMessage, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetterNameConflictMessage; + static deserializeBinaryFromReader(message: GetterNameConflictMessage, reader: jspb.BinaryReader): GetterNameConflictMessage; +} + +export namespace GetterNameConflictMessage { + export type AsObject = { + extension: string, + jsPbMessageId: Uint8Array | string, + } +} + diff --git a/examples/generated/proto/examplecom/getter_name_pb.js b/examples/generated/proto/examplecom/getter_name_pb.js new file mode 100644 index 00000000..61d31181 --- /dev/null +++ b/examples/generated/proto/examplecom/getter_name_pb.js @@ -0,0 +1,224 @@ +// source: proto/examplecom/getter_name.proto +/** + * @fileoverview + * @enhanceable + * @suppress {missingRequire} reports error on implicit type usages. + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! +/* eslint-disable */ +// @ts-nocheck + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = Function('return this')(); + +goog.exportSymbol('proto.examplecom.GetterNameConflictMessage', null, global); +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.examplecom.GetterNameConflictMessage = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.examplecom.GetterNameConflictMessage, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.examplecom.GetterNameConflictMessage.displayName = 'proto.examplecom.GetterNameConflictMessage'; +} + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.examplecom.GetterNameConflictMessage.prototype.toObject = function(opt_includeInstance) { + return proto.examplecom.GetterNameConflictMessage.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.examplecom.GetterNameConflictMessage} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.examplecom.GetterNameConflictMessage.toObject = function(includeInstance, msg) { + var f, obj = { + extension: jspb.Message.getFieldWithDefault(msg, 1, ""), + jsPbMessageId: msg.getJsPbMessageId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.examplecom.GetterNameConflictMessage} + */ +proto.examplecom.GetterNameConflictMessage.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.examplecom.GetterNameConflictMessage; + return proto.examplecom.GetterNameConflictMessage.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.examplecom.GetterNameConflictMessage} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.examplecom.GetterNameConflictMessage} + */ +proto.examplecom.GetterNameConflictMessage.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setExtension$(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setJsPbMessageId$(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.examplecom.GetterNameConflictMessage.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.examplecom.GetterNameConflictMessage.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.examplecom.GetterNameConflictMessage} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.examplecom.GetterNameConflictMessage.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getExtension$(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getJsPbMessageId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } +}; + + +/** + * optional string extension = 1; + * @return {string} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getExtension$ = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.setExtension$ = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional bytes js_pb_message_id = 2; + * @return {!(string|Uint8Array)} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId$ = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes js_pb_message_id = 2; + * This is a type-conversion wrapper around `getJsPbMessageId$()` + * @return {string} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getJsPbMessageId$())); +}; + + +/** + * optional bytes js_pb_message_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getJsPbMessageId$()` + * @return {!Uint8Array} + */ +proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getJsPbMessageId$())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.setJsPbMessageId$ = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +goog.object.extend(exports, proto.examplecom); diff --git a/proto/examplecom/getter_name.proto b/proto/examplecom/getter_name.proto new file mode 100644 index 00000000..6e5abfea --- /dev/null +++ b/proto/examplecom/getter_name.proto @@ -0,0 +1,8 @@ +syntax = "proto3"; + +package examplecom; + +message GetterNameConflictMessage { + string extension = 1; + bytes js_pb_message_id = 2; +} diff --git a/src/ts/message.ts b/src/ts/message.ts index ba81d6cc..7f57ce24 100644 --- a/src/ts/message.ts +++ b/src/ts/message.ts @@ -47,6 +47,12 @@ function hasFieldPresence(field: FieldDescriptorProto, fileDescriptor: FileDescr return false; } +function jsGetterName(name: string): string { + // Avoid conflicts with base-class names. + // https://github.com/protocolbuffers/protobuf/blob/97cb3a862f132c6ab98e240be11990b89f7d5467/src/google/protobuf/compiler/js/js_generator.cc#L528-L531 + return name === "Extension" || name === "JsPbMessageId" ? name + "$" : name; +} + export function printMessage(fileName: string, exportMap: ExportMap, messageDescriptor: DescriptorProto, indentLevel: number, fileDescriptor: FileDescriptorProto) { const messageName = messageDescriptor.getName(); const messageOptions = messageDescriptor.getOptions(); @@ -189,10 +195,10 @@ export function printMessage(fileName: string, exportMap: ExportMap, messageDesc } else { if (type === BYTES_TYPE) { toObjectType.printIndentedLn(`${camelCaseName}: Uint8Array | string,`); - printer.printIndentedLn(`get${withUppercase}(): Uint8Array | string;`); + printer.printIndentedLn(`get${jsGetterName(withUppercase)}(): Uint8Array | string;`); printer.printIndentedLn(`get${withUppercase}_asU8(): Uint8Array;`); printer.printIndentedLn(`get${withUppercase}_asB64(): string;`); - printer.printIndentedLn(`set${withUppercase}(value: Uint8Array | string): void;`); + printer.printIndentedLn(`set${jsGetterName(withUppercase)}(value: Uint8Array | string): void;`); } else { let fieldObjectType = exportType; let canBeUndefined = false; @@ -208,8 +214,8 @@ export function printMessage(fileName: string, exportMap: ExportMap, messageDesc } const fieldObjectName = normaliseFieldObjectName(camelCaseName); toObjectType.printIndentedLn(`${fieldObjectName}${canBeUndefined ? "?" : ""}: ${fieldObjectType},`); - printer.printIndentedLn(`get${withUppercase}(): ${exportType}${canBeUndefined ? " | undefined" : ""};`); - printer.printIndentedLn(`set${withUppercase}(value${type === MESSAGE_TYPE ? "?" : ""}: ${exportType}): void;`); + printer.printIndentedLn(`get${jsGetterName(withUppercase)}(): ${exportType}${canBeUndefined ? " | undefined" : ""};`); + printer.printIndentedLn(`set${jsGetterName(withUppercase)}(value${type === MESSAGE_TYPE ? "?" : ""}: ${exportType}): void;`); } } printer.printEmptyLn(); diff --git a/test/integration/getterName.ts b/test/integration/getterName.ts new file mode 100644 index 00000000..37e560f5 --- /dev/null +++ b/test/integration/getterName.ts @@ -0,0 +1,19 @@ +import {assert} from "chai"; +import {GetterNameConflictMessage} from "../../examples/generated/proto/examplecom/getter_name_pb"; + +describe("getterName", () => { + + describe("getter", () => { + it("generate the correct definitions based on the code the protoc-gen-js plugin generates", () => { + const message = new GetterNameConflictMessage(); + + assert.equal(message.getExtension$(), ""); + message.setExtension$("abc"); + assert.equal(message.getExtension$(), "abc"); + + assert.equal(message.getJsPbMessageId$(), ""); + message.setJsPbMessageId$("def"); + assert.equal(message.getJsPbMessageId$(), "def"); + }); + }); +}); From 76d20357c11eb6c5c8969b536f68b7b8fb6d56f9 Mon Sep 17 00:00:00 2001 From: Marcus Longmuir Date: Mon, 26 Apr 2021 10:40:58 +0100 Subject: [PATCH 2/3] Presence checks with conflicting namess --- .../proto/examplecom/getter_name_pb.d.ts | 8 ++- .../proto/examplecom/getter_name_pb.js | 50 ++++++++++++++++--- .../proto/examplecom/getter_name_pb.d.ts | 8 ++- .../proto/examplecom/getter_name_pb.js | 50 ++++++++++++++++--- .../proto/examplecom/getter_name_pb.d.ts | 8 ++- .../proto/examplecom/getter_name_pb.js | 50 ++++++++++++++++--- .../proto/examplecom/getter_name_pb.d.ts | 8 ++- .../proto/examplecom/getter_name_pb.js | 50 ++++++++++++++++--- proto/examplecom/getter_name.proto | 6 +-- src/ts/message.ts | 2 +- test/integration/getterName.ts | 2 + 11 files changed, 202 insertions(+), 40 deletions(-) diff --git a/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.d.ts b/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.d.ts index f131f5e0..974e3b68 100644 --- a/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.d.ts +++ b/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.d.ts @@ -4,9 +4,13 @@ import * as jspb from "google-protobuf"; export class GetterNameConflictMessage extends jspb.Message { - getExtension$(): string; + hasExtension$(): boolean; + clearExtension(): void; + getExtension$(): string | undefined; setExtension$(value: string): void; + hasJsPbMessageId$(): boolean; + clearJsPbMessageId(): void; getJsPbMessageId$(): Uint8Array | string; getJsPbMessageId_asU8(): Uint8Array; getJsPbMessageId_asB64(): string; @@ -24,7 +28,7 @@ export class GetterNameConflictMessage extends jspb.Message { export namespace GetterNameConflictMessage { export type AsObject = { - extension: string, + extension?: string, jsPbMessageId: Uint8Array | string, } } diff --git a/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.js b/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.js index 61d31181..067ee470 100644 --- a/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.js +++ b/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.js @@ -69,7 +69,7 @@ proto.examplecom.GetterNameConflictMessage.prototype.toObject = function(opt_inc */ proto.examplecom.GetterNameConflictMessage.toObject = function(includeInstance, msg) { var f, obj = { - extension: jspb.Message.getFieldWithDefault(msg, 1, ""), + extension: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f, jsPbMessageId: msg.getJsPbMessageId_asB64() }; @@ -144,15 +144,15 @@ proto.examplecom.GetterNameConflictMessage.prototype.serializeBinary = function( */ proto.examplecom.GetterNameConflictMessage.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getExtension$(); - if (f.length > 0) { + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeString( 1, f ); } - f = message.getJsPbMessageId_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { writer.writeBytes( 2, f @@ -175,7 +175,25 @@ proto.examplecom.GetterNameConflictMessage.prototype.getExtension$ = function() * @return {!proto.examplecom.GetterNameConflictMessage} returns this */ proto.examplecom.GetterNameConflictMessage.prototype.setExtension$ = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.clearExtension$ = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.examplecom.GetterNameConflictMessage.prototype.hasExtension$ = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -217,7 +235,25 @@ proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId_asU8 = fun * @return {!proto.examplecom.GetterNameConflictMessage} returns this */ proto.examplecom.GetterNameConflictMessage.prototype.setJsPbMessageId$ = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.clearJsPbMessageId$ = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.examplecom.GetterNameConflictMessage.prototype.hasJsPbMessageId$ = function() { + return jspb.Message.getField(this, 2) != null; }; diff --git a/examples/generated-grpc-node/proto/examplecom/getter_name_pb.d.ts b/examples/generated-grpc-node/proto/examplecom/getter_name_pb.d.ts index f131f5e0..974e3b68 100644 --- a/examples/generated-grpc-node/proto/examplecom/getter_name_pb.d.ts +++ b/examples/generated-grpc-node/proto/examplecom/getter_name_pb.d.ts @@ -4,9 +4,13 @@ import * as jspb from "google-protobuf"; export class GetterNameConflictMessage extends jspb.Message { - getExtension$(): string; + hasExtension$(): boolean; + clearExtension(): void; + getExtension$(): string | undefined; setExtension$(value: string): void; + hasJsPbMessageId$(): boolean; + clearJsPbMessageId(): void; getJsPbMessageId$(): Uint8Array | string; getJsPbMessageId_asU8(): Uint8Array; getJsPbMessageId_asB64(): string; @@ -24,7 +28,7 @@ export class GetterNameConflictMessage extends jspb.Message { export namespace GetterNameConflictMessage { export type AsObject = { - extension: string, + extension?: string, jsPbMessageId: Uint8Array | string, } } diff --git a/examples/generated-grpc-node/proto/examplecom/getter_name_pb.js b/examples/generated-grpc-node/proto/examplecom/getter_name_pb.js index 61d31181..067ee470 100644 --- a/examples/generated-grpc-node/proto/examplecom/getter_name_pb.js +++ b/examples/generated-grpc-node/proto/examplecom/getter_name_pb.js @@ -69,7 +69,7 @@ proto.examplecom.GetterNameConflictMessage.prototype.toObject = function(opt_inc */ proto.examplecom.GetterNameConflictMessage.toObject = function(includeInstance, msg) { var f, obj = { - extension: jspb.Message.getFieldWithDefault(msg, 1, ""), + extension: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f, jsPbMessageId: msg.getJsPbMessageId_asB64() }; @@ -144,15 +144,15 @@ proto.examplecom.GetterNameConflictMessage.prototype.serializeBinary = function( */ proto.examplecom.GetterNameConflictMessage.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getExtension$(); - if (f.length > 0) { + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeString( 1, f ); } - f = message.getJsPbMessageId_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { writer.writeBytes( 2, f @@ -175,7 +175,25 @@ proto.examplecom.GetterNameConflictMessage.prototype.getExtension$ = function() * @return {!proto.examplecom.GetterNameConflictMessage} returns this */ proto.examplecom.GetterNameConflictMessage.prototype.setExtension$ = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.clearExtension$ = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.examplecom.GetterNameConflictMessage.prototype.hasExtension$ = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -217,7 +235,25 @@ proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId_asU8 = fun * @return {!proto.examplecom.GetterNameConflictMessage} returns this */ proto.examplecom.GetterNameConflictMessage.prototype.setJsPbMessageId$ = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.clearJsPbMessageId$ = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.examplecom.GetterNameConflictMessage.prototype.hasJsPbMessageId$ = function() { + return jspb.Message.getField(this, 2) != null; }; diff --git a/examples/generated-grpc-web/proto/examplecom/getter_name_pb.d.ts b/examples/generated-grpc-web/proto/examplecom/getter_name_pb.d.ts index f131f5e0..974e3b68 100644 --- a/examples/generated-grpc-web/proto/examplecom/getter_name_pb.d.ts +++ b/examples/generated-grpc-web/proto/examplecom/getter_name_pb.d.ts @@ -4,9 +4,13 @@ import * as jspb from "google-protobuf"; export class GetterNameConflictMessage extends jspb.Message { - getExtension$(): string; + hasExtension$(): boolean; + clearExtension(): void; + getExtension$(): string | undefined; setExtension$(value: string): void; + hasJsPbMessageId$(): boolean; + clearJsPbMessageId(): void; getJsPbMessageId$(): Uint8Array | string; getJsPbMessageId_asU8(): Uint8Array; getJsPbMessageId_asB64(): string; @@ -24,7 +28,7 @@ export class GetterNameConflictMessage extends jspb.Message { export namespace GetterNameConflictMessage { export type AsObject = { - extension: string, + extension?: string, jsPbMessageId: Uint8Array | string, } } diff --git a/examples/generated-grpc-web/proto/examplecom/getter_name_pb.js b/examples/generated-grpc-web/proto/examplecom/getter_name_pb.js index 61d31181..067ee470 100644 --- a/examples/generated-grpc-web/proto/examplecom/getter_name_pb.js +++ b/examples/generated-grpc-web/proto/examplecom/getter_name_pb.js @@ -69,7 +69,7 @@ proto.examplecom.GetterNameConflictMessage.prototype.toObject = function(opt_inc */ proto.examplecom.GetterNameConflictMessage.toObject = function(includeInstance, msg) { var f, obj = { - extension: jspb.Message.getFieldWithDefault(msg, 1, ""), + extension: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f, jsPbMessageId: msg.getJsPbMessageId_asB64() }; @@ -144,15 +144,15 @@ proto.examplecom.GetterNameConflictMessage.prototype.serializeBinary = function( */ proto.examplecom.GetterNameConflictMessage.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getExtension$(); - if (f.length > 0) { + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeString( 1, f ); } - f = message.getJsPbMessageId_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { writer.writeBytes( 2, f @@ -175,7 +175,25 @@ proto.examplecom.GetterNameConflictMessage.prototype.getExtension$ = function() * @return {!proto.examplecom.GetterNameConflictMessage} returns this */ proto.examplecom.GetterNameConflictMessage.prototype.setExtension$ = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.clearExtension$ = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.examplecom.GetterNameConflictMessage.prototype.hasExtension$ = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -217,7 +235,25 @@ proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId_asU8 = fun * @return {!proto.examplecom.GetterNameConflictMessage} returns this */ proto.examplecom.GetterNameConflictMessage.prototype.setJsPbMessageId$ = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.clearJsPbMessageId$ = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.examplecom.GetterNameConflictMessage.prototype.hasJsPbMessageId$ = function() { + return jspb.Message.getField(this, 2) != null; }; diff --git a/examples/generated/proto/examplecom/getter_name_pb.d.ts b/examples/generated/proto/examplecom/getter_name_pb.d.ts index f131f5e0..974e3b68 100644 --- a/examples/generated/proto/examplecom/getter_name_pb.d.ts +++ b/examples/generated/proto/examplecom/getter_name_pb.d.ts @@ -4,9 +4,13 @@ import * as jspb from "google-protobuf"; export class GetterNameConflictMessage extends jspb.Message { - getExtension$(): string; + hasExtension$(): boolean; + clearExtension(): void; + getExtension$(): string | undefined; setExtension$(value: string): void; + hasJsPbMessageId$(): boolean; + clearJsPbMessageId(): void; getJsPbMessageId$(): Uint8Array | string; getJsPbMessageId_asU8(): Uint8Array; getJsPbMessageId_asB64(): string; @@ -24,7 +28,7 @@ export class GetterNameConflictMessage extends jspb.Message { export namespace GetterNameConflictMessage { export type AsObject = { - extension: string, + extension?: string, jsPbMessageId: Uint8Array | string, } } diff --git a/examples/generated/proto/examplecom/getter_name_pb.js b/examples/generated/proto/examplecom/getter_name_pb.js index 61d31181..067ee470 100644 --- a/examples/generated/proto/examplecom/getter_name_pb.js +++ b/examples/generated/proto/examplecom/getter_name_pb.js @@ -69,7 +69,7 @@ proto.examplecom.GetterNameConflictMessage.prototype.toObject = function(opt_inc */ proto.examplecom.GetterNameConflictMessage.toObject = function(includeInstance, msg) { var f, obj = { - extension: jspb.Message.getFieldWithDefault(msg, 1, ""), + extension: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f, jsPbMessageId: msg.getJsPbMessageId_asB64() }; @@ -144,15 +144,15 @@ proto.examplecom.GetterNameConflictMessage.prototype.serializeBinary = function( */ proto.examplecom.GetterNameConflictMessage.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getExtension$(); - if (f.length > 0) { + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeString( 1, f ); } - f = message.getJsPbMessageId_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { writer.writeBytes( 2, f @@ -175,7 +175,25 @@ proto.examplecom.GetterNameConflictMessage.prototype.getExtension$ = function() * @return {!proto.examplecom.GetterNameConflictMessage} returns this */ proto.examplecom.GetterNameConflictMessage.prototype.setExtension$ = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.clearExtension$ = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.examplecom.GetterNameConflictMessage.prototype.hasExtension$ = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -217,7 +235,25 @@ proto.examplecom.GetterNameConflictMessage.prototype.getJsPbMessageId_asU8 = fun * @return {!proto.examplecom.GetterNameConflictMessage} returns this */ proto.examplecom.GetterNameConflictMessage.prototype.setJsPbMessageId$ = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.examplecom.GetterNameConflictMessage} returns this + */ +proto.examplecom.GetterNameConflictMessage.prototype.clearJsPbMessageId$ = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.examplecom.GetterNameConflictMessage.prototype.hasJsPbMessageId$ = function() { + return jspb.Message.getField(this, 2) != null; }; diff --git a/proto/examplecom/getter_name.proto b/proto/examplecom/getter_name.proto index 6e5abfea..c6830bd6 100644 --- a/proto/examplecom/getter_name.proto +++ b/proto/examplecom/getter_name.proto @@ -1,8 +1,8 @@ -syntax = "proto3"; +syntax = "proto2"; package examplecom; message GetterNameConflictMessage { - string extension = 1; - bytes js_pb_message_id = 2; + optional string extension = 1; + optional bytes js_pb_message_id = 2; } diff --git a/src/ts/message.ts b/src/ts/message.ts index 7f57ce24..7d68efa2 100644 --- a/src/ts/message.ts +++ b/src/ts/message.ts @@ -168,7 +168,7 @@ export function printMessage(fileName: string, exportMap: ExportMap, messageDesc } if (hasFieldPresence(field, fileDescriptor)) { - printer.printIndentedLn(`has${withUppercase}(): boolean;`); + printer.printIndentedLn(`has${jsGetterName(withUppercase)}(): boolean;`); printClearIfNotPresent(); } diff --git a/test/integration/getterName.ts b/test/integration/getterName.ts index 37e560f5..a607fcaf 100644 --- a/test/integration/getterName.ts +++ b/test/integration/getterName.ts @@ -10,10 +10,12 @@ describe("getterName", () => { assert.equal(message.getExtension$(), ""); message.setExtension$("abc"); assert.equal(message.getExtension$(), "abc"); + assert.equal(message.hasExtension$(), true); assert.equal(message.getJsPbMessageId$(), ""); message.setJsPbMessageId$("def"); assert.equal(message.getJsPbMessageId$(), "def"); + assert.equal(message.hasJsPbMessageId$(), true); }); }); }); From ca7c645594dfe2d1feeb5a27d8a433d6f804a1ca Mon Sep 17 00:00:00 2001 From: "Philip K. Warren" Date: Mon, 26 Apr 2021 08:09:39 -0500 Subject: [PATCH 3/3] Fix clear method name. --- .../proto/examplecom/getter_name_pb.d.ts | 4 ++-- .../generated-grpc-node/proto/examplecom/getter_name_pb.d.ts | 4 ++-- .../generated-grpc-web/proto/examplecom/getter_name_pb.d.ts | 4 ++-- examples/generated/proto/examplecom/getter_name_pb.d.ts | 4 ++-- src/ts/message.ts | 2 +- test/integration/getterName.ts | 4 ++++ 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.d.ts b/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.d.ts index 974e3b68..25e59958 100644 --- a/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.d.ts +++ b/examples/generated-grpc-js-node/proto/examplecom/getter_name_pb.d.ts @@ -5,12 +5,12 @@ import * as jspb from "google-protobuf"; export class GetterNameConflictMessage extends jspb.Message { hasExtension$(): boolean; - clearExtension(): void; + clearExtension$(): void; getExtension$(): string | undefined; setExtension$(value: string): void; hasJsPbMessageId$(): boolean; - clearJsPbMessageId(): void; + clearJsPbMessageId$(): void; getJsPbMessageId$(): Uint8Array | string; getJsPbMessageId_asU8(): Uint8Array; getJsPbMessageId_asB64(): string; diff --git a/examples/generated-grpc-node/proto/examplecom/getter_name_pb.d.ts b/examples/generated-grpc-node/proto/examplecom/getter_name_pb.d.ts index 974e3b68..25e59958 100644 --- a/examples/generated-grpc-node/proto/examplecom/getter_name_pb.d.ts +++ b/examples/generated-grpc-node/proto/examplecom/getter_name_pb.d.ts @@ -5,12 +5,12 @@ import * as jspb from "google-protobuf"; export class GetterNameConflictMessage extends jspb.Message { hasExtension$(): boolean; - clearExtension(): void; + clearExtension$(): void; getExtension$(): string | undefined; setExtension$(value: string): void; hasJsPbMessageId$(): boolean; - clearJsPbMessageId(): void; + clearJsPbMessageId$(): void; getJsPbMessageId$(): Uint8Array | string; getJsPbMessageId_asU8(): Uint8Array; getJsPbMessageId_asB64(): string; diff --git a/examples/generated-grpc-web/proto/examplecom/getter_name_pb.d.ts b/examples/generated-grpc-web/proto/examplecom/getter_name_pb.d.ts index 974e3b68..25e59958 100644 --- a/examples/generated-grpc-web/proto/examplecom/getter_name_pb.d.ts +++ b/examples/generated-grpc-web/proto/examplecom/getter_name_pb.d.ts @@ -5,12 +5,12 @@ import * as jspb from "google-protobuf"; export class GetterNameConflictMessage extends jspb.Message { hasExtension$(): boolean; - clearExtension(): void; + clearExtension$(): void; getExtension$(): string | undefined; setExtension$(value: string): void; hasJsPbMessageId$(): boolean; - clearJsPbMessageId(): void; + clearJsPbMessageId$(): void; getJsPbMessageId$(): Uint8Array | string; getJsPbMessageId_asU8(): Uint8Array; getJsPbMessageId_asB64(): string; diff --git a/examples/generated/proto/examplecom/getter_name_pb.d.ts b/examples/generated/proto/examplecom/getter_name_pb.d.ts index 974e3b68..25e59958 100644 --- a/examples/generated/proto/examplecom/getter_name_pb.d.ts +++ b/examples/generated/proto/examplecom/getter_name_pb.d.ts @@ -5,12 +5,12 @@ import * as jspb from "google-protobuf"; export class GetterNameConflictMessage extends jspb.Message { hasExtension$(): boolean; - clearExtension(): void; + clearExtension$(): void; getExtension$(): string | undefined; setExtension$(value: string): void; hasJsPbMessageId$(): boolean; - clearJsPbMessageId(): void; + clearJsPbMessageId$(): void; getJsPbMessageId$(): Uint8Array | string; getJsPbMessageId_asU8(): Uint8Array; getJsPbMessageId_asB64(): string; diff --git a/src/ts/message.ts b/src/ts/message.ts index 7d68efa2..639b952f 100644 --- a/src/ts/message.ts +++ b/src/ts/message.ts @@ -163,7 +163,7 @@ export function printMessage(fileName: string, exportMap: ExportMap, messageDesc function printClearIfNotPresent() { if (!hasClearMethod) { hasClearMethod = true; - printer.printIndentedLn(`clear${withUppercase}${field.getLabel() === FieldDescriptorProto.Label.LABEL_REPEATED ? "List" : ""}(): void;`); + printer.printIndentedLn(`clear${jsGetterName(withUppercase)}${field.getLabel() === FieldDescriptorProto.Label.LABEL_REPEATED ? "List" : ""}(): void;`); } } diff --git a/test/integration/getterName.ts b/test/integration/getterName.ts index a607fcaf..2a8d01f5 100644 --- a/test/integration/getterName.ts +++ b/test/integration/getterName.ts @@ -11,11 +11,15 @@ describe("getterName", () => { message.setExtension$("abc"); assert.equal(message.getExtension$(), "abc"); assert.equal(message.hasExtension$(), true); + message.clearExtension$(); + assert.equal(message.hasExtension$(), false); assert.equal(message.getJsPbMessageId$(), ""); message.setJsPbMessageId$("def"); assert.equal(message.getJsPbMessageId$(), "def"); assert.equal(message.hasJsPbMessageId$(), true); + message.clearJsPbMessageId$(); + assert.equal(message.hasJsPbMessageId$(), false); }); }); });