aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBrian Duff <bduff@google.com>2013-06-07 00:12:27 -0700
committerBrian Duff <bduff@google.com>2013-06-07 14:00:05 -0700
commitbf79e2de36143b8b617af136c403496515373bb6 (patch)
tree824b600fb3ed18615fc3d5528146da24fa08fe57 /src
parent6f59b38386c8ff883c8e9e0a76068fa07d95bfb1 (diff)
downloadexternal_protobuf-bf79e2de36143b8b617af136c403496515373bb6.zip
external_protobuf-bf79e2de36143b8b617af136c403496515373bb6.tar.gz
external_protobuf-bf79e2de36143b8b617af136c403496515373bb6.tar.bz2
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
Diffstat (limited to 'src')
-rw-r--r--src/google/protobuf/compiler/javanano/javanano_helpers.cc18
-rw-r--r--src/google/protobuf/unittest_enum_multiplejava_nano.proto4
2 files changed, 18 insertions, 4 deletions
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;
+}