From bf79e2de36143b8b617af136c403496515373bb6 Mon Sep 17 00:00:00 2001 From: Brian Duff Date: Fri, 7 Jun 2013 00:12:27 -0700 Subject: 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 --- .../protobuf/compiler/javanano/javanano_helpers.cc | 18 ++++++++++++++---- .../protobuf/unittest_enum_multiplejava_nano.proto | 4 ++++ 2 files changed, 18 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/google/protobuf/compiler/javanano/javanano_helpers.cc b/src/google/protobuf/compiler/javanano/javanano_helpers.cc index 7839556..42cb133 100644 --- a/src/google/protobuf/compiler/javanano/javanano_helpers.cc +++ b/src/google/protobuf/compiler/javanano/javanano_helpers.cc @@ -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 += "."; } diff --git a/src/google/protobuf/unittest_enum_multiplejava_nano.proto b/src/google/protobuf/unittest_enum_multiplejava_nano.proto index d2da6c6..adf017d 100644 --- a/src/google/protobuf/unittest_enum_multiplejava_nano.proto +++ b/src/google/protobuf/unittest_enum_multiplejava_nano.proto @@ -47,3 +47,7 @@ enum SecondTopLevelEnum { SECOND_TOP_LEVEL_SECOND = 2; } +message SomeMessage { + optional FirstTopLevelEnum first = 1; + optional SecondTopLevelEnum second = 2; +} -- cgit v1.1