Skip to content

Commit f5b893c

Browse files
fix: support for options with repeated_value: [ "foo", "bar" ] (#1574)
Co-authored-by: Alexander Fenster <[email protected]>
1 parent 6e713ba commit f5b893c

File tree

3 files changed

+24
-3
lines changed

3 files changed

+24
-3
lines changed

src/parse.js

+17-1
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,23 @@ function parse(source, root, options) {
602602
skip(":");
603603
if (peek() === "{")
604604
value = parseOptionValue(parent, name + "." + token);
605-
else {
605+
else if (peek() === "[") {
606+
// option (my_option) = {
607+
// repeated_value: [ "foo", "bar" ]
608+
// };
609+
value = [];
610+
var lastValue;
611+
if (skip("[", true)) {
612+
do {
613+
lastValue = readValue(true);
614+
value.push(lastValue);
615+
} while (skip(",", true));
616+
skip("]");
617+
if (typeof lastValue !== "undefined") {
618+
setOption(parent, name + "." + token, lastValue);
619+
}
620+
}
621+
} else {
606622
value = readValue(true);
607623
setOption(parent, name + "." + token, value);
608624
}

tests/comp_options-parse.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,14 @@ tape.test("Options", function (test) {
3737

3838
test.test(test.name + " - message options (Message)", function (test) {
3939
var TestMessageOptionsMsg = root.lookup("TestMessageOptionsMsg");
40-
test.equal(TestMessageOptionsMsg.options["(mo_rep_msg).value"], 4, "should take second repeated message option");
41-
test.equal(TestMessageOptionsMsg.options["(mo_rep_msg).rep_value"], 6, "should take second repeated int in second repeated option");
40+
test.equal(TestMessageOptionsMsg.options["(mo_rep_msg).value"], 5, "should take last repeated message option");
41+
test.equal(TestMessageOptionsMsg.options["(mo_rep_msg).rep_value"], 8, "should take last repeated int in last repeated option");
4242
test.equal(TestMessageOptionsMsg.options["(mo_single_msg).value"], 7, "should correctly parse single msg option");
4343
test.equal(TestMessageOptionsMsg.options["(mo_single_msg).rep_value"], 9, "should take second repeated int in single msg option");
4444
test.same(TestMessageOptionsMsg.parsedOptions, [
4545
{"(mo_rep_msg)": {value: 1, rep_value: [2, 3]}},
4646
{"(mo_rep_msg)": {value: 4, rep_value: [5, 6]}},
47+
{"(mo_rep_msg)": {value: 5, rep_value: [7, 8]}},
4748
{"(mo_single_msg)": {value: 7, rep_value: [8, 9]}},
4849
], "should take all message options");
4950
test.end();

tests/data/options_test.proto

+4
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ message TestMessageOptionsMsg {
7474
rep_value: 5
7575
rep_value: 6
7676
};
77+
option (mo_rep_msg) = {
78+
value: 5
79+
rep_value: [ 7, 8 ]
80+
};
7781
option (mo_single_msg).value = 7;
7882
option (mo_single_msg).rep_value = 8;
7983
option (mo_single_msg).rep_value = 9;

0 commit comments

Comments
 (0)