Fix enum field references with java_multiple_files.

When the java_multiple_files option is on, enums are placed in java
class files based on the name of the original enum type. This fixes
field references to such enum values to point to the correct class
name when setting the default.

Change-Id: I51a2e251c0d0ab1e45a182ba849d314232a74bac
pull/91/head
Brian Duff 12 years ago
parent 63d4b5fd57
commit a220fe61e1
  1. 18
      src/google/protobuf/compiler/javanano/javanano_helpers.cc
  2. 4
      src/google/protobuf/unittest_enum_multiplejava_nano.proto

@ -208,7 +208,8 @@ string ClassName(const Params& params, const EnumDescriptor* descriptor) {
const string full_name = descriptor->full_name();
// Remove enum class name as we use int's for enums
string base_name = full_name.substr(0, full_name.find_last_of('.'));
int last_dot_in_name = full_name.find_last_of('.');
string base_name = full_name.substr(0, last_dot_in_name);
if (!file->package().empty()) {
if (file->package() == base_name.substr(0, file->package().size())) {
@ -226,13 +227,22 @@ string ClassName(const Params& params, const EnumDescriptor* descriptor) {
// Construct the path name from the package and outer class
// Add the java package name if it exsits
// Add the java package name if it exists
if (params.has_java_package(file_name)) {
result += params.java_package(file_name);
}
// Add the outer classname if it exists
if (params.has_java_outer_classname(file_name)) {
// If the java_multiple_files option is present, we will generate enums into separate
// classes, each named after the original enum type. This takes precedence over
// any outer_classname.
if (params.java_multiple_files() && last_dot_in_name != string::npos) {
string enum_simple_name = full_name.substr(last_dot_in_name + 1);
if (!result.empty()) {
result += ".";
}
result += enum_simple_name;
} else if (params.has_java_outer_classname(file_name)) {
// Add the outer classname if it exists
if (!result.empty()) {
result += ".";
}

@ -47,3 +47,7 @@ enum SecondTopLevelEnum {
SECOND_TOP_LEVEL_SECOND = 2;
}
message SomeMessage {
optional FirstTopLevelEnum first = 1;
optional SecondTopLevelEnum second = 2;
}

Loading…
Cancel
Save