Skip to content

Conversation

XR-stb
Copy link

@XR-stb XR-stb commented Oct 14, 2025

Reason

Sometimes, we might write more semicolons in proto, which usually has no impact on the back end. However, when it comes to collaborating with the front end, we need to export the server protocol. At this point, protobuf-js does not support lexical parsing of multiple semicolons, resulting in an error. Now, I have fixed this problem.

Test Proto File

test_dir/test.proto

syntax = "proto3";

package test;

// Test case 1: Enum with double semicolon
enum Enum_Fruit_App {
    APPLE = 0;
    BANANA = 1;;  // Double semicolon here
    ORANGE = 2;
}

// Test case 2: Multiple double semicolons
enum Status {
    UNKNOWN = 0;   ;
    ACTIVE = 1;;
    INACTIVE = 2;
}

// Test case 3: Triple semicolon (extreme case)
enum Priority {
    LOW = 0;
    MEDIUM = 1; ; ;  // Triple semicolon;
    HIGH = 2;;;;;///;;;;
}

// Test case 4: Message with double semicolon after field
message TestMessage {
    Enum_Fruit_App fruit = 1;;  // Double semicolon after field
    Status status = 2;
    Priority priority = 3;;
}

// Test case 5: Message with option having double semicolon
message ConfigMessage {
    option deprecated = true;;  // Double semicolon after option
    string name = 1;
    int32 value = 2;;
}

// Test case 6: Service with double semicolon
service TestService {
    rpc GetStatus(TestMessage) returns (ConfigMessage);;  ;;// Double semicolon after method;;
}

// Test case 7: Nested message with double semicolons
message OuterMessage {
    message InnerMessage {
        string data = 1; ;
    }
    InnerMessage inner = 1; ; // ;
}

Test Js File

test_dir/test.js
run check: node test_dir/test.js

#!/usr/bin/env node

// Test script to reproduce and verify fix for double semicolon bug

var protobuf = require("..");

console.log("=".repeat(60));
console.log("Testing double semicolon bug in enum definition");
console.log("=".repeat(60));
console.log();

try {
    console.log("Loading test.proto with double/triple semicolons...");
    var root = protobuf.loadSync("test-double-semicolon/test.proto");

    console.log("✓ SUCCESS: Proto file loaded successfully!");
    console.log();
    console.log("Parsed enums:");

    // Display parsed enums
    var enums = ["Enum_Fruit_App", "Status", "Priority"];
    enums.forEach(function (enumName) {
        var enumType = root.lookupEnum("test." + enumName);
        if (enumType) {
            console.log("  - " + enumName + ":");
            Object.keys(enumType.values).forEach(function (key) {
                console.log("      " + key + " = " + enumType.values[key]);
            });
        }
    });

    console.log();
    console.log("Parsed message:");
    var TestMessage = root.lookupType("test.TestMessage");
    if (TestMessage) {
        console.log("  - TestMessage:");
        TestMessage.fieldsArray.forEach(function (field) {
            console.log("      " + field.name + ": " + field.type + " (id: " + field.id + ")");
        });
    }

    console.log();
    console.log("=".repeat(60));
    console.log("✓ All tests passed! Bug is fixed.");
    console.log("=".repeat(60));

} catch (err) {
    console.log("✗ ERROR: Failed to parse proto file");
    console.log();
    console.log("Error message:");
    console.log("  " + err.message);
    console.log();

    if (err.stack) {
        console.log("Stack trace:");
        var stackLines = err.stack.split('\n').slice(0, 8);
        stackLines.forEach(function (line) {
            console.log("  " + line);
        });
    }

    console.log();
    console.log("=".repeat(60));
    console.log("✗ Bug still exists - fix not working");
    console.log("=".repeat(60));

    process.exit(1);
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant