From f5b893c03e9694bbe7da7c4001cc74b06039eb9c Mon Sep 17 00:00:00 2001 From: Aleksei Androsov Date: Fri, 14 May 2021 04:00:49 +0300 Subject: [PATCH] fix: support for options with `repeated_value: [ "foo", "bar" ]` (#1574) Co-authored-by: Alexander Fenster --- src/parse.js | 18 +++++++++++++++++- tests/comp_options-parse.js | 5 +++-- tests/data/options_test.proto | 4 ++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/parse.js b/src/parse.js index de2993815..0e538be0b 100644 --- a/src/parse.js +++ b/src/parse.js @@ -602,7 +602,23 @@ function parse(source, root, options) { skip(":"); if (peek() === "{") value = parseOptionValue(parent, name + "." + token); - else { + else if (peek() === "[") { + // option (my_option) = { + // repeated_value: [ "foo", "bar" ] + // }; + value = []; + var lastValue; + if (skip("[", true)) { + do { + lastValue = readValue(true); + value.push(lastValue); + } while (skip(",", true)); + skip("]"); + if (typeof lastValue !== "undefined") { + setOption(parent, name + "." + token, lastValue); + } + } + } else { value = readValue(true); setOption(parent, name + "." + token, value); } diff --git a/tests/comp_options-parse.js b/tests/comp_options-parse.js index a173caf67..18690a424 100644 --- a/tests/comp_options-parse.js +++ b/tests/comp_options-parse.js @@ -37,13 +37,14 @@ tape.test("Options", function (test) { test.test(test.name + " - message options (Message)", function (test) { var TestMessageOptionsMsg = root.lookup("TestMessageOptionsMsg"); - test.equal(TestMessageOptionsMsg.options["(mo_rep_msg).value"], 4, "should take second repeated message option"); - test.equal(TestMessageOptionsMsg.options["(mo_rep_msg).rep_value"], 6, "should take second repeated int in second repeated option"); + test.equal(TestMessageOptionsMsg.options["(mo_rep_msg).value"], 5, "should take last repeated message option"); + test.equal(TestMessageOptionsMsg.options["(mo_rep_msg).rep_value"], 8, "should take last repeated int in last repeated option"); test.equal(TestMessageOptionsMsg.options["(mo_single_msg).value"], 7, "should correctly parse single msg option"); test.equal(TestMessageOptionsMsg.options["(mo_single_msg).rep_value"], 9, "should take second repeated int in single msg option"); test.same(TestMessageOptionsMsg.parsedOptions, [ {"(mo_rep_msg)": {value: 1, rep_value: [2, 3]}}, {"(mo_rep_msg)": {value: 4, rep_value: [5, 6]}}, + {"(mo_rep_msg)": {value: 5, rep_value: [7, 8]}}, {"(mo_single_msg)": {value: 7, rep_value: [8, 9]}}, ], "should take all message options"); test.end(); diff --git a/tests/data/options_test.proto b/tests/data/options_test.proto index 15ba65282..52f022818 100644 --- a/tests/data/options_test.proto +++ b/tests/data/options_test.proto @@ -74,6 +74,10 @@ message TestMessageOptionsMsg { rep_value: 5 rep_value: 6 }; + option (mo_rep_msg) = { + value: 5 + rep_value: [ 7, 8 ] + }; option (mo_single_msg).value = 7; option (mo_single_msg).rep_value = 8; option (mo_single_msg).rep_value = 9;