Skip to content

Commit a26dd61

Browse files
authored
fix: Accept empty statements in proto definitions (#2176)
1 parent 1899891 commit a26dd61

2 files changed

Lines changed: 36 additions & 0 deletions

File tree

src/parse.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,9 @@ function parse(source, root, options) {
389389

390390
switch (token) {
391391

392+
case ";":
393+
break;
394+
392395
case "map":
393396
parseMapField(type, token);
394397
break;
@@ -523,6 +526,9 @@ function parse(source, root, options) {
523526
ifBlock(type, function parseGroup_block(token) {
524527
switch (token) {
525528

529+
case ";":
530+
break;
531+
526532
case "option":
527533
parseOption(type, token);
528534
skip(";");
@@ -647,6 +653,9 @@ function parse(source, root, options) {
647653
var enm = new Enum(token);
648654
ifBlock(enm, function parseEnum_block(token) {
649655
switch(token) {
656+
case ";":
657+
break;
658+
650659
case "option":
651660
parseOption(enm, token);
652661
skip(";");
@@ -840,6 +849,8 @@ function parse(source, root, options) {
840849
}
841850

842851
/* istanbul ignore else */
852+
if (token === ";")
853+
return;
843854
if (token === "rpc")
844855
parseMethod(service, token);
845856
else
@@ -891,6 +902,8 @@ function parse(source, root, options) {
891902
ifBlock(method, function parseMethod_block(token) {
892903

893904
/* istanbul ignore else */
905+
if (token === ";")
906+
return;
894907
if (token === "option") {
895908
parseOption(method, token);
896909
skip(";");
@@ -940,6 +953,9 @@ function parse(source, root, options) {
940953
while ((token = next()) !== null) {
941954
switch (token) {
942955

956+
case ";":
957+
break;
958+
943959
case "package":
944960

945961
/* istanbul ignore if */

tests/comp_empty-statements.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
var tape = require("tape");
2+
var protobuf = require("..");
3+
4+
tape.test("empty statements", function(test) {
5+
var root = protobuf.parse("syntax = \"proto3\";;" +
6+
"message Request { string value = 1;; }" +
7+
"message Response { oneof result { string value = 1; }; }" +
8+
"enum Status { UNKNOWN = 0;; OK = 1; ; }" +
9+
"service TestService { ; rpc Get(Request) returns (Response) { ; option deprecated = true;; }; }").root;
10+
11+
var proto2Root = protobuf.parse("syntax = \"proto2\";" +
12+
"message Legacy { optional group Group = 1 { ; optional string value = 2;; } }").root;
13+
14+
test.ok(root.lookupType("Request").fields.value, "should parse message fields");
15+
test.ok(root.lookupType("Response").oneofs.result, "should parse oneof fields");
16+
test.equal(root.lookupEnum("Status").values.OK, 1, "should parse enum values");
17+
test.ok(root.lookupService("TestService").methods.Get, "should parse service methods");
18+
test.ok(proto2Root.lookupType("Legacy.Group").fields.value, "should parse group fields");
19+
test.end();
20+
});

0 commit comments

Comments
 (0)