Protobuf.js: pbjs generates a syntax error with es6 javascript

Created on 17 Jul 2020  路  2Comments  路  Source: protobufjs/protobuf.js

protobuf.js version: 6.10.1

Expected behavior

pbjs should generate javascript free of syntax errors when using wrap = es6

Actual behavior

If there are 2 map fields in a protobuf message, pbjs generates code that redeclares let which is a SyntaxError. This did not happen in version 6.9.0

Code

pbjs -t static-module -w es6 ./message.proto
message Test {
  map<string, string> map_1 = 1;
  map<string, string> map_2 = 2;
}

Resulting javascript - end2 is declared twice, in case 1 and case 2 but the case statements are not wrapped in brackets

    Test.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Test(), key, value;
        while (reader.pos < end) {
            let tag = reader.uint32();
            switch (tag >>> 3) {
            case 1:
                if (message.map_1 === $util.emptyObject)
                    message.map_1 = {};
                let end2 = reader.uint32() + reader.pos;
                key = "";
                value = "";
                while (reader.pos < end2) {
                    let tag2 = reader.uint32();
                    switch (tag2 >>> 3) {
                    case 1:
                        key = reader.string();
                        break;
                    case 2:
                        value = reader.string();
                        break;
                    default:
                        reader.skipType(tag2 & 7);
                        break;
                    }
                }
                message.map_1[key] = value;
                break;
            case 2:
                if (message.map_2 === $util.emptyObject)
                    message.map_2 = {};
                let end2 = reader.uint32() + reader.pos;
                key = "";
                value = "";
                while (reader.pos < end2) {
                    let tag2 = reader.uint32();
                    switch (tag2 >>> 3) {
                    case 1:
                        key = reader.string();
                        break;
                    case 2:
                        value = reader.string();
                        break;
                    default:
                        reader.skipType(tag2 & 7);
                        break;
                    }
                }
                message.map_2[key] = value;
                break;
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

Javascript using protobufjs 6.9.0

    Test.decode = function decode(reader, length) {
        if (!(reader instanceof $Reader))
            reader = $Reader.create(reader);
        let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Test(), key;
        while (reader.pos < end) {
            let tag = reader.uint32();
            switch (tag >>> 3) {
            case 1:
                reader.skip().pos++;
                if (message.map_1 === $util.emptyObject)
                    message.map_1 = {};
                key = reader.string();
                reader.pos++;
                message.map_1[key] = reader.string();
                break;
            case 2:
                reader.skip().pos++;
                if (message.map_2 === $util.emptyObject)
                    message.map_2 = {};
                key = reader.string();
                reader.pos++;
                message.map_2[key] = reader.string();
                break;
            default:
                reader.skipType(tag & 7);
                break;
            }
        }
        return message;
    };

Most helpful comment

I've also hit this issue and had to switch to 6.9.0 to resolve.

All 2 comments

I have also reproduced this, here's a minimal example: https://github.com/AndiDog/protobufjs-identifier-already-declared

I've also hit this issue and had to switch to 6.9.0 to resolve.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

thedillonb picture thedillonb  路  4Comments

asafcombo picture asafcombo  路  4Comments

psaelango picture psaelango  路  4Comments

spiderkeys picture spiderkeys  路  5Comments

bennycode picture bennycode  路  3Comments