From 7120e93b7980728614779c50f40877da57e3cf37 Mon Sep 17 00:00:00 2001 From: Alexander Fenster Date: Fri, 9 Sep 2022 13:15:49 -0700 Subject: [PATCH] fix: generate valid js code for aliased enum values (#1801) --- src/converter.js | 4 +++- tests/cli.js | 2 ++ tests/data/cli/test.proto | 9 +++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/converter.js b/src/converter.js index a043ceef8..c9e68b5be 100644 --- a/src/converter.js +++ b/src/converter.js @@ -18,18 +18,20 @@ var Enum = require("./enum"), * @ignore */ function genValuePartial_fromObject(gen, field, fieldIndex, prop) { + var defaultAlreadyEmitted = false; /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */ if (field.resolvedType) { if (field.resolvedType instanceof Enum) { gen ("switch(d%s){", prop); for (var values = field.resolvedType.values, keys = Object.keys(values), i = 0; i < keys.length; ++i) { // enum unknown values passthrough - if (values[keys[i]] === field.typeDefault) { gen + if (values[keys[i]] === field.typeDefault && !defaultAlreadyEmitted) { gen ("default:") ("if(typeof(d%s)===\"number\"){m%s=d%s;break}", prop, prop, prop); if (!field.repeated) gen // fallback to default value only for // arrays, to avoid leaving holes. ("break"); // for non-repeated fields, just ignore + defaultAlreadyEmitted = true; } gen ("case%j:", keys[i]) diff --git a/tests/cli.js b/tests/cli.js index c74c549de..57440bc21 100644 --- a/tests/cli.js +++ b/tests/cli.js @@ -65,6 +65,7 @@ tape.test("pbjs generates static code", function(test) { value: 42, }, regularField: "abc", + enumField: 0, }; var obj1 = OneofContainer.toObject(OneofContainer.fromObject(obj)); test.deepEqual(obj, obj1, "fromObject and toObject work for plain object"); @@ -76,6 +77,7 @@ tape.test("pbjs generates static code", function(test) { instance.messageInOneof = new Message(); instance.messageInOneof.value = 42; instance.regularField = "abc"; + instance.enumField = 0; var instance1 = OneofContainerDynamic.toObject(OneofContainerDynamic.fromObject(instance)); test.deepEqual(instance, instance1, "fromObject and toObject work for instance of the static type"); diff --git a/tests/data/cli/test.proto b/tests/data/cli/test.proto index af976adab..f1ffc1c96 100644 --- a/tests/data/cli/test.proto +++ b/tests/data/cli/test.proto @@ -4,10 +4,19 @@ message Message { int32 value = 1; } +enum Enum { + option allow_alias = true; + + UNSPECIFIED = 0; + DEFAULT = 0; // checking that an alias does not break things + SOMETHING = 1; +} + message OneofContainer { oneof some_oneof { string string_in_oneof = 1; Message message_in_oneof = 2; } string regular_field = 3; + Enum enum_field = 4; }