Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7c60e2c3 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes I4e92d70c,Ibf25ff58 into main

* changes:
  Avoid outer/inner class name clashes
  Emit extension fields
parents b54da2d7 804f0134
Loading
Loading
Loading
Loading
+40 −13
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include <stdio.h>

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
@@ -31,21 +32,39 @@ using namespace android::stream_proto;
using namespace google::protobuf::io;
using namespace std;

static bool outer_class_name_clashes_with_any_message(const string& outer_class_name,
                                                      const vector<DescriptorProto>& messages) {
    return any_of(messages.cbegin(), messages.cend(), [&](const DescriptorProto& message) {
        return message.name() == outer_class_name;
    });
}

/**
 * If the descriptor gives us a class name, use that. Otherwise make one up from
 * the filename of the .proto file.
 */
static string make_outer_class_name(const FileDescriptorProto& file_descriptor) {
static string make_outer_class_name(const FileDescriptorProto& file_descriptor,
                                    const vector<DescriptorProto>& messages) {
    string name = file_descriptor.options().java_outer_classname();
    if (name.size() == 0) {
    if (!name.empty()) {
        return name;
    }

    // Outer class and messages with the same name would result in invalid java (outer class and
    // inner class cannot have same names).
    // If the outer class name clashes with any message, let's append an "OuterClass" suffix.
    // This behavior is consistent with the standard protoc.
    name = to_camel_case(file_base_name(file_descriptor.name()));
        if (name.size() == 0) {
            ERRORS.Add(UNKNOWN_FILE, UNKNOWN_LINE,
                       "Unable to make an outer class name for file: %s",
    while (outer_class_name_clashes_with_any_message(name, messages)) {
        name += "OuterClass";
    }

    if (name.empty()) {
        ERRORS.Add(UNKNOWN_FILE, UNKNOWN_LINE, "Unable to make an outer class name for file: %s",
                   file_descriptor.name().c_str());
        name = "Unknown";
    }
    }

    return name;
}

@@ -150,6 +169,12 @@ static void write_message(stringstream& text, const DescriptorProto& message,
        write_field(text, message.field(i), indented);
    }

    // Extensions
    N = message.extension_size();
    for (int i = 0; i < N; i++) {
        write_field(text, message.extension(i), indented);
    }

    text << indent << "}" << endl;
    text << endl;
}
@@ -166,7 +191,7 @@ static void write_file(CodeGeneratorResponse* response, const FileDescriptorProt
    stringstream text;

    string const package_name = make_java_package(file_descriptor);
    string const outer_class_name = make_outer_class_name(file_descriptor);
    string const outer_class_name = make_outer_class_name(file_descriptor, messages);

    text << "// Generated by protoc-gen-javastream. DO NOT MODIFY." << endl;
    text << "// source: " << file_descriptor.name() << endl << endl;
@@ -233,7 +258,8 @@ static void write_multiple_files(CodeGeneratorResponse* response,

        if (messages_allowlist.empty() || !enums.empty()) {
            write_file(response, file_descriptor,
                       make_file_name(file_descriptor, make_outer_class_name(file_descriptor)),
                       make_file_name(file_descriptor,
                                      make_outer_class_name(file_descriptor, messages)),
                       true, enums, messages);
        }
    }
@@ -291,8 +317,9 @@ static void write_single_file(CodeGeneratorResponse* response,

    if (messages_allowlist.empty() || !enums.empty() || !messages.empty()) {
        write_file(response, file_descriptor,
                   make_file_name(file_descriptor, make_outer_class_name(file_descriptor)), true,
                   enums, messages);
                   make_file_name(file_descriptor,
                                  make_outer_class_name(file_descriptor, messages)),
                   true, enums, messages);
    }
}