@@ -219,6 +219,67 @@ std::string DefaultForField(const FieldDescriptor* field) {
219219 }
220220}
221221
222+ std::string DefaultForFieldWithPresence (const FieldDescriptor* field) {
223+ if (field->has_default_value ()) {
224+ switch (field->cpp_type ()) {
225+ case FieldDescriptor::CPPTYPE_INT32:
226+ return absl::StrCat (field->default_value_int32 ());
227+ case FieldDescriptor::CPPTYPE_INT64:
228+ return " GPBUtil::compatibleInt64(" +
229+ absl::StrCat (field->default_value_int64 ()) + " , '" +
230+ absl::StrCat (field->default_value_int64 ()) + " ')" ;
231+ case FieldDescriptor::CPPTYPE_UINT32:
232+ return absl::StrCat (field->default_value_uint32 ());
233+ case FieldDescriptor::CPPTYPE_UINT64:
234+ return " GPBUtil::compatibleInt64(" +
235+ absl::StrCat (field->default_value_uint64 ()) + " , '" +
236+ absl::StrCat (field->default_value_uint64 ()) + " ')" ;
237+ case FieldDescriptor::CPPTYPE_FLOAT:
238+ return absl::StrCat (field->default_value_float ());
239+ case FieldDescriptor::CPPTYPE_DOUBLE:
240+ return absl::StrCat (field->default_value_double ());
241+ case FieldDescriptor::CPPTYPE_BOOL:
242+ return field->default_value_bool () ? " true" : " false" ;
243+ case FieldDescriptor::CPPTYPE_ENUM:
244+ return absl::StrCat (field->default_value_enum ()->number ());
245+ case FieldDescriptor::CPPTYPE_STRING:
246+ return " '" + absl::CEscape (field->default_value_string ()) + " '" ;
247+ case FieldDescriptor::CPPTYPE_MESSAGE:
248+ return " null" ;
249+ }
250+ }
251+
252+ switch (field->type ()) {
253+ case FieldDescriptor::TYPE_INT64:
254+ case FieldDescriptor::TYPE_UINT64:
255+ case FieldDescriptor::TYPE_SINT64:
256+ case FieldDescriptor::TYPE_FIXED64:
257+ case FieldDescriptor::TYPE_SFIXED64:
258+ return " GPBUtil::compatibleInt64(0, '0')" ;
259+ case FieldDescriptor::TYPE_INT32:
260+ case FieldDescriptor::TYPE_UINT32:
261+ case FieldDescriptor::TYPE_SINT32:
262+ case FieldDescriptor::TYPE_FIXED32:
263+ case FieldDescriptor::TYPE_SFIXED32:
264+ case FieldDescriptor::TYPE_ENUM:
265+ return " 0" ;
266+ case FieldDescriptor::TYPE_DOUBLE:
267+ case FieldDescriptor::TYPE_FLOAT:
268+ return " 0.0" ;
269+ case FieldDescriptor::TYPE_BOOL:
270+ return " false" ;
271+ case FieldDescriptor::TYPE_STRING:
272+ case FieldDescriptor::TYPE_BYTES:
273+ return " ''" ;
274+ case FieldDescriptor::TYPE_MESSAGE:
275+ case FieldDescriptor::TYPE_GROUP:
276+ return " null" ;
277+ default :
278+ assert (false );
279+ return " " ;
280+ }
281+ }
282+
222283std::string DeprecatedConditionalForField (const FieldDescriptor* field) {
223284 if (field->is_repeated ()) {
224285 return absl::StrCat (" count($this->" , field->name (), " ) !== 0" );
@@ -623,7 +684,7 @@ void GenerateFieldAccessor(const FieldDescriptor* field, const Options& options,
623684 " : ^default_value^;\n "
624685 " }\n\n " ,
625686 " camel_name" , UnderscoresToCamelCase (field->name (), true ), " name" ,
626- field->name (), " default_value" , DefaultForField (field),
687+ field->name (), " default_value" , DefaultForFieldWithPresence (field),
627688 " deprecation_trigger" , deprecation_trigger_with_conditional);
628689 } else {
629690 printer->Print (
0 commit comments