diff options
5 files changed, 51 insertions, 13 deletions
diff --git a/src/google/protobuf/compiler/javanano/javanano_enum_field.cc b/src/google/protobuf/compiler/javanano/javanano_enum_field.cc index 6a18834..8a59d32 100644 --- a/src/google/protobuf/compiler/javanano/javanano_enum_field.cc +++ b/src/google/protobuf/compiler/javanano/javanano_enum_field.cc @@ -59,6 +59,7 @@ void SetEnumVariables(const Params& params, RenameJavaKeywords(UnderscoresToCapitalizedCamelCase(descriptor)); (*variables)["number"] = SimpleItoa(descriptor->number()); if (params.use_reference_types_for_primitives() + && !params.reftypes_primitive_enums() && !descriptor->is_repeated()) { (*variables)["type"] = "java.lang.Integer"; (*variables)["default"] = "null"; @@ -197,7 +198,8 @@ GenerateSerializedSizeCode(io::Printer* printer) const { } void EnumFieldGenerator::GenerateEqualsCode(io::Printer* printer) const { - if (params_.use_reference_types_for_primitives()) { + if (params_.use_reference_types_for_primitives() + && !params_.reftypes_primitive_enums()) { printer->Print(variables_, "if (this.$name$ == null) {\n" " if (other.$name$ != null) {\n" @@ -228,7 +230,8 @@ void EnumFieldGenerator::GenerateEqualsCode(io::Printer* printer) const { void EnumFieldGenerator::GenerateHashCodeCode(io::Printer* printer) const { printer->Print( "result = 31 * result + "); - if (params_.use_reference_types_for_primitives()) { + if (params_.use_reference_types_for_primitives() + && !params_.reftypes_primitive_enums()) { printer->Print(variables_, "(this.$name$ == null ? 0 : this.$name$)"); } else { diff --git a/src/google/protobuf/compiler/javanano/javanano_generator.cc b/src/google/protobuf/compiler/javanano/javanano_generator.cc index 61ef2ca..b1e75e3 100644 --- a/src/google/protobuf/compiler/javanano/javanano_generator.cc +++ b/src/google/protobuf/compiler/javanano/javanano_generator.cc @@ -139,7 +139,13 @@ bool JavaNanoGenerator::Generate(const FileDescriptor* file, params.set_java_enum_style(option_value == "java"); } else if (option_name == "optional_field_style") { params.set_optional_field_accessors(option_value == "accessors"); - params.set_use_reference_types_for_primitives(option_value == "reftypes"); + params.set_use_reference_types_for_primitives(option_value == "reftypes" + || option_value == "reftypes_compat_mode"); + params.set_reftypes_primitive_enums( + option_value == "reftypes_compat_mode"); + if (option_value == "reftypes_compat_mode") { + params.set_generate_clear(false); + } } else if (option_name == "generate_equals") { params.set_generate_equals(option_value == "true"); } else if (option_name == "ignore_services") { diff --git a/src/google/protobuf/compiler/javanano/javanano_helpers.cc b/src/google/protobuf/compiler/javanano/javanano_helpers.cc index bf88f25..2149418 100644 --- a/src/google/protobuf/compiler/javanano/javanano_helpers.cc +++ b/src/google/protobuf/compiler/javanano/javanano_helpers.cc @@ -392,6 +392,10 @@ string DefaultValue(const Params& params, const FieldDescriptor* field) { } if (params.use_reference_types_for_primitives()) { + if (params.reftypes_primitive_enums() + && field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { + return "Integer.MIN_VALUE"; + } return "null"; } diff --git a/src/google/protobuf/compiler/javanano/javanano_message.cc b/src/google/protobuf/compiler/javanano/javanano_message.cc index cc44cd3..7c52ca3 100644 --- a/src/google/protobuf/compiler/javanano/javanano_message.cc +++ b/src/google/protobuf/compiler/javanano/javanano_message.cc @@ -245,16 +245,20 @@ void MessageGenerator::Generate(io::Printer* printer) { " _classInitialized = true;\n" " }\n" " }\n" - " }\n" - " clear();\n" - "}\n"); + " }\n"); + if (params_.generate_clear()) { + printer->Print(" clear();\n"); + } + printer->Print("}\n"); } else { - printer->Print( - "\n" - "public $classname$() {\n" - " clear();\n" - "}\n", - "classname", descriptor_->name()); + if (params_.generate_clear()) { + printer->Print( + "\n" + "public $classname$() {\n" + " clear();\n" + "}\n", + "classname", descriptor_->name()); + } } // Other methods in this class @@ -440,6 +444,9 @@ void MessageGenerator::GenerateSerializeOneField( } void MessageGenerator::GenerateClear(io::Printer* printer) { + if (!params_.generate_clear()) { + return; + } printer->Print( "\n" "public $classname$ clear() {\n", diff --git a/src/google/protobuf/compiler/javanano/javanano_params.h b/src/google/protobuf/compiler/javanano/javanano_params.h index d0626a2..4691f36 100644 --- a/src/google/protobuf/compiler/javanano/javanano_params.h +++ b/src/google/protobuf/compiler/javanano/javanano_params.h @@ -64,6 +64,8 @@ class Params { bool generate_equals_; bool ignore_services_; bool parcelable_messages_; + bool reftypes_primitive_enums_; + bool generate_clear_; public: Params(const string & base_name) : @@ -77,7 +79,9 @@ class Params { use_reference_types_for_primitives_(false), generate_equals_(false), ignore_services_(false), - parcelable_messages_(false) { + parcelable_messages_(false), + reftypes_primitive_enums_(false), + generate_clear_(true) { } const string& base_name() const { @@ -213,6 +217,20 @@ class Params { bool parcelable_messages() const { return parcelable_messages_; } + + void set_reftypes_primitive_enums(bool value) { + reftypes_primitive_enums_ = value; + } + bool reftypes_primitive_enums() const { + return reftypes_primitive_enums_; + } + + void set_generate_clear(bool value) { + generate_clear_ = value; + } + bool generate_clear() const { + return generate_clear_; + } }; } // namespace javanano |